国产宅男网站在线|亚洲A级性爱免费视频|亚洲中精品级在线|午夜福利AA毛

  • <dd id="gf5jf"><th id="gf5jf"></th></dd>

    <cite id="gf5jf"><label id="gf5jf"></label></cite>
  • <div id="gf5jf"><listing id="gf5jf"></listing></div>
    學習啦 > 學習電腦 > 操作系統(tǒng) > Linux教程 > initramfs如何切入真實linux文件系統(tǒng)

    initramfs如何切入真實linux文件系統(tǒng)

    時間: 若木635 分享

    initramfs如何切入真實linux文件系統(tǒng)

    initramfs切入真實linux文件系統(tǒng)
    initramfs切入真實linux文件系統(tǒng)主要用到switch_root命令。
     
    通常initramfs都是為安裝最終的根文件系統(tǒng)做準備工作,它的最后一步需要安裝最終的根文件系統(tǒng),然后切換到新根文件系統(tǒng)上去。
     
    以往 的基于ramdisk 的initrd 使用pivot_root命令切換到新的根文件系統(tǒng),然后卸載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是實際的根文件系統(tǒng)的掛載目錄,執(zhí)行switch_root命令前需要掛載到系統(tǒng)中;
    NEW_INIT是實際根文件系統(tǒng)的init程序的路徑,一般是/sbin/init;
    -c /dev/console是可選參數,用于重定向實際的根文件系統(tǒng)的設備文件,一般情況我們不會使用;
    ARGUMENTS_TO_INIT則是傳遞給實際的根文件系統(tǒng)的init程序的參數,也是可選的。
    特別注意
    switch_root命令必須由PID=1的進程調用,也就是必須由initramfs的init程序直接調用,不能由init派生的其他進程調用,否則會出錯,提示: switch_root: not rootfs
     
    也是同樣的原因,init腳本調用switch_root命令必須用exec命令調用,否則也會出錯,提示: switch_root: not rootfs
     
    示例
    下面是個人寫的一個init文件,把分區(qū)寫到命令里了,你可以從“/proc/cmdline”中讀取內核參數來找到要切換的分區(qū)。
     
    #!/bin/sh
    #[ expression ] expression為真返回true,否則返回false。-d file FILE exists and is a directory
    # ||或運算,前面為假運行后面。
    #下面一段的意思,沒有對應目錄創(chuàng)建。
    [ -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 
     
    75390