Как я могу перечислить те файлы, которые предотвращают / не могут быть перемонтированы только для чтения?
А) fuser
можно найти в psmisc
упаковке; это случай использования, где я нахожу fuser
сияние и более полезным, чем lsof
.
# fuser -v -m / 2>&1 | grep '[Ff]r.e'
Это покажет все процессы, в которых есть файлы, открытые для чтения (f) и записи (F). Файлы, которые препятствуют / не могут быть перемонтированы в режим только для чтения, - это файлы, которые открыты для записи (F).
Убейте процессы, которые являются исполняемыми файлами, запускаемыми с файлами корневого каталога, открытыми для записи ., Т.е.
# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done
Это выше systemd
комментариев с оговоркой. Если systemd
есть, init
то fuser
увидим это и есть другие соображения. При systemd
запуске он может (пере) запускать процессы за вашей спиной, даже если они только что были идентифицированы и уничтожены fuser
. systemd
гораздо более продвинутый, чем традиционный sysvinit
.
Б) ОБНОВЛЕНИЕ в описании утверждает, что система имеет только ... init
и getty
все еще работает ...
Я вижу комментарий, который говорит, что система не использует systemd
, она использует init
. На участке systemd
есть init
. В комментарии явно не сказано sysvinit
, поэтому я предполагаю, что рассматриваемая система может использовать растяжение systemd
по умолчанию для init
. Или что другие люди, которые наткнулись на этот пост, которые используют стрейч systemd
, находят эту часть полезной.
Согласно вики Debian ,
Процесс инициализации системы обрабатывается демоном init. В squeeze и более ранних выпусках этот демон предоставляется пакетом sysvinit, и никакие альтернативы не поддерживаются. В wheezy по умолчанию демон init все еще работаетsysvinit
, но доступен «предварительный просмотр технологии» systemd. В jessie и stretch по умолчанию используется система инициализацииsystemd
, но поддерживается переключение на sysvinit.
Начиная с Джесси, полностью поддерживается только systemd; sysvinit в основном поддерживается, но пакеты Debian не обязаны предоставлять сценарии запуска sysvinit. runit также упакован, но не получил того же уровня тестирования и поддержки, что и другие, и в настоящее время не поддерживается как PID 1.
При systemd
запуске есть несколько дополнительных шагов, которые необходимо предпринять, чтобы освободить / перемонтировать их без проблем.
Скорее всего, system.slice
он содержит открытые файлы для systemd-journald.service
или systemd-udevd.service
(оба из которых имеют зависимости сокетов). Или, если NetworkManager
он запущен, он может перезапустить, dhclient
который записывает аренды в / var / ... (& / var / не всегда является его собственным устройством), и т. Д. fuser
Может найти и вы убьете, dhclient
но NetworkManager
запустит его снова.
Мораль в том, что многие вещи автоматизированы, которые могут «хотеть» / (и даже более того systemd
).
Чтобы быть уверенным, если это возможно, systemd
эквивалент уровня выполнения 1 соответствует rescue.target
(и runlevel1.target
является символической ссылкой на rescue.target
).
1) Начните с изоляции системы до rescue.target
# systemctl isolate rescue.target
Это должно побудить вас ввести пароль root; следуйте инструкциям на экране.
2) В спасательной оболочке узнайте, что хочет /.
# systemctl show -p Wants /
Как правило, это system.slice
; остановить все, что хочет /. например
# systemctl stop system.slice
3) На данный момент, перемонтирование не должно сообщаться mount: / is busy
и mount -o remount,ro /
должно работать. Если нет, проверьте снова с fuser
.
4) FWIW; Я также видел случаи, когда происходит umount
сбой, когда / если другое устройство монтируется в подкаталог другого монтирования, то есть во вложенные монтирования. Например, umount /
произойдет сбой, если / var / или / boot / находится на другом устройстве (и смонтировано). Хотя mount -o remount,ro /
все равно должно работать в этом случае.
lsblk
может быть полезно для визуализации вложенных монтировок.
Почему lsof + L1 больше не выводит список открытых файлов, которые не были связаны?
Поскольку они недоступны (сокеты или большинство FIFO и каналов), они больше не являются открытыми файлами (родительский процесс закрыл дескриптор файла) или у них (по-прежнему) количество ссылок больше 1.
man lsof (8) подробнее ...
+ | -L [l]
Эта опция включает ('+') или отключает ('-') перечисление количества ссылок на файлы, где они доступны - например, они недоступны для сокетов или большинства FIFO и каналов.
Если + L указан без следующего номера, будут перечислены все количества ссылок. Если указан -L (по умолчанию), количество ссылок не будет отображаться.
Если после + L следует число, в списке будут отображаться только файлы с числом ссылок меньше этого числа . (Никакое число не может следовать за -L.) Спецификация формы '' + L1 '' выберет открытые файлы, которые не были связаны. Спецификация формы +aL1 <file_system>
будет выбирать несвязанные открытые файлы в указанной файловой системе.
w
илиu
вFD
столбцеlsof
выходных данных, или дляF
в выходных данныхfuser -vm /
, например. Я не могу дать вам исчерпывающий список. Вы также можете установить пакет needrestart .