如何构造linux根文件系统

1. 什么是linux根文件系统?

这个概念其实我也花了很久才明白,一开始一直分不清根文件系统与yaffs文件系统、ex2文件系统、jffs2文件系统的区别,下面就讲讲这个linux根文件系统到底是何方神圣。我们拿windows下的定义来类比吧,因为大部分人对windows操作系统还是比较熟悉的。

文件系统就是把闪存中地址与数据的关系按照一定的规则组织起来,对用户提供一个比较方便的操作接口。可以想想,如果没有文件系统,你想要在你的PC的D盘里找一个视频文件,那就需要你自己去对D盘进行寻址,再取出对应地址的数据,这样是不是很麻烦呢?而文件系统的出现就让用户对闪存的操作变得简单。PC上硬盘的文件系统一般是NTFS类型的。而对于linux系统,需要根据系统使用的闪存类型来决定使用什么类型的文件系统。常见的linux文件系统有:fat16、fat32、ntfs、ext2、ext3、jffs2、yaffs等。这个文件系统的区别是在存储文件时遵循的规则是不一样的。

                

那么既然linux文件系统的类型有很多,那根文件系统又是啥呢?首先可以确认的是根文件系统一定是有文件系统类型的,而且文件类型也就是fat16、fat32、ntfs、ext2、ext3、jffs2、yaffs这些。那根文件系统与普通的文件系统有什么区别呢?区别就在于

根文件系统是linux内核启动后第一个挂载的文件系统,是其他文件系统的根源。根文件系统主要包含内核启动后运行的第一个程序(init)、给用户提供操作界面的shell程序以及应用程序所依赖的库等内容。要想挂载其他文件系统,就必须得再根文件系统成功挂载后才可以。根文件系统核心就在一个“根”上面。

既然理解了什么是根文件系统,那就容易理解yaffs类型的根文件系统、jffs2型的文件系统,也就是把根文件系统的必需模块按照yaffs、jffs2类型来存储而已。

2. 如何构造根文件系统?

所谓制作根文件系统,就是创建各种目录,并在里面创建各种文件。比如在/bin、/sbin目录下存放可执行程序,在/etc中存放配置文件等。

现在构造根文件系统的方法比较多,有基于busybox的,有基于buildroot的。这里针对基于busybox来讲吧。busybox是一个遵循GPL V2协议的开源项目。busybox将许多UNIX命令集合进一个很小的可执行程序中。知道为什么你可以在linux的命令行中执行 ls 就可以显示文件吗?这个 ls命令就是由busybox实现的。所有有现成的工具一定要学会使用,不然你自己从头写一个 ls的程序,太浪费时间了。

  • 下载、解压busybox

busybox的下载地址为:https://busybox.net/

目前最新的busybox版本是busybox-1.32.1,后面的操作都是基于busybox-1.32.1来进行的。

解压busybox

tar xjvf busybox-1.32.1.tar.bz2
  • 配置busybox

在busybox的文件夹中有个INSTALL文件,里面介绍了如何配置和编译busybox,建议可以去看看。

利用"make menuconfig"命令即可进入配置界面。对于没有特殊要求的根文件系统,一般只需要修改以下几个部分:

1)Cross compile prefix中指定交叉编译工具链

2) 编译选项中选择为静态编译,静态编译出来的文件系统会比动态编译出来的文件系统更大,这事因为静态编译直接将busybox需要的库文件直接编译进文件系统了,在拷贝根文件系统时就无需关心动态库了。而动态编译还需要将gloibc的库复制到根文件系统的/lib目录下。

  • 编译和安装busybox

直接执行“make”命令就可以编译busybox了,但这时编译会报错,报错内容是

util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x184): undefined reference to `setns'
coreutils/lib.a(sync.o): In function `sync_common':
sync.c:(.text.sync_common+0x34): undefined reference to `syncfs'

这个问题目前只能通过在配置中将此文件忽略来避免,就是在“make menuconfig”时,将这两项取消掉。再进行make。

 Symbol: NSENTER [=y]                                                                    │  
  │ Prompt: nsenter (6.5 kb)                                                                │  
  │   Defined at util-linux/Config.in:699                                                   │  
  │   Location:                                                                             │  
  │     -> Linux System Utilities                                                           │  
  │   Selects: PLATFORM_LINUX  
 Symbol: SYNC [=y]                                                                       │  
  │ Prompt: sync (3.8 kb)                                                                   │  
  │   Defined at coreutils/Config.in:652                                                    │  
  │   Location:                                                                             │  
  │     -> Coreutils 

再执行“make install”命令来安装busybox。那么busybox会安装到哪里去呢?其实在“make menuconfig”中可以指定安装的路径,但如果没指定的话,就会安装到/_install目录下。

可以看到在_install目录下,已经有很多可执行文件了,剩下的就需要我们在这个目录下再创建一些目录和文件了。

1)创建etc/inittab文件

仿照busybox的exampiles/inittab文件,在/_install文件夹中创建inittab文件,内容如下:

#this is run first except when booting in single-user mode.                                                                                      
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot

2)创建etc/init.d/rcS文件

#!/bin/sh

echo "Starting rcS..."

echo "++ Mounting filesystem"
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /tmp

echo "++ Setting up mdev"

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

mkdir -p /dev/pts
mkdir -p /dev/i2c
mount -t devpts devpts /dev/pts

echo "rcS Complete"

最后要改变它的属性:chmod +x etc/init.d/rcS。

3) 创建etc/fstab文件

LABEL=/     /           tmpfs   defaults        0 0
none        /dev/pts    devpts  gid=5,mode=620  0 0
none        /proc       proc    defaults        0 0
none        /sys        sysfs   defaults        0 0
none        /tmp        tmpfs   defaults        0 0

4)创建一些空目录,比如proc、mnt、tmp等等。到此其根文件系统的必需文件就弄完了,接下来就需要将和_install目录中的内容格式化某种文件类型,就可以了。

所谓制作文件系统映像文件,就是将一个目录下的所有内容按照一定的格式存放到一个文件中,这文件可以直接烧写到存储设备上去,当系统启动后挂载这个设备,就可以看到与原来目录一样的内容。

制作不同类型的文件系统映像文件需要使不同的工具。

3. 制作ramdisk根文件系统

ramdisk文件系统就是ext2格式的文件系统,制作ramdisk文件系统就是将根文件按照ext2规则来存储。

$ dd if=/dev/zero of=ramdisk.image bs=1024 count=16384
$ mke2fs -F ramdisk.image -L "ramdisk" -b 1024 -m 0
$ tune2fs ramdisk.image -i 0
$ chmod 777 ramdisk.image

挂载ramdisk

新建一个rootfs目录, 并将ramdisk.image挂载到rootfs目录:

$ mkdir rootfs
$ chmod u+rwx ramdisk.image
$ sudo mount -o loop ramdisk.image rootfs

将制作好的根文件系统全部拷贝到rootfs目录下:

$ cp -af root/* rootfs/*

打包ramdisk

卸载rootfs, 并打包ramdisk.image:

$ sudo umount rootfs
$ gzip ramdisk.image
$ mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz

将生成的uramdisk.image.gz下载到嵌入式设备上,启动后就可以看到根文件系统了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值