萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> initramfs如何切入真實linux文件系統

initramfs如何切入真實linux文件系統

initramfs切入真實linux文件系統 initramfs切入真實linux文件系統主要用到switch_root命令。   通常initramfs都是為安裝最終的根文件系統做准備工作,它的最後一步需要安裝最終的根文件系統,然後切換到新根文件系統上去。   以往 的基於ramdisk 的initrd 使用pivot_root命令切換到新的根文件系統,然後卸載ramdisk。但是initramfs是rootfs,而rootfs既不能 pivot_root,也不能umount。   busybox的解決方案是,提供了switch_root命令,完成全部的處理過程,使用起來非常方便。   switch_root命令的格式是:    switch_root [-c  /dev/console] NEW_ROOT NEW_INIT [ARGUMENTS_TO_INIT]  其中NEW_ROOT是實際的根文件系統的掛載目錄,執行switch_root命令前需要掛載到系統中; NEW_INIT是實際根文件系統的init程序的路徑,一般是/sbin/init; -c /dev/console是可選參數,用於重定向實際的根文件系統的設備文件,一般情況我們不會使用; ARGUMENTS_TO_INIT則是傳遞給實際的根文件系統的init程序的參數,也是可選的。 特別注意 switch_root命令必須由PID=1的進程調用,也就是必須由initramfs的init程序直接調用,不能由init派生的其他進程調用,否則會出錯,提示: switch_root: not rootfs   也是同樣的原因,init腳本調用switch_root命令必須用exec命令調用,否則也會出錯,提示: switch_root: not rootfs   示例 下面是個人寫的一個init文件,把分區寫到命令裡了,你可以從“/proc/cmdline”中讀取內核參數來找到要切換的分區。   #!/bin/sh #[ expression ] expression為真返回true,否則返回false。-d file FILE exists and is a directory # ||或運算,前面為假運行後面。 #下面一段的意思,沒有對應目錄創建。 [ -d /dev ] || mkdir -m 0755 /dev [ -d /root ] || mkdir -m 0700 /root [ -d /sys ] || mkdir /sys [ -d /proc ] || mkdir /proc [ -d /tmp ] || mkdir /tmp #-----------------------------------   mkdir -p /var/lock echo "mount -t sysfs -o nodev,noexec,nosuid none /sys" mount -t sysfs -o nodev,noexec,nosuid none /sys  echo "mount -t proc -o nodev,noexec,nosuid none /proc " mount -t proc -o nodev,noexec,nosuid none /proc    # Note that this only becomes /dev on the real filesystem if udev's scripts # are used; which they will be, but it's worth pointing out if ! mount -t devtmpfs -o mode=0755 none /dev; then mount -t tmpfs -o mode=0755 none /dev #echo "mknod -m 0600 /dev/console c 5 1" #mknod -m 0600 /dev/console c 5 1 #mknod /dev/null c 1 3 # Make some basic devices first, let udev handle the rest mknod /dev/null c 1 3 mknod /dev/ptmx c 5 2 mknod /dev/console c 5 1 mknod /dev/kmsg c 1 11 fi mkdir /dev/pts mount -t devpts -o noexec,nosuid,gid=5,mode=0620 none /dev/pts || true mdev -s   echo "mount /dev/sda3 /root" mount  /dev/sda3 /root   echo "switch_root /root /sbin/init " exec switch_root /root /sbin/init   
copyright © 萬盛學電腦網 all rights reserved