私はOSを開発しようとしていますが、ステップ0はext4パーティション(最初のLBAで指定)のファイル(inodeで指定)からステップ1をロードするブートローダーで始まります。もちろん、ブートする必要があり、QEMUを選択しました。何をすべきか?
これまでうまく機能するのは次のとおりです。
truncate -s64M /tmp/SomeVolume
/sbin/mke2fs -t ext4 -F /tmp/SomeVolume
yasm phase0.asm
dd if=phase0 of=/tmp/SomeVolume conv=notrunc
約64MBのボリュームを作成してext4でフォーマットし、最初の1024オクテットをPhase0で上書きしました(サイズは常に1024バイトです)。これは素晴らしい作品です。
しかし、もう少し現実的なシナリオに適しているかどうかをテストするために、適切に分割されたファイルを作成したいと思います。/sbin/cfdisk
私はボリュームファイルが利用可能であることを知っていますが、mke2fs
ファイルから範囲を選択できるパラメータはありません。
今知っていますループを利用したソリューションしかし、残念ながら私には機能しないようです(max_part
Debian jessieでは変更できないようです)。あるようだ他のモジュールが呼び出されます。nbd
ただし、モジュールと一緒にサーバーとクライアントがインストールされていません。そして、ユーザー空間で明らかにできることを行うには、ルートアクセスが必要であることは少し面白いです。
ユーザーとしてこれをどのように実行しますか?それとも、私が作成したext4形式のファイルの周りにMBR / GPTパーティションボリュームを構築する必要がありますか?
答え1
長い旅行。しかし楽しみのために:
1.
一時イメージを作成します。
$ truncate -s64MiB tmp.img
2.
次のコマンドを使用して2つのパーティションを作成しますfdisk
。
少し詳しく説明していますが、大丈夫です。
$ fdisk tmp.img
最初のパーティション:
: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>
2番目のパーティション:
: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)
私たちが書きたいものを印刷してください:
: x
: p
Nr AF Hd Sec Cyl Hd Sec Cyl Start Size ID
1 00 32 33 0 57 52 5 2048 81920 83
2 00 57 53 5 40 32 8 83968 47104 83
作成して終了します。
:w (Dont! forget ;-) )
40MiBと23MiBの2つのパーティションがあります。
81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB
3.
2 つのファイルシステムを作成します。
truncate -s40MiB ext4.img
truncate -s23MiB ext3.img
mke2fs -t ext4 -F -L part_ext4 ext4.img
mke2fs -t ext3 -F -L part_ext3 ext3.img
4.
すべて一緒に縫います。
2048*512
一時イメージから最初のバイトを抽出します。
dd if=tmp.img of=disk.img bs=512 count=2048
それらを結合しなさい:
cat ext4.img ext3.img >> disk.img
美しい。
答え2
あなたの質問を正しく理解したかどうかはわかりません。 VM イメージを分割する場合は、次のオプションがいくつかあります。
各パーティションにリニアモードでラウンドロビンまたはデバイスマッパーを使用します。フォーマットするためにこれらの設定を同時に行う必要はありません。
部分/パテックスループ/デバイスマッパーデバイスまたは一般ファイルで考慮すべきパーティションをカーネルに伝えます。
kpartx -av /path/to/file
または
losetup /dev/loopX /path/to/file kpartx -av /dev/loopX
これらのデバイスはデバイスマッパーデバイスです(つまり、
/dev/mapper
デフォルトではfromに接続されています)。使用
partprobe
losetup /dev/loopX /path/to/file partprobe /dev/loopX
これはカーネル上のパーティションをチェックすることによって
/dev/loopXpY
。仮想マシンからライブCD / USBイメージ(インストールプログラムの可能性があります)を起動し、内部でパーティションを分割します。これは、特別な形式(QEMUのqcow2など)で保存されている仮想マシンイメージに対しても仮想ドライブを分割できるという明らかな利点があります。
答え3
http://blog.lifebloodnetworks.com/?p=934
これに関する情報があるようです。生ディスクをループバックデバイスとしてマウントできるようです。
rawディスクイメージをループバックデバイスとしてマウントします。losetup /dev/loop0 [path to image]
kpartxを実行し、次の操作を行います。kpartx -va /dev/loop0
これにより、各Xが異なるパーティションである/ dev/mapper/loop0pXにパーティションが追加されます。
これで各パーティションをマウントできます。mount /dev/mapper/loop0pX /media/partition
バックアップに何も書き込まないようにするには、読み取り専用でマウントするだけです。mount -o ro /dev/mapper/loop0pX /media/partition
作業が終わったら清掃する必要があります。
取り外し:umount /media/partition
マッパー装置の取り外し:kpartx -d /dev/loop0
ループバック装置の除去:losetup -d /dev/loop0
これらのコマンドはすべてrootとして実行する必要があります。 loop0が使用中であると報告した場合は、別のループ装置(/ dev / loop1など)を選択してください。
-編集:rootではない間にこれをやりたいので、上記は役に立たないかもしれません。
答え4
max_partを台無しにする必要はありません。parted
ループデバイスにパーティションを作成したり、すでにpartprobe
存在する場合はアクティブにするために使用されます。テスト/不安定な parted バージョンにアップグレードする必要があるかもしれません。