当得到了根文件系统后就要进行文件系统的烧写工作了。目前的想法暂时有两个,放到内存上或者放到硬盘上。
Ramdisk:
首先需要内核选中相应的选项进行支持,否则是无法使用ramdisk的。内核主要配两个地方,支持ramdisk并且需要根据文件系统设置内存的空间大小,大小以K为单位(需要是1024的整数倍)。
内核支持后就是制作文件系统了,需要执行以下几个步骤,获得文件、调整文件格式、挂载文件、填充数据、打包系统。
dd if=/dev/zero of=ramdisk bs=1M count=4096
mke2fs –F –v –m 0 ramdisk
mount -o loop ramdisk /mnt/
cp -arf * /mnt
umount/mnt
gzip –v9 ramdisk
最终得到ramdisk.gz文件这个就是我们需要的文件。
在使用的过程中会出现这种问题:
RAMDISK: Compressed image found at block 0
RAMDISK: incomplete write (2270 != 32768)
这说明设置的ram块不够大,修改内核配置即可。
如果对现有的ramdisk进行修改,比如找不到ttyAMA0这个设备总是无法进入shell,那可以解压ramdisk.gz并在dev目录下mknod ttyAMA0 c 204 64。
Ramdisk的解压方式为:
gunzip ramdisk.gz
完成修改后重新打包即可。目前这种方式只在虚拟机中使用,qemu-system-arm -M virt -m 256 -kernel ./zImage -initrd ./new.gz -nographic -append "root=/dev/ram0"。
如果要在实际得arm板卡上使用还需要针对ARM再次加工,使用如下命令:
mkimage -A arm -O linux -T ramdisk -C none -a 0x88080000 -n "ramdisk" -d ramdisk.gz ramdisk.img
最终将会有ramdisk.gz文件得到ramdisk.img文件,img文件就是可以用得文件系统了。
兴高采烈得拷贝到uboot内存里面,出现了如下问题
![]() |
百度也没有找到准确的答案,又仔细看了下错误信息,发现ramdisk加载得位置出现了问题,所以我调整了一下命令引导得位置,改为bootz 0x82000000 0x88080000 0x88000000发现顺利得引导起来了,以前得路子并没有错误!
![]() |
其中bootargs=console=ttyS0,115200n8 init=/linuxrc root=/dev/ram0 rw rootfstype=ext2
Ext4:
Ext文件系统是相对简单的操作方法,直接解压复制即可完成。
dd if=/dev/zero of=fs.ext4 bs=1M count=4096
mkfs.ext4 fs.ext4
mount -o loop ramdisk /mnt/
cp -arf * /mnt
umount/mnt
其实在实际使用中,直接分区后把文件复制或解压到相应的分区即可。
bootargs=console=ttyS0,115200n8 init=/linuxrc root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4
bootz 0x82000000 - 0x88000000
另外可通过dd的方式烧写文件系统,在使用的时候必须确定分区的大小,因为dd烧写的文件就是系统的大小,比如32G的硬盘,如果dd的文件系统大小定位100M那么最后烧写进去的空间就是100M。因此在使用的时候要分两个区,一个用来dd文件系统另一个用来存数据。如果只留一个分区,dd一个32G的文件系统,时间应该比较长。。。。。相比于直接复制进去,这样感觉不是很灵活,但也能固定文件在硬盘中的位置,不像cp那样没有规律的写,也算学习了新的方法吧。
Ubifs:
在uboot和kernel都要进行相应的支持配置:
对于MT29F2G08 pagesize为2048B,block size为64*2048B=131072B,block count为2048
使用如下命令:
$ mkfs.ubifs -F -q -r /home/fs -m 2048 -e 126976 -c 2047 -o ubifs.img
参数简介:
-r 后面的目录表示要制作的问价系统的路径,里面包含了文件系统的内容
-m NAND最小的读写单元,一般为page size
-e 对于am335x的nand driver,为block size-2 x(page size)
-c 最大block数,为block count -1
对于ubifs.img进一步加工:
$ ubinize -o ubi.img -m 2048 -p 128KiB ubinize.cfg
参数简介:
-p block size
其中ubinize.cfg内容如下
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=249MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
对于得到的ubi.img通过uboot命令nand write烧写到nand里面去。对启动参数进行如下设置:
setenv bootargs ‘console=ttyO0,115200n8 rootwait rw ubi.mtd=7,2048 rootfstype=ubifs root=ubi0:rootfs init=/linuxrc’
bootz 0x82000000 - 0x88000000
另外bootargs的参数也可以在设备树里面增加节点并添加内容,省去每次uboot手工设置,uboot的参数在设置的时候可以多看看uboot本身的默认设置,可以找到一些正确的设置方法。
参考文档:
https://www.cnblogs.com/lidabo/p/5304357.html
https://blog.csdn.net/sssddd12345_/article/details/106336978
Ubifs制作和启动.pdf