Как восстановить в Linux удалённый, но ещё не закрытый процессом файл?

Аватар пользователя admin

Ситуации бывают разные и сбои и человеческий фактор. Что делать, если так получилось, что вы удалили нужный файл, но он остался открытым, потому что есть процесс который продолжает его использовать? Да, его реально можно восстановить, если вы используете файловую систему ext2 или ext3 или ext4. Рассмотрим как это сделать на примере.

Допустим у нас есть хост виртуализации, на котором работает несколько виртуальных машин. Образы дисков этих машин хранятся в каталоге /data/img,  при этом каталог /data смонтирован на разделе жёсткого диска /dev/sdb1. Пусть нужный нам образ называется vm01.raw. По неосторожности вы удалили этот файл, перепутав, что он больше не используется и такой виртуальной машины нет. Однако, оказалось, что произошла ошибка и данная виртуальная машина не только есть, но и работает в данный момент. Что делать?

1. Не паникуем. Выполняем команду:

# ps ax | grep qemu

чтобы получить номер процесса, обслуживающего данную виртуальную машину. Допустим вы нашли - это процесс с номером 20444.

2. Получаем список файлов, открытый данным процессом. Для этого надо установить (если это ещё не сделано) утилиту lsof:

# lsof -p 2044

вы получите что-то вида:

qemu-kvm 20444 qemu   15u      REG                8,2 32212283392  56098829 /data/img/vm01.raw (deleted)

в этой строчке нас интересует номер иноды (inode id) данного файла, в данном случае - это последняя цифра: 56098829

3. Далее выпоняем следующие команды:

# debugfs -w /dev/sdb1

debugfs 1.42.9 (28-Dec-2013)
debugfs:  cd img
debugfs:  ln <56098829> tmp
debugfs:  q

4. Теперь у вас в каталоге /data/img появится файл с именем "tmp" который является жёсткой ссылкой на удалённый файл с inode id 56098829. Поскольку в файловой системе ext* все жёсткие ссылки совершенно равнозначны друг с другом, то всё что вам теперь остаётся сделать, это остановить вашу виртуальную машину (можно даже не сейчас, а когда в этом возникнет необходимость), а затем переименовать файл "tmp" в "vm01.raw".

0
Ваш рейтинг: Нет