Scroll to navigation

CHROOT(2) Руководство программиста Linux CHROOT(2)

ИМЯ

chroot - изменить корневой каталог

ОБЗОР

#include <unistd.h>

int chroot(const char *path);


Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

chroot():

Начиная с glibc 2.2.2:
_BSD_SOURCE ||

(_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
!(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600)

До glibc 2.2.2: не было

ОПИСАНИЕ

chroot() изменяет корневой каталог вызывающего процесса на тот, что задан аргументом path. Этот каталог будет использоваться для имён файлов, начинающихся с /. Корневой каталог наследуется всеми потомками вызывающего процесса.

Только привилегированный процесс (Linux: с мандатом CAP_SYS_CHROOT) может вызвать chroot().

Этот вызов изменяет только составляющую процесса разрешения имён и больше ничего.

Данный вызов не изменяет текущий рабочий каталог, поэтому после вызова '.' может оказаться вне дерева, являющегося корнем '/'. В частности, суперпользователь может выйти за пределы "тюрьмы chroot" выполнив:


mkdir foo; chroot foo; cd ..

Данный вызов не закрывает открытые файловые дескрипторы и поэтому через такие дескрипторы можно получить доступ к файлам за пределами дерева chroot.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

В зависимости от файловой системы могут быть возвращены другие ошибки. Наиболее распространённые ошибки перечислены далее:

Поиск запрещён из-за одного из частей префикса пути (См. также path_resolution(7).)
Аргумент path указывает за пределы доступного адресного пространства.
Произошла ошибка ввода-вывода.
Во время определения path встретилось слишком много символьных ссылок.
path слишком длинен.
Файл не существует.
Недостаточное количество памяти ядра.
Компонент path не является каталогом.
У вызвавшего процесса недостаточно прав.

СООТВЕТСТВИЕ СТАНДАРТАМ

SVr4, 4.4BSD, SUSv2 (отмечена как УСТАРЕВШАЯ). Эта функция не входит в POSIX.1-2001.

ЗАМЕЧАНИЯ

Дочерний процесс, созданный посредством fork(2), наследует корневой каталог родительского процесса. При вызове execve(2) корневой каталог остаётся неизменным.

В FreeBSD есть более ограничивающий системный вызов jail().

СМОТРИТЕ ТАКЖЕ

chdir(2), path_resolution(7)

2010-09-20 Linux