Две разные точки монтирования с одинаковым абсолютным путем (проблема привязки монтирования)

Вопрос или проблема

Сценарий

  • на /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. Эта команда позволяет переместить одну из точек монтирования в другое место, тем самым устраняя путаницу между двумя идентичными абсолютными путями.

Шаги для реализации решения

  1. Создайте новую временную директорию для перемещения монтирования:

    mkdir /foo
  2. Переместите монтирование в новую директорию:

    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.

Оцените материал
Добавить комментарий

Капча загружается...