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

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

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

  • NIS: Как разрешить доступ к домашним каталогам локальных и удаленных пользователей?
  • Как выполняется сетевое программное обеспечение?
  • Размер файла: размер контента и то, что видно
  • Могу ли я предотвратить создание папки с определенным именем?
  • Ошибка «mount: wrong fs type ..» при установке USB
  • Файловая система для совместного использования GIT-проектов между Windows и Linux
  • Поэтому я хочу, чтобы удалить каталог, но только если он не является точкой монтирования (поскольку я не хочу случайно удалять содержимое тома).

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

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

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

  • Как удалить файлы, которые не заканчиваются на «.c»?
  • Как удалить все в каталоге?
  • Перемещение файлов из разных подпапок в подпапки
  • mount: точка монтирования отсутствует
  • Как я могу узнать о "rootfs"
  • Изменение конфигурации пользовательского cwd как root
  • 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 когда файловая система действительно смонтирована, или является ли это заполнитель, когда файловая система размонтирована.

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