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'

Другие вопросы по тегам