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.