Вопрос или проблема
Я знаю, что unshare -m
создает новое пространство имен монтирования, перемещая процесс, выполняющий его, в новое создаваемое пространство имен монтирования.
Последнее получает копию пространства имен монтирования родителя. Действительно, посмотрите на следующее:
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
---------------------------- вывод опущен ------------------------------------------
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
---------------------------- вывод опущен ------------------------------------------
root@ubuntu:~#
Выводы немного различаются, даже несмотря на то, что зависимости родителя и ребенка монтирования одинаковы (разные идентификаторы
в первых двух столбцах ожидаемы, так как пространства имен монтирования не одинаковы).
Теперь вопрос: есть ли причина различного порядка, в котором на самом деле отображаются точки монтирования?
Документация ядра абсолютно не дает никаких гарантий относительно порядка записей в /proc/*/mountinfo. (Так получается, что они упорядочены по идентификатору, но сам идентификатор – это просто уникальный идентификатор, без какого-либо смысла.)
Итак, нет, этот порядок не имеет никакого значения. Ни в пространстве имен родителя, ни в пространстве имен ребенка. Таким образом, изменение порядка также не имеет смысла.
Ответ или решение
При создании нового пространства имен монтирования с помощью команды unshare -m
в Linux происходит интересный процесс, который может вызвать вопросы у специалистов в области информационных технологий. Этот процесс включает копирование пространства имен монтирования родительского процесса в новое пространство. Однако, несмотря на то что структура монтирования остается той же, порядок отображения этих монтированных точек можно ожидать увидеть в /proc/self/mountinfo
, однако он может отличаться для разных пространств имен.
Порядок отображения записей в пространстве имен монтирования
В представленных вами данных из /proc/self/mountinfo
наблюдается различие в порядке записей между родительским и дочерним процессами. Об этом следует отметить несколько ключевых моментов:
-
Отсутствие гарантии порядка: Документация ядра Linux ясно указывает, что порядок записей в
/proc/*/mountinfo
не имеет четких гарантий. Это значит, что порядок не определяется каким-либо алгоритмом, и может меняться от запуска к запуску, а также между различными пространствами имен. -
Идентификаторы монтирования: Первые два столбца в выводе представляют собой уникальные идентификаторы монтирования (ID), которые свидетельствуют о связи между монтированными точками. Эти ID действительно различаются между родительским и дочерним пространствами. Они обеспечивают уникальность записей, позволяя системе корректно обрабатывать монтированные точки.
-
Отображение иерархии: Хотя контекст иерархии монтирования может оставаться неизменным, порядок, в котором они представлены, обусловлен внутренними механизмами ядра. Это может объяснить, почему порядок записей отличается: во время выполнения различных операций с монтированием возможно изменение состояния и кэширования в ядре.
Значение разницы в порядке
Разница в отображении монтированных точек между различными пространствами имен не имеет принципиального значения. Как было отмечено, порядок не является индикатором каких-либо параметров монтирования или их состояния. Он не влияет на работу процессов, использующих эти пространства имен, и не влечет за собой изменение функциональности монтированных точек.
Заключение
Суммируя вышеизложенное, можно сказать, что порядок, в котором отображаются монтированные точки в пространствах имен, не играет роли и не имеет прямого значения для администратора или разработчика. Важно понимать, что ядро Linux работает с уникальными идентификаторами, и хоть порядок отображения может меняться, это не влияет на целостность или работу системных функций. Ключ к пониманию заключается в осознании того, что механизм управления пространствами имен в Linux высоко оптимизирован и предназначен для поддержания целостности системы.