itop4412 linux驱动学习环境搭建-最小根文件系统制作与NFS挂载

前言

在前面的文章中,完成了uboot和内核的基本移植教程,为驱动的学习打下了一定的基础。为了后期更好的学习,本篇文章记录了最小文件系统的制作、nfs挂载根文件系统教程,搭建一个方便驱动教程学习的环境。

注:本文开发环境均基于ubuntu18.04 LTS平台搭建。

交叉编译工具安装

说明

后期所有程序都是在开发板上运行的,基于ARM Coretex-A9的exynos 4412,而我们开发机是X64平台,所以需要安装交叉编译链,编译出能在开发板上运行的可执行二进制。

安装

在最新的ubuntu18.04 LTS平台上,arm版的gcc已经收录到官方源里面,可以直接执行熟悉的apt install 便可以安装gcc交叉编译工具链,下面给出安装流程与说明。

  • 安装命令
$ sudo apt install gcc-arm-linux-gnueabihf 
  • 安装文件说明
    安装好后会在/usr/arm-linux-gnueabihf目录下生成以下文件夹:
$ bin  include  lib
  1. bin目录下是软链接到/usr/bin/arm-linux-gnueabihf-*(*为gcc,ar等等)
  2. include目录下是头文件
  3. lib目录下是gcc的库文件,有动态和静态库。

最小根文件系统制作

在安装好arm-linux-gnueabihf-交叉编译工具链后,便可进行最小根文件系统的制作。

下载

本文以官方最新稳定版14 February 2019 -- BusyBox 1.30.1 (stable)为例,进行最小跟文件系统的制作,制作流程参阅讯为官方手册《Linux系统编程_v2.2.pdf》[1]。

流程

$ tar -xvf busybox-1.30.1.tar.bz2
$ cd ../busybox-1.30.1/
$ make menuconfig
$ 作相应配置,见下面的说明
$ make -j8
$ make install
$ 完善最小根文件系统,同见下面的说明

说明

配置说明

  • 选中Settigs目录:


    主设置项
  • 指定交叉编译链前缀和指定install目录


    指定交叉编译链前缀和指定install目录
  • 其他设置(可选)
    其他配置项中可以选着安装的软件包,根据自己需要自行配置。

完善最小根文件系统

  • 创建必需的文件夹
$ mkdir dev etc lib mnt proc sys tmp var
  • 完善etc目录
  1. 目录如下:


    目录树

注:图片中的绿色文件的权限均为0755,必须设置!

  1. 在内核加载完成后启动的第一个进程init进程,会读取并执行init.d/rcS, 该文件内容如下:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
 
#
#       Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
 
#/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
[ -e /proc/1 ]    || /bin/mount -n -t proc  none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ]   || /bin/mount    -t ramfs none /dev
 
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
#/bin/hotplug

# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
#/bin/mount -n -t ramfs none /tmp
#/bin/mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
 
ln -sf /dev/ttyS2 /dev/tty2
ln -sf /dev/ttyS2 /dev/tty3
ln -sf /dev/ttyS2 /dev/tty4
 
syslogd
/etc/rc.d/init.d/netd start
echo "                        " > /dev/tty1
echo "Starting networking..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/httpd start
#echo "                        " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/leds start
#echo "                        " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo "                        "
#sleep 1
 
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0
#echo 0 > /proc/sys/kernel/hung_task_timeout_secs

  1. 完善网卡配置相关文件
  • ifconfig-eth0文件内容如下:
IP=192.168.1.141
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90
  • init.d/ifconfig-eth0文件内容如下:
#!/bin/sh
 
echo -n Try to bring eth0 interface up......>/dev/ttySAC2
 
if [ -f /etc/eth0-setting ] ; then
        source /etc/eth0-setting
 
        if grep -q nfs /proc/mounts ; then
                echo -n NFS root ... > /dev/ttySAC2
        else
                ifconfig eth0 down
                ifconfig eth0 hw ether $MAC
                ifconfig eth0 $IP netmask $Mask up
                route add default gw $Gateway
        fi
 
        echo nameserver $DNS > /etc/resolv.conf
else
 
        if grep -q "^/dev/root / nfs " /etc/mtab ; then
                echo -n NFS root ... > /dev/ttySAC2
        else
        /sbin/ifconfig eth0 192.168.253.12 netmask 255.255.255.0 up
        fi
fi
 
echo Done > /dev/ttySAC2
  • rc.d/init.d/netd文件内容如下:
#!/bin/sh
 
base=inetd
 
# See how we were called.
case "$1" in
  start)
        /usr/sbin/$base
        ;;
  stop)
        pid=`/bin/pidof $base`
        if [ -n "$pid" ]; then
                kill -9 $pid
        fi
        ;;
esac
 
exit 0
  1. 环境变量配置
    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='[$USER@$HOSTNAME]# '
PATH=$PATH
 
HOSTNAME=`/bin/hostname`
 
export USER LOGNAME PS1 PATH
  1. 用户配置
    passwd文件内容如下:
root:*:0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:

设置相关文件权限

注:必须修改新建的文件权限,这里推荐设置为0755(rwxr-xr-x),下面命令以安装好的最小根文件系统文件夹为root,在其下的etc文件夹里执行.

$ chmod 0755 eth0-setting passwd profile init.d/* rc.d/init.d/*

拷贝库文件

因为使用的交叉编译环境和编译内核的相同,Busybox 编译生成的二进制文件是以动态链接库的形式运行,所以需要拷贝编译器里面的库文件到 lib 目录,使用下面的命令:

$ cp /usr/arm-linux-gnueabihf/lib/* lib -a

注:命令以安装好的最小根文件系统文件夹为root,在其下执行。

nfs挂载根文件系统

开发板端NFS配置

在上面的init.d/ifconfig-eth0配置为了nfs启动,eth0-setting中对网卡的IP做了相应配置,需要和linux内核中的启动参数相对应,否者无法以NFS方式挂载根文件系统,需要在内核启动参数中填入参数,具体如下:

Boot options  --->
    ...
    Kernel command line type...  --->
    (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)
    Kernel command line type... --->
    ...

开发机端NFS配置

  • 安装nfs-kernel-server
$ sudo apt install nfs-kernel-server
  • 配置NFS服务器参数
  1. 在/etc/exports文件写入新的一行,内容如下:
/home/jason/arm-devlop/system/      *(rw,sync,no_root_squash,no_subtree_check)
  1. 挂载不上

发现开发机能够挂在自己的NFS文件系统,但是开发板不能挂载,尝试挂载Ubuntu12版本的却可以,经过查阅资料后发现,从Ubuntu17.04开始,nfs默认只支持协议3和协议4,而kernel中默认支持协议2,所以才会出现挂载失败的情况[2],在/etc/default/nfs-kernel-server加入如下内容,使其支持2,3,4版本即可。

RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
  • 重启服务
$ sudo systemctl restart nfs-kernel-server.service

效果展示

以NFS方式挂载的最小根文件系统

参考资料

[1] 讯为官方手册《Linux系统编程_v2.2.pdf》
[2] 开发板挂载 ubuntu18.04系统下的 nfs根文件系统失败

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容