umount: устройство занято. Почему?

172

При беге umount /pathя получаю:

umount: /path: device is busy.

Файловая система огромна, поэтому lsof +D /pathэто нереальный вариант.

lsof /path, lsof +f -- /pathИ fuser /pathвсе не возвращает ничего. fuser -v /pathдает:

                  USER        PID ACCESS COMMAND
/path:            root     kernel mount /path

что нормально для всех неиспользуемых смонтированных файловых систем.

umount -lи umount -fне достаточно хорош для моей ситуации.

Как мне выяснить, почему ядро ​​считает эту файловую систему занятой?

Оле Танге
источник
11
Текущий каталог вашей оболочки находится на пути точки монтирования?
LawrenceC
Нет. Тогда фьюзер сказал бы так.
Оле Танге
12
Вы действительно хотите fuser -vm /path...
Дероберт
5
Для размонтировать --forceбудет стараться , чтобы отключить и -vили -vvvдаже будет reaveal более чем проблема с креплением. Так что попробуйте:umount -vvv --force /babdmount
Gaoithe

Ответы:

139

Кажется, причиной моей проблемы nfs-kernel-serverбыл экспорт каталога. nfs-kernel-server, Вероятно , идет позади обычных открытых файлов и , таким образом , не перечислены lsofи fuser.

Когда я остановился, nfs-kernel-serverя мог umountкаталог.

До сих пор я сделал страницу с примерами всех решений здесь: http://oletange.blogspot.com/2012/04/umount-device-is-busy-why.html

Оле Танге
источник
54
Спасибо, что ответили на свой вопрос, а не отказались от него при реализации своего решения. Ваш ответ помог мне разобраться в аналогично экспортированном ресурсе NFS.
Джефф Веллинг
7
Эта же проблема может возникнуть и в том случае, если вы настроили петлевые устройства в файловой системе - например, если / dev / loop0 поддерживается файлом в / path.
BCran
1
Я должен был sudo service samba stopсначала, ваш ответ действительно помог!
Малат
1
Этот пост напомнил мне, что у меня запущена служба nfs после нескольких часов попыток выяснить это. В RHEL6 / CentOS6 используйте, sudo service nfs stopи вам, возможно, (не) потребуется также sudo exportfs -uнеэкспортировать. Не забудьте тогда sudo exportfs -rи sudo service nfs startповторно экспортировать и перезапустить сервис.
code_dredd
1
В моем случае не было необходимости останавливать сервер nfs, только exportfs -uрассматриваемый каталог.
Закон 29
41

Чтобы добавить BruceCran «s комментарий выше, причина для моего проявления этой проблемы только сейчас был несвежий петлевой крепление. Я уже проверил вывод fuser -vm <mountpoint>/ lsof +D <mountpoint>, mountи cat /proc/mountsпроверил, работал ли какой-то старый nfs-kernel-сервер, отключил квоты, попытался (но потерпел неудачу) a umount -f <mountpoint>и почти смирился с тем, что отказался от времени безотказной работы 924 дней, прежде чем наконец проверить вывод из losetupи нахождения двух устаревших сконфигурировано-но-не-смонтированных шлейфов:

parsley:/mnt# cat /proc/mounts 
rootfs / rootfs rw 0 0
none /sys sysfs rw,nosuid,nodev,noexec 0 0
none /proc proc rw,nosuid,nodev,noexec 0 0
udev /dev tmpfs rw,size=10240k,mode=755 0 0
/dev/mapper/stuff-root / ext3 rw,errors=remount-ro,data=ordered 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=755 0 0
usbfs /proc/bus/usb usbfs rw,nosuid,nodev,noexec 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,nosuid,noexec,gid=5,mode=620 0 0
fusectl /sys/fs/fuse/connections fusectl rw 0 0
/dev/dm-2 /mnt/big ext3 rw,errors=remount-ro,data=ordered,jqfmt=vfsv0,usrjquota=aquota.user 0 0

тогда

parsley:/mnt# fuser -vm /mnt/big/
parsley:/mnt# lsof +D big
parsley:/mnt# umount -f /mnt/big/
umount2: Device or resource busy
umount: /mnt/big: device is busy
umount2: Device or resource busy
umount: /mnt/big: device is busy

parsley:/mnt# losetup -a    
/dev/loop0: [fd02]:59 (/mnt/big/dot-dropbox.ext2)
/dev/loop1: [fd02]:59 (/mnt/big/dot-dropbox.ext2)

parsley:/mnt# losetup -d /dev/loop0
parsley:/mnt# losetup -d /dev/loop1
parsley:/mnt# losetup -a
parsley:/mnt# umount big/
parsley:/mnt#

В сообщении на форуме Gentoo также перечислены файлы подкачки как потенциальный преступник; хотя обмен файлами, вероятно, довольно редок в наши дни, проверить выходную информацию не помешает cat /proc/swaps. Я не уверен, могли ли когда-нибудь квоты помешать демонтировать - я держался за соломинку.

ZakW
источник
12
Все 924 дня безотказной работы означают, что вам нужно обновить патчи для ядра :-)
w00t
+1 за упоминание файлы подкачки, они делают блок размонтированием, и в значительной степени невозможно обнаружить , если вы не проверять их непосредственно.
Петр
22

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

lsof | grep '/path'
Калеб
источник
1
lsof / path просматривает только путь.
Оле Танге
7
Я не сказал lsof /path, я сказал lsof | grep '/path'. Разница в том, что lsof без аргументов показывает все открытые файлы, используя какую-то кеш-таблицу, а grep очень быстро просматривает ее. То, что вы попробовали с lsof, заставляет его сканировать файловую систему, что занимает много времени.
Калеб
1
Как я уже сказал: lsof /pathсмотрит только на путь. Он не смотрит на каждый файл. Это часто намного быстрее, чем lsof | grep /path(в моем ненаучном тесте это было в 20 раз быстрее YMMV), поскольку он не просматривает все открытые файлы, а только файлы по этому пути.
Оле Танге
Я не уверен в том, в чем техническая разница, но, исследуя устаревшее монтирование NFS, lsof /pathничего не дало, хотя lsof | grep /pathпоказал процесс, который удерживал открытые файлы и мешал мне отключить том.
17
20

Для меня оскорбительным процессом был демон, запущенный в chroot. Потому что это было в chroot, lsofи fuserне нашел бы его.

Если вы подозреваете, что у вас есть что-то, работающее в chroot, sudo ls -l /proc/*/root | grep chrootвы найдете виновника (замените «chroot» на путь к chroot).

cibyr
источник
1
Хорошо, и во FreeBSD я сделал это: sudo ls -l /proc/*/status | grep HOSTгде HOST - это имя хоста тюрьмы
JGurtz
1
В моей системе (Mint Qiana) lsof /mountpointи то и fuser /mountpointдругое находит процесс, даже если у него есть chrooted.
Оле Танге
10

Открытые файлы

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

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) .

Том Хейл
источник
5

Чтобы fuser мог сообщить о PID, которые держат монтируемое устройство открытым, вы должны использовать -m

fuser -m /path
Патрик
источник
2
Верно, но не имеет значения: lsof /pathпредоставляет тот же список PID, что и fuser -m /path.
Жиль
fuser -M /pathпроверим, /pathявляется ли точка монтирования.
user3804598
5

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

mount -oremount,rw /

А потом перемонтировал обратно:

mount -oremount,ro /

На этот раз, однако, mountпродолжал давать mount: / is busyошибку. Это было вызвано процессом, содержащим открытый дескриптор файла, который был заменен некоторой командой, которая выполнялась, когда файловая система находилась в режиме чтения-записи. Важной строкой из lsof -- /вывода является (имена были изменены):

replicate  1719 admin DEL REG 8,5  204394 /opt/gns/lib/replicate/modules/md_es.so

Обратите внимание DELна вывод. Простая перезагрузка процесса, держась за удаленный файл, решила проблему.

ПРП
источник
3
Итак, сводка такова: у процесса есть открытый файл, который был удален. Хороший вклад.
Оле Танге
4

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

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

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

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

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

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

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

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

CAPTCHA,
источник
3

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

Просто подумал, что поделюсь своим решением.

colemanm
источник
1

Сегодня проблема была в открытом сокете (конкретно tmux):

mount /mnt/disk
export TMPDIR=/mnt/disk
tmux
<<detatch>>
umount /mnt/disk
umount: /mnt/disk: device is busy.
lsof | grep /mnt/disk
tmux      20885             root    6u     unix 0xffff880022346300        0t0    3215201 /mnt/disk/tmux-0/default
Оле Танге
источник
1

У меня есть пара bindи overlayмонтирует под моим горе, блокировали меня, проверьте автодополнению на точку монтирования , которую вы хотите отключить. Я подозреваю, что это было наложение, в частности, но могло быть и связыванием

ThorSummoner
источник
1

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

В моем случае я пытался изменить LVM, так как хотел увеличить раздел / var, поэтому мне нужно было его размонтировать. Я попробовал все комментарии и ответил в этом посте (спасибо всем и особенно @ ole-tange за их сбор) и все равно получил ошибку «устройство занято».

Я пытался убить большинство процессов в порядке, указанном в уровне запуска 0, просто на случай, если порядок был уместен в моем случае, но это тоже не помогло. Поэтому я создал собственный уровень выполнения (объединяющий вывод команды chkconfig в новые команды chkconfig --level), который был бы очень похож на 1 (однопользовательский режим), но с сетевыми возможностями (с сетью ssh и xinet).

Поскольку я использовал redhat, уровень запуска 4 помечен как «неиспользуемый / определенный пользователем», поэтому я использовал его и запустил. init 4 В моем случае это было нормально, так как мне нужно было перезагрузить сервер в любом случае, но, вероятно, это будет так кто-нибудь настраивал диски.

Габриэль Ксункейра
источник