Как я могу перечислить те файлы, которые предотвращают / не могут быть перемонтированы только для чтения?
А) 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 .