在上一篇文章【(1)uboot与kernel编译移植】中需要将自己的根文件系统通过NFS挂载或SD加载的形式来启动linux系统,本文将介绍如何制作是属于自己的根文件系统。
busybox下载地址为busybox资源,本教程下载版本为busybox-1.29.1.tar.bz2
。
在交叉编译前,需要在虚拟机上准备好自己的交叉编译工具链,本文如下
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin
解压压缩包:tar -xvf busybox-1.29.1.tar.bz2
修改顶层Makefile,添加编译器与芯片架构信息:
#164行
CROSS_COMPILE ?= arm-linux-gnueabi-
#190行
ARCH ?= arm
根我们编译 Uboot、 Linux kernel 一样,我们要先对 busybox 进行默认的配置 。
make defconfig
配置menuconfig 执行make menuconfig
Location:
-> Settings
-> Build static binary (no shared libs)
Location:
-> Settings
-> vi-style line editing commands
Location:
-> Linux Module Utilities
-> Simplified modutils
Location:
-> Linux System Utilities
-> mdev (16 kb)//确保下面的全部选中,默认都是选中的
Location:
-> Settings
-> Support Unicode //选中
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中
Location:
->Coreutils
->sync
Location:
->Linux System Utilities
->nsenter
执行编译命令:
make -j4
安装命令:
# CONFIG_PREFIX安装目录需要自己创建
make install CONFIG_PREFIX=/home/wcs/4412/rootfs/rootfs
安装结果为:
向rootfs下/lib添加库
将编译器路径下的库,添加到向rootfs下/lib添加库。
先在rootfs下创建lib文件
mkdir lib
然
后拷贝库文件
# 1.进入编译器库目录
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/lib
#2.拷贝库
cp *.so* *.a /home/wcs/4412/rootfs/rootfs/lib -d
# 3.进入编译器库目录
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/lib
#4.拷贝库
cp *.so* *.a /home/wcs/4412/rootfs/rootfs/lib -d
向rootfs下/usr/lib添加库
先在rootfs的use下创建lib文件
mkdir lib
拷贝库
# 1.进入编译器库目录
cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/usr/lib
#2.拷贝库
cp *.so* *.a /home/wcs/4412/rootfs/rootfs/usr/lib/ -d
至此文件系统已经移植完成,通过NFS挂载来验证,其结果为:
在系统起来时,报can't run '/etc/init.d/rcS': No such file or directory
,需创建文件/etc/init.d/rcS
。
rcS 是个 shell 脚本, Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件的脚本文件。
# 1.创建etc目录
mkdir etc
# 2.创建init.d目录
mkdir init.d
# 3.创建rcS文件
vim rcS
# 4.rcS文件添加内容
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH#保存着可执行文件可能存在的目录
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib#保存着库文件所在的目录
export PATH LD_LIBRARY_PATH
mount -a #命令来挂载所有的文件系统,这些文件系统由文件/etc/fstab 来指定
mkdir /dev/pts #创建目录/dev/pts,然后将 devpts 挂载到/dev/pts 目录中。
mount -t devpts devpts /dev/pts
mdev -s
# 5.修改权限
chmod 777 rcS
创建/etc/fstab文件
在 rootfs中创建/etc/fstab文件,fstab在Linux开机以后自动配置哪些需要自动挂载的分区,格式如下:
:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
:挂载点。
:文件系统类型,比如 ext2、ext3、proc、romfs、tmpfs 等等。
:挂载选项,在Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使用 defaults,也就是默认选项,defaults 包含了 rw、suid、 dev、 exec、 auto、 nouser 和 async。
:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。
:磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1,其他的分区从 2 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0。
# 1.创建fstab文件
mkdir fdtab
# 2.添加内容
#
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
创建/etc/inittab文件
inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。 init 程序会读取/etc/inittab这个文件, inittab 由若干条指令组成。
# 1.创建inittab文件
vim inittab
# 2.添加内容
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
第 2 行,系统启动以后自动运行/etc/init.d/rcS 这个脚本文件。(可设置启动测试脚本)
第 3 行,将 console 作为控制台终端,也就是 ttymxc0。
第 4 行,重启的话运行/sbin/init。
第 5 行,按下 ctrl+alt+del 组合键的话就运行/sbin/reboot,看来 ctrl+alt+del 组合键用于重启系统。
第 6 行,关机的时候执行/bin/umount,也就是卸载各个文件系统。
第 7 行,关机的时候执行/sbin/swapoff,也就是关闭交换分区。
使用IMX6Q开发板,通过NFS挂载根文件系统。
设置虚拟机为NFS服务器。
修改uboot中的bootargs参数。
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=169.254.17.100:/home/wcs/nfs,proto=tcp rw ip=169.254.17.229:169.254.17.100:169.254.17.1:255.255.255.0::eth0:off'
169.254.17.229
为开发板ip,169.254.17.100
虚拟机ip
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=169.254.17.100:/home/wcs/nfs,proto=tcp rw ip=169.254.17.229:169.254.17.100:169.254.17.1:255.255.255.0::eth0:off'
169.254.17.229
为开发板ip,169.254.17.100
虚拟机ip
注:
本文参考正点原子以及网络教程