ディスクレスlinux


ラムディスクをマウントし、そこにold-rootとlibディレクトリを作成します。
[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
3
pivot_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は同じでも、参照する実態は変更される。ということです。

最終更新 2014/08/15 02:29:02 - north
(2014/08/14 18:47:53 作成)


検索

アクセス数
2534242
最近のコメント
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
Adsense
広告情報が設定されていません。