Почему возможно восстановить удалённый файл? Потому что он состоит из трех сущностей — запись в каталоге с соответствием имени и inode, самой inode и блоков данных.
При удалении файла стирается запись в каталоге, а inode и блоки помечаются как свободные. В них остаются данные до тех пор, пока они не будут использованы заново.
Тут есть важный нюанс: Если какой-то процесс держит удалённый файл открытым, то inode и блоки данных не будут помечены свободными, пока не будет закрыт последний файловый дескриптор, указывающий на файл. В этом случае восстановить удалённый файл очень просто с помощью программы R-Linux.
В моём примере я удалю файл безвозвратно файл с виртуального сервера и держать открытым его никто не будет.
Возьмём систему Debian 11 и файловую систему ext4. Удалим стартовую страницу nginx — /var/www/html/index.nginx-debian.html
# rm -f /var/www/html/index.nginx-debian.html
Если вы хотите с максимальной вероятностью восстановить файл, то вам надо тут же выключить машину, сделать копию виртуального диска и работать уже с ним. Подключить его к другой виртуалке, загрузиться с LiveCD и все дальнейшие действия делать там. Так вы максимально снизите шанс того, что освобождённое после удаления файла место будет перезаписано.
Я подключил к этой виртуальной машине CD-ROM, вставил туда LIVE образ Debian 11 с xfce и загрузился с него.
Далее установил RLinux5. Можно скачать с сайта через браузер, либо через консоль:
# wget https://www.r-studio.com/downloads/RLinux5_x64.deb
# dpkg -i RLinux5_x64.deb
Запустил RLinux. Программа с графическим интерфейсом, так что работать с ней легко. Она увидела мой жёсткий диск и все разделы на нём. Я выбрал раздел, на котором был удалён файл и выполнил сканирование уровня detailed. Затем открыл обзор файлов на этом же разделе.
Пошёл в директорию /var/www/html/ и увидел там свой файл, помеченный как удалённый. Там же можно выбрать этот файл и нажать кнопку Recover. Программа сообщила, что файл восстановлен. Я обрадовался, что всё получилось так просто и быстро. Но радоваться было рано. Файл оказался пустым.
Тут я приуныл. В данном эксперименте условия идеальные. Файл с очень большой долей вероятности должен быть цел. Решил выполнить поиск по всем удалённым файлам. Получил большой список файлов с названиями вида $inodeindx0001ff23. Стал выборочно проверять те, которые по размеру могут быть похожи на удалённый файл. И нашёл его. Результат на картинке. Выбрал файл, нажал Recover и сохранил его в другое место.
Вот так на практике можно попробовать восстановить то, что было случайно удалено. Я подозреваю, что не до конца разобрался, как правильно осуществить поиск в этой программе, поэтому пришлось вручную копаться в удалённых файлах. У них было корректное время изменения (не удаления), так что можно было хотя бы по этому признаку сузить поиск.
Заметку имеет смысл сохранить и надеяться, что никогда не пригодится. Тут готовая инструкция как с большой долей вероятности восстановить случайно удалённый файл, если действовать оперативно. Но вообще программа R-Linux умеет много всего: восстанавливать разделы, файловые системы, делать корректно образы с повреждённых дисков и т.д. На сайте подробно всё описано.
Замечание: Увы, на сервере, в инфраструктуре BareMetal, а проще говоря на "железном" сервер с SSD это все может не сработать.
При удалении файла или форматировании раздела система немедленно посылает команду TRIM и данным можно помахать ручкой. Даже если вы тут же выключите ПК. Стоит подать питание на накопитель и сборщик мусора спокойно начнет очищать ячейки. Возможно, вы еще успеете увидеть какие-то файлы при сканировании, реальный шанс восстановить - нулевой.
На дисках виртуальных серверов, с вероятностью 99%, TRIM не работает, либо дисковая подсистема гипервизора собрана в конфигурации не поддерживающей TRIM, поэтому файл удалось восстановить.