内核ramdisk启动之根文件系统制作
文章基于海思 hi3519av100 平台, 仅供参考。
涉及方面:
- uboot : 这里uboot需要传递启动命令行参数
- kernel : 这里要修改启动方式为ramdisk启动
- rootfs : 这里要制作目标
其中第一个uboot启动参数要与kernel的配置、rootfs的大小要保持一致。
uboot 修改启动参数
当前:
bootargs='mem=256M console=ttyAMA0,115200 clk_ignore_unused root=/dev/ram0 rw init=/linuxrc initrd=0x24000000,0x800000'
这里root=/dev/ram0 rw init=/linuxrc initrd=0x24000000,0x800000
是必要的参数,/dev/ram0
需要在内核开启ramdisk
的块设备选项,init=/linuxrc
是启动选项,initrd=0x24000000,0x800000
是ramdisk
在内存中的位置,长度。这个0x800000
需要和kernel的配置一致,且生成的ramdisk
也是这个大小。
setenv bootargs 'mem=256M console=ttyAMA0,115200 clk_ignore_unused root=/dev/ram0 rw init=/linuxrc initrd=0x24000000,0x800000'
savenv
kernel 修改配置文件
配置路径为:> Device Drivers > Block devices
。
这里配置的RAM disks
的数量是8,可以更少,ramdisk
镜像的大小是8192
,单位是KB
,即8MB
的大小。
配置如图所示:
紧接着编译内核:
make ARCH=arm CROSS_COMPILE=arm-himix200-linux- uImage -j16
rootfs 制作
编译busybox
这里暂时没有做修改,先用默认配置进行编译:
cp config_arm_himix200_a53_softfp_neon .config
make -j16 && make install
make install
之后,在当前目录生成了_install
文件夹。
拷贝相关工具和库
这里先将刚刚生成的busybox的工具拷贝过来:
mkdir mroot
cd mroot/
cp -R ../../busybox-1.26.2/_install/* ./
将lib.tgz
解压后拷贝到刚刚创建的mroot
:
tar -xzvf lib.tgz
mv lib mroot/
lib.tgz
来自SDK的工具链里:arm-himix200-linux/runtime_glibc.tgz/runtime_glibc.tar/runtime_glibc/a53_softfp_neon-vfpv4/
,选这个运行库需要和前面的busybox参数对应a53_softfp_neon
。
这里要strip一下,否则库占用空间会比较大:
cd mroot/lib/
arm-himix200-linux-strip *
这里需要的一些配置文件直接从SDK包里取了:(主要是/etc
目录下的文件)
SDK/Hi3519AV100_SDK_V2.0.2.0/package/osdrv/rootfs_scripts/rootfs
接下来要到虚拟机里面制作ramdisk
镜像。
压缩这个临时文件系统:
tar -czf mroot.tgz mroot/
放到虚拟机后,解压后创建/dev下的某些设备,增加权限等:
tar -xzvf mroot.tgz
cd mroot/
cd dev/
sudo mknod -m 666 console c 5 1
sudo mknod -m 666 null c 1 3
cd -
sudo chown root -R *
sudo chgrp root -R *
sudo chmod 4755 bin/busybox
创建ramdisk
镜像,并拷贝rootfs的内容到里面:
sudo dd if=/dev/zero of=ramdisk bs=1024 count=8192
sudo mke2fs -F -m0 ramdisk
sudo mount -t ext2 ramdisk /mnt/loop/
cd /mnt/loop/
sudo cp ~/test/mroot/* ./ -afR
cd -
sudo umount loop/
将此时的ramdisk
从虚拟机拷贝出来,放到nfs服务器上,准备放到设备上运行,设置好IP等,使用测试命令进行运行:
setenv mj "tftp 0x22000000 uImage;tftp 0x24000000 ramdisk; bootm 0x22000000;"
savenv
run mj
令进行运行:
setenv mj "tftp 0x22000000 uImage;tftp 0x24000000 ramdisk; bootm 0x22000000;"
savenv
run mj
此时已经可以正常启动。