Неудалённые точки монтирования в /media я встречал много раз, чтобы их удалить просто необходимо становиться рутом или давать привилегии пользователю.
Это от неумения и нежелания знать что такое UNIX.
От полного нежелания перед первой в жизни установкой хотя бы по-верхам познакомиться с понятием файловых систем, процессов и иерархией каталогов UNIX-подобных.
Пользователь мог бы и догадаться, что перед размонтированием надо бы прибить процессы, которые держат mountpoint.
А всё так просто, - RTFM же! И ведь пишет же: "Том занят. Одно или более приложений используют том"!
# umount /run/media/altlinux/Transcend2/
umount: /run/media/altlinux/Transcend2: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
И даже скажет кто использует
$ /usr/sbin/lsof | grep /run/media/altlinux/
medit 13511 altlinux cwd DIR 8,34 4096 2 /run/media/altlinux/Transcend2
gdbus 13511 13514 altlinux cwd DIR 8,34 4096 2 /run/media/altlinux/Transcend2
Мягкий способ отпустить mountpoint (точку монтирования):
Mount/umount USB-FlashИз которого
Скрипт для принудительного размонтирования может выглядеть так:
#!/bin/sh
# пытаемся убить все блокирующие процессы вежливо
fuser -k TERM -m /media/n78
sleep 1
# если кто-то уцелел, то пытаемся убить их грубо
fuser -k KILL -m /media/n78
sleep 1
# а вот теперь размонтируем
umount /media/n78
можно сделать выжимку.
Здесь следует сказать, что если использовать скриптом, а не командами, в данном простейшем виде скрипт заготавливается под каждую usb-flash, поскольку uuid или label (метка), это уникальные идентификаторы, которые в данном случае, применимо к текущей ситуации, используются как точка монтирования.
Далее ниже в примере, точка монтирования Transcend2: LABEL = Transcend2
Спойлер
Чуть более развёрнутая версия того же самого без лишних ожиданий может быть такой:
#!/bin/sh
if test "_$#" = '_1'
then
FS="$1"
else
echo 'Usage:' $0 '/mount-point'
exit 1
fi
for sig in TERM KILL
do
if mountpoint -q "$FS"
then
if fuser -m "$FS"
then
fuser -k $sig -m "$FS"
sleep 1
else
break
fi
else
echo 'not mounted'
exit 0
fi
done
umount "$FS"
Обратите внимание: убивание процессов — довольно чувствительная операция, поэтому надо быть особо осторожным. В частности, если файловая система не смонтирована, то действия будут отнесены к корневой файловой системе и скрипт перебьёт всех, до кого дотянется. Поэтому важно проверять mountpoint.
Из которого тоже можно сделать выжимку по-вкусу.
Садистский способ (удушить несмотря ни на что - ключ '-k' (без указания параметров пересылается сигнал SIGKILL - убить все процессы которым он отправлен)):
Как узнать, какое приложение заблокировало файл/директорию/раздел?Вообще-то `man lsof`, `man fuser` :)
Например, команда
user@linux# lsof|grep /home
покажет все открытые файлы в каталоге /home.
А команда
root@linux# fuser -km /home
Завершит выполнение всех процессов, работающих с файловой сисмемой /home. Будьте внимательны, если /home является не отдельной файловой системой, а частью корневой, то результат может превзойти ваши ожидания :)
Поймите меня правильно: я сторонник элегантности, красоты и минимализма.
Чётко разделяющий на то, что я знаю и то чего не знаю, а узнать надо.
Это воспитано спектрум-платформой и менять это бесполезно.
Есть ровно два способа решения сиюминутной проблемы:
Первый: Поместить исполняемый код решающий проблему на винчестер.
Второй: Держать "исполняемый код", решающий проблему, в голове.
Я сторонник второго.
В первом случае срабатывает человеческий фактор и как следствие недоработки, ошибки и утяжеление системы дубликатом того, что уже есть.
Как результат второго способа:
mountpoint ни в run, ни в var не нужен.
Чёткое соблюдение FHS.
Подозреваю Android после активации опции "Отключить карту памяти", в первую очередь делает то же самое - мочит все процессы которые держат microSDHC.
И это правильно. Это по-UNIX'овому.
Цитирование уже существующего потому, что:
- цитируемый ресурс может помереть
- самому писать лень
- всё уже написано где-то
- поделиться с теми, кому это необходимо и полезно.
На деле это работает так:
Файловая система раздела sdc2 смонтирована в точки монтирования:
$ mount|grep run|grep media
/dev/sdc2 on /run/media/altlinux/Transcend2 type ext3 (rw,nosuid,nodev,relatime,errors=continue,barrier=1,data=writeback,uhelper=udisks2)
/dev/sdc2 on /var/run/media/altlinux/Transcend2 type ext3 (rw,nosuid,nodev,relatime,errors=continue,barrier=1,data=writeback)
sdc2 держит открытое приложение medit в котором открыт файл лежащий на Transcend2:
$ /usr/sbin/lsof | grep /run/media/altlinux/Transcend2
medit 13511 altlinux cwd DIR 8,34 4096 2 /run/media/altlinux/Transcend2
gdbus 13511 13514 altlinux cwd DIR 8,34 4096 2 /run/media/altlinux/Transcend2
А здесь нет:
$ /usr/sbin/lsof | grep /var/run/media/altlinux/Transcend2
$
Посылаем сигнал SIGTERM всем процессам которые работают с файловой системой Transcend2:
$ fuser -k -SIGTERM -m /run/media/altlinux/Transcend2
Теперь Transcend2 ничего не держит:
$ /usr/sbin/lsof|grep /run/media/altlinux/Transcend2
$
Если бы продолжало держать, можно было бы послать сигнал SIGKILL
man fuser
-k
Уничтожает (завершает) процессы, которые используют указанный файл. Посылаемый сигнал завершения SIGKILL можно заменить с помощью параметра -signal.
Ну и уж черезвычайно редкая необходимость, выпонить fuser от root или sudo.
Отмонтируем через проводник.
Всё размонтировано:
$ mount|grep run|grep media
$
Единственно остались созданные каталоги media/altlinux/, но это уже специфика новой системы монтирования:
$ ls -l /run/media
итого 0
drwxr-x---+ 2 root root 40 июл 8 09:09 altlinux
$ ls -l /run/media/altlinux/
итого 0
(После ребута:)
$ ls -l /run/media
ls: невозможно получить доступ к /run/media: Нет такого файла или каталога
$ ls -l /run/|grep media
$
$ mount | grep run
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /var/run type tmpfs (rw,nosuid,nodev,mode=755)
Вместо всей этой "простыни" достаточно было просто закрыть medit.