3

Так что у меня может быть случайный вид rm -r'd ~. Не волнуйтесь, у меня есть резервные копии! Я сделал быстрый список файлов diff, чтобы скопировать файлы, которые были удалены, все хорошо. Но...

Повреждает ли GNU rm файлы, если я прерываю его? Конечно, это было просто отключение гигабайт моих бесценных данных в секунду, а не удаление файла с самого диска?

2 ответа2

4

Нет. rm просто вызывает unlink() чтобы удалить имя. Этот системный вызов является атомарным, то есть он либо удаляет имя, либо нет. Это не может быть прервано. Если вы прервете rm, когда он unlink() несколькими файлами, некоторые файлы будут успешно удалены, а некоторые - нет. Ведение домашнего хозяйства, например освобождение блоков, которые использовался файлом, если все ссылки были удалены, является отдельной операцией и может быть выполнено позже, и если это прерывается (из-за сбоя питания или сбоя системы, не прерывая работу rm ), файловая система может потребовать fsck чтобы закончить, но большинство файловых систем в наши дни заносятся в журнал, поэтому им это не нужно. В любом случае, файл либо удален, либо нет, между ними нет.

2

Из Википедии

Чтобы быть более точным, rm удаляет ссылки на объекты из файловой системы, где эти объекты могли иметь несколько ссылок (например, файл с двумя разными именами), а сами объекты отбрасываются только тогда, когда все ссылки удалены и программы отсутствуют. все еще имеют открытые ручки для объектов.

Так что да, твоя несвязанная аналогия довольно хороша. Если у вас есть несколько жестких ссылок на файл, данные не будут помечены как не подлежащие удалению, пока не исчезнут все ссылки (символические ссылки не соответствуют требованиям, только жесткие ссылки).

Если у вас есть резервные копии, было бы неплохо сделать несколько хэшей md5 или sha1 для резервных копий и вашего домашнего каталога и отразить их, чтобы обнаружить любые изменения, но пока вы восстанавливаете отсутствующие файлы, файлы, которые застряли вокруг, не должны не страдает от коррупции.

Как всегда, YMMV.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .