chroot, exec, pivot_root

1. chroot: 在指定的root目錄運行命令
參考"info root"中的例子,我把/bin/ls拷貝至~/myroot後,
運行"$ sudo chroot ~/myroot /ls -Rl /", 結果獲得下面的錯誤結果:
「chroot: cannot run command `/ls': No such file or directory」.

事實上,"info root"中提到,若是執行的命令屬於動態連接可執行文件,須要把依賴的共享庫文件拷貝到新的root相關目錄中。
運行,"$ ldd ~/myroot/ls",發現依賴於如下庫:

    linux-gate.so.1 =>  (0x00795000)
    librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x00e7a000)
    libselinux.so.1 => /lib/libselinux.so.1 (0x00748000)
    libacl.so.1 => /lib/libacl.so.1 (0x00fbf000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x0053d000)
    /lib/ld-linux.so.2 (0x003ba000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x002f5000)
    libattr.so.1 => /lib/libattr.so.1 (0x00255000)

在myroot下創建lib目錄,而後把上訴庫文件拷貝至該目錄。從新運行chroot,成功。

chroot一般用於運行一些不可靠的程序,這樣比較安全。
chroot也一般用於手動創建一個linux系統,屬於LFS項目的重要部分。LFS項目(Linux from Scratch),提供方法和建議來創建本身定製的linux系統,包括所有經過源代碼。

LFS用於學習linux系統以及定製小的系統很是有幫助。

2. exec命令在當前shell執行一個命令,同時結束該shell。exec能夠用於用一種新的shell替換原來的shell,好比 "$exec ksh"。

3. pivot_root: 改變root文件系統
   用法:pivot_root new_root put_old
   描述:pivot_root把當前進程的root文件系統放到put_old目錄,而使new_root成爲新的root文件系統。
例子:
   從127.0.0.1:/home/qianjiang/nfsroot掛載新的文件系統而且運行init
   a. 拷貝sh,ls至nfsroot/bin,以及相關的共享庫至nfsroot/lib
   b. 在nfsroot下面創建目錄old_root
   c. mount -o ro 127.0.0.1:/home/qianjiang/nfsroot /mnt
   d. cd /mnt
   e. pivot_root . old_root

「這個時候,會發現好比"ls /"顯示的是nfsroot下面的文件;"ls old_root"顯示的是以前文件系統root下面的文件。」
  
   f. exec chroot . sh -c "umount /old_root; exec /sbin/init' \
         <dev/console >dev/console 2>&1

pivot_root和chroot的主要區別是,pivot_root主要是把整個系統切換到一個新的root目錄,而移除對以前root文件系統的依賴,這樣你就可以umount原先的root文件系統。而chroot是針對某個進程,而系統的其它部分依舊運行於老的root目錄。
 linux

相關文章
相關標籤/搜索