루트 파일 시스템이 포함된 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