根文件系统制作流程
根文件系统是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行 。
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。
根文件系统主要是基于busybox来制作的
下载busybox: https://busybox.net/downloads/busybox-1.9.2.tar.bz2
解压文件进入文件根目录;
编译busybox: 怎么编译在INSTALL中有说明
编译和编译kernel类似,先make menuconfig 配置参数 生成.config文件。
make 生成可执行文件 make install 安装
编译时出现了两个错误
修改文件 applets/applets.c 第 21 行, 将 #error Aborting compilation. 注释
这个是编译工具链 netfilter.h 中少头文件 添加头文件:#include <netinet/in.h>
这样就解决了busybox的编译问题
我们还需要配置,配置界面:
具体项的配置说明可参考百度文库中的这个链接,大神写的很详细
https://wenku.baidu.com/view/5d25420602020740be1e9b0b.html
我的配置比较简单:
配置成静态库
编译后不生成usr目录, 下面的是make install 的安装目录
这个也可以不配置,还有个Makefile文件也可以不用改,只不过在编译的时候要添加命令
make menuconfig
make ARCH= arm CROSS_COMPILE=arm-linux- 这条命令中指定编译平台和编译器
make CONFIG_PREFIX=/home/book/workspace/rootfs install 指定安装路径,
编译安装完成后在/home/book/workspace/rootfs会生成 bin, sbin linuxrc软连接文件(dev文件我后来创建的)
创建成功后接下来还需做什么工作呢?(借鉴大神图http://blog.****.net/czg13548930186)
mdev作用是在系统启动和热插拔或动态加载驱动程序时,自动创建设备节点。文件系统中的/dev目录下的设备节点都是由mdev创建的,mdev是通过init进程来启动的,在使用mdev构造/dev目录之前,init至少要用到设备文件/dev/console, dev/null,所以需要事先建立这两个设备文件
1,创建设备节点dev/console,dev/null
mkdir dev
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3
为什么主次设备号为5,1 和1,3 我们可以查看linux系统中的这两设备号
2. 创建必要的文件目录
mkdir etc lib proc sys root mnt tmp
3. 构造/etc/inittab
vi /etc/inittab 添加文件(可以参照busybox中的example)
#/etc/inittab
::sysinit:/etc/init.d/rcS /* 具体含义参考 http://blog.sina.com.cn/s/blog_aa9fb81a0102wbbe.html */
ttySAC0::askfirst:-/bin/sh /* /bin/sh是一个程序,会把标准输出、标准输入、标准错误定位到ttySAC0里面去,0号串号*/
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
4. 添加库文件(我们的库文件是基于编译器的,所以拷贝的是编译器的库文件)
mkdir lib //创建lib文件,将编译器中此目录的库文件拷贝到lib中
cp *.so* ~/workspace/rootfs/lib -d // -d含义是带软连接拷贝
接下来就是来配置etc目录了:
touch etc/inittab etc/fstab
touch etc/init.d/rcS -p
既然/etc/inittab 是第一个执行的文件 ,那么从此文件中我们看到有个sysinit ,所以我们需要在/etc 下创建一个rcS文件。
这个文件中我们能填充些什么呢,这个文件里面我们可以添加想自动执行的文件,如配置电脑的ip,挂载/etc/fstab指定的文件系统等.
#!/bin/sh
ifconfig eth0 192.168.0.100
mount -a //mount 某一具体的文件系统也行这里是mount所有。
mount -t tmpts mdev /dev //使用内存文件系统,减少对flash的读写
mkdir /dev/pts //用来支持外部网络链接的虚拟终端
mount -t devpts devpts /dev/pts
mount -t sysfs sysfs /sys //mdev通过sysfs文件系统获取设备信息
echo /sbin/mdev/ > /proc/sys/kernel/hotplug //设置内核,当有设备插拔时调用/bin/mdev程序
mdev -s //在/dev 目录下生成内核支持的所有设备的节点
然后给创建的rcS添加执行权限
chmod +x /etc/init.d/rcS
mount -a 到底mount是什么东西呢?
它mount的是/etc/fstab中指定的文件系统 ,所以我们需要创建一个fstab
#device mount_point type options dump fsck order
proc /proc proc defaults 0 0
tempfs /tmp tmpfs default 0 0
sysfs /sys sysfs default 0 0
tmpfs /dev tmpfs default 0 0
创建完这个个主要的目录文件后,我们还需要创建其他的文件,他们可以为空
mkdir proc mnt tmp sys root
这样一个简单的根文件系统就做好了,我们可以通过网络挂载的方式去使用这个文件系统,当然也可以将这个跟问价系统烧到我们的开发板中去使用,但是烧到开发板中使用,我们就得将这个文件打包成镜像文件,需要使用到的工具: mkyaffsimage,
mkdyaffsimage rootfs rootfs.yaffs
使用tftp烧写:
tftp 0x30000000 rootfs.yaffs
nand erase 0xA0000000 0x36000000 //擦除指定地址的空间
nand write.yaffs 0x30000000 0xA0000000 (镜像的大小)