使用和不使用 initramfs 的不同掛載輸出

使用和不使用 initramfs 的不同掛載輸出

我需要建立一個 initramfs 來載入驅動程式以存取包含根檔案系統的 EMMC。

  • 在我目前的核心建置中,EMMC 驅動程式是模組化的(抱歉,無法更改這一點)。
  • 核心啟動後,會載入 initramfs。
  • 使用函數,需要從 initramfs 切換到 EMMC 上包含實際 rootfs 的分割區switch_root

到這裡一切都運作良好。我可以建立 initramfs,讓核心載入它,然後讓它切換到/dev/mmcblk0p2包含實際 rootfs 的 EMMC 分割區。我的查詢:

啟動完成後,mount指令顯示如下:

rootfs 上 / 輸入 rootfs (rw)
/dev/mmcblk0p2 on / type ext4 (rw,sync,noatime,data=ordered)
/proc 上的 proc 型別 proc (rw,relatime)
……
/dev/mmcblk0p1 在 /var/volatile/run/media/mmcblk0p1 上鍵入 vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,sh)
/dev/mmcblk0p3 在 /var/volatile/run/media/mmcblk0p3 型態 ext4 (rw,relatime,data=ordered)
/dev/mmcblk0p4 在 /var/volatile/run/media/mmcblk0p4 型態 ext4 (rw,relatime,data=ordered)

如果我將 EMMC 驅動程式建構成核心的一部分(並擺脫 initramfs),則輸出會非常不同:

rootfs 上 / 輸入 rootfs (rw)
/dev/root on / type ext4 (rw,relatime,discard,journal_checksum,commit=1,data=ordered)
/dev 上的 devtmpfs 類型 devtmpfs (rw,relatime,size=112272k,nr_inodes=28068,mode=755)
……
/dev/mmcblk0p1 在 /var/volatile/run/media/mmcblk0p1 上鍵入 vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,sh)
/dev/mmcblk0p3 在 /var/volatile/run/media/mmcblk0p3 型態 ext4 (rw,relatime,data=ordered)
/dev/mmcblk0p4 在 /var/volatile/run/media/mmcblk0p4 型態 ext4 (rw,relatime,data=ordered)
  • 儘管當我檢查內核日誌和主要、次要設備編號時,我發現僅/dev/root對應/dev/mmcblk0p2
  • 但我不明白為什麼 mount 的輸出會不同。

在花費瞭如此多的努力讓 initramfs 工作之後,我不想錯過任何瑣碎的事情。任何幫助,非常感謝。

下面給出了執行此操作的腳本:

#!/bin/sh

#Make busybox links
#/bin/busybox mkdir -p /usr/bin /sbin /bin
#BBINSTALL="/bin/busybox --install -s"
SWITCH="/bin/busybox switch_root"
INSERT="/sbin/insmod"
MOUNT="/bin/busybox mount"
UMOUNT="/bin/busybox umount"
DISKF="/bin/busybox df"
LSMOD="/bin/busybox lsmod"
LS="/bin/busybox ls"
CAT="/bin/busybox cat"
LS="/bin/busybox ls"
PRINTENV="/usr/bin/printenv"
SLEEP="/bin/busybox sleep"
PS="/bin/busybox ps"
MKDIR="/bin/busybox mkdir"
CAT="/bin/busybox cat"
GREP="/bin/busybox grep"
WC="/bin/busybox wc"

#mount proc and sysfs
$MOUNT -t proc none /proc
$MOUNT -t sysfs none /sys

#Mount NFS/EMMC - check
$CAT /proc/cmdline | $GREP -inr "/dev/nfs" | $WC -l > /var/NFSFOUND
ISNFSFOUND=$($CAT /var/NFSFOUND)

#Check if NFS was found in Kernel command line
if [ $ISNFSFOUND -ne 0 ]
then
    echo "Mounting NFS:"
    $MOUNT -a -t nfs -o rw,relatime,vers=2,rsize=8192,wsize=8192,namlen=255,hard,nolock,proto=udp,timeo=1,retrans=1,mountvers=1,addr=172.31.219.19 172.31.219.19:/home/user/Perforce/Mfg_Repo/ng5_mfg/b5/main/nfsroot /mnt/root/
else
#If NFS was not found, mount EMMC
    if [ ! -d /mnt/root ];  then
            $MKDIR /mnt/root
    fi
        echo "Mounting EMMC:"
    $MOUNT -t devtmpfs -o rw,relatime,mode=755 none /dev
    $SLEEP 1

    #Load EMMC driver
    echo "Inserting EMMC driver"
    $INSERT /lib/mmc_block.ko
    $INSERT /lib/omap.ko
    $INSERT /lib/omap_hsmmc.ko
    $SLEEP 1

    #Mount the mount point
    $MOUNT -a -t ext4 -o rw,relatime,discard,journal_checksum,commit=1,data=ordered  /dev/mmcblk0p2 /mnt/root/
fi

#Unmount the current mounts
echo "Unmounting initramfs:"
if [ $ISNFSFOUND -eq 0 ]
then
echo "Unmounting devtmpfs(EMMC):"
    $UMOUNT /dev
fi

#Switch to actual rootfs - This will be done by init program

相關內容