本文共 2778 字,大约阅读时间需要 9 分钟。
在之前的文章中,我们已经完成了uboot和内核的基础移植工作,为后续对驱动的学习打下了重要的基础。本文将记录最小文件系统的制作以及nfs挂载根文件系统的教程,帮助我们搭建一个便于驱动教程学习的开发环境。
在后续的驱动开发中,我们需要将程序编译到开发板上运行,而开发板均基于ARM Coretex-A9的exynos 4412架构,开发环境则基于ubuntu 18.04 LTS平台。因此,我们需要安装交叉编译链,这样才能生成能在开发板上运行的可执行二进制文件。
后期所有程序都将在开发板上运行,基于ARM架构的内核。由于开发机是x64平台,为了跨平台编译,我们需要安装对应的交叉编译工具链。
在最新版本的ubuntu 18.04 LTS平台上,arm版本的gcc已经被收入官方源码仓库,因此我们可以直接通过apt命令安装相应的交叉编译工具链。
sudo apt install gcc-arm-linux-gnueabihf
安装完成后,交叉编译工具会被安装在/usr/arm-linux-gnueabihf
目录下,包含以下子目录:
bin/ include/ lib/
bin/
:包含对应交叉编译工具链的可执行文件(如gcc、ar等),这些文件是软链接到/usr/bin/arm-linux-gnueabihf-*
。include/
:包含头文件。lib/
:包含静态和动态链接库文件。在安装了交叉编译工具链之后,我们可以进行最小根文件系统的制作。以官方最新稳定版为例,制作流程主要参考《Linux系统编程_v2.2.pdf》[1]。
mkdir dev etc lib mnt proc sys tmp var
tar -xvf busybox-1.30.1.tar.bz2 && cd ../busybox-1.30.1/
make menuconfig
根据具体需求进行配置,如交叉编译前缀和安装目录等。
make -j8make install
.├── dev/├── etc/│ └── rc.d/│ ├── init.d/│ │ ├── ifconfig-eth0│ │ └── netd│ └── profile├── lib/├── mnt/├── proc/├── sys/├── tmp/├── var/└── var/log/ (示例目录结构)注:所有新建文件需设置权限0755(如:chmod 0755 eth0-setting passwd profile init.d/* rc.d/init.d/*)
init.d/rc.S
的内容示例:#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/binrunlevel=Sprevlevel=Numask 022export PATHrunlevel prevlevel# ...# 启动网络配置/bin/mount -n -t proc none /proc/bin/mount -n -t sysfs none /sys/bin/mount -n -t usbfs none /proc/bus/usb/bin/mount -t ramfs none /dev# 系统初始化脚本rc.S
profile
和passwd
。以下是profile
示例:# Ash profile# vim: syntax=shulimit -S -c 0 > /dev/null 2>&1USER="`id -un`"LOGNAME=$USERPS1='[$USER@$HOSTNAME]# 'PATH=$PATHHOSTNAME=`/bin/hostname`export USER LOGNAME PS1 PATH
为了方便开发和测试,我们需要将根文件系统通过nfs挂载到开发板上。以下分开发板和开发机两部分进行说明。
在内核启动参数中添加相应的nfsroot参数,确保开发板能够以nfs协议挂载根文件系统。示例内核命令行参数:
kernel cmd line: (root=/dev/nfs rw nfsroot=192.168.1.140:/home/jason/arm-devlop/system ip=192.168.1.141:192.168.1.140:192.168.1.1:255.255.255.0:itop:eth0:off rootfstype=ext4 init=/linuxrc console=ttySAC2,115200)
sudo apt install nfs-kernel-server
/etc/default/nfs-kernel-server
中添加以下内容:RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
/etc/exports
中添加以下配置:/home/jason/arm-devlop/system/ *(rw,sync,no_root_squash,no_subtree_check)
sudo systemctl restart nfs-kernel-server.service
在实际操作过程中,可能会遇到开发板无法挂载nfs文件系统的问题。通过仔细检查内核启动参数和nfs服务器配置,确保两者的兼容性。例如,内核中的nfsroot参数是否与服务器上共享的目录一致,IP地址是否正确配置,协议版本是否匹配等。
完成上述步骤后,开发板将能够以nfs协议挂载根文件系统,实现完整的开发环境。最终效果如下:
[1] 《Linux系统编程_v2.2.pdf》 [2] 开发板挂载ubuntu 18.04系统下的nfs根文件系统失败
转载地址:http://dvdjz.baihongyu.com/