ルートファイルシステムを含むEMMCにアクセスするためにドライバをロードするには、initramfsを作成する必要があります。
- 現在、カーネルビルドでは、EMMCドライバはモジュラーです(申し訳ありませんが変更できません)。
- カーネルが起動した後、initramfsがロードされます。
- この機能を使用するには、initramfsから実際のrootfsを含むEMMCのパーティションに切り替える必要があります
switch_root
。
この時点までは、すべてがうまくいっています。 initramfsを作成し、カーネルにそれをロードさせ、/dev/mmcblk0p2
実際のrootfsを含むEMMCパーティションに切り替えることができます。私のクエリ:
起動が完了すると、mountコマンドは次のように表示されます。
rootfsオン/rootfs入力(rw) /dev/mmcblk0p2 on / ext4 入力 (rw,sync,noatime,data=ordered) /proc の proc タイプ proc(rw,relatime) … /dev/mmcblk0p1 /var/揮発性/run/media/mmcblk0p1 に vfat(rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,sh) を入力します。 /var/揮発性/run/media/mmcblk0p3の/dev/mmcblk0p3型 ext4(rw,relatime,data=ordered) /var/揮発性/run/media/mmcblk0p4の/dev/mmcblk0p4型ext4(rw,relatime,data=ordered)
カーネルの一部としてEMMCドライバをビルドしてinitramfsを削除すると、出力は非常に異なります。
rootfsオン/rootfs入力(rw) /dev/root on / 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/揮発性/run/media/mmcblk0p1 に vfat(rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,sh) を入力します。 /var/揮発性/run/media/mmcblk0p3の/dev/mmcblk0p3型 ext4(rw,relatime,data=ordered) /var/揮発性/run/media/mmcblk0p4の/dev/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