Я использую Debian Stretch. Мой корневой раздел смонтирован read-only
. Только когда я устанавливаю или обновляю пакеты, /
перемонтируется read-write
(с помощью apt hook), а затем перемонтируется обратно ro
.
Иногда после обновления пакета я не могу перемонтировать /
обратно только для чтения:
mount -o remount,ro /
mount: / is busy
В старых версиях Debian (Wheezy) я мог перечислить открытые файлы, которые не были связаны с lsof
:
lsof +L1
или, более конкретно, файлы, которые препятствуют /
повторному подключению к ro:
{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'
Тем не менее, в Debian Stretch lsof +L1
не перечисляются никакие файлы.
Я не вижу каких - либо изменений +|-L
в man lsof
том , что бы объяснить , почему он перестал работать.
Почему lsof + L1 больше не выводит список открытых файлов, которые не были связаны?
Как я могу перечислить те файлы, которые предотвращают / не могут быть перемонтированы только для чтения?
ОБНОВИТЬ
Я остановил все процессы, которые можно остановить, и только они есть init
и getty
работают, но я все еще не могу перемонтировать /
их ro
.
w
илиu
вFD
столбцеlsof
выходных данных, или дляF
в выходных данныхfuser -vm /
, например. Я не могу дать вам исчерпывающий список. Вы также можете установить пакет needrestart .root
?fuser -m /
говорит что использует root?Ответы:
Как я могу перечислить те файлы, которые предотвращают / не могут быть перемонтированы только для чтения?
А)
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 ,
При
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) подробнее ...
источник
Вы
/proc
установили?По-видимому, будучи тем, кто
/
большую часть времени заботится о том, чтобы монтировать его только для чтения, я могу себе представить, что вы также можете не монтировать procfs. Но для этого нужноlsof
найти открытые файлы.Файлы, открытые процессами, открываются ядром через символические ссылки в procfs. Каталоги
/proc/<pid>/fd
содержат символическую ссылку для каждого открытого файла. Имя символических ссылок - это номера дескрипторов файлов, а путь, на который ссылается символическая ссылка, - это путь к файлу.Висячие символические ссылки все еще остаются
/proc
для открытых файлов, которые уже удалены. И указанный путь к файлу переименовывается в конец (удалено).Что
lsof +L1
, по сути, ничем не отличается от быстрого однострочного:Таким образом, вы можете использовать похожую однострочную, чтобы перечислить все открытых файлов, которые могут помешать перемонтированию корневой файловой системы (при условии работы
/proc
).Однако, если вы сделали / сделали
/proc
монтирование, единственные другие причины, о которых я могу думать, это ошибки ... В любом случае, к вашему сведению, в моей нынешней системе Debian Stretch.lsof +L1
работает как положено.источник
/proc
смонтировал Я не слежу за твоими рассуждениями, почему у меня их не было. В любом случае,stat -c%N /proc/[0-9]*/fd/* | grep deleted
ничего не показывает мне.Я мог воспроизвести эту проблему только один раз, и решил ее, просто используя
mount
с -n опцией.Цитирую man mount :
Сама
mount
программа, открывающая файл (ы) для записи в корневой файловой системе, звучала для меня как правдоподобное объяснение. Конкретноmount
пишет/etc/mtab
ведь и/etc
часто является частью корневой файловой системы. Однако я не мог воспроизвести это снова на той же машине после того, как я сделал это однажды ...Может ли это решить вашу проблему?
источник
-n
с mount не имеет значения.Без видимости вашей системы очень сложно точно сказать, в чем проблема. Комментарии и предыдущие ответы - хорошее начало.
Тем не менее, я бы прошел весь путь через вики Debian, в которой описаны prereq для монтирования / только для чтения.
Ссылка на документацию находится здесь: https://wiki.debian.org/ReadonlyRoot
Большой, я проведу тебя через здесь:
1 - есть определенные места в /, которые должны быть прочитаны и записаны. На основании документации это выглядит примерно так:
Ваши блочные устройства, вероятно, будут другими, в зависимости от конфигурации стека хранения (разделов, lvm без разделов и т. д.), но основная идея заключается в том, что вам нужны эти 4 точки монтирования, чтобы их последующая смонтированная файловая система имела опцию монтирования RW.
2 - в / etc есть несколько специальных файлов, для которых вам нужно либо создать символическую ссылку, либо внести некоторые другие изменения (подробно описано в связанной статье). Они могут или не могут применяться в зависимости от того, какие приложения работает ваш сервер Linux. некоторые файлы могут даже не существовать на вашем компьютере, но я включил все в документы. Имейте в виду, я настоятельно рекомендую вносить эти изменения, даже если вы убили pid процесса. Вот пути непосредственно из вики Debian:
После того, как вы проверили все вышеперечисленное и подтвердили, что они соответствуют спецификации в вики, следующая вещь, которую нужно проверить, это /etc/apt/apt.conf
на основании вашей ошибки последнее, что вы можете проверить на основании документации, приведено ниже:
«После обновления пакетов вы можете столкнуться с проблемой, при которой mount отказывается перемонтировать файловую систему, сообщая вам только« / is busy ». Это вызвано тем, что удаленные файлы все еще используются процессом. Чтобы выяснить, какие процессы используют удаленные файлы, используйте инструмент checkrestart (1) из пакета debian-goodies или используйте следующую команду. Часто это демоны, использующие обновленные библиотеки. нужно перезапустить их, чтобы файлы были освобождены. "
Команда предоставлена в док .:
Не зная вашей точной конфигурации файловой системы, разбиения на разделы и конфигурации устройства хранения, трудно дать вам что-то еще. Я бы начал с возвращения и перепроверки ваших предварительных требований в документации (и обрисованной в общих чертах выше).
источник