ディスクレスlinux
ラムディスクをマウントし、そこにold-rootとlibディレクトリを作成します。
chrootはカレントプロセス(current->fs->root)のみrootを変更しますが、pivot_rootは、それぞれのcurrent->fs->rootは変更されませんが(/ramdisk/old_rootだと/ramdiskになります。)、ルートファイルシステムを変更するため、結果的に全てのプロセス及びカーネルのcurrent->fs->rootは同じでも、参照する実態は変更される。ということです。
[root@localhost /]# mount -t ramfs none /ramdisk [root@localhost /]# touch /ramdisk/this_is_ramdisk [root@localhost /]# mkdir /ramdisk/old-root [root@localhost /]# mkdir /ramdisk/lib [root@localhost home]# ls -l /ramdisk/ 合計 0 drwxr-xr-x 2 root root 0 8月 15 00:34 lib drwxr-xr-x 2 root root 0 8月 15 00:33 old-root -rw-r--r-- 1 root root 0 8月 15 01:26 this_is_ramdiskとりあえず、lib下にオリジナルの/lib/を複写しておきます。(pivot後にlddのパスを設定することで必要ないかと思いますが。)下手すると、にっちもさっちもいかなくて、リセットということになります。
[root@localhost /]# cp /lib/* /ramdisk/lib/ cp: ディレクトリ `/lib/alsa' を省略しています cp: ディレクトリ `/lib/crda' を省略しています cp: ディレクトリ `/lib/dbus-1' を省略しています : : cp: ディレクトリ `/lib/terminfo' を省略しています cp: ディレクトリ `/lib/tls' を省略しています cp: ディレクトリ `/lib/udev' を省略しています cp: ディレクトリ `/lib/xtables' を省略していますpivot後のカレントプロセスのpwd検証のためで、pivotされるルートファイルシステム下の/home/kitamuraに1/2/3を作成し、cwdを/home/kitamura/1/2としておきます。
[root@localhost /]# cd /home/kitamura/ [root@localhost kitamura]# mkdir 1 [root@localhost kitamura]# cd 1 [root@localhost 1]# mkdir 2 [root@localhost 1]# cd 2 [root@localhost 2]# mkdir 3 [root@localhost 2]# pwd /home/kitamura/1/2 [root@localhost 2]# ls 3pivot_rootを実行することで、/が/ramdisk、元のルートファイルシステムが/ramdisk/old-root/にマウントされ、DISKレスのlinuxが作成されました。/は/ramdiskその物です。/下に必要なコマンドを含め、lkm/デバイスファイル等を設定してあれば、/ramdisk/old-root/をumountすれば完全なDISKレスのlinuxとなります。
[root@localhost 2]# pivot_root /ramdisk/ /ramdisk/old-root/ [root@localhost home]# /old-root/bin/ls -l / total 4 drwxr-xr-x 2 0 0 0 Aug 14 15:34 lib dr-xr-xr-x. 35 0 0 4096 Aug 14 15:31 old-root -rw-r--r-- 1 0 0 0 Aug 14 16:26 this_is_ramdisk [root@localhost 2]# /old-root/bin/ls /old-root apr-tmp.3BYsWv apr-tmp.FIt3Qt apr-tmp.oqMsLF dev lost+found mnt2 opt run sysroot apr-tmp.5Y7Kqs apr-tmp.ThqTwH apr-tmp.q7VcB2 etc media mnt3 proc sbin tmp apr-tmp.5ykbkB apr-tmp.ZvIc0t bin export misc mnt4 pstore sd usr apr-tmp.8wM2lK apr-tmp.k94eiT boot home mnt net ramdisk srv va apr-tmp.9UD0AA apr-tmp.oISac7 debugfs lib mnt1 new-root root sys varカレントディレクトはそのままです。同じファイルシステム内の相対的なパス移動は、そのファイルシステムがどこにマウントされようと関係ありません。ただし絶対パスで指定するとエラーとなります。
[root@localhost 2]# pwd /home/kitamura/1/2 [root@localhost 2]# /old-root/bin/ls /home/kitamura/1/2 /old-root/bin/ls: cannot access /home/kitamura/1/2: No such file or directory [root@localhost 2]# cd 3 [root@localhost 3]# pwd /old-root/home/kitamura/1/2/3 [root@localhost 3]# cd .. [root@localhost 2]# cd .. [root@localhost 1]# pwd /old-root/home/kitamura/1 [root@localhost 1]# cd .. [root@localhost kitamura]# pwd /old-root/home/kitamura [root@localhost kitamura]# cd .. [root@localhost home]# cd .. [root@localhost old-root]# pwd /old-root [root@localhost old-root]# /old-root/bin/ls apr-tmp.3BYsWv apr-tmp.ThqTwH bin home mnt1 opt sbin usr apr-tmp.5Y7Kqs apr-tmp.ZvIc0t boot lib mnt2 proc sd va apr-tmp.5ykbkB apr-tmp.k94eiT debugfs lost+found mnt3 pstore srv var apr-tmp.8wM2lK apr-tmp.oISac7 dev media mnt4 ramdisk sys apr-tmp.9UD0AA apr-tmp.oqMsLF etc misc net root sysroot apr-tmp.FIt3Qt apr-tmp.q7VcB2 export mnt new-root run tmp [root@localhost old-root]# pwd /old-root [root@localhost old-root]# cd .. [root@localhost /]# pwd / [root@localhost /]# /old-root/bin/ls lib old-root this_is_ramdisk/old-rootを再度ルートファイルシステムとすることで、元の状態に復帰します。
[root@localhost home]# /old-root/sbin/pivot_root /old-root /old-root/ramdisk [root@localhost home]# ls / apr-tmp.3BYsWv apr-tmp.FIt3Qt apr-tmp.oqMsLF dev lost+found mnt2 opt run sysroot apr-tmp.5Y7Kqs apr-tmp.ThqTwH apr-tmp.q7VcB2 etc media mnt3 proc sbin tmp apr-tmp.5ykbkB apr-tmp.ZvIc0t bin export misc mnt4 pstore sd usr apr-tmp.8wM2lK apr-tmp.k94eiT boot home mnt net ramdisk srv va apr-tmp.9UD0AA apr-tmp.oISac7 debugfs lib mnt1 new-root root sys var [root@localhost home]# ls /ramdisk/ lib old-root this_is_ramdisk
補足
プロセスのcwd/rootが/ramdisk/old_rootだと、pivot後のcwd/rootは/ramdiskになります。chrootはカレントプロセス(current->fs->root)のみrootを変更しますが、pivot_rootは、それぞれのcurrent->fs->rootは変更されませんが(/ramdisk/old_rootだと/ramdiskになります。)、ルートファイルシステムを変更するため、結果的に全てのプロセス及びカーネルのcurrent->fs->rootは同じでも、参照する実態は変更される。ということです。