4.制作树莓派最小系统文件(rootfs)
2.1 下载busybox源码
我们可以在BusyBox的官网下载到源码:
https://busybox.net/downloads/
将下载的busybox-XXXXXX.tar.bz2复制到raspberry目录下,并解压
然后进入busybox-1.22.1/目录下
2.2 编译busybox
2.2.1 修改顶层Makefile(指定交叉编译工具链)
或者
在编译之前使用如下命令:
2.2.2 添加busybox中文字符支持
打开busybox-1.29.0/libbb/printable_string.c文件,找到printable_string函数,修改如下
打开busybox-1.29.0/libbb/unicode.c文件,找到unicode_conv_to_printable2函数,修改如下
2.2.3 配置Busybox
在busybox-1.22.1/目录下输入 make defconfig 命令预配置busybox,然后通过make menuconfig图形化界面配置,进入Setting->Build static binary (no shared libs),不要选中改选项
然后保存、退出
出现如下错误:说明打开的窗口太小导致的,放大窗口即可解决问题
2.2.4 编译Busybox
配置完成即可以编译,编译结果指定为之前创建的rootfs目录
在rootfs目录下可以看到busybox工具:
出现如下错误:需要在配置选项里面去除2个选项
make menuconfig
Linux System Utilities—>nsenter,去掉该选项,
Coreutils—>sync选项去掉,重新make编译通过
2.3 最小根文件系统制作
1.在上述新建的rootfs文件夹下面创建两个设备文件/dev/console 和 /dev/NULL
mkdir dev/console
mkdir dev/NULL
2.查询虚拟机
console : 主设备号为5,次设备号为1
null:主设备号为1,次设备号为3
所以,创建两个新的设备节点
[email protected]:/home/xd/rootfs/dev/console# mknod -m 666 console c 5 1
[email protected]:/home/xd/rootfs/dev/NULL# mknod -m 666 null c 1 3
(1)/dev/console
/dev/console代表bai的系统控制台,错误信息和诊du断信息都会被到这个上。
(2)/dev/tty
/dev/tty如果一个控制台有一个终端dao的话,那么这个文件就是对应的当前的这个控制终端的别名,注:console和tty有很大区别:console是个只输出的设备,功能很简单,只能在内核中访问;tty是char设备,可以被用户程序访问。
(3)/dev/null
这个是一个空设备文件,所有写到这个文件中的数据都会被丢弃掉
3.创建etc目录,构造inittab
这里移植的是一个已经做好的典型的inittab,所以操作如下
[email protected]:/home/imx6/busybox-1.27.2/examples/bootfloppy#目录下有一个etc文件夹,将它全部拷贝到你的rootfs目录下的etc文件夹下,在tootfs下先新建一个etc文件夹
Fstab:https://blog.****.net/kepa520/article/details/81315430
当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录
inittab:https://blog.****.net/u014089899/article/details/80622607
Linux在完成核内引导以后,就开始运行init程序
init.d/rcS:rcS是一个脚本文件,在inittab文件中本解析调用,用于配置Linux系统
https://blog.****.net/u013686019/article/details/26846571
https://blog.****.net/weixin_30839881/article/details/97608919?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight
执行mount –a 命令后,将挂接proc、tmpfs文件系统
写成mount –a 它会依赖于etc/fstab ,根据fstab的指示来挂载根文件系统
profile: https://www.cnblogs.com/lh03061238/p/9952659.html
/etc/profile文件的改变会涉及到系统的环境
4.C库lib
进入到编译busybox的C库,这里我的路径是,将交叉编译工具链里面需要的文件动态链接到rootfs的lib下(在rootfs下新建lib文件夹)
cp -d .so /home/mf/Desktop/rootfs/lib
2.4 完善根文件系统
1.
2.在fstab文件里边加上
chmod +x rcS
这样我们这个文件系统启动就会执行rcS,可以在proc目录看到所有运行的文件
3.创建一些必备的文件夹
mkdir dev etc lib mnt proc sys tmp var boot
/*
- 说明
- dev 目录主要共系统生成各类设备节点
- etc 系统的配置文件
- lib 系统需要的各类库文件
- mnt 一般用来挂载其他设备的的目录
- sys 系统文件
- tmp 临时文件
- var
- proc 内存虚拟文件系统节点
*/
注意:这里可以不用添加boot文件夹,但是由于fstab里面增加了挂载结点,这里最好增加一个
2.5 上机测试
df -h
Sudo mount /dev/sdb2 /mnt/rpi/ext4
Sudo rm -rf /mnt/rpi/ext4/*
Sudo cp -r /home/xd/raspberry/rootfs/* /mnt/rpi/ext4 -d
Sudo umount /mnt/rpi/ext4
将SD插入树莓派运行
注意:这里必须将文件夹整体拷贝进SD卡,不能在拷贝之后在添加boot等文件夹,否则会出现一些问题,可能的原因是,第一次启动时,已经将文件系统烧写进内存当中,再次修改导致死机,文件系统做的任何修改都不行要整体拷贝