私は巨大で複雑なアプリケーションを開発しています。ディスクを接続してボタンを押すと、ディスクを分割してフォーマットしてマウントし、いくつかのファイルをコピーします。
このアプリケーションをテストするために、ディスクイメージのマウントを繰り返して同じプロセスを実行するテストシステムがあります。アプリケーションロジックを変更したことを除いて、テストシステムは機能しません。プログラムを与えると本物ディスク、すべて大丈夫です。ただし、ループデバイスを提供すると失敗します。
特に、アプリケーションはディスクを分割してフォーマットしてからパーティションをマウントできないと文句を言います。正確な命令は
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 の間に異なるステップを追加してシンボリックリンクを作成することもできます。