Linux: Какой процесс вызывает "устройство занято" при выполнении umount?
Linux: Какой процесс вызывает "устройство занято" при выполнении umount?
12 ответов
Посмотрите на команду lsof (список открытых файлов) - она может сказать вам, какие процессы удерживают, а какие открывают. Иногда это сложно, но часто что-то так просто, как sudo lsof | grep (your device name here)
мог бы сделать это для вас.
На всякий случай... иногда случается так, что вы звоните umount из терминала, и ваш текущий каталог принадлежит смонтированной файловой системе.
Вы должны использовать fuser
команда.
Например. fuser /dev/cdrom
вернет pid(ы) процесса, используя /dev/cdrom
,
Если вы пытаетесь размонтировать, вы можете убить процесс тезисов, используя -k
переключатель (см. man fuser
).
Проверьте устройства с разомкнутым контуром, сопоставленные с файлом в файловой системе с помощью "losttup -a". Они не будут появляться с lsof или fuser.
Также проверьте /etc/exports
, Если вы экспортируете пути в точке монтирования через NFS, это выдаст эту ошибку при попытке размонтирования, и ничего не появится в fuser
или же lsof
,
lsof +f -- /mountpoint
(as перечисляет процессы, использующие файлы на монтируемом в /mountpoint файлах. Особенно полезно для определения того, какие процессы используют монтированный USB-накопитель или CD/DVD.
lsof и fuser - действительно два способа найти процесс, который держит определенный файл открытым. Если вы просто хотите, чтобы umount преуспел, вам следует изучить его параметры -f и -l.
Открытые файлы
Процессы с открытыми файлами являются обычными виновниками. Показать их:
lsof +f -- <mountpoint or device>
Есть преимущество в использовании /dev/<device>
скорее, чем /mountpoint
: точка монтирования исчезнет после umount -l
или он может быть скрыт накладным креплением.
fuser
тоже можно использовать, но на мой взгляд lsof
имеет более полезный вывод. тем не мение fuser
полезно, когда дело доходит до уничтожения процессов, вызывающих ваши драмы, чтобы вы могли продолжить свою жизнь.
Список файлов на <mountpoint>
(см. предостережение выше):
fuser -vmM <mountpoint>
Интерактивно уничтожать только процессы с открытыми для записи файлами:
fuser -vmMkiw <mountpoint>
После перемонтирования только для чтения (mount -o remount,ro <mountpoint>
), безопасно (r) убить все остальные процессы:
fuser -vmMk <mountpoint>
точки монтирования
Виновником может быть само ядро. Другая файловая система, смонтированная в файловой системе, которую вы пытаетесь umount
вызовет горе. Проверить с:
mount | grep <mountpoint>/
Для петлевых монтировок также проверьте вывод:
losetup -la
Анонимные иноды (Linux)
Анонимные иноды могут быть созданы:
- Временные файлы (
open
сO_TMPFILE
) - Inotify часы
- [Eventfd]
- [Eventpoll]
- [Timerfd]
Это самый неуловимый тип покемонов, и появляются в lsof
"s TYPE
столбец как a_inode
(который недокументирован в lsof
справочная страница).
Они не появятся в lsof +f -- /dev/<device>
так что вам нужно:
lsof | grep a_inode
Для процессов уничтожения, содержащих анонимные inode, смотрите: Список текущих наблюдений inotify (pathname, PID).
Именно поэтому существует "fuser -m /mount/point".
Кстати, я не думаю, что "fuser" или "lsof" будут указывать, когда ресурс удерживается модулем ядра, хотя у меня обычно такой проблемы нет..
Если вы по-прежнему не можете размонтировать или перемонтировать устройство после остановки всех служб и процессов с открытыми файлами, возможно, существует раздел подкачки или раздел подкачки, который удерживает ваше устройство занятым. Это не будет отображаться с fuser
или же lsof
, Выключите обмен с:
sudo swapoff -a
Вы можете проверить заранее и показать сводку любых разделов подкачки или файлов подкачки с:
swapon -s
или же:
cat /proc/swaps
В качестве альтернативы использованию команды sudo swapoff -a
Вы также можете отключить обмен, остановив службу или системный модуль. Например:
sudo systemctl stop dphys-swapfile
или же:
sudo systemctl stop var-swap.swap
В моем случае было необходимо отключить подкачку, в дополнение к остановке любых служб и процессов с файлами, открытыми для записи, чтобы я мог перемонтировать свой корневой раздел как доступный только для чтения, чтобы запустить fsck
на моем корневом разделе без перезагрузки. Это было необходимо на Raspberry Pi под управлением Raspbian Jessie.
Изоф и фьюзер мне тоже ничего не дали.
После процесса переименования всех возможных каталогов в.old и перезагрузки системы каждый раз, когда я вносил изменения, я обнаружил один конкретный каталог (связанный с postfix), который отвечал за это.
Оказалось, что однажды я сделал символическую ссылку из /var/spool/postfix на /disk2/pers/mail/postfix/varspool, чтобы минимизировать записи на диск в корневой файловой системе на основе SDCARD (Sheeva Plug).
С этой символической ссылкой, даже после остановки служб postfix и dovecot (как ps aux, так и netstat -tuanp ничего не показывали) я не смог размонтировать /disk2/pers.
Когда я удалил символическую ссылку и обновил файлы конфигурации postfix и dovecot, чтобы они указывали прямо на новые каталоги в / disk2 / pers /, я смог успешно остановить службы и размонтировать каталог.
В следующий раз я посмотрю более внимательно на вывод:
ls -lR /var | grep ^l | grep disk2
Приведенная выше команда рекурсивно выведет список всех символических ссылок в дереве каталогов (здесь начинается с /var) и отфильтрует те имена, которые указывают на конкретную целевую точку монтирования (здесь disk2).
Файловые системы, смонтированные в файловой системе, которую вы пытаетесь размонтировать, могут вызвать target is busy
ошибка в дополнение к любым файлам, которые используются. (Например, когда вы mount -o bind /dev /mnt/yourmount/dev
для того, чтобы использовать chroot
там.)
Чтобы определить, какие файловые системы смонтированы в файловой системе, выполните следующее:
mount | grep '/mnt/yourmount'
Чтобы узнать, какие файлы используются, совет, уже предложенный другими здесь:
lsof | grep '/mnt/yourmount'