誤って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_inode
loop_info
loop_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