ディスク イメージをループ デバイス経由でマウントします (losetup -f image.img)。これにはパーティション テーブルが含まれており、カーネルにそれを強制的に読み取らせます: partprobe /dev/loop1。
/dev/loop1p1 をマウントし、修正したい部分を修正し、ファイルシステムをアンマウントします。ループバック デバイスからファイルを削除します (losetup -d /dev/loop1)。しかし、/dev/loop1p1 は消えません。
lodevice を再作成したり、fdisk 経由でパーティション テーブルを追加および削除したりしてみましたが、すべての試みは失敗しました。
パーティション テーブルが変更されました。
ioctl() を呼び出してパーティション テーブルを再読み取りします。
警告: パーティション テーブルの再読み取りがエラー 22 で失敗しました: 引数が無効です。カーネルは古いテーブルをまだ使用しています。新しいテーブルは、次回の再起動時、または partprobe(8) または kpartx(8) を実行してディスクを同期した後に使用されます。
パーティションはまったく使用されていないのですが、解放できません。再起動せずに削除する方法はありますか?
dmesg にはいくつかのレコードが表示されます:
[4649002.505727] loop1: rw=0、want=211812300、limit=62914560 [4649002.505753] デバイス loop1p1、論理ブロック 52952562 でバッファ I/O エラーが発生しています [4649002.505870] デバイスの末尾を超えてアクセスしようとしています
そして彼らは私のナギオスをうるさく言っています。
答え1
再起動するとカーネルが修正されるはずです。次回からは、losetup
と をpartprobe
手動で実行する代わりに、以下を使用しますkpartx
。
kpartx -v -a image.img
そしてそれを破壊するために:
kpartx -d image.img