此方法常用与开发阶段,系统移植和驱动开发通常使用此种方式。对于uboot中bootcmd和bootargs的环境变量的设置
NFS的方式挂载根文件系统
setenv bootargs root=/dev/nfs nfsroot=192.168.3.222:/home/linux/nfs/rootfs rw console=ttySAC0,115200 init=/linuxrc ip=192.168.3.250
setenv bootcmd tftp 0x48000000 uImage\;bootm 0x48000000
saveenv
uboot uImage ramdisk.img文件都写到EMMC中,然后从内存(ram)中挂载根文件系统
1》 对EMMC进行分区操作
0-----512byte-------1M----------20M-----------532M------------剩余
保留 uboot kernel ramdisk.img userData
字节单位0-----0x200------0x100000-----0x1400000------0x21400000 -----剩余
块为单位0-----0x1--------0x800--------0xa000---------0x10a000---------剩余
mmcblkboot0 mmcblk0p1 mmcblk0p2 mmcblk0p3
已经完成 自己分区 自己分区 自己分区
启动uboot进入uboot交互界面,对uboot中fdisk命令,
对EMMC进行分区操作 :
fdisk 2 3 0x100000:0x1300000 0x1400000:0x20000000 0x21400000:0
分析 :
‘2’:表示emmc的设备号
‘3’:表示分三个个分区(uImage+ramdisk.img+userData)
uboot分区不用做,默认已经设置好了
起始地址 分区大小
0x100000:0x1300000:第二个分区的起始地址和大小
0x1400000:0x10000000:第三个分区的起始地址和大小
0x21400000:0:第四个分区的起始地址和剩余的空间
2》生成uImage内核的镜像,并烧写到EMMC中
需要配置内核:
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
(8192) Default RAM disk size (kbytes)
**需要与实际根文件系统大小匹配
Boot options ---> 配置内核的参数使用哪个
Kernel command line type (Use bootloader kernel arguments if available) --->
//只使用uboot传递的参数
(X) Use bootloader kernel arguments if available
// 使用uboot传递的参数和内核中默认参数
( ) Extend bootloader kernel arguments
// 只使用内核自己的默认的参数
( ) Always use the default kernel command string
重新编译内核,并且下载到EMMC中
tftp 48000000 uImage
mmc write 48000000 0x800 0x4000
3》制作ext4类型的根文件系统,并烧写到emmc中
注意,ext4类型文件系统的大小,需要看roofs文件的大小
使用以下命令可以查看文件的大小
cd 到rootfs目录下,执行du -h命令,可知文件为17M
这里也可以使用arm-none-linux-gnueabi-strip对库文件进行压缩。
roofs-ok到ramdisk.img操作步骤 :
cd ~/nfs/
sudo dd if=/dev/zero of=ramdisk bs=1k count=8192
命令解析:
dd:用于创建一个单个镜像文件
if=/dev/zero : 将来创建的单个镜像文件里面的内容全部来自设备/dev/zero
/dev/zero设备能够源源不断产生0数据
if ====》input file
of=ramdisk : 指定将来创建单个镜像文件名
并且此文件里面填充全0
of ====》output file
bs=1k : 生成的ramdisk以块为单位,一块1024字节
count=8192 : 总共8192块
结论:生成的ramdisk.img根文件系统的镜像大小位8MB
sudo mkfs.ext4 -F ramdisk
命令解析:
// 格式化镜像文件ramdisk
// 把ramdisk.img比作U盘
// 指定的文件系统格式为ext4
/类似windows下格式化U盘
sudo mount -t ext4 -o loop ramdisk /mnt
命令解析:
挂接rootfs_ext4.img到目录/mnt,并且指定的文件系统类型ext4
挂接命令的结果就是将来只需要访问/mnt,本质
就是在访问ramdisk里面的内容
sudo cp ~/nfs/rootfs/* /mnt/ -a */
//向/mnt目录拷贝rootfs-ok的内容,
//本质上就是向ramdisk.img拷贝rootfs的内容
//ramdisk.img里面的内容,就是我们通过网络挂载的根文件系统中的内容
sudo umount /mnt //卸载/mnt/下挂载的ramdisk.img
使用gzip工具对ramdisk镜像进行压缩
gzip --best -c ramdisk > ramdisk.gz
使用mkimage工具为镜像文件添加校验头然后生成可用的镜像ramdisk.img
mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
将自己制作生成的根文件系统镜像拷贝到tftp的下载目录下并修改其权限
cp ramdisk.img ~/tftpboot
chmod 777 ~/tftpboot/ramdisk.img
****************************************************************************************************************
第二种方法:
制作ext4类型的根文件系统,边烧写到emmc中
注意,ext4类型文件系统的大小,需要看roofs-ok文件的大小
使用以下命令可以查看文件的大小
cd 到rootfs目录下,执行du -h命令,可知文件为17M
这里也可以使用arm-none-linux-gnueabi-strip对库文件进行压缩。
roofs到rootfs.ext4操作步骤 :
cd ~/nfs/
sudo dd if=/dev/zero of=rootfs.ext4 bs=1k count=8192
sudo mkfs.ext4 -F rootfs.ext4
sudo mount -t ext4 -o loop rootfs.ext4 /mnt
sudo cp ~/nfs/rootfs/* /mnt/ -a
*/
sudo umount /mnt
将自己制作生成的根文件系统镜像拷贝到tftp的下载目录下并修改其权限
cp rootfs.ext4 ~/tftpboot
chmod 777 ~/tftpboot/rootfs.ext4
****************************************************************************************************************
4》将ramdisk.img烧写到EMMC中
tftp 48000000 ramdisk.img
mmc write 48000000 0xa000 0x100000
5》修改bootcmd和bootargs
ram的方式挂载根文件系统
setenv bootcmd mmc read 0x48000000 0x800 0x4000\;mmc read 0x49000000 0xa0000 0x80000\;bootm 0x48000000 0x49000000
setenv bootargs root=/dev/ram rw initrd=0x49000040,0x10000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200
saveenv
EMMC的方式挂载跟文件系统
setenv bootcmd mmc read 48000000 0x800 0x4000 \; bootm 48000000
setenv bootargs root=/dev/mmcblk0p2 rw rootfstype=ext4 init=/linuxrc console=ttySAC0,115200 tp=gt818-linux maxcpus=1
saveenv
tp=gt818-linux:对应触摸屏型号
maxpus=1: 启动CPU0
系统启动后:
ls /dev/mmcblk0*
cat /proc/partitions
mkfs.vfat /dev/mmcblk0p3
mount /dev/mmcblk0p3 /mnt/
原文:https://www.cnblogs.com/yangtai/p/14851555.html