Иногда я хотел бы размонтировать 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, чтобы сменить каталог.