- Вопрос или проблема
- Сценарий
- Проблема
- Некоторые пояснения
- Вопрос
- Ответ или решение
- Как размонтировать "неправильный" монтирование (идентификатор монтирования 29)?
- Введение
- Проблема дублирующегося монтирования
- Решение проблемы с помощью перемещения
- Шаги для реализации решения
- Удаление "неправильного" монтирования
- Заключение
Вопрос или проблема
Сценарий
- на
/mnt/temp/dir
смонтирован NFS-ресурс (а другие ресурсы смонтированы в подкаталогах), - я выполняю
umount
всего там, но, предположительно, это не работает хорошо (возможно, я начинаю сumount /mnt/temp/dir
вместо того, чтобы смонтировать “вложенные” ресурсы, такие как/mnt/temp/dir/subdir*
сначала), - я выполняю
mount -o bind /data/temp /mnt/temp
, - я выполняю
mount /mnt/temp/dir
, - я выполняю
mount /mnt/temp/dir/subdir1
… и это работает хорошо.
Примечание: /mnt/temp
изначально находится на корневой (/
) файловой системе /dev/sda6
, а /data
— это другая файловая система из /dev/sda8
.
Проблема
Я не могу удалить каталог /mnt/temp/dir
на корневой файловой системе:
# mount -o bind / /test/root
# rmdir /test/root/mnt/temp/dir
rmdir: не удалось удалить `dir': Устройство или ресурс заняты
Некоторые пояснения
/mnt/temp/dir
смонтирован дважды, вероятно, один раз на корневой файловой системе, и один раз на файловой системе /data
.
Вот cat /proc/mounts
:
nfsserver:/some/share/ /mnt/temp/dir nfs rw,relatime(...) 0 0
nfsserver:/some/share/ /mnt/temp/dir nfs rw,relatime,(...) 0 0
Еще интереснее, вот cat /proc/1/mountinfo
:
29 20 0:18 / /mnt/temp/dir rw,relatime - nfs nfsserver:/some/share/ rw,(...)
33 31 0:18 / /mnt/temp/dir rw,relatime - nfs nfsserver:/some/share/ rw,(...)
Видите, два числа в начале разные.
Документация ядра говорит для этих двух полей:
(1) ID монтирования: уникальный идентификатор монтирования (может быть повторно использован после umount)
(2) родительский ID: ID родителя (или самого себя для вершины дерева монтирования)
У них также разные родительские ID 20 и 31 (корневая файловая система и /data
файловая система), см.:
20 1 8:6 / / rw,relatime - ext4 /dev/sda6 rw,(...)
31 20 8:8 /temp /mnt/temp rw,relatime - ext4 /dev/sda8 rw,(...)
Если я попробую выполнить umount /mnt/temp/dir
, я получаю 2 сообщения об ошибках:
umount.nfs: /mnt/temp/dir: устройство занято
umount.nfs: /mnt/temp/dir: устройство занято
Вопрос
Как я могу выполнить umount
“неправильного” (ID монтирования 29)?
Даже системный вызов umount(2)
принимает путь в качестве аргумента, а не “ID монтирования”.
Это не тестировалось, но это хотя бы обойдет проблему “устройство занято”.
Переместите одну точку монтирования в другое место. Таким образом, не будет путаницы между двумя точками монтирования.
mkdir /foo
mount --move /mnt/temp/dir /foo
Ответ или решение
Как размонтировать "неправильный" монтирование (идентификатор монтирования 29)?
Введение
В данной ситуации, вы столкнулись с проблемой двойного монтирования одной и той же директории на разных файловых системах, что привело к путанице и невозможности удалить директорию /mnt/temp/dir
на корневой файловой системе. Данная проблема возникает из-за того, что при попытке выполнить операцию umount
возникают ошибки, связанные с занятостью устройства.
Проблема дублирующегося монтирования
Вы правильно заметили, что /mnt/temp/dir
было смонтировано дважды, каждый из разов с присвоением уникального идентификатора монтирования (mount ID). Их различие в идентификаторах и родительских идентификаторах указывает на то, что первая точка монтирования соответствует корневой файловой системе (/dev/sda6
), а вторая — файловой системе /data
(/dev/sda8
).
Попытка выполнить команду umount /mnt/temp/dir
вызывает ошибки, так как система не может освободить ресурсы, связанные с вышеописанным дублированием.
Решение проблемы с помощью перемещения
Одним из методов решения данной проблемы является использование команды mount --move
. Эта команда позволяет переместить одну из точек монтирования в другое место, тем самым устраняя путаницу между двумя идентичными абсолютными путями.
Шаги для реализации решения
-
Создайте новую временную директорию для перемещения монтирования:
mkdir /foo
-
Переместите монтирование в новую директорию:
mount --move /mnt/temp/dir /foo
Удаление "неправильного" монтирования
Теперь, когда вы переместили одну из точек монтирования, ошибка "устройство занято" больше не должна возникать. Поскольку монтирование более не находится по пути /mnt/temp/dir
, теперь можно безопасно выполнить команду демонтирования для того монтирования, которое осталось:
umount /mnt/temp/dir
Или, если хотите удалить монтирование, которое было перемещено:
umount /foo
После успешного выполнения команд umount
, теперь вы сможете удалить директорию /mnt/temp/dir
без каких-либо проблем:
rmdir /mnt/temp/dir
Заключение
Проблема с дублирующимся монтированием может быть сложной, однако, используя команду mount --move
, вы можете эффективно обойти занятость устройства и успешно выполнить операцию umount
. Это решение позволяет избежать путаницы и обеспечивает правильное управление файловыми системами в Linux.