- chroot (Русский)
- Contents
- Причины
- Требования
- Монтирование разделов
- Изменение корневого раздела
- Используя arch-chroot
- Используя chroot
- Используя systemd-nspawn
- Запуск графических приложений в среде chroot
- Выход из среды chroot
- Без прав суперпользователя
- PRoot
- Fakechroot
- Linux / Unix: chroot Command Examples
- Purpose
- Syntax
- chroot command examples
- How do I exit from chrooted jail?
- Find out if service in chrooted jail or not
- Rescue and fix software RAID system with chroot
- But wait, there’s more!
- A note about chrooting apps on a Linux or Unix-like systems
- chroot command options
- Chroot
- Содержание
- Подготовка к переходу в целевую систему [ править ]
- Переход в целевую систему [ править ]
- Первым делом в целевой системе [ править ]
- Выход из целевой системы [ править ]
- Чрут в экзотическую систему [ править ]
- А можно ли попроще? [ править ]
chroot (Русский)
Chroot — операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов. Программа, запущенная в таком окружении не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называется chroot jail.
Contents
Причины
Изменение корневого каталога обычно производится для выполнения действий по обслуживанию систем, загрузка и/или вход в которых стали невозможны. В таком режиме, например, могут быть выполнены:
Требования
- Наличие привилегий суперпользователя.
- Возможность загрузки с другой среды Linux, например, LiveCD, загрузочного USB-носителя или другого установленного дистрибутива.
- Совпадение архитектур двух сред: с которой производится загрузка и в которую происходит изменение корня. Архитектуру текущей среды можно узнать командой # uname -m (например, i686 или x86_64).
- Если среде chroot необходимы какие-нибудь модули ядра, они должны быть загружены.
- Если нужен раздел подкачки, он должен быть включен: swapon /dev/sdxY .
- Интернет-соединение установлено, если нужно.
Монтирование разделов
Корневой раздел среды Linux, в которую вы хотите войти с chroot, должен быть первым делом смонтирован. Чтобы найти имя раздела, выполните:
Затем создайте каталог для монтирования корневого раздела и смонтируйте его:
Если отдельные системные каталоги были вынесены на отдельные разделы, их также нужно смонтировать в файловую систему корневого раздела:
Изменение корневого раздела
Используя arch-chroot
Bash-скрипт arch-chroot является частью пакета arch-install-scripts из официальных репозиториев. Перед тем, как запускать /usr/bin/chroot , этот скрипт монтирует интерфейсные файловые системы вроде /proc и делает /etc/resolv.conf доступным из под окружения chroot.
Запустите arch-chroot с указанием нового корневого каталога:
Чтобы запустить командную оболочку bash вместо sh:
Чтобы запустить mkinitcpio -p linux в окружении chroot минуя создание сеанса в командной оболочке:
Используя chroot
Смонтируйте временные интерфейсные файловые системы:
Чтобы использовать интернет-соединение в chroot может понадобиться скопировать resolv.conf:
Чтобы запустить bash в окружении chroot:
После входа в сеанс chroot может понадобиться проинициализировать среду командной оболочки в новой среде:
Используя systemd-nspawn
systemd-nspawn может использоваться для запуска команды или операционной системы в легковесном контейнере. Во многих случаях он похож на chroot, но является более мощным инструментом, так как он полностью эмулирует отдельную иерархию файловой системы и дерево процессов, различные системы межпроцессного взаимодействия, имя хоста и домена.
Перейдите в точку монтирования нового корневого раздела и запустите systemd-nspawn:
Нет необходимости самостоятельно монтировать интерфейсные файловые системы вроде /proc , так как systemd-nspawn запускает новый процесс init в созданной виртуальной среде, который берет на себя эту задачу. Это похоже на загрузку второй операционной системы внутри основной, но без создания виртуальной машины.
Чтобы вернуться в основную систему, просто разлогиньтесь или запустите команду poweroff. После этого вы можете размонтировать разделы, как показано в #Выход из среды chroot.
Запуск графических приложений в среде chroot
Если у вас есть запущенный X-сервер, вы сможете запускать даже графические приложения в среде chroot.
Чтобы разрешить среде chroot соединение с сервером X, откройте виртуальный терминал внутри сервера (то есть, внутри рабочего стола пользователя, который в данный момент вошел в систему), запустите команду xhost, которая даст права каждому подключаться к X-серверу пользователя:
Теперь, для соединения приложений с сервером X, установите переменной окружения DISPLAY в сеансе chroot значение, совпадающее с переменной окружения DISPLAY пользователя, от имени которого запущен сервер. То есть, выполните
от имени этого пользователя для того, чтобы узнать значение переменной, и выполните
в среде chroot, установив переменной нужное значение (в данном примере это :0 ).
Выход из среды chroot
После завершения работы, выйдите из сеанса chroot:
Теперь размонтируйте временные файловые системы и корневой раздел:
Без прав суперпользователя
Chroot требует привелегий суперпользователя, что может быть нежелательно. Однако, есть несколько способов симулировать работу chroot, используя альтернативные реализации.
PRoot
PRoot может использоваться для изменения корневого раздела и использовать mount —bind без привелегий суперпользователя. Это полезно для ограничивания доступа приложений до единственного каталога или запуска программ, собранных для другой архитектуры. Однако PRoot имеет ограничения, связанные с тем, что все файлы принадлежат пользователю на основной системе. PRoot предоставляет опцию —root-id , которая может быть использована в качестве обходного пути для этих ограничений, по тому же принципу (хотя и более ограниченно), что и в fakeroot.
Fakechroot
fakechroot является небольшой прослойкой, которая перехватывает системные вызовы chroot и симулирует поведение системы, на самом деле не выполняя реальных вызовов (на которые все равно нет прав). Он может использоваться вместе с fakeroot для создания видимости того, что chroot запускается суперпользователем.
Источник
Linux / Unix: chroot Command Examples
I am a new Linux and Unix user. How do I change the root directory of a command? How do I change the root directory of a process such as web-server using a chroot command to isolate file system? How do I use a chroot to recover password or fix the damaged Linux/Unix based environment?
Each process/command on Linux and Unix-like system has current working directory called root directory of a process/command. You can change the root directory of a command using chroot command, which ends up changing the root directory for both current running process and its children.
chroot command details | |
---|---|
Description | Change root directory |
Category | Processes Management |
Difficulty | Easy |
Root privileges | Yes |
Est. reading time | 8 minutes |
Table of contents
|
- Privilege separation for unprivileged process such as Web-server or DNS server.
- Setting up a test environment.
- Run old programs or ABI in-compatibility programs without crashing application or system.
- System recovery.
- Reinstall the bootloader such as Grub or Lilo.
- Password recovery – Reset a forgotten password and more.
Purpose
The chroot command changes its current and root directories to the provided directory and then run command, if supplied, or an interactive copy of the user’s login shell. Please note that not every application can be chrooted.
Syntax
The basic syntax is as follows:
chroot /path/to/new/root command
chroot /path/to/new/root /path/to/server
chroot [options] /path/to/new/root /path/to/server
chroot command examples
In this example, build a mini-jail for testing purpose with bash and ls command only. First, set jail location using mkdir command:
$ J=$HOME/jail
Create directories inside $J:
$ mkdir -p $J
$ mkdir -p $J/
$ cd $J
Copy /bin/bash and /bin/ls into $J/bin/ location using cp command:
$ cp -v /bin/
Copy required libs in $J. Use ldd command to print shared library dependencies for bash:
$ ldd /bin/bash
Sample outputs:
Copy libs in $J correctly from the above output:
$ cp -v /lib64/libtinfo.so.5 /lib64/libdl.so.2 /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 $J/lib64/
Sample outputs:
Copy required libs in $J for ls command. Use ldd command to print shared library dependencies for ls command:
$ ldd /bin/ls
Sample outputs:
You can copy libs one-by-one or try bash shell for loop as follows:
Finally, chroot into your new jail:
$ sudo chroot $J /bin/bash
Try browsing /etc or /var:
# ls /
# ls /etc/
# ls /var/
A chrooted bash and ls application is locked into a particular directory called $HOME/$J and unable to wander around the rest of the directory tree, and sees that directory as its “/” (root) directory. This is a tremendous boost to security if configured properly. I usually lock down the following applications using the same techniques:
How do I exit from chrooted jail?
Type exit
$ exit
Sample session from above commands:
Animated gif 01: Linux / Unix: Bash Chroot ls Command Demo
Find out if service in chrooted jail or not
Sample outputs from my Linux based server:
The PID 8613 pointing out to / (root) i.e. the root directory for application is not changed or chrooted. This is a quick and dirty way to find out if application is chrooted or not without opening configuration files. Here is another example from chrooted nginx server:
- No ads and tracking
- In-depth guides for developers and sysadmins at Opensourceflare✨
- Join my Patreon to support independent content creators and start reading latest guides:
- How to set up Redis sentinel cluster on Ubuntu or Debian Linux
- How To Set Up SSH Keys With YubiKey as two-factor authentication (U2F/FIDO2)
- How to set up Mariadb Galera cluster on Ubuntu or Debian Linux
- A podman tutorial for beginners – part I (run Linux containers without Docker and in daemonless mode)
- How to protect Linux against rogue USB devices using USBGuard
Join Patreon ➔
The root directory for application is changed to /nginxjail.
Rescue and fix software RAID system with chroot
I’m assuming that software RAID based Linux system is not booting. So you booted system either using the Live CD or networked based remote rescue kernel mode to fix the system. In this example, I booting RHEL based system using live Linux DVD/CD and chroot into /dev/sda1 and/or /dev/md0 to fix the problem:
But wait, there’s more!
See all other chroot command related examples on nixCraft:
A note about chrooting apps on a Linux or Unix-like systems
Should you use the chroot feature all the time? In the above example, the program is fairly simple but you may end up with several different kinds of problems such as:
- Missing libs in jail can result into broken jail.
- Complex program are difficult to chroot. I suggest you either try real jail such as provided by FreeBSD or use virtualization soultuon such as KVM on Linux.
- App running in jail can not run any other programs, can not alter any files, and can not assume another user’s identity. Loosen these restrictions, you have lessened your security, chroot or no chroot.
- Do not forgot, to updated chrooted apps when you upgrade apps locally.
- Not every app can or should be chrooted.
- Any app which has to assume root privileges to operate is pointless to attempt to chroot, as root can generally escape a chroot.
- Chroot is not a silver bullet. Learn how to secure and harden rest of the system too.
chroot command options
From the chroot(8) command man page:
See also
- chroot(8) Linux/Unix command man page
- Man pages – chroot(2)
- OpenBSD documentation – See Apache chrooting faq for more information.
🐧 Get the latest tutorials on Linux, Open Source & DevOps via
Источник
Chroot
Чрут (команда chroot, от англ. change root) — это временная смена корня. Может выполняться с разными целями. Например, загружаемся с ALT Rescue флэшки и чиним поломанную систему или меняем забытый пароль пользователя root, для чего монтируем корень целевой системы и делаем в него чрут. Все нижеописанные действия требуют полномочий пользователя root.
Содержание
Подготовка к переходу в целевую систему [ править ]
Предполагается, что корень целевой системы находится во втором разделе первого диска (/dev/sda2). Перед тем, как сменить корень, мы уже подняли сеть. Но, чтобы в чруте работало преобразование имён в IP-адреса (и обратно), мы скопировали текущий /etc/resolv.conf, например, на случай, если будем ставить пакеты из сети.
Также мы сделали bind-mount ВСЕХ устройств из исходной системы. Все необходимые устройства должны быть в будущем /dev. bind-mount решает эту задачу одной командой, потому что, как правило, в исходной системе все имеющиеся устройства уже доступны через devtmpfs в /dev. Однако, если мы не доверяем этому чруту, не хотим, чтобы из него можно было оказать негативное воздействие на исходную систему, из которой мы заходим в этот чрут, то делать bind-mount напротив, не следует. Достаточно вручную определить в /mnt/target/dev только необходимые ноды устройств (man mknod).
Последней командой мы переустановили hostname. Если имя хоста выводится в приглашении, то во время работы в чруте имя будет ожидаемым. Также это необходимо для работы с некоторыми утилитами, привязывающимися к имени хоста, например, mdadm. Не забывайте вернуть оригинальный hostname по возвращении в исходную систему!
Переход в целевую систему [ править ]
В простом случае так. PS1 рекомендуется менять, чтобы визуально отличать приглашение в чруте от приглашений в других терминалах. Вместо /bin/bash можно указать свою любимую оболочку. Предлагаемый выше вызов как бы перенесёт вас в целевую систему, в точку, когда система с ядром и initrd уже загрузились, когда запустились все службы, когда было дано дано приглашение войти в систему, разве что без ввода логина и пароля. На самом деле ничего этого, конечно, не было, просто при запуске процесс /bin/bash получил в качестве «корневой» директорию /mnt/target. Ни /bin/bash, ни что-либо из него запущенное не смогут увидеть директории выше уровнем, им доступно только содержимое /mnt/target, которое они видят как «/». Но есть ещё один существенный нюанс. Команда выше передаёт все переменные окружения из исходной системы, а это далеко не всегда желательно. Более длинный, но более безопасный вариант запуска мог бы выглядеть следующим образом:
Здесь мы очищаем ВСЕ переменные среды для новой оболочки и устанавливаем всего несколько переменных, передавая им определённые значения. Такой подход позволит избежать всевозможных side-эффектов при дальнейшей работе в чруте. Другой нюанс заключается в том, что с высокой вероятностью мы загрузились с ДРУГОЙ версией ядра, возможно даже из ДРУГОГО дистрибутива GNU/Linux. Команды типа uname -r, uanme -a покажут всё верно, то бишь информацию о реально загруженном ядре, на которую ориентируются такие скрипты, как make-initrd. По умолчанию они просто выругаются, не найдя такого ядра в вашем чруте, поэтому их нужно запускать иначе:
Первым делом в целевой системе [ править ]
Первая и наиболее предпочтительная форма подключения /proc, /sys и /dev/pts. Про другие варианты говорится далее.
Отнюдь не всё это может потребоваться. Если какая-то программа ругается, что ей нужен sysfs, например, lspci без него работать не станет, можно смонтировать и позже, по мере необходимости. Если хотите понять, почему первые две команды выше имеют сокращённую форму, а третья команда — полную форму, загляните в /etc/fstab. Что характерно для ALT Linux, может быть совершенно иначе в других дистрибутивах. Не забывайте об этом, чрутясь куда-то не туда. 🙂
Выход из целевой системы [ править ]
Не забываем отмонтировать всё, что было смонтировано ранее. Обращаем внимание на синтаксис.
Чрут в экзотическую систему [ править ]
В случае, если в целевой системе отсутствует команда mount, что совсем не характерно для ALT Linux, смонтировать в ней /proc, /sys и /dev/pts не получится. Тогда придётся сделать это заранее до перехода в экзотический чрут.
Хотя последняя форма наиболее универсальная, есть целый ряд причин, по которым предпочтительно монтировать эти три файловые системы только по мере необходимости, и только изнутри самого чрута.
Кроме того, возможен чрут из 64-бит исходной системы в 32-бит целевую систему. В ALT Linux для этих целей используется setarch.
При отсутствии /usr/bin/env в целевой системе, что также не характерно для ALT Linux, достаточно поменять аргументы местами, например:
А можно ли попроще? [ править ]
Да, можно. Так как мы используем ALT Rescue, то сразу после загрузки нам доступен скрипт mount-system (о чём будет подсказка). Делаем так:
Если что-то пошло не так, то переходим к началу статьи.
Источник