Linux: какой процесс вызывает "устройство занято" при выполнении umount? [закрытый]

Linux: какой процесс вызывает "устройство занято" при выполнении umount?

12 ответов


посмотреть lsof command (список открытых файлов) -- он может сказать вам, какие процессы держат что открыто. Иногда это сложно, но часто что-то просто sudo lsof | grep (your device name here) может сделать это за вас.


на всякий случай... иногда случается, что вы вызываете umount из терминала, и ваш текущий каталог принадлежит смонтированной файловой системе.


вы должны использовать .

например. fuser /dev/cdrom вернет PID(ы) процесса, используя /dev/cdrom.

если вы пытаетесь размонтировать, вы можете убить процесс тезисов с помощью -k (см. man fuser).


Проверьте устройства с открытым циклом, сопоставленные с файлом в файловой системе с помощью "losetup-a". Они не появятся ни с lsof, ни с fuser.


также проверить /etc/exports. Если вы экспортируете пути внутри точки монтирования через NFS, это даст эту ошибку при попытке размонтировать, и ничего не появится в fuser или lsof.


lsof +f -- /mountpoint

(as перечисляет процессы, использующие файлы на монтируемой точке монтирования. Особенно полезно для поиска того, какой процесс (ы) использует установленный USB-накопитель или CD/DVD.


lsof и fuser действительно два способа найти процесс, который держит определенный файл открытым. Если вы просто хотите, чтобы umount преуспел, вы должны изучить его-f и-l варианты.


именно поэтому существует" fuser-m /mount/point".

кстати, я не думаю, что" fuser "или" lsof " будут указывать, когда ресурс удерживается модулем ядра, хотя у меня обычно нет этой проблемы..


lsof и fuser тоже ничего мне не дали.

после процесса переименования всех возможных каталогов .старый и перезагрузка системы каждый раз после внесения изменений я нашел один конкретный каталог (относящийся к postfix), который был ответственным.

оказалось, что я когда-то сделал символическую ссылку из /var/spool/postfix на /disk2/pers/mail/postfix/varspool, чтобы минимизировать записи на диске в корневой файловой системе на основе SDCARD (Sheeva Plug).

С эта символическая ссылка, даже после остановки служб postfix и dovecot (как ps aux, так и netstat-tuanp не показали ничего связанного), я не смог отключить /disk2/pers.

когда я удалил символическую ссылку и обновил файлы конфигурации postfix и dovecot, чтобы указать непосредственно на новые dirs на /disk2/pers/, я смог успешно остановить службы и размонтировать каталог.

в следующий раз я буду более внимательно на выходе:

ls -lR /var | grep ^l | grep disk2

выше команда рекурсивно перечислит все символические ссылки в дереве каталогов (здесь, начиная с /var) и отфильтрует те имена, которые указывают на определенную целевую точку монтирования (здесь disk2).


открыть файлы

процессы с открытыми файлами являются обычные преступники. Покажите их:

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>

Mountpoints

виновником может быть само ядро. Другая файловая система, смонтированная в файловой системе, которую вы пытаетесь umount вызовет скорбь. Проверять с:

mount | grep <mountpoint>/

для петлевых креплений также проверьте выход:

losetup -la

анонимные коды (Linux)

анонимный inodes может быть создан:

  • временные файлы (open С O_TMPFILE)
  • inotify часы
  • [eventfd]
  • [eventpoll]
  • [timerfd]

это самый неуловимый тип покемонов, и появиться в lsof ' s как a_inode (который недокументирован в lsof man page).

они не появятся в lsof +f -- /dev/<device>, так что вам потребуется:

lsof | grep a_inode

для процессов убийства, содержащих анонимные индексы, см.:список текущих часов inotify (путь, PID).


если вы все еще не можете размонтировать или перемонтировать устройство после остановки всех служб и процессов с открытыми файлами, то может быть файл подкачки или раздел подкачки, сохраняя устройство занято. Это не будет отображаться с fuser или lsof. Выключите замену с помощью:

sudo swapoff -a

вы можете проверить заранее и показать сводку любых разделов подкачки или файлов подкачки с:

swapon -s

или:

cat /proc/swaps

в качестве альтернативы, используя команду sudo swapoff -a, вы также можно отключить своп, остановив службу или systemd в единица. Например:

sudo systemctl stop dphys-swapfile

или:

sudo systemctl stop var-swap.swap

в моем случае выключение swap было необходимо, в дополнение к остановке любых служб и процессов с открытыми для записи файлами, чтобы я мог переустановить свой корневой раздел только для чтения, чтобы запустить fsck на моем корневом разделе без перезагрузки. Это было необходимо на Raspberry Pi под управлением Raspbian Jessie.


файловые системы, смонтированные в файловой системе, которую вы пытаетесь размонтировать, могут вызвать target is busy ошибка в дополнение к любым файлам, которые используются. (Например, когда вы mount -o bind /dev /mnt/yourmount/dev чтобы использовать chroot там.)

чтобы найти, какие файловые системы монтируются в файловой системе, выполните следующие действия:

mount | grep '/mnt/yourmount'

чтобы найти, какие файлы используются советы, уже предложенные другими здесь:

lsof | grep '/mnt/yourmount'