pivot_root - root
ファイルシステムを変更する
pivot_root new_root put_old
pivot_root
はカレントプロセスの
root ファイルシステムを
put_old
ディレクトリに移動し、
new_root を新しい root
ファイルシステムにする。
は
pivot_root(2)
を呼び出しているだけなので、詳細は後者の
man
ページにあたって欲しい。
呼び出しプロセスの root
とカレントワーキングディレクトリ
(cwd) は
pivot_root
の実装に依存して変わったり変わらなかったりする。
以下はどちらの場合にも動作する
pivot_root
の起動方法だが、
pivot_root と
chroot
の両方が現在の
PATH
に入っている必要がある。
cd
new_root
pivot_root .
put_old
exec chroot .
command
chroot は古い root と新しい
root
の両方で使えなければならない。
なぜなら
pivot_root
がシェルの root
ディレクトリを暗黙のうちに変更するかどうかは
わからないからである。
exec chroot
は動作している実行ファイルを変更する。
これは後で古い root
ディレクトリがアンマウントされるために必要なのである。
また標準入力・標準出力・標準エラー出力が古い
root ファイルシステムの
デバイスを指していて、
root ファイルシステムを
busy
状態にするかもしれない。
これらは
chroot
を実行するときに簡単に変更できる
(以下を参照。
先頭のスラッシュがないので
(相対パスで指定しているので)、
pivot_root がシェルの root
を変更する場合でもしない場合でも動作することに注目。)
対話シェルから root
ファイルシステムを
/dev/hda1 に変更する:
mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root
新しい root
ファイルシステムを
10.0.0.1:/my_root から NFS
でマウントし、
init
を起動する:
ifconfig lo 127.0.0.1 up # for portmap
# configure Ethernet or such
portmap # for lockd (implicitly started by mount)
mount -o ro 10.0.0.1:/my_root /mnt
killall portmap # portmap keeps old root busy
cd /mnt
pivot_root . old_root
exec chroot . sh -c 'umount /old_root; exec /sbin/init' \
<dev/console >dev/console 2>&1
chroot(1),
mount(8),
pivot_root(2),
umount(8)