umount - устройство занято

14

Иногда, когда я хочу отключить устройство, например,

sudo umount /dev/loop0

Я получу сообщение

umount: /mnt: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

Я обычно решаю эту проблему, закрывая окно консоли (в моем случае xfce4-терминал), а затем umount.

Что означает эта проблема? Есть ли более разумное решение?

xralf
источник
2
Это случается, например, если вы все еще находитесь в оболочке в этом каталоге, куда монтируется устройство.
Клапауций
Я не помню, был ли я там, но я попробовал, и вы правы, это случилось.
xralf

Ответы:

14

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

Хотя в Linux есть альтернатива. Использование umount -lзвонков «ленивым» размонтированием. Файловая система все еще будет смонтирована, но вы не сможете ее увидеть или использовать, за исключением процессов, которые уже ее используют. Когда программа-нарушитель завершает работу (с помощью любых средств), система «заканчивает» размонтирование файловой системы.

bahamat
источник
2
Есть ли способ узнать, какой процесс имеет дескриптор открытого файла и должен быть остановлен?
xralf
4
Использование lsof, вероятно, лучший способ.
Багамат
1
например lsof | grep loop0?
xralf
Нет, grep для точки монтирования. Это должно перечислить любые файлы внизу. Я не думаю, что это покажет вещи, которые просто имеют рабочий каталог в точке монтирования, так что это не идеальный метод.
Багамат
7

Вы также можете использовать, fuserчтобы убить все процессы, используя смонтированную файловую систему.

fuser -cuk /mnt

Параметры:

-c     
    Same as -m option, used for POSIX compatibility.

-u, --user
    Append the user name of the process owner to each PID.

-k, --kill
    Kill  processes accessing the file. Unless changed with -SIGNAL, SIGKILL is sent. An fuser process
    never kills itself, but may kill other fuser processes. The  effective  user  ID  of  the  process
    executing fuser is set to its real user ID before attempting to kill.kill.

-m NAME, --mount NAME
    NAME specifies a file on a mounted file system or a block device that is  mounted.  All  processes
    accessing  files  on  that  file  system  are  listed.   If  a  directory file is specified, it is
    automatically changed to NAME/. to use any file system that might be mounted on that directory.

Проверьте себя на объяснение оболочки .

sys0dm1n
источник
3

Учитывая ваше «обычное решение», это означает, что оболочка, которую вы запускаете в окне консоли, имеет каталог в файловой системе на этом устройстве в качестве текущего рабочего каталога.

Linux и Unixes в целом очень сильно хотят, чтобы файловая система была смонтирована, если у процесса есть текущий рабочий каталог в этой файловой системе.

Вы можете просто использовать cdв окне консоли, чтобы выйти из каталога в или под, /mntа не убивать окно консоли, и оболочка работает внутри него.

Брюс Эдигер
источник
0

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

Если у вас есть общие ресурсы NFS, размещенные на компьютере, и любые из этих общих ресурсов NFS поддерживаются устройством, которое вы пытаетесь отключить, вам придется прекратить их совместное использование (лучше всего это сделать, остановив службу NFS, например, sudo service nfs-kernel-server stopв последних версиях Ubuntu. ). Сервер NFS может не отображаться в lsof или fuser, что может затруднить выявление проблемы.

ГВП
источник