Документация по LinuxLinuxDoc.Ru 🔍

pivot_root - изменяет корневую файловую систему

НАЗВАНИЕ
pivot_root - изменяет корневую файловую систему

СИНТАКСИС
#include

_syscall2(int,pivot_root,const char *,new_root,const char
*,put_old)

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.
Читать новости Linux в Telegram
Linux - pivot_root - изменяет корневую файловую систему
Мы в соцсетях ✉