Странный результат монтирования tmpfs в корневой директории дерева.

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

Используя unshare -Umr, я создал нового пользователя, пространства имён для монтирования, куда перемещается вызываемый процесс. Затем с помощью mount -t tmpfs tmpfs / я примонтировал новый экземпляр tmpfs к корневому / дерева каталогов внутри нового пространства имён монтирования.

Поскольку tmpfs пуст, я ожидал увидеть пустой список из команды ls -la /, однако вот вывод:

ubuntu@ubuntu:~$ unshare -Umr /bin/bash
root@ubuntu:~# mount -t tmpfs tmpfs /
root@ubuntu:~# ls -la /
total 5309704
drwxr-xr-x  24 nobody nogroup       4096 Nov 22  2023 .
drwxrwxrwt   2 root   root            40 Nov 11 15:47 ..
drwxr-xr-x   2 nobody nogroup       4096 Jan 25  2023 bin
drwxr-xr-x   3 nobody nogroup       4096 Jan 25  2023 boot
drwxr-xr-x   2 nobody nogroup       4096 Nov 11  2019 cdrom
drwxr-xr-x  17 nobody nogroup       3820 Aug 22 14:22 dev
drwxr-xr-x 105 nobody nogroup       4096 Mar 14  2024 etc
-rw-r--r--   1 root   root    1688371200 Jan 19  2021 GISO
drwxr-xr-x   3 nobody nogroup       4096 Nov 11  2019 home
lrwxrwxrwx   1 nobody nogroup         34 Jan 25  2023 initrd.img -> boot/initrd.img-4.15.0-202-generic
lrwxrwxrwx   1 nobody nogroup         34 Jan 25  2023 initrd.img.old -> boot/initrd.img-4.15.0-132-generic
drwxr-xr-x  21 nobody nogroup       4096 Jan 25  2023 lib
drwxr-xr-x   2 nobody nogroup       4096 Jan 25  2023 lib64
drwx------   2 nobody nogroup      16384 Nov 11  2019 lost+found
drwxr-xr-x   2 nobody nogroup       4096 Feb 10  2021 media
drwxr-xr-x   2 nobody nogroup       4096 Aug  5  2019 mnt
drwxr-xr-x   3 nobody nogroup       4096 Nov 26  2020 opt
dr-xr-xr-x 123 nobody nogroup          0 Aug 22 12:22 proc
drwx------   4 nobody nogroup       4096 Dec  6  2023 root
drwxr-xr-x  24 nobody nogroup        820 Nov 11 15:20 run
drwxr-xr-x   2 nobody nogroup      12288 Jan 25  2023 sbin
drwxr-xr-x   4 nobody nogroup       4096 Nov 11  2019 snap
drwxr-xr-x   3 nobody nogroup       4096 Jan 24  2020 srv
-rw-------   1 nobody nogroup 3748659200 Nov 11  2019 swap.img
dr-xr-xr-x  13 nobody nogroup          0 Nov 11 15:40 sys
drwxrwxrwt  10 nobody nogroup       4096 Nov 11 15:42 tmp
drwxr-xr-x  10 nobody nogroup       4096 Aug  5  2019 usr
drwxr-xr-x  13 nobody nogroup       4096 Aug  5  2019 var
lrwxrwxrwx   1 nobody nogroup         31 Jan 25  2023 vmlinuz -> boot/vmlinuz-4.15.0-202-generic
lrwxrwxrwx   1 nobody nogroup         31 Jan 25  2023 vmlinuz.old -> boot/vmlinuz-4.15.0-132-generic
root@ubuntu:~#

как в файловой системе, смонтированной как / перед тем, как tmpfs был смонтирован сверху. Почему я получаю этот результат?

Путь / специальный. Он соответствует корневому каталогу текущего процесса. Он не проверяет, смонтирована ли другая файловая система сверху.

Корневой каталог текущего процесса можно изменить. Это называется “chroot”.

Корневой каталог текущего пространства имен можно заменить. Это называется “pivot_root”.

Существует способ замены корневого каталога, если это необходимо. Этот процесс описывается как “привередливый” :-). Это полезно в “initramfs”.

ПРЕДУПРЕЖДЕНИЕ: “switch_root” удалит все файлы и каталоги на текущей корневой файловой системе. Не выполняйте команду “switch_root” в вашей обычной системе.

(Если [initramfs] нужно передать управление, он может замонтировать / с новым корневым устройством и выполнить другую инициализацию. См. утилиту switch_root ниже.)

При переключении на другое корневое устройство старый стиль initrd будет выполнять pivot_root, а затем размонтировать ramdisk. Но сейчас initramfs является rootfs: вы не можете ни pivot_root для rootfs, ни размонтировать его. Вместо этого удалите все из rootfs, чтобы освободить место (find -xdev / -exec rm ‘{}’ ‘;’), замонтируйте rootfs новым корнем (cd /newmount; mount –move . /; chroot .), подключите stdin/stdout/stderr к новому /dev/console и выполните новую инициализацию.

Поскольку это довольно привередливый процесс (и включает в себя удаление команд перед их исполнением), пакет klibc ввёл вспомогальную программу (utils/run_init.c), чтобы сделать всё это за вас. Большинство других пакетов (таких как busybox) назвали эту команду “switch_root”.

Documentation/filesystems/ramfs-rootfs-initramfs.rst

Ответ или решение

Когда вы используете команду unshare -Umr, вы создаете новое пространство имен для пользователя и монтирования, что позволяет вам работать с собственным, изолированным окружением. После этого вы монтируете tmpfs в качестве корневой файловой системы с помощью команды mount -t tmpfs tmpfs /. Однако, ожидая увидеть пустую директорию при выполнении команды ls -la /, вы столкнулись с не тем результатом, что вызывает вопросы.

Причины неожиданного результата

  1. Сохранение информации о пространстве имен: Когда вы создаете новое пространство имен монтирования, система работает с текущей иерархией файловой системы, включая информацию о монтировании родительского процесса. Это означает, что элементы, существующие в родительском пространстве имен, остаются доступными даже после монтирования новой tmpfs файловой системы в /.

  2. Логика символической ссылки: Результаты ls -la / показывают, что некоторые элементы являются символическими ссылками, указывающими на монтированные каталоги или файлы, которые по-прежнему доступны, несмотря на то, что вы поместили tmpfs на корень.

  3. Хранение информации о монтировании: Файловые системы в Linux имеют уровень абстракции, где каждая новая точка монтирования сохраняет информацию о предыдущих монтированиях. Это позволяет системе отслеживать все точки монтирования и атрибуты, оставаясь при этом совместимой с существующими процессами.

Плюсы и минусы монтирования tmpfs в качестве корневой файловой системы

  • Плюсы:

    • Идеально подходит для использования в контейнерах, виртуальных машинах или средах, где требуется быстрое и временное хранилище.
    • Позволяет мне контролировать и изолировать процессы от основной системы, что полезно для разработки или тестирования.
  • Минусы:

    • Не подходит для постоянного хранилища, так как данные в tmpfs хранятся только в оперативной памяти и будут потеряны после перезагрузки.
    • Сложность в управлении, когда требуется взаимодействие с существующими монтированными файловыми системами.

Альтернативные решения и рекомендации

Если необходимо создать полностью изолированное окружение без доступа к родительскому пространству имен, рассмотрите возможность:

  • Использования chroot: Это позволяет установить корневую файловую систему, однако также может быть необходимо монтировать необходимые системные директории.
  • Использования pivot_root: Это позволяет более гибко управлять корневой файловой системой, в частности, когда необходимо заменить использующуюся файловую систему на новую.

Тем не менее, будьте осторожны: команды, такие как switch_root, могут удалить все содержимое текущей корневой файловой системы и изначально предназначены для использования в специализированных окружениях, таких как initramfs.

Заключение

Таким образом, при монтировании tmpfs как корневой файловой системы в новой иерархии вы сохраняете доступ к информации о существующих монтированиях из родительского пространства имен. Для изоляции и создания чистого окружения можно рассмотреть альтернативные методы, такие как chroot или pivot_root, однако следует учитывать возможные последствия и ограничения этих методов.

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

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