S5PV210--nfs挂载rootfs

nfs挂载rootfs

开发环境:
主机:win10 IP:192.168.1.10
开发板:九鼎X210BV3S IP:192.168.1.20
虚拟机:ubuntu16.04-x64 IP:192.168.1.30
交叉编译工具链:arm-2009q3
busybox源码包:busybox-1.29.2

本文目标是将开发板的内核通过nfs远程挂载到虚拟机ubuntu上根据busybox移植好的的rootfs,nfs挂载方式主要用于开发阶段调试使用,真正的产品需要烧录rootfs镜像文件。


一、ubuntu配置NFS服务器

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

1.安装NFS服务

sudo apt install nfs-kernel-server

2.配置/etc/exports

sudo vi /etc/exports

文本末添加:

/home *(rw,sync,no_root_squash)

各段表达的意思如下:

/home   :共享的目录
*       :指定哪些用户可以访问
            *  所有可以ping同该主机的用户
            192.168.1.*  指定网段,在该网段中的用户可以挂载
            192.168.1.12 只有该用户能挂载
(ro,sync,no_root_squash):  权限
        ro : 只读
        rw : 读写
        sync :  同步
        no_root_squash: 不降低root用户的权限
其他选项man 5 exports 查看

我的修改内容为:/root/rootfs_zht/rootfs *(rw,sync,no_root_squash)
然后在终端执行:

chmod 777 -R /home  # 更改挂载目录权限
sudo exportfs -r    # 更新
sudo showmount -e   # 显示NFS服务器上所有的共享目录

3.重启nfs服务

sudo /etc/init.d/nfs-kernel-server restart

显示:[ ok ] Restarting nfs-kernel-server (via systemctl): nfs-kernel-server.service.
到这里,nfs的服务就搭建好了。


二、ubuntu配置开发板kernel

配置内核以支持nfs作为rootfs。方法是在ubuntu中进入内核的根文件目录,执行 make menuconfig 命令,进行如下配置:
1、配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system on NFS选项。

Networking support 
    Networking options 
        TCP/IP networking
                IP: kernel level autoconfiguration
                    [*] IP: DHCP support
                    [*] IP: BOOTP support

2、配置开启nfs服务。

File systems  --->  
    Network File Systems  --->
        <*> NFS client support 
        [*] NFS client support for NFS version 3                                  
        [*] NFS client support for the NFSv3 ACL protocol extension 
        [*] NFS client support for NFS version 4 (EXPERIMENTAL) 
        [*] NFS client support for NFSv4.1 (DEVELOPER ONLY) 
        [*] Root file system on NFS  

配置好之后,make编译,最后将生成的zImage镜像文件复制粘贴到tftp的传输目录。tftp要确保可以用才能做接下来的工作,tftp安装方法点这里
我的命令是:cp /root/kernel_x210/arch/arm/boot/zImage /tftpboot/ -f


三、开发板配置uboot启动参数

进入uboot之后,执行命令:

set bootargs root=/dev/nfs nfsroot=192.168.1.30:/root/rootfs_zht/rootfs ip=192.168.1.20:192.168.1.30:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
save # 保存到flash,否则断电后配置丢失

参数解释:

/dev/nfs:对应内核中配置,不需要更改
192.168.1.30:ubuntu的IP
/root/rootfs_zht/rootfs:nfs服务器的共享目录
192.168.1.20:开发板uboot的IP
eth0:以太网卡0,不需要更改
ttySAC2,115200:控制台对应串口2,波特率115200

一开始我以为eth0对应ubuntu的网卡接口,ubuntu16的以太网卡名称为ens33,我就改成了ens33,后来启动的时候根文件系统都挂载不上!后知后觉,uboot是给kernel传参,和ubuntu无关系的,ubuntu是通过nfs和kernel紧密联系的!所以uboot这里eth0不要改就完事儿了。


四、移植busybox制作rootfs

1.下载

https://busybox.net/downloads/
我下载的版本为1.29.2。

2.配置

在busybox的根目录下修改Makefile文件,将ARCH修改为arm,CROSS_COMPILE修改为/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-(对应我的交叉编译工具链所在位置)。
这里写图片描述
执行make menuconfig命令进行配置,1.29.2为目前最新版本,(NEW)代表默认值,并不需要再去更改;老版本busybox的参数需要自己更改。

Settings  ---> 
    [*] Build static binary (no shared libs)    
    [*] Command line editing
        [*]   vi-style line editing commands

Linux Module Utilities  --->
    [ ] Simplified modutils
    [*]depmod (NEW)
    [*]insmod (NEW)
    [*]lsmod (NEW)
    [*]modprobe (NEW)
    [*]rmmod (NEW)

Linux System Utilities  --->
    [*] mdev (16 kb) (NEW)
    [*]   Support /etc/mdev.conf (NEW)
    [*]     Support subdirs/symlinks (NEW)
    [*]       Support regular expressions substitutions when renaming device (NEW)
    [*]     Support command execution at device addition/removal (NEW)
    [*]   Support loading of firmware (NEW)

3.编译安装

这时make进行编译链接,我这里提示了几个错误,主要信息是下图中圈起来的内容,提示没有定义’setns’和’syncfs’。解决办法有两个,一种是更换编译工具;另外一种是menuconfig屏蔽掉相关配置,不进行编译链接。
这里写图片描述
第二种方法相对简单一点,menuconfig中屏蔽相关配置的步骤是:

Coreutils  --->
    [ ] sync (769 bytes)
Linux System Utilities  ---> 
    [ ] nsenter (8.6 kb)

这样make后就不会报错了,接下来进行安装。make install这种方式是源码安装,需要指定安装路径,不指定的话会有一个默认路径,如果默认路径在ubuntu根目录下,这时候安装会把ubuntu的系统文件覆盖,那就完啦!不过默认路径并不在ubuntu根目录,查看并修改安装路径的的方法是进入menuconfig,找到Settings —> (/root/rootfs_zht/rootfs) Destination path for 'make install',当前显示的路径为默认路径,修改为自己的就行了。

make install安装完成后即可看到指定目录下面生成了几个文件夹,即最小的根文件系统。

①linuxrc是一个可执行的应用程序。属于应用层,和内核源码没关系;在开发板内核系统下可执行;linuxrc只能静态编译,属于内核态过渡到用户态的第一个程序;②linuxrc负责执行时引出用户界面;③负责系统启动后的配置;④linuxrc在嵌入式系统中一般是busybox。


五、开发板挂载rootfs


开发板启动后进入uboot,tftp下载内核镜像到内存的30008000地址处,然后bootm启动内核,命令如下:

进入uboot后手动下载:
tftp 30008000 zImage
bootm 30008000

或者设置uboot中的环境变量,实现自动下载:
set bootcmd 'tftp 30008000 zImage; bootm 30008000'

镜像格式用来烧录根文件系统
set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
set bootcmd ‘movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000’
tftp-nfs方式启动bootargs和bootcmd
set bootargs root=/dev/nfs nfsroot=192.168.1.30:/root/rootfs_zht/rootfs ip=192.168.1.20:192.168.1.30:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
set bootcmd ‘tftp 30008000 zImage; bootm 30008000’

可以看到rootfs已经成功挂载了并且可以运行,但是一直提示无法打开设备文件。
这里写图片描述
接下来在ubuntu中的rootfs目录下执行如下命令:

mkdir etc       # 创建运行时配置目录
cd etc          # 切换到etc目录
vi inittab      # vi创建inittab文件

####### 然后,把下面的内容粘贴到inittab中 #######

#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

测试的时候是这样的,加上”-”的语句会在登陆终端之后调用/etc/目录下的profile文件,而不加”-”的不会执行这个脚本。
其实登陆终端的命令有几种方便,但是标准的还是使用getty来登陆,但是直接使用如上的语句也是可以的,并且兼容性强一点,因为它不需要指定对应的串口设备。
::askfirst:-/bin/sh
s3c2410_serial2::askfirst:-/bin/sh
::askfirst:-/bin/sh
s3c2410_serial2::respawn:/sbin/getty -L s3c2410_serial2 115200 vt100

都是可用的。


再次tftp下载启动挂载后就没有出现设备报错的情况,到这里就ok了。
这里写图片描述


参考文章:

猜你喜欢

转载自blog.csdn.net/Meteor_s/article/details/82150044