Иногда я хотел бы размонтировать USB устройство с umount /run/media/theDrive
, но я получаю сообщение об drive is busy
ошибке.
Как узнать, какие процессы или программы обращаются к устройству?
Иногда я хотел бы размонтировать USB устройство с umount /run/media/theDrive
, но я получаю сообщение об drive is busy
ошибке.
Как узнать, какие процессы или программы обращаются к устройству?
Ответы:
Используйте, lsof | grep /media/whatever
чтобы узнать, что использует крепление.
Кроме того, рассмотрите возможность umount -l
(lazy umount), чтобы новые процессы не могли использовать диск во время очистки.
fuser -mv /path/to/mountpoint
может быть более читаемой альтернативой для обнаружения процессов, использующих точку отсчета.
lsof | grep
работает лучше для меня. fuser -mv
кажется, просто сбросить 80+ несвязанных процессов. Я использую каталоги с привязкой.
umount -l
опасно . mount -o bind
режим 000
пустой каталог сверху, а очистить через lsof +f -- /dev/device
.
Большая часть времени, лучшая командой использования является Lsof ( « л я с т о авторучке й Ильза»).
lsof +f -- /media/usb0
где /media/usb0
точка монтирования USB-накопителя или другой файловой системы для размонтирования. +f --
говорит lsof обрабатывать последующий аргумент как точку монтирования; это обычно, но не всегда, управляет само по себе, так что это lsof /media/usb0
тоже работает. Он находит открытые файлы (даже несвязанные), отображенные в память файлы, текущие каталоги и некоторые другие неясные варианты использования. Вам нужно будет выполнить команду от имени пользователя root, чтобы получить информацию о процессах других пользователей (и я думаю, что есть устройства, где lsof
нужно запускать от имени пользователя root).
Есть способы, которые lsof не найдет; это необычно на съемных носителях. Они включают:
/foo
если /foo/bar
это точка монтирования./foo
если /foo/bar
это смонтированное блочное устройство или обычный файл, смонтированный в цикле, или если это источник монтируемого подключения Linux.Еще одна команда, которая может использоваться в крайнем случае, - это fuser, который перечисляет только PID процессов с открытыми файлами на устройстве:
fuser -m /media/usb0
Вы можете использовать, lsof
как сказал Питер, или если вы уверены, что просто хотите убить все эти вещи и размонтировать его, вы, вероятно, можете сделать что-то вроде:
fuser -Mk /mnt/path
umount /mnt/path
-M
для безопасности.
-M
должна применяться.
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.
Процессы с открытыми файлами являются обычными виновниками. Показать их:
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
Анонимные иноды могут быть созданы:
open
с O_TMPFILE
)Это самый неуловимый тип покемона, и появляются в 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
раздел.
Для (как минимум) 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
процесса.
Это распространенная ошибка: вы можете использовать другого пользователя (либо root, либо любого другого пользователя), перейти в каталог подключенного устройства и выйти из системы под этим пользователем. Когда вы забудете, что оставили в этом каталоге, вы можете попытаться найти его, пока не ослепнете. lsof
действительно показывает оболочку, какой текущий каталог использует это устройство. Возможно, вы захотите снова ввести в качестве этого пользователя su, чтобы сменить каталог.