pivot_root

PIVOT_ROOT(2)   Ð ÑководÑÑво пÑогÑаммиÑÑа Linux   PIVOT_ROOT(2)



ÐÐЯ
       pivot_root - изменÑÐµÑ ÐºÐ¾ÑневÑÑ ÑайловÑÑ ÑиÑÑемÑ

ÐÐÐÐÐ
       int pivot_root(const char *new_root, const char *put_old);

       ÐамеÑание: Ð glibc Ð½ÐµÑ Ð¾Ð±ÑÑÑоÑной ÑÑнкÑии длÑ
       данного ÑиÑÑемного вÑзова; ÑмоÑÑиÑе ÐÐÐÐЧÐÐÐЯ.

ÐÐÐСÐÐÐÐ
       ÐÑзов 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 как коÑневой
       каÑалог (/).

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном вÑполнении возвÑаÑаеÑÑÑ 0. Ð
       ÑлÑÑае оÑибки возвÑаÑаеÑÑÑ -1, а errno
       ÑÑÑанавливаеÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑее знаÑение.

ÐШÐÐÐÐ
       ÐÑзов pivot_root() Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ (в errno) лÑбÑе
       оÑибки, коÑоÑÑе возвÑаÑаÑÑÑÑ stat(2). Также он
       Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑнÑÑÑ:

       EBUSY  ÐÑгÑÐ¼ÐµÐ½Ñ new_root или put_old наÑодиÑÑÑ Ð²
              ÑекÑÑей коÑневой Ñайловой ÑиÑÑеме, или
              какаÑ-Ñо ÑÐ°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑÑема Ñже
              ÑмонÑиÑована в put_old.

       EINVAL ÐÑгÑÐ¼ÐµÐ½Ñ put_old не наÑодиÑÑÑ Ð² деÑеве
              каÑалогов new_root.

       ENOTDIR
              ÐÑгÑÐ¼ÐµÐ½Ñ new_root или put_old не ÑвлÑеÑÑÑ
              каÑалогом.

       EPERM  ÐÑзÑваÑÑий пÑоÑеÑÑ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð¼Ð°Ð½Ð´Ð°Ñа
              CAP_SYS_ADMIN.

ÐÐРСÐÐ
       ÐÑзов pivot_root() поÑвилÑÑ Ð² Linux 2.3.41.

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       ÐÑзов pivot_root() еÑÑÑ ÑолÑко в Linux и поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾
       иÑполÑзование не пеÑеноÑимо.

ÐÐÐÐЧÐÐÐЯ
       Ð glibc Ð½ÐµÑ Ð¾Ð±ÑÑÑки Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑиÑÑемного
       вÑзова; запÑÑкайÑе его Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ syscall(2).

ÐÐФÐÐТЫ
       ÐÑзов pivot_root() не должен изменÑÑÑ ÐºÐ¾Ñневой
       и ÑабоÑий каÑалоги дÑÑÐ³Ð¸Ñ Ð¿ÑоÑеÑÑов в
       ÑиÑÑеме.

       ÐекоÑÑекÑное иÑполÑзование pivot_root() можеÑ
       пÑивеÑÑи к непÑедÑказÑемÑм поÑледÑÑвиÑм.

СÐÐТРÐТРТÐÐÐÐ
       chdir(2), chroot(2), stat(2), initrd(4), pivot_root(8)



Linux                             2012-07-13                     PIVOT_ROOT(2)