У меня часто возникают проблемы с размонтированием каталога:
umount / mnt / dir umount: / mnt / dir: устройство занято
Существует множество причин, по которым устройство занято. Иногда выполняются процессы с открытыми блокировками, иногда есть другие каталоги, смонтированные поверх них /mnt/dir
.
Мой вопрос:
Какие шаги нужно проверить, почему каталог не может быть размонтирован.
Я знаю, что есть много причин, но это нормально, если вы объясните конкретное решение.
[РЕДАКТИРОВАТЬ]
[X] запуск процессов на подключенных томах.
[X] другой том монтируется поверх тома, который мы хотим размонтировать
[_] NFS блокирует том, который мы хотим размонтировать
Ответы:
Способ проверить
fuser -vm /mnt/dir
, который должен быть запущен от имени пользователя root. Он скажет вам, какие процессы обращаются к точке монтирования.Альтернатива
lsof /mnt/dir
, которая покажет каждый открытый файл на монтировании. Опять лучше всего запускать с правами root.Вы можете запустить любой из них как не-root, но тогда вывод будет ограничен вашими процессами - те, что от других пользователей, будут просто молча не показываться, даже если они будут препятствовать размонтированию файловой системы.
Пример:
Поле «доступ» сообщает вам, как к нему обращаются. В этом случае ядро использует его в качестве монтирования (да, но с размонтированием все будет в порядке только с этим).
bash
имеет текущий рабочий каталог (cd
перед размонтированием должен перейти в другой каталог), а у gvim есть текущий каталог и открытый файл (необходимо закрыть этот gvim).В этом выводе вы можете увидеть текущие каталоги для bash и gvim (как тип
DIR
). Вы также можете увидеть, какой файл gvim открыт для записи.Как заставить проблему:
fuser
есть-k
опция, которая отправляет сигнал (по умолчанию:)SIGKILL
каждому процессу, используя монтирование. Это довольно силовой способ не дать маунту быть занятым. (И конечно, будь осторожен с тем, что тыSIGKILL
!)umount
имеет-l
возможность выполнить ленивое размонтирование. Монтирование будет удалено из пространства имен файловой системы (так что/mnt/Zia/src
в этом примере вы его больше не увидите ), но оно остается смонтированным, поэтому программы, обращающиеся к нему, могут продолжать это делать. Когда последняя программа, получающая доступ к нему, завершает работу, произойдет размонтирование.Существует еще одна решаемая причина сбоя при размонтировании, и это отказ сервера NFS. Здесь вы можете использовать
umount -f
, но вы рискуете потерей данных, если вы это сделаете. (Возможно, клиент кэшировал записи, которые еще не были подтверждены сервером, и эти записи будут отброшены. Однако приложениям уже было сообщено, что запись прошла успешно.)источник
fuser -k
это чрезвычайно рискованно, так как вы будете делать это как root, и если вы не очень уверены в том, какие процессы будут убиты, вы можете нанести действительно впечатляющий урон с помощью небрежной команды ...-k
опции, так что вы будете знать, какие процессы вы собираетесь убить. Но я добавлю в предупреждение.fuser -vm
показал "монтирование ядра". пришлось делатьsystemctl stop opt.mount
вместо мануалаumount
.umount -f
и NFS. Моя проблема была связана с NFS, когда мои dev-машины меняли IP-адреса, и я не мог удалить общий ресурс.Вы должны использовать:
источник
-l
именно тот вариант, который можно использовать, даже если-f
он не работает.Другой том монтируется поверх тома, который мы хотим отключить:
Команда
mount
позволяет вам знать все подключенные тома, если они вызываются без аргументов или опций (кроме-v
). Вы можете получить список активных точек монтирования, добавив немного perl:Затем просто наведите курсор на точку mointpoint, с которой вы хотите отключиться, и вы узнаете, есть ли над ней смонтированные файловые системы.
Тогда у вас есть два решения . Либо размонтируйте файловые системы, либо переместите их с помощью
mount --move olddir newdir
(ядро> 2.5.1)источник
Открытые файлы
Процессы с открытыми файлами являются обычными виновниками. Показать их:
Преимущество использования
/dev/<device>
вместо/mountpoint
: точка монтирования исчезнет послеumount -l
или может быть скрыта наложенным монтированием.fuser
Также можно использовать, но на мой взгляд,lsof
есть более полезный вывод. Однакоfuser
это полезно, когда дело доходит до уничтожения процессов, вызывающих ваши драмы, чтобы вы могли продолжить свою жизнь.Список файлов
<mountpoint>
(см. Предостережение выше):Интерактивно уничтожать только процессы с открытыми для записи файлами:
После перемонтирования только для чтения (
mount -o remount,ro <mountpoint>
) можно (r) убить все оставшиеся процессы:точки монтирования
Виновником может быть само ядро. Другая файловая система, смонтированная в той файловой системе, к которой вы пытаетесь
umount
, вызовет горе. Проверить с:Для петлевых монтировок также проверьте вывод:
Анонимные иноды (Linux)
Анонимные иноды могут быть созданы:
open
сO_TMPFILE
)Это самый неуловимый тип покемона, и появляются в
lsof
«sTYPE
столбец какa_inode
(который без документов наlsof
странице человека ).Они не появятся
lsof +f -- /dev/<device>
, поэтому вам нужно:Для процессов уничтожения, содержащих анонимные inode, смотрите: Список текущих наблюдений inotify (pathname, PID) .
источник
Вопрос о том, как проверить, имеет ли NFS доступ к каталогу, который собирается размонтировать, до сих пор остается без ответа.
Что у меня есть только это:
Проверьте, работает ли nfsd:
Показать подключенные каталоги по клиентам:
и
showmount
без аргументов показывает только клиентские хосты, даже если они не в сети. Я предполагаю, что это особое поведение NFS.источник
Для меня проблема заключалась в том, что я входил в систему более одного раза (через ssh), и во время одного из входов в систему я находился в командной строке, где pwd находился внутри папки, подчиненной точке монтирования.
источник