以下内容源于网络资源的学习与整理,如有侵权请告知删除。
参考博客
Uboot和系统移植(19)------- 根文件系统构建过程详解_big__C的博客-CSDN博客
一、总结
(1)本节在前面的理论分析的基础上,我们开始从零开始构建一个根文件系统。
(2)构建根文件系统的步骤如下。
- 首先在形式上创建一些空目录。
- 然后利用busybox软件来创建bin/、sbin/、linuxrc这三个(目录)文件。
- 接着构建与修改etc目录下的文件(包括inittab文件、rcS文件、profile文件、fstab文件、shadow文件、passwd文件等等)。
- 最后构建lib目录(即把交叉编译工具链的动态链接库复制到根文件系统的lib目录)。
(3)我们可以通过NFS方式来挂载这个文件夹形式的根文件系统,以验证其可用性。后续也可以将它制作成镜像文件并烧录到Flash中,参见博客制作ext2格式的根文件系统镜像。
二、构建根文件系统的步骤
1、明确最小根文件系统包含哪些内容
(1)由博文根文件系统的目录结构可知,根文件系统一般有/dev、/etc、/lib、/usr、/var、/proc、/tmp、/home、/root、/mnt、/bin、/sbin、/sys等目录(这些目录有些是最小根文件系统必需的,有些不是必需的),以及/linuxrc文件。
(2)我们先创建一个文件夹“rootfs_xjh”,然后在该文件夹内创建以上文件夹。至于/bin、/sbin目录,以及/linuxrc文件,它们是由busybox生成的,可以生成后再拷贝到文件夹“rootfs_xjh”里。
2、使用busybox生成bin/、sbin/、usr/目录与linuxrc文件
步骤1、获取busybox源码
(1)busybox是开源项目,版本差异不大;这里选择busybox-1.24.1版本。
(2)官方网站下载:Index of /downloads。
步骤2、解压后修改Makefile
将Makefile中的ARCH、CROSS_COMPILE修改如下:
ARCH = arm CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin//arm-none-linux-gnueabi-
步骤3、配置busybox
先“make defconfig”,然后“make menuconfig”,按照下面图示进行配置。
步骤4、编译与安装
(1)执行“make”时出现错误如下。
解决方法:此文件和主功能无关,可以避开。
1)先找到sync.c文件。在此目录下find -name "sync.c",知道其在./coreutils/sync.c。
2)切换到coreutils目录,在Kbuild文件中查找“sync.o”,可知由宏CONFIG_SYNC来控制是否编译。
3)在make menuconfig中,输入/然后查找SYNC,转到其位置选择为N。
(2)再次执行make进行编译,然后执行make install进行安装。
安装目录默认在busybox-1.24.1/_install,我们也可以在make menuconfig时设置安装目录。
安装成功后里面有bin/、sbin/、linuxrc、usr/这个四个目录或文件。其中linuxrc、bin/、sbin/、usr/bin/、usr/sbin/目录下的命令都指向了bin/busybox,如下所示。
步骤5:将目录bin/、sbin/、usr/以及文件linuxrc拷贝到rootfs_xjh文件夹
cp bin/ sbin/ usr/ linuxrc /home/xjh/iot/embedded_basic/rootfs/rootfs_xjh -raf
3、构建etc目录
这步骤主要是拷贝一些文件到etc/目录下,并对这些文件进行一些修改。
最终的根文件系统对应的文件夹内容如下:
步骤1、将busybox/examples/bootfloopy/etc/中的文件拷贝到rootfs_xjh/etc/目录
busybox/examples/bootfloopy/etc/有fstab、init.d、inittab、profile四个文件或目录。
步骤2:修改rootfs_xjh/etc/inittab文件
(1)如果需要开机免登陆而直接进入shell,则修改如下。console::askfirst:-/bin/sh表示系统启动后,如果按回车就执行/bin/sh而出现命令行,从而不会出现登录界面。
::sysinit:/etc/init.d/rcS #::respawn:-/bin/sh #tty2::askfirst:-/bin/sh console::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r
注意按回车之后自动有“[root@xjh]#”,root应该是默认的,而xjh是/etc/profile文件中写好的。
(2)如果需要开机时登陆用户,则设置如下。::respawn:-/bin/login表示系统启动的时候会提示用户登录。至于是否还需要输入密码,则要看shadow文件第一行代码的第一个冒号和第二个冒号之间是否有加密的密码。如果没有,则只要输入用户名root然后回车即可,无需输入密码;如果有则和拷贝源的密码一样。
::sysinit:/etc/init.d/rcS ::respawn:-/bin/login #tty2::askfirst:-/bin/sh #console::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r
步骤3、设置用户名与密码设置
下面操作的前提,是步骤2的时候选择(2).。
将虚拟机linux系统里的/etc/passwd、/etc/group、/etc/shadow拷贝到rootf_xjh/etc/目录下,然后修改三个文件的相关内容。
(1)修改passwd文件
只保存与root相关的行,修改passwd文件内容为“root:x:0:0:root:/root:/bin/sh”(没双引号,而且因为busybox不支持bash,这里的/bin/bash要改为/bin/sh)。
(2)修改group文件
只保存与root相关的行,修改group文件内容为“root:x:0:root”(没双引号)。
(3)修改shadow文件
只保存与root相关的行,而且与root相关的行不需要更改(此时登陆密码和拷贝源的密码一致),或者可以清除这行第一个冒号和第二个冒号之间的内容(登陆时只需要输入root这个用户名然后回车即可,无需密码)。
//第一个冒号和第二个冒号之间的内容是加密后的密码 root:$7$.KKrGMfb$M2qiFqy1dNaMVv9LVfk/0Fex4EDrLu5ladkTR0mZ6SrMvlvJHjTSF30/KwRNVjPhMJQn04qzIV9wQwujCIgCm.:17463:0:99999:7:::
步骤4、修改rootfs_xjh/etc/profile文件
# Ash profile # vim: syntax=sh# No core files by default ulimit -S -c 0 > /dev/null 2>&1USER="`id -un`" LOGNAME=$USER PS1='[\u@\h \W]\# ' PATH=$PATHHOSTNAME=`/bin/hostname`export USER LOGNAME PS1 PATH
步骤5、修改rootfs_xjh/etc/fstab文件
我们在这个文件中添加以下内容(作为挂载点的空目录需要先建立):
#<file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /var tmpfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0
步骤6、修改rootfs_xjh/etc/init.d/rc.S文件
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=S prevlevel=Numask 022export PATH runlevel prevlevelmount -aecho /sbin/mdev > /proc/sys/kernel/hotplug mdev -s/bin/hostname -F /etc/sysconfig/HOSTNAMEifconfig eth0 192.168.1.100
4、构建lib目录
(1)这一步也就是将动态链接库复制到rootfs_xjh/lib目录。动态链接库位于虚拟机linux系统的/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/目录。
cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/*so* /home/xjh/iot/embedded_basic/rootfs/rootfs_xjh/lib/ -rdf
(2)为什么复制的是交叉编译工具链的动态链接库,而非gcc的动态链接库呢?这是因为根文件系统是在板子上工作的,即动态链接库的使用是在arm体系架构中,而非虚拟机的Intel 80386。也就是说,如果使用gcc编译则可以在虚拟机中运行,但不能在开发板运行;如果要在开发板运行则需要用arm-linux-gcc来编译,但此时编译得到的文件不能在虚拟机运行。
(3)可以用“file xx”命令来查看一个可执行程序是哪个架构的。