Перерахуйте зайнятий диск в режим лише для читання


19

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

Що я спробував:

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

    Проблема . Це спричинило помилку пристрою, оскільки деякі процеси використовували розділ. Я не хочу вбивати процеси за допомогою диска. Я хочу імітувати диск, який раптово переходить у режим лише для читання, коли процеси ще використовують його.

  2. Використовується магічний ключ sysrq, як нижче

    echo u > /proc/sysrq-trigger
    

    Проблема : це зробить усі дискові розділи лише для читання (хоча пристрій зайнято). Але через 20-30 хвилин машина перезавантажується сама. Деякі машини перезавантажуються відразу після виконання цієї команди. Не впевнений, що викликає цю перезавантаження. Я не хочу, щоб машина перезавантажувалась і мені потрібно тримати диск у режимі лише для читання протягом 30+ хвилин.

Питання : Чи є кращий спосіб змусити один диск розділити лише для читання і підтримувати його в такому стані протягом півгодини та повернути його в режим читання-запису, не викликаючи перезавантаження в процесі?


3
Ви розглядали fsfreeze -f? Він точно не перераховує файлову систему лише для читання. Натомість він блокує всіх авторів до тих пір, поки fsfreeze -u. Але це схоже ...
Селада

Дякую Селада! це гарна ідея! .. Зараз у мене не працює fsfreeze в моїй машині, але я спробую це.
AdithyaCS

Я спробував, fsfreeze -fі в моєму випадку це було більше "os заморозки". Може, тому, що записи були заблоковані, а не відхилені?
Пьотр Фіндейзен

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 Findeisen

@PiotrFindeisen ви запустили це як root?
hanshenrik

@hanshenrik я гадаю так
Piotr Findeisen

4

Використовуйте mountопцію force (якщо припустимо, що у вашої версії є GNU mount, але BSD і macOS, наприклад, роблять):

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

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


1
@psusi немає. Це дозволило мені переписати /розділ ext4 .
Piotr Findeisen

2
Виявляється, я думав umount -f, але я просто спробував перерахувати на ro, і хоча команда -f робить команду не повертати помилку, файлова система насправді не робиться лише для читання.
psusi

1
@psusi, не дивно. Я не сподівався б на будь-який єдиний підхід до роботи у всіх випадках. Це працює для мене повторюваністю (ext4 кореневий розділ на малину для справи) - і я маю в виду перемонтажа в RO, що не ігноруючи помилки - так що я думаю , буде працювати для деяких, але не всі, і інші випадки. Вибачте, це не включало ваше.
Пьотр Фіндейзен

13
людина гору каже, що -fє --fake. Цитата: "Викликає все, за винятком фактичного системного виклику; якщо це не очевидно, це" підробка "монтажу файлової системи. Цей параметр корисний у поєднанні з прапором -v для визначення того, що намагається виконати команда mount. Він також може бути використаний для додавання записів для пристроїв, які були встановлені раніше за допомогою параметра -n. Параметр -f перевіряє наявність наявного запису в / etc / mtab і виходить з ладу, коли запис вже існує (при регулярному неправдивому монтажі, ця перевірка виконується ядром). "
Буде Менлі

3
BSD і, отже, macOS кріплення ' -f дійсно означає "сила".
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.