欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Xilinx Linux 设置sd卡作为根文件系统

程序员文章站 2022-03-05 17:01:48
...
  • 问题:现在用的板子是从sd卡启动linux,sd卡中有一个文件是根文件系统。根文件系统挂载后占用的是内存空间,每次重启后,之前在根文件系统中的修改不会保存(内存是RAM,掉电修改就丢失了),如果想修改只能重新制作ramdisk。但是这样有点不正常,像平常用的ubuntu重启后之前的修改肯定是保存下来,同时板子上的根文件系统占用内存空间,嵌入式系统内存本来就小,所以根文件系统大小也受到限制。如何不将根文件系统挂载在内存?
  • 参考:
    1 使用sdcard作为XilinxLinux根文件系统
    2 linux创建SD卡分区创建详细教程
    3 zedboard运行linaro系统

问题:

1
- 我先是在设备树中修改了bootargs,但是似乎无效,系统启动时还是去加载ramdisk,然后报错:

reading uramdisk.image.gz
** Unable to read file uramdisk.image.gz **
Zynq> <INTERRUPT>
  • 然后看到了zedboard运行linaro系统 中说到了编译u-boot时,去修改u-boot的一些配置文件,来让系统不要去加载 uramdisk.image.gz,

2
- 但是我没做这一步,我在编译内核时,执行 make ARCH=arm xilinx_zynq_defconfig 之后,执行了 make menuconfig ,然后出来一个简单的图形界面,进入到 Boot Options 下,将 default command line设为console=ttyPS0,115200 root=/dev/mmcblk0p2 cma=25M rw earlyprintk rootfstype=ext4rootwait devtmpfs.mount=0,然后选择Kernel command line type为 default command line (以写在这里的启动参数为准,而不是先从u-boot加载,help中说了这里的三个选项的意思)。内核默认是如果bootloader给了启动参数那么就以BootLoader的为准。级别好像是 Bootloader > devicetree >kernel
- 但是启动时系统还是去加载ramdisk,然后我去看了linux用ramdisk正常启动的log,发现先去从sd卡里read 内核,设备树,ramdisk,然后在之后Starting kernel ...的过程中才打印了kernel command line,所以还是得需要去修改u-boot的配置,load什么是写在了u-boot的配置里。
- 查看 u-boot/include/configs/zynq-common.h ,注意是 configs 不是 config,查看 sdboot 这一项,可以看出这也是个Shell脚本
- 查看bootloader阶段的log,发现了可以通过修改uEnv.txt 文件来设置u-boot参数,这样就避免了重新编译u-boot,一般是没有 uEnv.txt文件的,此时就会按照编译好的u-boot参数来进行bootloader,自己创建这个文件后和Boot.bin、内核镜像、设备树一块放在sd卡上就可以,我的文件内容为

bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 cma=25M rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0

load_image=load mmc 0 ${kernel_load_address} ${kernel_image} && load mmc 0 ${devicetree_load_address} ${devicetree_image}
uenvcmd=echo Copying Linux from SD to RAM... && run load_image && bootm ${kernel_load_address} - ${devicetree_load_address}

在这里就没有去load ramdisk,所以在BootLoader阶段就不会去加载ramdisk。

相关标签: 嵌入式系统