ループなしで通常のファイルのボリュームを分割する方法は?

ループなしで通常のファイルのボリュームを分割する方法は?

私は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_partDebian 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 イメージを分割する場合は、次のオプションがいくつかあります。

  1. 各パーティションにリニアモードでラウンドロビンまたはデバイスマッパーを使用します。フォーマットするためにこれらの設定を同時に行う必要はありません。

  2. 部分/パテックスループ/デバイスマッパーデバイスまたは一般ファイルで考慮すべきパーティションをカーネルに伝えます。

    kpartx -av /path/to/file
    

    または

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

    これらのデバイスはデバイスマッパーデバイスです(つまり、/dev/mapperデフォルトではfromに接続されています)。

  3. 使用partprobe

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

    これはカーネル上のパーティションをチェックすることによって/dev/loopXpY

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

関連情報