Xilinx Linux 设置sd卡作为根文件系统
- 问题:现在用的板子是从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。
上一篇: 架构设计比较 youtubetwitter应用服务器
下一篇: 查找算法之线性查找