linux:创建nfs网络根文件系统

使用环境:

  • VMware® Workstation 10.0.2
  • ubuntu-16.04 LTS
  • arm-linux-gcc-4.9.1
  • busybox-1.17.2-20101120
  • uboot_tiny4412-sdk1506.tar
  • kernel –>linux 3.5
  • 友善之臂tiny4412SDK 1161B

Tiny4412的文件系统在调试阶段使用网络文件系统,将使用busybox工具进行制作。Busybox是linux下的管理工具类似于电脑的360安全卫士、电脑管家。

nfs根文件系统的创建分为四部分:

  • busybox的安装
  • 文件系统文件的配置
  • nfs服务搭建
  • 修改uboot启动引导参数

一、busybox的安装

1.1、把busybox安装包解压到指定的工作目录。

1.2、执行make menuconfig命令进入配置界面进行配置。

image

a、定义交叉编译器(arm-linux-)

Busybox Settings --->

    Build Options --->

        (arm-linux-)Cross Compiler Prefix(NEW)

b、选定库支持

Busybox Settings --->

    Build Options --->

        [*]Build shared libbusybox(NEW)

C、指定安装目录

Busybox Settings --->

    Installation Options --->

        (/tiny4412_nfs)Busybox Installation Prefix(NEW)

D、指定模块使用方式,不使用工具默认方式,取消下述该项,选择insmod、rmmod、lsmod

Linux Module Utilities --->

    []Simplified modutils(NEW)

1.3、配置完成后,执行make命令进行过编译。

使用4.9.1版本交叉编译器,会有两个错误:

error: storage size of ‘rlimit_fsize’ isn’t known struct rlimit rlimit_fsize;

缺少类型定义,使用4.5.1版本是没这个错误的,感觉是使用4.8以上的编译器会有这个问题。查看passwd.c文件,发现其包含了libbb.h,而libbb.h中包含了platform.h文件。

解决办法:在platform.h中包含sys/resource.h

error: redefinition of ‘struct sysinfo’

在交叉编译工具链中的头文件kernel.h与busybox源码中的头文件libbb.h出现了相同的结构体定义,造成了冲突。

解决办法:保留交叉编译器的头文件,维持该编译链的环境,对busybox源码进行修改。

在libbb.h文件中,注释掉struct sysinfo的定义,并添加交叉编译工具链头文件#include <linux/kernel.h>

1.4、编译完成后,make install命令进行安装。

1.5、安装完成后,在安装目录下会有bin、sbin、linuxrc、usr。

二、文件系统文件的配置

2.1、将交叉编译器中的动态库文件复制到根文件系统目录/tiny4412_nfs下,-arp项表示保留文件的一切属性。/opt/gcc-……是我的安装目录

cp /opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/arm-linux-gnueabihf/bin/ /tiny4412_nfs –rap  // 4.9.1版本还有libc
rm /tiny4412_nfs/bin/*.a –r  // 删除静态库

如果启动过程中出现错误:

Failed to execute /linuxrc.  Attempting defaults...

kernel panic - not syncing: No init found.  Try passing init= option to kernel.

其中linuxrc连接到bin中的可执行文件busybox,执行失败,则可能是由于缺少动态库依赖造成的。此时需要添加交叉编译器动态库的支持,进入bin目录,使用file busybox查看动态库依赖,从交叉编译安装目录中查找相应库,把依赖的动态库复制到根文件系统/bin目录下即可。

clip_image006

2.2、创建系列文件夹

mkdir root home proc tmp sys opt var dev etc/init.d –p

2.3、进入etc 文件夹,输入cp /etc/passwd ./回车,再输入cp /etc/group ./回车,两个文件赋值到/tiny4412_nfs/etc路径下,这两个文件是跟用户登录相关的配置文件

2.4、在etc文件中,输入cp /etc/fstab ./回车,将fstab文件复制到当前文件夹内,修改并保留如下内容:

tmpfs    /dev/shm         tmpfs   defaults         1 0
devpts   /dev/pts         devpts  defaults         0 0
sysfs    /sys             sysfs   defaults         0 0
proc     /proc            proc    defaults         0 0

2.5、在etc文件夹下,输入cp /busybox安装目录/examples/inittab ./,修改并保留如下内容:

::sysinit:/etc/init.d/rcS  #系统启动首先运行/etc/init.d/rcS文件
console::askfirst:-/bin/sh #将字符中断输入信息用/bin/sh解释器来解释
::ctrlaltdel:/sbin/reboot #热重启则执行sbin/reboot命令
::shutdown:/bin/umount -a –r #系统关闭时卸载所有的磁盘

2.6、在dev目录下创建console文件节点(控制台终端)

mknod console c 5 1  // 创建节点, c—字符设备 5—主设备号 1—次设备号

2.7、进入etc/init.d文件夹中输入touch rcS创建rcS文件

创建后之后,输入chmod 777 rcS将权限设置为最高,打开rcS文件,添加如下内容:

#!/bin/sh  #加载sh解释器,开发板启动后使用sh解释器
mount –a #挂载所有的磁盘设备
mkdir devpts /dev/pts #创建一个devpts和/dev/pts文件夹
mount -t devpts devpts /dev/pts #将devpt挂载到/dev/pts文件夹下以devpts系统
echo /sbin/mdev > /proc/sys/kernel/hotplug # 扫描设备增加减少并编辑节点功能
mdev –s #激活mdev的这个功能
/bin/hostname Fu #环境变量赋值,这个值出现在命令提示符中

2.8、在etc目录下输入vim profile并编辑如下内容(其中斜点为tab键上的点):

USER="`id -un`" #得到当前登录用户名
LOGNAME=$USER #将当前登录用户名重新赋值给LOGNAME
PS1='[\u@\h \W]#' #设置命令提示符 \u-当前登录用户 \h-主机名\W当前路径
PATH=$PATH #路径变量赋值
HOSTNAME=`/bin/hostname` #主机名赋值
export USER LOGNAME PS1 PATH #声明为环境变量

三、nfs服务搭建

如果安装的时候没有nfs服务,则需要进行安装

3.1、安装nfs服务
     服务端:sudo apt-get install nfs-kernel-server
      客户端:sudo apt install nfs-common
3.2、修改配置文件
     sudo vim /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 查看
3.3、重启nfs服务
     sudo /etc/init.d/nfs-kernel-server restart

3.4、查看服务器共享目录:
      showmount -e 服务器IP  例:showmount -e localhost

四、修改uboot启动引导参数

进入uboot,修改bootargs变量为如下所示:

set bootargs “noinitrd root=/dev/nfs nfsroot=192.168.134.128:/tiny4412_nfs ip=192.168.134.10:192.168.134.128:192.168.134.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=HD700”
 
saveenv

其中:192.168.134.128为Ubuntu网址,192.168.134.10为开发板网址(uboot环境变量),eth0表示开发板网络设备,console=>控制台输出到串口0,lcd=>LCD屏型号。

使用nfs网络根文件系统,虚拟机网络需要配置成桥接模式,在连接前,需要确保主机能够ping通开发板。

THE END

posted @ 2020-08-02 18:04  小懒虫alex  阅读(815)  评论(0)    收藏  举报