Вопрос или проблема
По явной просьбе я открыл этот вопрос, чтобы задать следующее: в системах Ubuntu linux начальное (т.е. root или по умолчанию) пространство монтирования имеет параметры для смонтированных файловых систем, которые отличаются от тех же смонтированных файловых систем в дочернем пространстве монтирования, которое изначально получает копию этого.
root@ubuntu:~# cat /proc/self/mountinfo
25 31 0:23 / /sys rw,nosuid,nodev,noexec,relatime shared:7 - sysfs sysfs rw
26 31 0:24 / /proc rw,nosuid,nodev,noexec,relatime shared:12 - proc proc rw
27 31 0:5 / /dev rw,nosuid,relatime shared:2 - devtmpfs udev rw,size=4008708k,nr_inodes=1002177,mode=755,inode64
28 27 0:25 / /dev/pts rw,nosuid,noexec,relatime shared:3 - devpts devpts rw,gid=5,mode=620,ptmxmode=000
29 31 0:26 / /run rw,nosuid,nodev,noexec,relatime shared:5 - tmpfs tmpfs rw,size=812844k,mode=755,inode64
31 1 8:2 / / rw,relatime shared:1 - ext4 /dev/sda2 rw
32 25 0:6 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime shared:8 - securityfs securityfs rw
33 27 0:28 / /dev/shm rw,nosuid,nodev shared:4 - tmpfs tmpfs rw,inode64
34 29 0:29 / /run/lock rw,nosuid,nodev,noexec,relatime shared:6 - tmpfs tmpfs rw,size=5120k,inode64
35 25 0:30 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime shared:9 - cgroup2 cgroup2 rw,nsdelegate,memory_recursiveprot
36 25 0:31 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime shared:10 - pstore pstore rw
37 25 0:32 / /sys/fs/bpf rw,nosuid,nodev,noexec,relatime shared:11 - bpf bpf rw,mode=700
38 26 0:33 / /proc/sys/fs/binfmt_misc rw,relatime shared:13 - autofs systemd-1 rw,fd=29,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=17383
39 27 0:20 / /dev/mqueue rw,nosuid,nodev,noexec,relatime shared:14 - mqueue mqueue rw
40 27 0:34 / /dev/hugepages rw,relatime shared:15 - hugetlbfs hugetlbfs rw,pagesize=2M
41 25 0:7 / /sys/kernel/debug rw,nosuid,nodev,noexec,relatime shared:16 - debugfs debugfs rw
42 25 0:12 / /sys/kernel/tracing rw,nosuid,nodev,noexec,relatime shared:17 - tracefs tracefs rw
---------------------------- output omitted ------------------------------------------
root@ubuntu:~#
root@ubuntu:~# unshare -m /bin/bash
root@ubuntu:~#
root@ubuntu:~# cat /proc/self/mountinfo
714 713 8:2 / / rw,relatime - ext4 /dev/sda2 rw
715 714 0:5 / /dev rw,nosuid,relatime - devtmpfs udev rw,size=4008708k,nr_inodes=1002177,mode=755,inode64
716 715 0:25 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=000
719 715 0:28 / /dev/shm rw,nosuid,nodev - tmpfs tmpfs rw,inode64
720 715 0:20 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw
725 715 0:34 / /dev/hugepages rw,relatime - hugetlbfs hugetlbfs rw,pagesize=2M
726 714 0:26 / /run rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,size=812844k,mode=755,inode64
739 726 0:29 / /run/lock rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,size=5120k,inode64
740 726 0:36 / /run/credentials/systemd-sysusers.service ro,nosuid,nodev,noexec,relatime - ramfs none rw,mode=700
741 726 0:26 /snapd/ns /run/snapd/ns rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,size=812844k,mode=755,inode64
742 726 0:26 /netns /run/netns rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,size=812844k,mode=755,inode64
743 726 0:46 / /run/user/1000 rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=812840k,nr_inodes=203210,mode=700,uid=1000,gid=1000,inode64
744 714 0:23 / /sys rw,nosuid,nodev,noexec,relatime - sysfs sysfs rw
745 744 0:6 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime - securityfs securityfs rw
746 744 0:30 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - cgroup2 cgroup2 rw,nsdelegate,memory_recursiveprot
747 744 0:31 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime - pstore pstore rw
748 744 0:32 / /sys/fs/bpf rw,nosuid,nodev,noexec,relatime - bpf bpf rw,mode=700
814 744 0:7 / /sys/kernel/debug rw,nosuid,nodev,noexec,relatime - debugfs debugfs rw
815 744 0:12 / /sys/kernel/tracing rw,nosuid,nodev,noexec,relatime - tracefs tracefs rw
---------------------------- output omitted ------------------------------------------
root@ubuntu:~#
Например, корневая файловая система /sda/sda2
помечена как shared:1
в корневом/начальном пространстве монтирования, в то время как она помечена как частная (без явной метки) в дочернем пространстве монтирования. В чем причина этого? Спасибо.
Ответ или решение
Общие и частные точки монтирования в родительских и дочерних пространствах имен монтирования
Понимание различий между общими и частными точками монтирования в Linux, особенно в контексте пространств имен монтирования, имеет важное значение для системного администрирования и разработки контейнеров. В данной статье мы рассмотрим, что подразумевается под этими терминами, и как они действуют в родительских и дочерних пространствах имен, используя вывод команды mountinfo
для иллюстрации.
Основные понятия
- Точка монтирования — это место в файловой структуре, куда монтируется файловая система.
- Общее (shared) монтирование означает, что изменения в данной точке монтирования (например, добавление или удаление файлов) будут видны в других пространствах имен, которые разделяют это монтирование.
- Частное (private) монтирование предполагает, что изменения не будут видны в других пространствах имен; дочерние пространства имен имеют свою собственную изолированную версию данной точки монтирования.
Пример на базе выводов mountinfo
При рассмотрении вывода команды cat /proc/self/mountinfo
в родительском пространстве имен (изначальном) мы можем заметить, что корневая файловая система /dev/sda2
обозначается как shared:1
, что означает, что она является общей точкой монтирования. Это дает возможность любому другим процессам, находящимся в других пространствах имен, которые также сделали это монтирование общим, видеть изменения.
Когда вы создаете новое дочернее пространство имен с помощью команды unshare -m /bin/bash
, корневая файловая система, которую мы видим в выводе mountinfo
, уже не имеет явного тега общности. В данном случае она просто представлена без каких-либо тегов, что подразумевает, что она частная. Это означает, что в дочернем пространстве имен монтирование не будет видеть изменений, сделанных в родительском пространстве, и наоборот.
Почему это важно?
-
Изоляция процессов: Дочерние пространства имен монтирования обеспечивают уровень изоляции для процессов, позволяя разработчикам и администраторам создавать безопасные и управляемые среды выполнения, особенно в контейнеризованных приложениях.
-
Управление зависимостями: Понимание различных типов монтирования позволяет эффективно управлять зависимостями и конфигурациями между различными приложениями и службами, минимизируя риск неожиданных конфликтов и проблем с доступом.
-
Безопасность: Использование частных точек монтирования помогает избегать случайных изменений, происходящих в общих файловых системах, что увеличивает уровень безопасности системы.
Заключение
Различия между общими и частными точками монтирования в различных пространствах имен играют ключевую роль в управлении файловыми системами в Linux. Понимание этих принципов и их применения может значительно упростить администрирование систем, особенно в средах с высокой степенью изоляции, таких как контейнеры. Для более глубокого анализа и практического применения рекомендаций по использованию пространств имен монтирования рекомендуется изучить более подробные руководства и документацию по данной теме.