Переустановите занятый диск в режим только для чтения

19

Я хочу заставить раздел диска работать только в режиме чтения и держать его только для чтения более 30 минут.

Что я пробовал:

  1. mount -o remount,ro (partition-identifier) (mount-point) -t (filesystem)

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

  2. Используется волшебный ключ sysrq, как показано ниже

    echo u > /proc/sysrq-trigger
    

    Проблема : это сделает все разделы диска доступными только для чтения (хотя устройство занято). Но через 20-30 минут машина сама перезагружается. Некоторые машины перезагружаются сразу после выполнения этой команды. Не уверен, что вызывает эту перезагрузку еще. Я не хочу, чтобы машина сама по себе перезагружалась, и мне нужно держать диск в режиме «только чтение» более 30 минут.

Вопрос : Есть ли какой-нибудь лучший способ заставить один раздел диска работать только для чтения, поддерживать его в таком состоянии в течение получаса и переводить его в режим чтения-записи, не вызывая перезагрузки в процессе?

AdithyaCS
источник
3
Вы рассматривали fsfreeze -f? Он точно не перемонтирует файловую систему только для чтения. Вместо этого он блокирует всех авторов до fsfreeze -u. Но это похоже ...
Celada
Спасибо, Селада! Это хорошая идея! .. Сейчас у меня не работает fsfreeze на моей машине, но я попробую это.
AdithyaCS
Я пытался, fsfreeze -fи в моем случае это было больше "заморозить ОС". Может быть, потому что записи были заблокированы, а не отклонены?
Петр Финдейзен
fsfreezeсделал мою систему недоступной, и я не мог ввести команду разморозки, не имея возможности переключиться обратно на терминал, и пришлось перезагрузить компьютер. Так что будьте осторожны ! :)
Алекс

Ответы:

16

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

Вы можете использовать, umount -lчтобы освободить точку монтирования и предотвратить открытие других файлов, но оставьте файловую систему смонтированной и оставьте процессы, которые уже открыли файлы, работающими в обычном режиме.

Я не могу придумать общий способ заставить файловую систему перемонтироваться только для чтения, когда этого не должно быть. Однако, если файловая система поддерживается блочным устройством, вы можете сделать блочное устройство доступным только для чтения , например:

echo 1 >/sys/block/dm-4/ro
echo 1 >/sys/block/sda/sda2/ro

echo u > /proc/sysrq-triggerэто довольно экстремальный способ принудительного перемонтирования только для чтения, поскольку он затрагивает все файловые системы. Он предназначен как последний способ оставить файловую систему в чистом состоянии перед перезагрузкой.

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

Жиль "ТАК - прекрати быть злым"
источник
2
К сожалению, это не переносимое решение. На малину я получаю: « echo 1 | sudo tee /sys/block/mmcblk0/mmcblk0p2/ro
Петр Финдейзен
.. и echo u > /proc/sysrq-triggerэто не только экстремально, но также может заставить вас перезагрузиться, если вы хотите перемонтировать обратно RW. Когда я попробовал это, а затем перемонтировал (с mount..), dmesgсказал: «Не удалось перемонтировать RDWR из-за необработанного списка инодов-сирот. Пожалуйста, перемонтируйте / перемонтируйте вместо этого»
Piotr
@PiotrFindeisen ты запускал это как root?
hanshenrik
@hanshenrik Я так думаю
Петр Финдейзен,
4

Используйте mountопцию Force (при условии, что у вашего монтирования есть; у GNU mountнет, но, например, у BSD и macOS):

mount -f -o remount,ro /mount/point

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

Петр Финдейзен
источник
1
@psusi нет. Это позволило мне перемонтировать /раздел ext4 .
Петр Финдейзен
2
Оказывается, я думал об этом umount -f, но я только что попробовал перемонтировать в ro, и хотя -f заставляет команду не возвращать ошибку, файловая система фактически не сделана только для чтения.
Псуси
1
@psusi, не удивительно. Я не ожидал бы, что какой-либо один подход будет работать во всех случаях. Это сработало для меня многократно (корневой раздел ext4 на raspberry) - и я имею в виду перемонтирование в RO, а не игнорирование ошибок - так что я думаю, что это будет работать в некоторых, но не во всех других случаях. Извините, это не относится к вашему.
Петр Финдейзен,
13
Человек Маунт говорит, что -fесть --fake. Цитата: «Заставляет делать все, кроме самого системного вызова; если это не очевидно, это« подделка », монтирующая файловую систему. Этот параметр полезен в сочетании с флагом -v, чтобы определить, что пытается выполнить команда mount do. Его также можно использовать для добавления записей для устройств, которые были смонтированы ранее с параметром -n. Параметр -f проверяет существующую запись в / etc / mtab и завершается ошибкой, когда запись уже существует (при обычном не поддельном монтировании, эта проверка выполняется ядром). "
Уилл Мэнли
3
BSD и, следовательно, macOS mounts ' -f действительно означает «сила».
Тердон