私は 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
約 64 MB のボリュームを作成し、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 ;-) )
40 MiB と 23 MiB の 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 イメージをパーティション分割しようとしている場合、いくつかのオプションがあります。
各パーティションに対してループまたはデバイス マッパーを線形モードで使用します。フォーマットのためにこれらを並列に設定する必要はありません。
パートx/kpartxループ/デバイス マッパー デバイスまたは通常のファイル上でどのパーティションを考慮するかをカーネルに指示します。
kpartx -av /path/to/file
または
losetup /dev/loopX /path/to/file kpartx -av /dev/loopX
デバイスはデバイス マッパー デバイスです (つまり、
/dev/mapper
デフォルトで からリンクされています)。使用して
partprobe
losetup /dev/loopX /path/to/file partprobe /dev/loopX
これにより、カーネルにパーティションをチェックするように指示し、 が作成されます
/dev/loopXpY
。VM でライブ CD/USB イメージ (インストーラーでも可) を起動し、内部からパーティション分割を行います。これには、特殊な形式 (たとえば QEMU の qcow2 など) で保存された VM イメージでも仮想ドライブをパーティション分割できるという明らかな利点があります。
答え3
http://blog.lifebloodnetworks.com/?p=934
これについてはいくつか情報があるようです。raw ディスクをループバック デバイスとしてマウントできるようです。
生のディスク イメージをループバック デバイスとしてマウントします。losetup /dev/loop0 [path to image]
kpartx を実行し、次の操作を実行します。kpartx -va /dev/loop0
これにより、パーティションが/dev/mapper/loop0pXに追加されます。各Xは異なるパーティションです。
これで各パーティションをマウントできます。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 など) を選択します。
-編集: これを非ルートで実行したいようですので、上記は役に立たないかもしれません。
答え4
max_part を変更する必要はありません。parted
ループ デバイスにパーティションを作成するか、partprobe
すでに存在する場合はアクティブ化するために使用します。testing/unstable の parted バージョンにアップグレードする必要があるかもしれません。