Ввод пространства имен монтирования перед настройкой chroot
позволяет избежать загромождения пространства имен хоста дополнительными монтированиями, например. для /proc
. Вы можете использовать chroot
внутри пространства имен монтирования в качестве приятного и простого хака.
Я думаю, что понимание pivot_root
дает определенные преимущества, но для этого нужно немного научиться. Документация не совсем все объясняет... хотя вman 8 pivot_root
(есть пример использования для команды оболочки ).man 2 pivot_root
(для системного вызова )могло бы быть понятнее, если бы он делал то же самое и включал пример программы на C.
Сразу после входа в пространство имен монтирования вам также потребуется mount --make-rslave /
или аналогичный. В противном случае все ваши изменения монтирования распространяются на монтирования в исходном пространстве имен, включая pivot_root
. Вы этого не хотите :).
Если вы использовали команду unshare --mount
, обратите внимание, что в документации указано, что mount --make-rprivate
применяется по умолчанию. AFAICS это плохой вариант по умолчанию, и вы не хотите этого в производственном коде. Например. в этот момент он остановит eject
работу с смонтированным DVD или USB в пространстве имен хоста.DVD или USB останутся смонтированными внутри частного дерева монтирования, и ядро не позволит вам извлечь DVD.
Как только вы это сделаете, вы можете смонтировать, например,. каталог /proc
, который вы будете использовать. Так же, как и для chroot
.
В отличие от случая, когда вы используете chroot
, pivot_root
требует, чтобы ваша новая корневая файловая система была точкой монтирования. Если это еще не так, вы можете удовлетворить это, просто применив привязку:mount --rbind new_root new_root
.
Используйте pivot_root
-, а затем umount
старую корневую файловую систему с параметром -l
/ MNT_DETACH
.(Вам не нужно umount -R
, что может занять больше времени.).
Технически, использование pivot_root
обычно также требует использования chroot
; это не "или -или".
Согласно man 2 pivot_root
, это определяется только как замена корня пространства имен монтирования. Не определено изменение физического каталога, на который указывает корень процесса. Или текущий рабочий каталог (/proc/self/cwd
). Бывает, что действительно так и делают, но это хак для обработки потоков ядра. На странице руководства говорится, что это может измениться в будущем.
Обычно вам нужна эта последовательность:
chdir(new_root); // cd new_root
pivot_root(".", put_old); // pivot_root. put_old
chroot("."); // chroot.
Положение chroot
в этой последовательности — еще одна тонкая деталь . Хотя смысл pivot_root
состоит в том, чтобы изменить пространство имен монтирования, код ядра, кажется, находит корневую файловую систему для перемещения, просматривая корень процесса -, что и устанавливает chroot
.
В принципе, имеет смысл использовать pivot_root
для обеспечения безопасности и изоляции. Мне нравится думать о теории безопасности на основе возможностей -. Вы передаете список конкретных необходимых ресурсов, и процесс не может получить доступ к другим ресурсам. В данном случае мы говорим о файловых системах, переданных в пространство имен монтирования. Эта идея в целом применима к функции «пространства имен» Linux, хотя я, вероятно, не очень хорошо выразил ее.
chroot
устанавливает только корень процесса,но процесс по-прежнему ссылается на полное пространство имен монтирования. Если процесс сохраняет привилегию на выполнение chroot
, он может выполнить резервное копирование пространства имен файловой системы. Как подробно описано в man 2 chroot
, «суперпользователь может выйти из «тюрьмы chroot» с помощью...».
Еще одна мысль, -провоцирующая способ отмены chroot
— это nsenter --mount=/proc/self/ns/mnt
. Возможно, это более сильный аргумент в пользу принципа.nsenter
/ setns()
обязательно повторно -загружает корень процесса из корня пространства имен монтирования ... хотя тот факт, что это работает, когда два ссылаются на разные физические каталоги, может считаться ядром ошибка. (Техническое примечание :может быть несколько файловых систем, смонтированных друг над другом в корневом каталоге; setns()
использует верхний, установленный последним ).
Это иллюстрирует одно преимущество объединения пространства имен монтирования с «пространством имен PID». Нахождение внутри пространства имен PID не позволит вам войти в пространство имен монтирования неограниченного процесса. Это также предотвращает вход в корень неограниченного процесса(/proc/$PID/root
). И, конечно же, пространство имен PID также предотвращает уничтожение любого процесса, находящегося вне его :-).
В современных ноутбуках динамики часто отключаются (аппаратным контроллером )при подключении наушников. Это не особенность Linux, а особенность самой машины.
Это, например, случай с моим ThinkPad T490s.