int pivot_root(const char *new_root, const char *put_old);
ОПИСАНИЕ
pivot_root перемещает корневую систему текущего процесса
в каталог put_old и устанавливает каталог new_root новой
корневой файловой системы текущего процесса.
pivot_root обычно используется при загрузке, когда система запускает
временную файловую систему (например, initrd), а затем подключает
настоящую корневую файловую систему, делая тем самым ее корневой для всех
процессов и подпроцессов.
pivot_root может изменить (или не изменить) текущие корневые
и рабочие каталоги процессов или подпроцессов, использующих старый
корневой каталог. Для запуска процесса, вызывающего pivot_root, Вы должны
убедиться в том, что процессы, корневой или рабочий каталог которых являются старым
корневым каталогом текущего процесса, работали нормально в каждом случае.
Самый простой способ убедиться в этом - сменить их корневой и рабочий
каталог на new_root до вызова pivot_root.
Содержимое предыдущего абзаца, на самом деле, является не совсем определенным,
потому что реализация pivot_root может измениться в будущем.
На момент написания этого документа pivot_root изменяет корневой
и рабочий каталоги каждого процесса или подпроцесса на new_root,
если они указывают на старый корневой каталог. Это необходимо для того, чтобы
подпроцессы ядра не занимали старый корневой каталог, даже если они
вообще не обращались к файловым системам. В будущем, возможно, будет
создан механизм, заставляющий подпроцессы ядра освобождать старый
корневой каталог, что позволит удалить этот довольно навязчивый механизм
из pivot_root.
Заметьте, что все это относится и к текущему процессу pivot_root ,
который может изменить (а может и не изменить) его рабочий каталог. По этой
причине рекомендуется вызывать chdir("/") сразу после вызова
pivot_root.
На new_root и put_old накладываются следующие ограничения:
-
Они должны быть каталогами.
-
new_root и put_old не могут быть в одной файловой системе с
текущим корневым каталогом.
-
put_old должен быть в дереве каталогов new_root, т.е.,
путем добавления положительного количества /.. к put_old
можно получить каталог, равный new_root.
-
К put_old не должны быть подключены файловые системы.
См. также страницу pivot_root(8), в которой приведены
дополнительные примеры.
Если текущий корневой каталог не является точкой подключения файловой
системы (например, после chroot(2) илиpivot_root, см. ниже),
то к put_old подключается не старый корневой каталог, а точка
подключения его файловой системы.
ЗАМЕЧАНИЯ
new_root может и не быть точкой подключения файловой системы. В этом случае
в /proc/mounts будет указана точка подключения файловой системы, содержащей
новый корневой каталог new_root (/).
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При удачном завершении вызова возвращаемое значение равно нулю. При ошибке оно
равно -1, а переменной
errno
присваивается номер ошибки.
НАЙДЕННЫЕ ОШИБКИ
pivot_root может возвращать (в errno) любые коды ошибок, как и
stat(2). К тому же, pivot_root может возвращать:
EBUSY
new_root или put_old находятся в текущей корневой файловой
системе, или какая-то файловая система уже подключена к put_old.
EINVAL
put_old не находится в дереве каталогов new_root.
ENOTDIR
new_root или put_old не являются каталогами.
EPERM
Текущий процесс не имеет прав суперпользователя.
НАЙДЕННЫЕ ОШИБКИ
pivot_root не должен изменять корневые и рабочие каталоги
других процессов в системе.
Некорректное использование pivot_root может привести к
непредсказуемым последствиям.
СООТВЕТСТВИЕ СТАНДАРТАМ
pivot_root - это функция, специфичная для Linux. Не рекомендуется
использовать ее в программах, портируемых на другие системы.
ПРИМЕЧАНИЯ ПО ИСТОРИИ
pivot_root был впервые реализован в ядре Linux версии 2.3.41.