名 前
pivot_root − root フ ァ イ ル シ ス テ ム を 変 更 す る
書 式
int pivot_root(const char *new_root, const char *put_old); 注 : こ の シ ス テ ム コ ー ル に は glibc の ラ ッ パ ー 関 数 は 存 在 し な い 。 「 注 意 」 の 節 を 参 照 。
説 明
pivot_root() は 呼 び 出 し 元 の プ ロ セ ス の root フ ァ イ ル シ ス テ ム を put_old デ ィ レ ク ト リ に 移 動 し 、 new_root を 呼 び 出 し 元 の プ ロ セ ス の 新 し い root フ ァ イ ル シ ス テ ム に す る 。
pivot_root() の 典 型 的 な 利 用 法 は 、 シ ス テ ム の 起 動 中 に シ ス テ ム が 一 時 的 な root フ ァ イ ル シ ス テ ム (例 え ば initrd) を マ ウ ン ト し 、 こ れ に 続 い て 本 当 の root フ ァ イ ル シ ス テ ム を マ ウ ン ト し 、 後 者 を 必 要 な 全 て の プ ロ セ ス ・ ス レ ッ ド の カ レ ン ト root に 変 更 す る よ う な 場 合 で あ る 。 古 い root デ ィ レ ク ト リ を 使 っ て い た 全 て の プ ロ セ ス や ス レ ッ ド の カ レ ン ト root と カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ を 、 pivot_root() が 変 更 す る か ど う か は わ か ら な い 。 pivot_root() の 呼 び だ し プ ロ セ ス は 、 古 い root や カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ を 使 っ て い た プ ロ セ ス が 、 い ず れ の 場 合 で も 正 し く 動 作 す る こ と を 保 証 し な け れ ば な ら な い 。 こ れ を 簡 単 に 行 う に は 、 そ れ ら の プ ロ セ ス の root と カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ を pivot_root() を 呼 び 出 す 前 に new_root に 変 更 し て お く こ と で あ る 。 上 記 の 段 落 は 、 将 来 pivot_root() が 変 更 さ れ る か も 知 れ な い こ と を 鑑 み て 、 わ ざ と 曖 昧 に 書 い て あ る 。 本 ペ ー ジ を 記 述 し て い る 時 点 で は 、 pivot_root() は 古 い root デ ィ レ ク ト リ を 用 い て い る 全 て の プ ロ セ ス ・ ス レ ッ ド の root と カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ を new_root に 変 更 す る 。 こ れ は カ ー ネ ル の ス レ ッ ド が 古 い root デ ィ レ ク ト リ を busy 状 態 に し な い た め に 必 要 で あ る 。 こ れ ら の ス レ ッ ド が 古 い デ ィ レ ク ト リ を root や カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ と し て い る と 、 フ ァ イ ル シ ス テ ム に 一 切 ア ク セ ス し な い 場 合 で も 古 い root が busy に な っ て し ま う か ら で あ る 。 将 来 は 、 カ ー ネ ル ス レ ッ ド が あ ら ゆ る フ ァ イ ル シ ス テ ム へ の ア ク セ ス を 明 示 的 に 放 棄 す る メ カ ニ ズ ム が で き 、 こ の で し ゃ ば り な 機 能 は pivot_root() か ら 削 除 さ れ る か も し れ な い 。 こ れ は 呼 び 出 し 元 の プ ロ セ ス に つ い て も 当 て は ま る こ と に 注 意 。 pivot_root() が カ レ ン ト プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 影 響 す る か ど う か は 分 か ら な い 。 し た が っ て pivot_root() の 直 後 に chdir("/") を 呼 び 出 す と よ い 。
new_root お よ び put_old に は 以 下 の 制 限 が あ る :
− デ ィ レ ク ト リ で な け れ ば な ら な い 。 |
||
− |
new_root と put_old は 現 在 の root と 同 じ フ ァ イ ル シ ス テ ム に あ っ て は な ら な い 。
− |
put_old は new_root 以 下 に な け れ ば な ら な い 。 す な わ ち put_old を 差 す 文 字 列 に 1 個 以 上 の ../ を 付 け る こ と に よ っ て new_root と 同 じ デ ィ レ ク ト リ が 得 ら れ な け れ ば な ら な い 。 他 の フ ァ イ ル シ ス テ ム が put_old に マ ウ ン ト さ れ て い て は な ら な い 。 利 用 例 に つ い て は pivot_root(8) を 参 照 の こ と 。 現 在 の root が マ ウ ン ト ポ イ ン ト で は な い (chroot(2) や pivot_root() の 後 な ど 。 以 下 も 参 照 ) 場 合 、 古 い root デ ィ レ ク ト リ で は な く 、 そ の フ ァ イ ル シ ス テ ム の マ ウ ン ト ポ イ ン ト が put_old に マ ウ ン ト さ れ る 。 new_root は マ ウ ン ト ポ イ ン ト で な く て も よ い 。 こ の 場 合 /proc/mounts は 、 new_root を root (/) と す る フ ァ イ ル シ ス テ ム の マ ウ ン ト ポ イ ン ト を 表 示 す る 。 返 り 値成 功 し た 場 合 は 0 が 返 さ れ る 。 エ ラ ー の 場 合 は −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。 エ ラ ーpivot_root() は stat(2) の 返 す あ ら ゆ る エ ラ ー を (errno に ) 返 す 可 能 性 が あ る 。 さ ら に 以 下 を 返 す こ と が あ る :
ENOTDIR new_root ま た は put_old が デ ィ レ ク ト リ で な い 。
い 。 バ ー ジ ョ ンpivot_root() は Linux 2.3.41 で 導 入 さ れ た 。 準 拠pivot_root() は Linux に 固 有 の も の な の で 、 移 植 性 は な い 。 注 意glibc は こ の シ ス テ ム コ ー ル に 対 す る ラ ッ パ ー 関 数 を 提 供 し て い な い 。 syscall(2) を 使 っ て 呼 び 出 す こ と 。 バ グpivot_root() は シ ス テ ム の 他 の プ ロ セ ス 全 て の root と カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ と を 変 更 し な く て も よ い は ず で あ る 。 pivot_root() の 使 い 方 が も う ち ょ っ と 曖 昧 に な る と 、 あ っ と い う 間 に わ け の わ か ら な い 状 態 に な っ て し ま う だ ろ う 関 連 項 目chdir(2), chroot(2), stat(2), initrd(4), pivot_root(8) こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |