一、根文件系统概述
1、为什么需要根文件系统
(1) init 进程这个应用程序,在根文件系统上。
(2) 根文件系统提供了根目录:/。
(3) 内核启动后的应用层配置(/etc 目录),在根文件系统上。几乎可以认为:发行版 == 内核 + rootfs。
(4) shell 命令程序在根文件系统上。譬如 ls、cd 等命令。
总结:一套 linux 体系,只有内核的话,是不能工作起来的,必须要 rootfs(上的 /etc目录下的配置文件、/bin、 /sbin 等目录下的 shell 命令,还有 /lib 目录下的库文件等···)相配合,才能工作。
2、根文件系统的实质是什么
(1) 根文件系统,是特殊用途的文件系统。
(2) 根文件系统也必须属于某种文件系统格式。uboot cmdline 中使用格式:rootfstype= 来指定。
(3) 究竟文件系统是用来干嘛的。
首先,存储设备(块设备,像硬盘、flash等)是分块(扇区)的,物理上底层去访问存储设备时,是按照块号(扇区号)来访问的。这就很麻烦。
其次,文件系统是一些代码,是一套软件,这套软件的功能就是对存储设备的扇区进行管理,将这些扇区的访问,变成了对目录和文件名的访问。 我们在上层按照特定的目录和文件名去访问一个文件时,文件系统会将这个 ”目录+文件名“ 转换成对扇区号的访问。
最后,不同的文件系统的差异就在于,对这些扇区的管理策略和方法不同,譬如坏块管理、碎片管理。
二、根文件系统的形式
1、镜像文件的形式
(1) 使用专用工具软件制作的、可供烧录的镜像文件。
(2) 镜像中包含了根文件系统中的所有文件。
(3) 烧录此镜像,类似于对相应分区格式化。
(4) 镜像文件系统具有一定的格式, 格式是内化的,跟文件名后缀是无关的。
2、文件夹的形式
(1) 根文件系统,其实就是一个包含特定内容的文件夹而已。
(2) 根文件系统可由任何一个空文件夹 添加必要的文件构成而成。
(3) 根文件系统的雏形就是,在开发主机中构造的文件夹形式的。
3、总结
(1) 镜像文件形式的根文件系统,主要目的是用来烧录到块设备上,设备上的内核启动后,去挂载它。
镜像文件形式的根文件系统,是由文件夹形式的根文件系统,使用专用的镜像制作工具制作而成的。
(2) 最初在开发主机中随便 mkdir 创建了一个空文件夹,然后向其中添加一些必要的文件(包括 etc 目录下的运行时配置文件、/bin 等目录下的可执行程序、/lib 目录下的库文件等···)后就形成了一个文件夹形式的 rootfs。
然后这个文件夹形式的 rootfs, 可以被 kernel 通过 nfs 方式来远程挂载使用,但是不能用来烧录块设备。
我们为了将这个 rootfs 烧录到块设备中,于是用一些专用的软件工具,将其制作成可供烧录的 具有一定格式的 根文件系统镜像。
(3) 文件夹形式的 rootfs 是没有格式的,制作成镜像后就有了一定的 rootfs 格式了,格式是由我们的镜像制作过程和制作工具来决定的。
每一种格式的镜像制作工具的用法都不同。
三、自己制作 ext2 格式的根文件系统
1、mke2fs 介绍
(1) mke2fs 是一个应用程序,在 ubuntu 中默认是安装了的。这个应用程序就是用来制作 ext2、ext3、ext4 等格式的根文件系统的。
(2) 一般用来制作各种不同格式的 rootfs 的应用程序的名字都很相似,类似于 mkfs.xxx(譬如用来制作 ext2 格式的 rootfs 的工具,叫 mkfs.ext2、用来制作 jffs2 格式的 rootfs 的工具就叫 mkfs.jffs2)。
(3) ubuntu14.04 中的 mkfs.ext2 等,都是 mke2fs 的符号链接而已。
2、动手制作 ext2 格式的根文件系统
(1) 创建 rootfs.ext2 文件,并且将之挂载到一个目录下,方便访问它。
《参考资料:http://blog.csdn.net/zhengmeifu/article/details/24174513》
dd if=/dev/zero of=rootfs.ext2 bs=1024 count=2048
losetup /dev/loop1 rootfs.ext2
mke2fs -m 0 /dev/loop1 2048
mkdir rootfs
mount -t ext2 /dev/loop1 ./rootfs/
(2) 我们向镜像中写入一个普通文件 linuxrc。这个文件就会成为我们制作的镜像中的 /linuxrc。内核挂载了这个镜像后,就会尝试去执行 linuxrc。然后执行时必然会失败。
我们将来实验看到的现象就应该是:挂载成功,执行 /linuxrc 失败。
root@ubuntu:/home/aston/workspace/porting_x210/rootfs# cd rootfs
root@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs# ls
lost+found
root@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs# touch linuxrc
root@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs# ls
linuxrc lost+found
root@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs#
(3) 将来真正去做有用的 rootfs 时,就要在这一步添加真正可以执行的 linuxrc 程序,然后还要添加别的 /lib 目录下的库文件,/etc 目录下的配置文件等。
(4) 卸载掉,然后镜像就做好了。
root@ubuntu:/home/aston/workspace/porting_x210/rootfs/rootfs# cd ../
root@ubuntu:/home/aston/workspace/porting_x210/rootfs# ls
rootfs rootfs.ext2
root@ubuntu:/home/aston/workspace/porting_x210/rootfs# umount /dev/loop1
root@ubuntu:/home/aston/workspace/porting_x210/rootfs# losetup -d /dev/loop1
root@ubuntu:/home/aston/workspace/porting_x210/rootfs#
3、烧录制作的 rootfs.ext2
(1) 烧录过程参考裸机中第三部分的刷机过程。注意 bootargs 传参的设置。
uboot 中配置:
set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext2
Windows 下的 fastboot 文件夹:
启动 uboot,执行 fastboot :
Windows 下,使用 cmd 命令执行 fastboot 命令:
fastboot devices
fastboot flash system rootfs.ext2
fastboot reboot
uboot 下敲任意键,进入 uboot 命令行。
使用 tftp 传输 kernel 镜像,并启动:
set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext2
tftp 30008000 192.168.1.20:zImage
bootm 30008000
注意:由于前面我们移植三星官方的 kernel 时,未解决 mmc 驱动的问题,所以如果使用我们移植的三星官方 kernel ,将会失败。
我们应该使用三星官方移植好的 kernel :qt_x210v3s_160307/kernel
root@ubuntu:/home/aston/workspace/uboot_bsp/qt_x210v3s_160307/kernel# cp arch/arm/boot/zImage /mnt/hgfs/linux_win_shared/zImage -rf
源自朱有鹏老师.