私は巨大で複雑なアプリケーションを開発しています。ディスクを接続してボタンを押すと、ディスクを分割してフォーマットしてマウントし、いくつかのファイルをコピーします。
このアプリケーションをテストするために、ディスクイメージのマウントを繰り返して同じプロセスを実行するテストシステムがあります。アプリケーションロジックを変更したことを除いて、テストシステムは機能しません。プログラムを与えると本物ディスク、すべて大丈夫です。ただし、ループデバイスを提供すると失敗します。
特に、アプリケーションはディスクを分割してフォーマットしてからパーティションをマウントできないと文句を言います。正確な命令は
mount /dev/vda /mnt --rw -o offset=111149056,sizelimit=314572800
(ここでは/dev/vda
単にシンボリックリンクです/dev/loop0
。直接引用しても違いはありませんloop0
。)
コマンドを手動で実行すると、次の結果が表示されます。
root# mount /dev/vda /mnt --rw -o offset=111149056,sizelimit=314572800
FUSE exfat 1.0.1
ERROR: exFAT file system is not found.
root# echo $?
1
このコマンドは引き続き実行できますが、機能しません。理由もなく、ただ理由もありません。
怖い部分は次のとおりです。実行しcfdisk /dev/vda
てから変更を適用せずにすぐに終了した場合今インストールされました!
何ですか地獄cfdisk
ディスクが突然動作し始めますか?このプログラムを呼び出す必要をなくすにはどうすればよいですか?
(私はそれを呼び出そうとしましたが、無駄になりました。sfdisk -R /dev/vda
単に「間違った引数」のようなものについて文句を言いました。)
電話をかけたり、他のことをするためにアプリを編むこともできますが、cfdisk -Ps /dev/vda
実際にはしたくありません。知りたいなぜこれらは必要です。アプリケーションを変更するまで、すべてがうまくいきました。
答え1
暗闇の中で突くのですが、実行cfdisk
時にカーネルパーティションテーブルを更新することもできますか?
あなたのアプリケーションロジックはループデバイスと互換性がありますか?
ディスクイメージファイルをフォーマットし、必要なパーティションを作成します。
-P
カーネルパーティションテーブルを更新するオプションでループバックデバイスを設定します。losetup -P /dev/loop0 <image file>
マウントパーティション:
mount /dev/loop0p1 /mnt
これにより、オフセットを心配する必要がなくなり、mount
コマンドが物理ディスクで使用されるコマンドに近づきます。 2 と 3 の間に異なるステップを追加してシンボリックリンクを作成することもできます。
答え2
カーネルはまず分割を理解する必要があります。ループデバイス(例/dev/loop0
:)を分割した後、実際にマウントすることはできません(分割は明らかにデバイスの先頭から始まりません)。物理ドライブの場合(少なくとも(S)ATAドライブから)パーティションテーブルを再読み込みするようにカーネルに指示できますhdparm -z
。
別のオプションは、デバイスからパーティションテーブル(必ずしもGPTまたはMBRである必要はありません)を検索し、パーティションデバイスファイルを生成する特別なユーティリティを使用することです。そのうちの1つはpartx
(util-linuxに付属)です。
答え3
テストフレームワークを少し変更したところ、問題は消えました。
kpartx -u /dev/vda
特にデバイスを再分割した後は電話をかけませんが、kpartx -d
今はkpartx -a
すべて正常です。奇妙な...