ループなしで通常のファイル内のボリュームをパーティション分割するにはどうすればよいですか?

ループなしで通常のファイル内のボリュームをパーティション分割するにはどうすればよいですか?

私は 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 イメージをパーティション分割しようとしている場合、いくつかのオプションがあります。

  1. 各パーティションに対してループまたはデバイス マッパーを線形モードで使用します。フォーマットのためにこれらを並列に設定する必要はありません。

  2. パートx/kpartxループ/デバイス マッパー デバイスまたは通常のファイル上でどのパーティションを考慮するかをカーネルに指示します。

    kpartx -av /path/to/file
    

    または

    losetup /dev/loopX /path/to/file
    kpartx -av /dev/loopX
    

    デバイスはデバイス マッパー デバイスです (つまり、/dev/mapperデフォルトで からリンクされています)。

  3. 使用してpartprobe

    losetup /dev/loopX /path/to/file
    partprobe /dev/loopX
    

    これにより、カーネルにパーティションをチェックするように指示し、 が作成されます/dev/loopXpY

  4. 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 バージョンにアップグレードする必要があるかもしれません。

関連情報