Как узнать, какие процессы препятствуют размонтированию устройства?

59

Иногда я хотел бы размонтировать USB устройство с umount /run/media/theDrive, но я получаю сообщение об drive is busyошибке.

Как узнать, какие процессы или программы обращаются к устройству?

Стефан
источник
1
больше голосов за тот же вопрос / ответ здесь: stackoverflow.com/questions/624154/…
Тревор Бойд Смит

Ответы:

59

Используйте, lsof | grep /media/whateverчтобы узнать, что использует крепление.

Кроме того, рассмотрите возможность umount -l(lazy umount), чтобы новые процессы не могли использовать диск во время очистки.

Питер Айзентраут
источник
24
fuser -mv /path/to/mountpointможет быть более читаемой альтернативой для обнаружения процессов, использующих точку отсчета.
Риккардо Мурри
@RiccardoMurri lsof | grepработает лучше для меня. fuser -mvкажется, просто сбросить 80+ несвязанных процессов. Я использую каталоги с привязкой.
Рикки Бойс
1
umount -lопасно . mount -o bind режим 000пустой каталог сверху, а очистить через lsof +f -- /dev/device.
Том Хейл,
35

Большая часть времени, лучшая командой использования является Lsof ( « л я с т о авторучке й Ильза»).

lsof +f -- /media/usb0

где /media/usb0точка монтирования USB-накопителя или другой файловой системы для размонтирования. +f --говорит lsof обрабатывать последующий аргумент как точку монтирования; это обычно, но не всегда, управляет само по себе, так что это lsof /media/usb0тоже работает. Он находит открытые файлы (даже несвязанные), отображенные в память файлы, текущие каталоги и некоторые другие неясные варианты использования. Вам нужно будет выполнить команду от имени пользователя root, чтобы получить информацию о процессах других пользователей (и я думаю, что есть устройства, где lsofнужно запускать от имени пользователя root).

Есть способы, которые lsof не найдет; это необычно на съемных носителях. Они включают:

  • точки монтирования: вы не можете размонтировать, /fooесли /foo/barэто точка монтирования.
  • монтировать устройства: вы не можете размонтировать, /fooесли /foo/barэто смонтированное блочное устройство или обычный файл, смонтированный в цикле, или если это источник монтируемого подключения Linux.
  • Экспорт NFS: lsof не обнаружит, что дерево экспортируется сервером NFS ядра.

Еще одна команда, которая может использоваться в крайнем случае, - это fuser, который перечисляет только PID процессов с открытыми файлами на устройстве:

fuser -m /media/usb0
Жиль "ТАК - перестань быть злым"
источник
8

Вы можете использовать, lsofкак сказал Питер, или если вы уверены, что просто хотите убить все эти вещи и размонтировать его, вы, вероятно, можете сделать что-то вроде:

fuser -Mk /mnt/path
umount /mnt/path
pioto
источник
1
Если вы собираетесь сделать это, посмотрите на использование -Mдля безопасности.
Том Хейл,
@ TomHale Возможно, вы захотите уточнить, какая команда -Mдолжна применяться.
HSchmale
1
fuser: -M, --ismountpoint Request will be fulfilled only if NAME specifies a mountpoint. This is an invaluable seatbelt which prevents you from killing the machine if NAME happens to not be a filesystem.
Том Хейл,
6

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

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

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

inotify часы (Linux)

Этот комментарий объясняет, почему inotify не следует предотвращать размонтирование, но в этом примечании описываются ситуации, в которых он будет :

в vx_softcnt_flush()вызове может зависнуть размонтированный Зависание происходит из-за того, что часы inotify увеличивают i_countпеременную и заставляют v_os_hold valueзначение оставаться повышенным, пока наблюдатель inotify не освободит удержание.

Том Хейл
источник
Есть еще одно, монтирование по шлейфу: если вы смонтируете файловую систему, а затем смонтируете файл в этой файловой системе с помощью петлевого монтирования, вы не сможете размонтировать первую файловую систему, но в ней ничего не появится lsof.
Стивен Китт
Приветствия. Добавлено в Mountpointsраздел.
Том Хейл,
5

Если вы используете GNOME, отключение через Nautilus отобразит сообщение о том, какой процесс все еще использует диск, и файл, который он использует.

альтернативный текст

tshepang
источник
1

Для (как минимум) OpenBSD:

$ fstat /mnt/mountpoint

Например (использование doasдля выполнения fstatот имени пользователя root, поскольку в противном случае мы видели бы только наши собственные процессы):

$ doas fstat /usr/ports
USER     CMD          PID   FD MOUNT        INUM MODE         R/W    SZ|DV NAME
_pbuild  make       15172   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/
_pbuild  make       40034   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/

В этом случае я не смогу размонтировать, /usr/portsпока пользователь _pbuildне закончит эти два makeпроцесса.

Кусалананда
источник
-2

Это распространенная ошибка: вы можете использовать другого пользователя (либо root, либо любого другого пользователя), перейти в каталог подключенного устройства и выйти из системы под этим пользователем. Когда вы забудете, что оставили в этом каталоге, вы можете попытаться найти его, пока не ослепнете. lsofдействительно показывает оболочку, какой текущий каталог использует это устройство. Возможно, вы захотите снова ввести в качестве этого пользователя su, чтобы сменить каталог.

Ханс Линкельс
источник
2
Этот ответ либо неполный, либо неверный. Я не уверен, что, потому что это также неясно.
Хильдред