8.6. Изменение корневого каталога: chroot()
8.6. Изменение корневого каталога: chroot()
Текущий рабочий каталог, установленный с помощью chdir() (см. раздел 8.4.1 «Изменение каталога — chdir() и fchdir()»), является атрибутом процесса, таким же, как набор открытых файлов. Он также наследуется новыми процессами.
Менее известным является то, что у каждого процесса есть также текущий корневой каталог. Это именно на этот каталог ссылается имя пути /. В большинстве случаев корневые каталоги процесса и системы идентичны. Однако, суперпользователь может изменить корневой каталог с помощью (как вы догадались) системного вызова chroot():
#include <unistd.h> /* Обычный */
int chroot(const char *path);
Возвращаемое значение равно 0 при успешном завершении и -1 при ошибке.
Как указывает справочная страница GNU/Linux chroot(2), изменение корневого каталога не изменяет текущий каталог: программы, которые должны обеспечить нахождение под новым корневым каталогом, должны также вызвать затем chdir():
if (chroot("/new/root") < 0) /* Установить новый корневой каталог */
/* обработать ошибку */
if (chdir("/some/dir") < 0) /* Пути даны не относительно нового корневого каталога */
/* обработать ошибку */
Системный вызов chroot() чаще всего используется для демонов — фоновых программ, которые должны работать в специальном ограниченном окружении. Например, рассмотрите демон Интернета FTP, допускающий анонимный FTP (соединение любого клиента из любого места, без обычных имени пользователя и пароля). Очевидно, такое соединение не должно быть способным видеть все файлы целой системы. Вместо этого демон FTP выполняет chroot() в специальный каталог со структурой, достаточной лишь чтобы позволить ему функционировать. (Например, со своим собственным /bin/ls для перечисления файлов, со своей копией библиотеки С времени исполнения, если она разделяется, и, возможно, со своей копией /etc/passwd и /etc/group для отображения ограниченного набора имен пользователей и групп.)
POSIX не стандартизует этот системный вызов, хотя GNU/Linux и все системы Unix его поддерживают. (Он популярен с V7.) Он специализирован, но при необходимости очень удобен.