在前面分析的基础上,我们从零开始构建一个根文件系统。
一、弄清楚rootfs至少具备哪些目录与文件并创建空目录
根文件系统一般有/dev、/etc、/lib、/usr、/var、/proc、/tmp、/home、/root、/mnt、/bin、/sbin、/sys等目录,以及/linuxrc文件。
我们先创建一个文件夹“rootfs_xjh”,然后在该文件夹内创建以上文件夹。
至于/bin、/sbin目录,以及/linuxrc文件,它们是由busybox生成的,可以生成后再拷贝到文件夹“rootfs_xjh”里。
二、使用busybox构建/bin、/sbin目录与/linuxrc文件
1、获取busybox源码
2、解压后修改Makefile
- ARCH = arm
- CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin//arm-none-linux-gnueabi-
3、配置busybox
- 先“make defconfig”,然后“make menuconfig”,按照下面图示进行配置。
?
然后输入“make”出现错误如下。
?
解决方法:此文件和主功能无关,可以避开。
(1)先找到sync.c文件。在此目录下find -name "sync.c",知道其在./coreutils/sync.c。
(2)切换到coreutils目录,在Kbuild文件中查找“sync.o”,可知由宏CONFIG_SYNC来控制是否编译。
?
(3)在make menuconfig中,查找SYNC的位置,转到其位置,选择为N。?
4、输入make进行编译,然后输入make install进行安装
(1)make install,执行的是busybox顶层目录的一个目标install。
(2)安装目录默认在busybox/_install,里面有bin/、sbin/、linuxrc三个(目录)文件。
?
5、将bin/、sbin/、linuxrc文件拷贝到rootfs_xjh文件夹下
cp?bin/ sbin/ linuxrc ~/iot/embedded_basic_course/rootfs/rootfs_xjh -ra
三、构建etc目录
主要是拷贝一些文件到etc/目录下,并进行一些修改
?
1、复制busybox中的etc目录内容并修改inittab文件
将busybox/examples/bootfloopy/etc/目录内容,全部拷贝到rootfs_xjh/etc/目录下,然后修改其中的inittab文件。
(1)如果想开机免登陆,直接进入shell,则设置如下。
#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init
或者
::sysinit:/etc/init.d/rcS
#::respawn:-/bin/sh
#::respawn:-/bin/login
console::askfirst:-/bin/sh //这个和上面一样,只是id明确给出而已
#tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
(2)如果想开机需要登陆验证密码,则设置如下。
::sysinit:/etc/init.d/rcS
#::respawn:-/bin/sh
::respawn:-/bin/login
#console::askfirst:-/bin/sh
#tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
2、设置用户名与密码设置
将虚拟机ubuntu的/etc/passwd、/etc/group、/etc/shadow拷贝到rootf_xjh/etc/目录下,然后修改三个文件的相关内容。
(1)只保存与root相关项,修改passwd为root:x:0:0:root:/root:/bin/sh。
(2)只保存与root相关项,修改group为root:x:0:root。
(3)只保存与root相关项,shadow其他不需要更改(或者清除密码),登陆密码和拷贝源的密码一致。
3、修改profile文件
# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
4、修改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
5、修改etc/init.d/rc.S文件
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
/bin/hostname -F /etc/sysconfig/HOSTNAME
ifconfig eth0 192.168.1.10
四、构建lib目录
将动态链接库拷贝到rootfs_xjh/lib/目录下。
动态链接库在虚拟机的/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/目录。
cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/*so* ~/iot/embedded_basic_course/rootfs/rootfs_xjh/lib/ -rdf
P.s.知识扩充
为什么复制的是交叉编译工具链的动态链接库,而非gcc的动态链接库呢?因为根文件系统是在板子上工作的,即动态链接库的使用是在arm体系架构中,而非虚拟机的Intel 80386。也就是说,如果使用gcc编译则可以在虚拟机中运行,但是不能在开发板运行;要在开发板运行需要用arm-linux-gcc来交叉编译,但是此时编译文件不能在虚拟机运行。
可以用“file xx”命令来查看一个可执行程序是哪个架构的。
从上可知,构建根文件系统,主要是先形式上创建一些空目录,然后利用busybox软件包来创建bin/、sbin/、linuxrc三个(目录)文件,接着构建etc目录并修改其中的文件(包括inittab文件、rcS文件、profile文件、fstab文件、shadow文件、passwd文件等等),然后再构建lib目录(即把交叉编译工具链的动态链接库拷贝到根文件系统的lib目录下)。至此,一个文件夹形式的根文件系统构建完成。
我们可以通过NFS方式来挂载这个制作好的、文件夹形式的根文件系统,来验证其是否可用。可用的话,接下来我们可以将它制作成镜像文件并烧录到Flash中。制作镜像文件的方法见博客:制作ext2格式的根文件系统镜像_天糊土的博客-CSDN博客。
|