鸿蒙系统研究之四:根⽂件系统
在上⼀篇⽂章,我们将内核加载并启动,但缺少根⽂件系统。这篇⽂章我们来探讨⼀下根⽂件系统的制作。
熟悉 Android 系统开发的朋友可能知道,⼀个 Android 系统镜像通常包括 system.img、userdata.img、recovery.img 等⼏个系统镜像,这些镜像⼀般烧录到⼿机或板⼦的 Flash 存储上。Vexpress A9 模拟器也可以模拟出 Flash Memory,但容量最多只有 128 M。鸿蒙标准系统⾯向⼿机、平板等富资源设备,系统镜像通常有好⼏百兆,没有办法写⼊到 Vexpress A9 模拟器的 Flash Memory。但是Vexpress A9 模拟器⽀持加载 SD 存储,所以咱们先采取⼀个变通的⽅法,将根⽂件系统和系统⽂件都放⼊到 SD 存储中,然后挂载到模拟器中。
鸿蒙系统构建完毕之后,包括 system.img、userdata.img、vendor.img 和 updater.img,但这不是能够挂载到 SD 存储的格式。
研究鸿蒙系统的构建输出,系统⽂件都输出在 out/ohos-arm-release/packages/phone/images/system ⽬录下,根⽂件系统则位于out/ohos-arm-release/packages/phone/images/root,先把这两个⽬录的⽂件整合到⼀起,⽣成 ext3 格式的镜像,为此,我们写⼀个名为 create-fs.sh 的脚本:
#!/bin/bash
# 0.设置⽬录变量
OHOS_ROOTFS=../../../out/ohos-arm-release/packages/phone/images
# 1.先进⾏清理操作
sudo rm -rf rootfs
sudo rm -rf tmpfs
sudo rm -3
sudo mkdir rootfs
# 2.创建Linux中的必要⽂件夹
sudo mkdir -p rootfs/bin  # /bin包含普通⽤户和超级⽤户都能使⽤的命令
sudo mkdir -p rootfs/sbin  # /sbin包含系统运⾏的关键可执⾏⽂件以及⼀些管理程序
sudo mkdir -p rootfs/home  # /home普通⽤户的⼯作⽬录,没有普通⽤户都会在这⾥建⽴⼀个⽂件夹
sudo mkdir -p rootfs/etc  # /etc存放系统配置⽂件以及应⽤程序的配置⽂件
sudo mkdir -p rootfs/lib  # /lib存放所有应⽤程序的共享⽂件以及内核模块
sudo mkdir -p rootfs/proc/ # /proc⽬录是内核在内存中映射的实时⽂件系统,存放内核向⽤户应⽤程序提供的信息⽂件
sudo mkdir -p rootfs/sys/  # /sys是⽂件系统挂载的地⽅
sudo mkdir -p rootfs/tmp/  # /tmp存放系统或应⽤程序产⽣的临时⽂件
sudo mkdir -p rootfs/root/ # /root是超级⽤户的⽤户⽬录
sudo mkdir -p rootfs/var/  # /var存放假脱机数据以及系统⽇志
sudo mkdir -p rootfs/mnt/  # /mnt⽤于加载磁盘分区和硬件设备挂载点
sudo mkdir -p rootfs/usr  # /usr包含所有⽤户的⼆进制⽂件和库⽂件等
sudo mkdir -p rootfs/dev/  # /dev⽤于存放设备⽂件
sudo mkdir -p rootfs/system
# 3.将open harmony 根⽂件系统⽂件放到rootfs下
sudo cp -arf ${OHOS_ROOTFS}/root/*  rootfs/
sudo cp -arf ${OHOS_ROOTFS}/system/*  rootfs/system/
# 4.创建设备⽂件
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
mkdirs方法sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
# 5.⽣成⼀个空的⽂件作为⽂件系统
sudo dd if=/dev/zero 3 bs=1M count=1024
sudo mkfs -t 3
# 6.将⽂件系统挂载到tmpfs⽬录下
sudo mkdir -p tmpfs
sudo mount -t 3 tmpfs/ -o loop
# 7.将之前创建的⽂件系统相关的⽂件放到通过tmpfs放到3⽂件系统中去
sudo cp -r rootfs/*  tmpfs/
sudo umount tmpfs
脚本⽂件中使⽤ sudo 的⽬的是保证 3 ⾥⾯的⽂件的所有者为 root。在 device/qemu/vexpress-a9 下执⾏该脚本,会在当前
⽬录下⽣成 3,先修改⽂件属性,让模拟器能够加载:
$ sudo chmod 3
退回到鸿蒙系统源码的根⽬录下,执⾏命令:
$ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./out/KERNEL_OBJ/kernel/src_tmp/linux-4.19/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ./out/KER 可以发现有如下输出:
可以看到,内核加载了,根⽂件系统也加载了,也执⾏了超级⽤户进程 init,遗憾的是,执⾏中还存在
错误。不⽤担⼼,我们⼀步⼀步来解决问题。
可以看出,这篇⽂章介绍的⽅法的不⾜,系统镜像的⽂件和根⽂件系统混在⼀起。⼀般⽽⾔,根⽂件系统是加载到内存中,这样做出来的根⽂件系统太⼤,⽐较占内存。⼀般根⽂件系统和系统镜像分开加载,在下⼀篇⽂章中,我们采⽤ uboot 来加载内核、根⽂件系统以及系统镜像。
敬请关注!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。