05步:制作根文件系统

5.1 编译、安装根文件系统

根文件系统的安装方法有很多,这里我们为了方便,安装最为简单和轻量的busybox

# cd /home/tftpboot
# mkdir filesys
# cd filesys
# wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
# tar -xvf busybox-1.35.0.tar.bz2
# cd busybox-1.35.0
# sudo mkdir -p /home/nfs
# sudo chmod 777 /home/nfs/

配置Makefile

# gedit Makefile +191

和编译kernel的时候一样,ARCH和CROSS_COMPILE配置成arm编译器

ARCH ?= arm
CROSS_COMPILE = arm-linux-gnueabi-

和kernel一样,输入make menuconfig进行一些配置
(1) 设置一下编辑器环境,方便操作:
Settings —-> [*] vi-style line editing commands (New)

(2) 设置一下安装路径,避免错误安装在根目录
Settings —-> Destination path for ‘make install’

进入以后,输入自己的rootfs的路径(我这里的路径是: /home/nfs)

设置完毕,设置编译安装:

# make install -j 2

无需再输入单独的编译命令,没有编译的话默认是会编译好了再安装的
注意!!!!!这里不要以root用户编译也不要加sudo编译,防止安装到根目录里,破坏Ubuntu
我们通常设置的安装模式安装到的/home/tftpboot已经给了最高权限,是肯定可以安装的,如果错误设置不安装到这个地方就会因为没有权限导致安装不上,从而完全避免了安装到根目录导致Ubuntu崩溃的问题。
如下图,就是错误的将安装目录设置为根目录的时候,因为没有权限没有执行安装过程,从而避免了因为错误安装导致的系统崩溃。

正常安装以后:

基本系统的功能是有了,接下来的功能便是安装动态链接库设置设备节点设置初始化进程设置文件系统设置环境变量

5.2 完成完整的根文件系统的构建

5.2.1 安装动态链接库

通过apt安装的arm编译器,动态链接库路径通常为:/usr/arm-linux-gnueabi/lib,复制到根文件系统的lib下

# cd /home/nfs
# mkdir lib
# cd /usr/arm-linux-gnueabi/lib
# cp *.so* /home/nfs/lib -d

若在运行linuxrc时失败,库的版本不兼容等,解决方法是编译busybox时,配置静态编译:

[*] Build static binary (no shared libs)

这样linuxrc运行时就不依赖动态库了,就可以正常运行了。

5.2.2 创建设备结点

# cd /home/nfs
# mkdir dev
# cd dev
# sudo mknod -m 666 tty1 c 4 1
# sudo mknod -m 666 tty2 c 4 2
# sudo mknod -m 666 tty3 c 4 3
# sudo mknod -m 666 tty4 c 4 4
# sudo mknod -m 666 console c 5 1
# sudo mknod -m 666 null c 1 3

5.2.3 设置初始化进程/etc/rcS

# cd /home/nfs
# mkdir -p etc/init.d
# cd etc/init.d
# touch rcS
# chmod 777 rcS
# gedit rcS

将以下内容加入rcS中

#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin 
export LD_LIBRARY_PATH=/lib:/usr/lib
/bin/mount -n -t ramfs ramfs /var
/bin/mount -n -t ramfs ramfs /tmp
/bin/mount -n -t sysfs none /sys
/bin/mount -n -t ramfs none /dev
/bin/mkdir /var/tmp
/bin/mkdir /var/modules
/bin/mkdir /var/run
/bin/mkdir /var/log
/bin/mkdir -p /dev/pts
/bin/mkdir -p /dev/shm
/sbin/mdev -s
/bin/mount -a
echo "-----------------------------------"
echo "*****welcome to vexpress board*****"
echo "-----------------------------------"

5.2.4 设置文件系统/etc/fstab

# cd /home/nfs/etc
# touch fstab
# gedit fstab

输入以下内容:

proc    /proc           proc    defaults        0       0
none    /dev/pts        devpts  mode=0622       0       0
mdev    /dev            ramfs   defaults        0       0
sysfs   /sys            sysfs   defaults        0       0
tmpfs   /dev/shm        tmpfs   defaults        0       0
tmpfs   /dev            tmpfs   defaults        0       0
tmpfs   /mnt            tmpfs   defaults        0       0
var     /dev            tmpfs   defaults        0       0
ramfs   /dev            ramfs   defaults        0       0

5.2.5 设置初始化脚本/etc/inittab

# cd /home/nfs/etc
# touch inittab
# gedit inittab

输入以下内容:

::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

5.2.6 设置环境变量/etc/profile

# cd /home/nfs/etc
# touch profile
# gedit profile

输入以下内容:

USER="root"
LOGNAME=$USER
export HOSTNAME=`cat /etc/sysconfig/HOSTNAME`
export USER=root
export HOME=/root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

5.2.7 增加主机名/etc/sysconfig/HOSTNAME

# cd /home/nfs/etc
# mkdir sysconfig
# cd sysconfig
# touch HOSTNAME

输入以下内容:

vexpress

5.2.8 创建剩下的文件夹

# cd /home/nfs
# mkdir mnt proc root sys tmp var

5.3 封装构建好的根文件系统,并挂载

# cd /home/
# sudo mkdir temp
# sudo dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
# sudo mkfs.ext3 rootfs.ext3
# sudo mount -t ext3 rootfs.ext3 temp/ -o loop
# sudo cp -r nfs/* temp/
# sudo umount temp
# sudo mv rootfs.ext3 tftpboot
# cd /home/tftpboot
# sudo gedit start.sh

更改启动脚本start.sh:
和前面一样,root登录才能启动

qemu-system-arm \
        -M vexpress-a9 \
        -m 512M \
        -kernel zImage \
        -dtb vexpress-v2p-ca9.dtb \
        -nographic \
        -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
        -sd rootfs.ext3

如图,挂载成功,内核版本也是课程配套的5.10.99版本

如果想设置为LCD启动的话,将start.sh改一下就好

qemu-system-arm \
        -M vexpress-a9 \
        -m 512M \
        -kernel zImage \
        -dtb vexpress-v2p-ca9.dtb \
        -append "root=/dev/mmcblk0 rw console=tty0" \
        -sd rootfs.ext3

效果图如图:

不用买开发板,使用QEMU就可以学习的Linux内核开发实战视频教程:《Linux内核编程》,具有一线芯片原厂开发经验的驱动工程师录制,详情点击:王利涛老师个人淘宝店:Linux内核编程