initramfs の有無によるマウント出力の違い

initramfs の有無によるマウント出力の違い

ルートファイルシステムを含む EMMC にアクセスするためのドライバーをロードするための initramfs を作成する必要があります。

  • 現在のカーネル ビルドでは、EMMC ドライバーはモジュール化されています (申し訳ありませんが、これを変更することはできません)。
  • カーネルが起動すると、initramfs がロードされます。
  • initramfs から、関数を使用して実際の rootfs を含む EMMC 上のパーティションに切り替える必要がありますswitch_root

/dev/mmcblk0p2ここまではすべてうまくいっています。initramfs を作成し、カーネルにそれをロードさせて、実際の rootfs を含む EMMC パーティションに切り替えることもできます。私の質問:

起動が完了すると、マウント コマンドは次のように表示します。

rootfs オン / タイプ rootfs (rw)
/dev/mmcblk0p2 オン / タイプ 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ものだけが見つかりました。
  • しかし、マウントの出力が異なる理由がわかりません。

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

関連情報