根文件系统制作
概念:根文件系统(root filesystem)是存放运行,维护系统所必须的各种工具软件
库文件 脚本 配置文件和其他特殊文件的地方,也可以安装各种软件包
根文件系统首先是一个文件系统,文件系统是对数据的抽象,文件系统的引入为各个程序提供了标准化。根文件系统是第一个初始化的文件系统,根文件系统下面可以挂载其他文件系统
根文件系统主要目录结构
/bin 可执行程序 就是常用的命令那些
/dev 块 字符设备节点文件 linux提供应用程序访问驱动程序的入口
/etc 主要是配置文件和初始化执行文件 一些自动化脚本也在里面
/lib 基本的库文件,如:C库 内核模块
/usr/lib 所有的其他库
/usr/lib/xxx:一些工具包的私有库
/mnt 挂载点,临时挂载文件系统用
/opt 附加的软件包 第三方软件的目录
/proc 虚拟文件系统,用于内核和进程通讯,把内核的一些信息暴露给应用程序
/sbin 基本的系统管理程序(root用户能执行的基本程序)
/tmp 临时文件目录
/usr 更多的用户程序包括X server
/sys 虚拟文件系统sysfs挂载点
/var 可变信息存储 如log
根文件系统不是所有目录都得有,部分可以没有,根据自己的需求来
设备访问
Linux系统下一切皆文件
Linux系统中,所有的设备文件(如 设备节点),通常放到/dev/下
嵌入式系统中只需要创建必须的设备节点即可
主设备号 次设备号
主设备号(major) 内核用来区分哪类设备
次设备号(minor) 区分某类设备中的哪个设备
内核中的相关文档/documentation/devices.txt
Linux中通过主次设备号来区分不同设备,设备号不是随机分配的,有些已经被系统占用了
创建设备节点
设备文件不能在加载驱动程序时自动创建,要通过指令创建
创建设备文件的一般语法:
mknod /dev/<device> [c|b] <major> <minor>
例如 mknod /dev/ttySACO c 4 64
mknod /dev/hdal b 3 1
基本的设备节点
名称 描述 major minor
mem 物理内存访问设备 1 1
null Null设备(可以把这类设备当作黑洞把堆积的数据扔进去) 1 3
zero 从该设备读取将得到0(格式化某个磁盘时可以用到) 1 5
random 随机数发生设备 1 8
tty0 当前的虚拟终端设备 4 0
ttySAC0 第一个串口设备 4 64
tty 当前的TTY设备 5 0
console 系统console设备 5 1
制作根文件系统
制作根文件系统的内容
1 采用busybox创建基本的指令
busybox常用于制作linux命令
注意busybox编译也需要指定交叉编译工具链,只需要填写交叉编译工具链的前缀就行
make menuconfig先配置busybos然后make编译完成之后要make install安装到一个目录里
2 创建基本的目录
创建基本的目录/lib /etc /var /tmp /dev /sys /proc等
这些目录需要手动创建(不排除当前最新版本的busybox是已经自动创建了)
这些目录不是必须要有的
3 添加glibc的基本动态库
先把交叉编译工具链下的lib目录下的库拷贝到_install目录下
库里面一般静态库和动态库都会有,如果想要减少体积可以把静态库去掉
这样操作 rm lin/*.a 或者去掉符号文件通过下面这条指令
arm-none-linux-gnueabi-strip lib/* 根据交叉编译工具链的名字来修改前缀
(不排除有些交叉编译工具链没有strip工具)
如果空间足够的话尽量不要裁剪的太小,以防出现一些玄学bug
4 创建基本的设备节点
根文件系统中有一个设备节点是必须的,在dev下创建console节点
mknod dev/console c 5 1
5 添加启动配置和脚本程序
/etc/inittab /etc/fstab /etc/init.d/rcS
/etc目录下的大部分东西都是不变的,板子上电自动运行的脚本和应用可以自己添加
测试rootfs内容正确性
正常的根文件系统是可以挂载的,我们只需要测试一下板子上电能不能正常挂载就知道咱们做的对不对了
制作需要的rootfs类型的格式
具体种类可以自己搜索一下,蛮多的
根文件系统的类型是很多的,读写特性和存储介质是会有差别的,这是为了适应不同设备的特点
这些不同种类的可以互相结合,比如一些分区用A格式,一些分区用B格式
制作ramdisk文件系统
通过NFS测试之后,就可以制作ramdisk文件系统了