Что такое chroot
chroot — команда для смены корневой директории (/) на любую доступную в этой ОС. Смена корневой директории происходит с выполнением программы (по умолчанию /bin/sh). Для выполнения chroot вы должны быть суперпользователем
SYNOPSIS:
chroot [-g group[,group[,...]]] [-u user] newroot [command]
Опции
- -g — устанавливает группы, первую указанную устанавливает в качестве основной (должна найтись в /etc/groups).
- -u — устанавливает пользователя (по умолчанию root) (должен найтись в базе данных пользователей).
- newroot — новая корневая директория.
- command — команда, которую надо выполнить.
Пример использования
Из статьи «Восстановление GRUB»: <syntaxhighlight lang=sh> for f in proc sys dev; do mount -o bind /$f /mnt/$f; done chroot /mnt /usr/sbin/grub-install /dev/sdX </syntaxhighlight>
Системный вызов chroot
Программа chroot использует системный вызов chroot(2) для смены корневой директории.
SYNOPSIS:
<syntaxhighlight lang=c>
- include <unistd.h>
int chroot(const char *dirname); </syntaxhighlight> Параметры:
- dirname — директория, которую необходимо сделать корневой.
Возвращаемые значения:
- «0» — директория успешно сделана корневой.
- «-1» — произошла ошибка (какая именно — смотрим код в глобальной переменной errno) и корневая директория не изменена.
Ошибки в errno:
- ENOTDIR — dirname не является директорией.
- ENAMETOOLONG — dirname является слишком длинным путем (длина больше PATH_MAX).
- ENOTENT — директории dirname не существует.
- EACCES — в праве поиска для какого-либо компонента пути отказано.
- ELOOP — слишком много символьных ссылок встречается в каком-либо компоненте пути.
- EFAULT — dirname находится вне адресного пространства процесса.
- EIO — ошибка ввода-вывода при чтении или записи ФС.
- EPERM — вызов был произведен процессом не от имени root (нужно запускать программу от имени суперпользователя).
После успешного завершения вызова chroot можно выполнять программу в новой корневой директории с помощью одной из функций семейства exec или выполнить другие действия.