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

К сожалению, меня вынуждают работать с программным обеспечением, которое обрабатывает автоматически установку и размонтирование сетевого уровня очень плохо; у него есть раздражающая тенденция покидать каталог, где была точка монтирования, но не может справиться должным образом с тем, что происходит при установке громкости позже (он должен быть убран, но часто этого не делает).

Естественно, я нахожусь в разработчиках, чтобы получить это исправление, но в то же время мне нужно сделать что-то, чтобы самостоятельно убрать точки монтирования.

Поэтому я хочу, чтобы удалить каталог, но только если он не является точкой монтирования (поскольку я не хочу случайно удалять содержимое тома).

Теперь я могу получить идентификатор устройства в каталоге и сравнить его с идентификатором устройства root достаточно легко, но есть вероятность состояния гонки, если я использую такое сравнение, т. Е. Если уровень устанавливается между проверкой идентификаторов устройств и вызов rm -r /mnt/point .

Есть ли альтернативы? Я был заинтригован возможностью использования опции -xdev команды -xdev , но я не уверен, как бы я мог предоставить точку сравнения, так как find /mnt/point -xdev не будет работать, поскольку цель и ее содержимое одно и то же устройство.

Кроме того, использование rmdir в предположении, что оставшаяся папка всегда будет пустой, кажется ненадежной, так как на некоторых системах точка монтирования может иметь файл внутри; Например, macOS оставляет .autodiskmounted файл .autodiskmounted . Хотя я мог бы создавать список таких случаев и обрабатывать их, было бы неплохо (и, надеюсь, полезно другим) иметь более общее решение для будущих ссылок, если такое возможно.

3 Solutions collect form web for “Безопасное удаление каталога только в том случае, если оно не является точкой монтирования”

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

 $ sudo mv /mnt /mnt.old mv: cannot move '/mnt' to '/mnt.old': Device or resource busy 

Если это обычный каталог, вы можете переименовать его.

 $ sudo mv /mnt /mnt.old 

Если перемещение завершается успешно, заново создайте каталог монтирования и удалите переименованную директорию. При желании вы можете проверить, что переименованный каталог является частью файловой системы, которую вы ожидаете перед удалением.

Если вы используете Linux

Вы можете проверить, является ли каталог точкой монтирования с помощью точки mountpoint .

Чтобы избежать появления / исчезновения точки монтирования между тестом и rm -r , вам нужно запустить сценарий в отдельном пространстве имен монтирования с частным поддеревом (mounts не распространяются из / в новое пространство имен). Это может быть достигнуто с помощью unshare .

 unshare -m --propagation private -- "<delete script>" 

Все в одном скрипте:

 #!/bin/sh unshare -m --propagation private -- sh -e <<EOF if ! mountpoint -q "<path>"; then rm -r "<path>" fi EOF 

Вы не можете rmdir каталог, который не пуст, или тот, который является точкой монтирования. Таким образом, это удовлетворит ваши требования:

 rm -f mountpoint/.autodiskmounted # MacOS cookie rmdir mountpoint 2>/dev/null 

Если вы работаете в скрипте с выходом из набора ошибок , вы можете использовать rmdir ... || true rmdir ... || true . (Обратите внимание, что --ignore-fail-on-non-empty малопригодно, потому что мы попытаемся удалить непонятную ошибку при попытке удалить точку монтирования.)

Я должен указать, что у меня нет доступа к системе Mac, поэтому я не могу проверить, присутствует ли файл .autodiskmounted когда файловая система действительно смонтирована, или является ли это заполнитель, когда файловая система размонтирована.

  • Свободное использование неиспользуемого пространства в разделе, недоступном после монтирования
  • Отключите монтировку rbind, не влияя на исходное крепление
  • невозможно отключить, разрешено отклонение
  • Почему ленивый MNT_DETACH или `umount -l` небезопасно / опасно?
  • Сбой umount / home (ZFS) при завершении работы
  • umount внешний привод ntfs как не root
  • Является ли `mount -o remount, ro` гарантией сбой, если есть файлы, открытые для записи?
  • Командная строка эквивалентна «Безопасно удалить диск»?
  • Как автоматически принудительно использовать umount на накопителе USB, который уже удален?
  • Установка и размонтирование в том же сценарии оболочки приводит к ошибке
  • Почему usb-drive не отображается с помощью `lsblk` после того, как он был удален из Thunar?
  • sshfs - не может размонтировать точку
  • Interesting Posts

    Основной вопрос: Почему linux-образ не соответствует установленной версии?

    usb thumbdrive не монтируется

    Можно ли преобразовать существующий LVM VG в полосу (RAID0 eq)?

    Не удалось запустить archlinux после обновления: не удается найти uuid

    Мой процесс был убит, но я не могу понять сообщение ядра

    Как скрыть чужие каталоги от пользователя?

    Подключение к Wi-Fi без сохранения пароля (Raspbian)

    Прогресс уведомления в лотке из командной строки

    Как узнать, какая конкретная электронная почта в Thunderbird / Icedove содержит вредоносное ПО Doc.Dropper.Agent-1552723, на которое указывает Clamscan?

    Замените несколько пробелов одним, используя только «tr»

    подсчет нескольких шаблонов за один проход с помощью grep?

    Установите Node.js 4 на Alpine Linux

    Соединение ведомого ведомого слишком медленное

    как использовать & для sudo

    Высокое состояние ввода / вывода BluRay Burner с UDF; Возможно ли оптимизация?

    Linux и Unix - лучшая ОС в мире.