Почему выключение компьютера после плохого `rm` сохранения моих файлов?


31

Классическая ситуация: я запустил плохо rmи сразу после этого понял, что удалил не те файлы. (Ничего критического, и у меня были сносные недавние резервные копии, но все еще раздражает.)

Зная, что дальнейшая активность на диске была моим врагом, если я хотел восстановить файлы с помощью extundeleteтаких инструментов, я сразу же выключил машину физически (т. Е. С помощью кнопки питания, а не с помощью haltлюбой такой команды). Это был ноутбук без каких-либо важных задач или что-то открытое, так что это была приемлемая операция. (Кстати, с тех пор я узнал, что первое, что нужно сделать в такой ситуации, - это сначала оценить, могут ли отсутствующие файлы все еще открываться процессом /unix//a/101247 - если они есть, вы должны восстановить их таким образом, а не выключать машину.)

Тем не менее, когда машина была выключена, я немного подумал и решил, что файлы не стоят затрат времени на загрузку работающей системы для надлежащей криминалистики. Поэтому я снова включил машину. А потом я обнаружил, что мои файлы все еще находятся на диске: rmони не были распространены на диск до того, как я выключился. Я немного потанцевал и поблагодарил бога сисадминов за его неожиданное прощение.

Мой вопрос теперь состоит в том, чтобы понять, как это было возможно, и какова типичная задержка перед rmфактическим распространением на диск. Я знаю, что дисковый ввод-вывод не сразу очищается, но он некоторое время находится в памяти, но я подумал, что журнал диска быстро убедится, что ожидающие операции не будут полностью потеряны. /unix//a/78766, похоже, намекает на отдельный механизм очистки грязных страниц и операций журнала, но не дает достаточно подробных сведений о том, как журнал будет задействован для rm, и ожидаемой задержке до операции сбрасываются.

Еще несколько подробностей: данные были в разделе ext4 внутри тома LUKS, и при перезагрузке машины я увидел следующее syslog:

Sep 24 10:24:58 gamma kernel: [   11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [   11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [   11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)

но я не уверен, что это связано с rm.

Другой вопрос заключается в том, существует ли способ заставить ядро ​​не выполнять какие-либо ожидающие операции с диском (а, скажем, вывести их куда-нибудь), а не выключать компьютер. (Конечно, звучать опасно - не выполнять ожидающие операции, но это то, что произойдет при выключении машины в любом случае, и в некоторых случаях это может вас спасти.) Конечно, это будет «чище», а также интересно например, для удаленных серверов, где физическое отключение не является простым вариантом.

Ответы:


22

Похоже, у вас есть хорошее представление о том, что произошло.

Да, поскольку вы отключили питание системы до того, как ваши изменения были зафиксированы на диске, они были там, когда вы загрузились обратно.

Система кэширует все записи перед их сбросом на диск. Есть несколько опций, которые управляют этим поведением, все они расположены в /proc/sys/vm/dirty_* [ kernel doc ] . Если очистка явно не выполняется приложением через fsync() [ man 2 fsync ] , данные фиксируются , когда они либо достаточно стары, либо кэш записи заполнен.
Определение «данные», как использовано выше, включает в себя модификацию записи каталога для удаления файла.

Теперь, что касается журнала, это одно из распространенных заблуждений о том, для чего предназначен журнал. Цель журнала - не гарантировать, что изменения будут воспроизведены или данные не будут потеряны. Цель журнала - предотвратить повреждение самой файловой системы, а не файлов в ней. Журнал просто содержит информацию о внесенных изменениях, а не (как правило) полные данные самого изменения. Точные данные зависят от файловой системы и режима журнала. Для ext3 / 4 см. dataПараметр монтирования в man 8 mount.


Чтобы ответить на ваш дополнительный вопрос о том, есть ли способ предотвратить ожидающие записи без перезагрузки:

После быстрого прочтения исходного кода ядра создается впечатление, что вы можете использовать магическую uкоманду sysrq ([ wikipedia ], [ kernel doc ]) для выполнения экстренной операции только для чтения. Похоже, что это немедленно перемонтирует все тома только для чтения без операции синхронизации.

Чтобы использовать это, просто нажмите Alt+ SysRq+ u.


1
Спасибо за этот ответ! Я все еще немного запутался в журнале: должен ли я думать о нем как о чем-то, что включается только тогда, когда изменения записываются на диск, так что кэширование записи является единственным подходящим механизмом для оценки времени отсрочки перед записью rm? Другими словами, вещи передаются в журнал только тогда, когда запись вот-вот должна быть выполнена? Или картина сложнее? Что касается alt-sysrq-u, это довольно изящная идея. У вас есть ссылка на претензию "Похоже"? (Похоже, это не следует из ссылок, которые вы дали.) Спасибо! :)
a3nm

Кроме того, у магического sysrq есть ограничение, что вы все еще не можете сделать это на удаленной машине.
3

3
@ a3nm Вы можете использовать sysrq на удаленной машине. echo u > /proc/sysrq-trigger(возможно, вам нужно сначала активировать его).
Пауло Алмейда,

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

@ a3nm Что касается вашего комментария в журнале. Кэш записи находится между журналом и диском. Когда вы записываете в файловую систему, журнал обновляется, затем файловая система, но ни одна из них еще не записана на диск.
Патрик

2

От: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt

commit = nrsec (*) Ext4 может предписывать синхронизировать все свои данные и метаданные каждые nrsec секунд. Значение по умолчанию составляет 5 секунд. Это означает, что если вы потеряете свою мощность, вы потеряете столько же, сколько и последние 5 секунд работы (однако, благодаря журналированию ваша файловая система не будет повреждена). Это значение по умолчанию (или любое низкое значение) ухудшит производительность, но это хорошо для безопасности данных. Установка его в 0 будет иметь тот же эффект, что и установка по умолчанию (5 секунд). Установка очень больших значений улучшит производительность.

Также смотрите здесь о том, как их очистить: как вы очищаете буферы и кеш в системе Linux?

Цитируется по вышеуказанной ссылке:

ПРИМЕЧАНИЕ: очистите память от ненужных вещей (Kernerl 2.6.16 или новее). Всегда сначала запускайте синхронизацию, чтобы записать полезные вещи на диск !!!

To free pagecache:

$ echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

$ echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

$ echo 3 > /proc/sys/vm/drop_caches

Спасибо за этот ответ! Тем не менее, я не понимаю этого: что касается этой «синхронизации», которая упоминается в commit=nrsecстатье, произойдет ли это после того, как ядро ​​решит сбросить изменения из памяти на диск? Или установка commit=1гарантирует , что все изменения будут сброшены после 1 секунду независимо от dirty_expire_centisecsи dirty_writeback_centisecsнастроек?
a3nm

Ядро будет сбрасывать (синхронизировать) любой кеш / буферы на диск каждую 1 секунду commit=1. Насколько я понимаю, syncзаставляет все происходить независимо от настроек виртуальной памяти, хотя это может произойти раньше.
Дэвид

Кроме того, по соображениям производительности (и долговечности хранилища) установка фиксации ниже значения по умолчанию не рекомендуется.
Дэвид
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.