削除されたがマウントされたループファイル/ファイルシステムの回復

削除されたがマウントされたループファイル/ファイルシステムの回復

誤ってlxcイメージファイルを削除しました。コンテナはまだ実行中なので、コンテナを停止する前にファイルは実際には削除されませんでした。非常に敏感なので、コンテナを停止しないでください。

次のコマンドを使用して削除されたファイルを見つけようとしましたが、 for i in $(ls /proc/|grep '^[0-9]*$'); do ls -l /proc/$i/fd|grep delete; done ループデバイスが見つかりませんでした。単純さと同じlsof | vm-

削除されていない他の画像に対してlsofを実行すると、その画像を使用するプロセスは表示されませんlsof /var/lib/vz/images/100/vm-100-disk-0.raw。それはおそらくプロセスではなくカーネルによって開かれたからです。

コメントで提案したとおり:

# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                          DIO
/dev/loop1         0      0         1  0 /var/lib/vz/images/200/vm-200-disk-0.raw (deleted)   0
/dev/loop0         0      0         1  0 /var/lib/vz/images/100/vm-100-disk-0.raw             0

私は試した:

debugfs /dev/mapper/pve-data
debugfs:  cd images/200
debugfs:  lsdel
 Inode  Owner  Mode    Size      Blocks   Time deleted
 0 deleted inodes found.

まだ削除されていないのでそうです。削除するようにしてここに表示され、破損しないことを望むのは少し危険です(300 GB以上)。

コンテナの内部にはmount次のものがあります。

/var/lib/vz/images/200/vm-200-disk-0.raw (deleted) on / type ext4 (rw,relatime,data=ordered)

ファイルシステム全体をダンプし、コンテナを完全に再作成する以外に、他の解決策はありますか? (また、ホストドライブがほぼいっぱいで、隣に2番目のコンテナを作成するスペースが少なくなりました。

ベストアンサー1

[完全な答えではありませんが、コメントが長すぎます。]

LOOP_GET_STATUSまたは、ioctlを使用してループデバイスのバックアップファイル(削除された可能性がある)のinodeを見つけることもできます。これはand構造のフィールドLOOP_GET_STATUS64です。.lo_inodeloop_infoloop_info64

この情報を公開するコマンドラインユーティリティが見つからないため、以下はトリックを実行する必要があるPerlシングルライナーです。

perl -le 'ioctl STDIN, 0x4C05, $s = pack "a512" or die "ioctl: $!"; print unpack "x[Q]Q", $s' </dev/loop1
1179684

loop(4)詳しくは、マンページとマニュアルを参照してください/usr/include/linux/loop.h

しかし、削除されたファイルをinodeに復元する安全な方法があるかどうかはわかりません。debugfs(8)マウントされたライブファイルシステムから回復できないほど破損せずにはできないと思います。絶対削除されたファイルへのリンクを作成します。

私が考えることができる唯一の安全な方法は、ループデバイス/パーティション全体がまだ存在している間にコピーすることです。

cp --sparse=always /dev/loop1 /path/where/to/save/it

おすすめ記事