Linux使用nfs root文件系统

使用Ubuntu14.04虚拟机,virtualbox5.2版本,friendlyarm自带4.4.3编译器,micromini2440开发板。Linux内核版本2.6.32.2,uboot版本u-boot-2010.3(移植参考:http://blog.chinaunix.net/uid-23787856-id-115375.html),busybox1.13.3。

一、制作root文件系统

      根文件系统是内核启动后挂载的第一个文件系统,设备文件以及启动配置文件都会加载到该文件系统上。根文件系统目录结构由mkyaffs2image工具生成一个二进制文件烧录到NAND FLASH中,待内核加载该文件系统到DRAM内存中。

1.1 制作根文件目录结构

      首先手动创建内核需要的目录结构,使用友善之臂提供的脚本生成目录。用以下命令创建一个脚本文件creat_root,并使用命令chmod +x creat_root修改脚本文件执行属性。运行./creat_root脚本后,当前目录下会出现rootfs文件夹,证明创建成功。

    #!/bin/sh
    echo "------Create rootfs directons start...--------"
    mkdir rootfs
    cd rootfs
    echo "--------Create root,dev....----------"
    mkdir root dev etc boot tmp var sys proc lib mnt home
    mkdir etc/init.d etc/rc.d etc/sysconfig
    mkdir usr/sbin usr/bin usr/lib usr/modules
    echo "make node in dev/console dev/null"
    mknod -m 600 dev/console c 5 1
    mknod -m 600 dev/null c 1 3
    mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
    mkdir var/lib var/lock var/run var/tmp
    chmod 1777 tmp
    chmod 1777 var/tmp
    echo "-------make direction done---------"

    echo "------Create rootfs directons start...--------"
    mkdir rootfs
    cd rootfs
    echo "--------Create root,dev....----------"
    mkdir root dev etc boot tmp var sys proc lib mnt home
    mkdir etc/init.d etc/rc.d etc/sysconfig
    mkdir usr/sbin usr/bin usr/lib usr/modules
    echo "make node in dev/console dev/null"
    mknod -m 600 dev/console c 5 1
    mknod -m 600 dev/null c 1 3
    mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
    mkdir var/lib var/lock var/run var/tmp
    chmod 1777 tmp
    chmod 1777 var/tmp
    echo "-------make direction done---------"

1.2 建立动态链接库

    拷贝友善之臂提供的库文件到rootfs/lib库文件夹下。根据以下参考方法拷贝。

    tar –zxvf root_qtopia.tgz –C /opt/studyarm

    cp –rfd /opt/studyarm/root_qtopia/lib/* /opt/studyarm/rootfs/lib/*


1.3 交叉编译 Bosybox
    Bosybox 是一个遵循 GPL v2 协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限 ( 比如内存等 ) 的情况,使用 Busybox 可以自动生成根文件系统所需的 bin sbin usr 目录和 linuxrc 文件。可到busybox官网下载任意版本,地址:https://busybox.net/downloads/
1.3.1 、解压 busybox
    cd /mnt/hgfs/share
    tar –zxvf busybox-1.13.3.tar.tgz –C /opt/studyarm
1.3.2 、进入源码,修改 Makefile 文件:
    cd /opt/studyarm/busybox-1.13.3
修改:
    CROSS_COMPILE ?=arm-linux- // 164 行 需要使用编译器的绝对路径。
    ARCH ?=arm // 189
1.3.3 、配置 busybox
    提示:友善之臂已经在光盘中提供了 busybox 的源代码包,在光盘 \linux 目录中,文件
名为:
busybox-1.13.3-mini2440.tgz( 用户手册 5.4 章节介绍了解压安装的方法),解压后里面包
含了友善之臂提供的缺省配置文件:
fa_config( 输入命令“ cp fa.config .config ”可以调用该配
) ,一般用户直接使用缺省文件就可以了,这样生成的 busybox root_qtopia 中的是完全一
致的。但为了对它的配置了解更多一些,可以参考原文作者的如下步骤:
输入
make menuconfig 进行配置
(1) Busybox Settings--->
General Configuration--->
[*] Show verbose applet usage messages
[*] Store applet usage messages in compressed form
[*] Support –install [-s] to install applet links at runtime
[*] Enable locale support(system needs locale for this to work)

[*] Support for –long-options
[*] Use the devpts filesystem for unix98 PTYs
[*] Support writing pidfiles
[*] Runtime SUID/SGID configuration via /etc/busybox.config
[*] Suppress warning message if /etc/busybox.conf is not readable
Build Options--->
[*] Build BusyBox as a static binary(no shared libs)
[*] Build with Large File Support(for accessing files>2GB)
Installation Options->
[]Don’t use /usr
Applets links (as soft-links) --->
(./_install) BusyBox installation prefix
Busybox Library Tuning --->
(6)Minimum password legth
(2)MD5:Trade Bytes for Speed
[*]Fsater /proc scanning code(+100bytes)
[*]Command line editing
(1024)Maximum length of input
[*] vi-style line editing commands
(15) History size
[*] History saving
[*] Tab completion
[*]Fancy shell prompts
(4) Copy buffer size ,in kilobytes
[*]Use ioctl names rather than hex values in error messages
[*]Support infiniband HW
(2) Linux Module Utilities--->
(/lib/modules)Default directory containing modules
(modules.dep)Default name of modules.dep
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
-----options common to multiple modutils
[ ] support version 2.2/2.4 Linux kernels
[*]Support tainted module checking with new kernels
[*]Support for module .aliases file
[*] support for modules.symbols file
(3) 、在 busybox 中配置对 dev 下设备类型的支持
    dev 的创建有三种方法:
手动创建:在制作根文件系统的时候,就在 dev 目录下创建好要使用的设备文件,系统
挂接根文件系统后,就可以使用
dev 目录下的设备文件了。
使用
devfs 文件系统:这种方法已经过时,具有不确定的设备映射、没有足够的主 / 次设
备号、
devfs 消耗大量的内存。
udev :它是个用户程序,能根据系统中硬件设备的状态动态的更新设备文件,包括设备
文件的创建、删除等。它的操作相对复杂,但灵活性很高
mdev busybox 自带的一个简化版的 udev ,适合于嵌入式的应用埸合。其具有使用简
单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所
需的节点文件。在以
busybox 为基础构建嵌入式 linux 的根文件系统时,使用它是最优的选择。
下面的选项将增加对
mdev 的支持。
Linux System Utilities --->
[*]Support /etc/mdev.conf
[*]Support command execution at device addition/removal
1.3.4 、编译 busybox
编译 busybox 到指定目录:
    cd /opt/studyarm/busybox-1.13.3
    make CONFIG_PREFIX=/opt/studyarm/rootfs install    //红色标注为刚才创建的根文件系统顶层目录

rootfs 目录下会生成目录 binsbinusr 和文件 linuxrc 的内容。

1.4 建立 etc 目录下的配置文件
1etc/mdev.conf 文件,内容为空。
2、拷贝主机 etc 目录下的 passwdgroupshadow 文件到 rootfs/etc 目录下。
3etc/sysconfig 目录下新建文件 HOSTNAME,内容为” H3-Studio”。
4etc/inittab 文件:
    #etc/inittab
    ::sysinit:/etc/init.d/rcS
    s3c2410_serial0::askfirst:-/bin/sh
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/bin/umount -a –r
5
etc/init.d/rcS 文件:
    #!/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    runlevel=S
    prevlevel=N
    umask 022
    export PATH runlevel prevlevel
    echo "----------munt all----------------"
    mount -a

    echo /sbin/mdev>/proc/sys/kernel/hotplug
    mdev -s
    echo "***********************************************"
    echo "****************Studying ARM*********************"
    echo "Kernel version:linux-2.6.32.2"
    echo "***********************************************"
    /bin/hostname -F /etc/sysconfig/HOSTNAME
    (
或者直接 /bin/hostname H3-Studio
    使用以下命令改变
rcS 的执行权限:
    Chmod +x rcS
6
etc/fstab 文件:
    #device mount-point type option dump fsck order
    proc /proc proc defaults 0 0
    none /tmp ramfs defaults 0 0
    sysfs /sys sysfs defaults 0 0
    mdev /dev ramfs defaults 0 0
7
etc/profile 文件:
    #Ash profile
    #vim:syntax=sh
    #No core file by defaults
    #ulimit -S -c 0>/dev/null 2>&1
    USER="id -un"
    LOGNAME=$USER
    PS1='[\u@\h]#'
    PATH=$PATH
    HOSTNAME='/bin/hostname'
    export USER LOGNAME PS1 PATH

    

二、Ubuntu中开启nfs服务器

参考:https://www.linuxidc.com/Linux/2016-04/129848.htm

2.1-安装Ubuntu nfs服务器端:

sudo apt-get install nfs-kernel-server

2.2-安装nfs的客户端:

sudo apt-get install nfs-common​

(在安装nsf-kernel-server的时候,也会安装nfs-commom。如果没有安装这个软件包,则要执行1.2中的命令了)
2.3-设置共享的文件目录

sudo mkdir /opt/studyarm/rootfs

2.4-修改配置文件/etc/exports

在最后一行添加:/opt/studyarm/rootfs  *(rw,sync,no_root_squash,no_subtree_check)
前面那个目录是与nfs服务客户端共享的目录,*代表允许所有的网段访问(也可以使用具体的IP)
rw:挂接此目录的客户端对该共享目录具有读写权限
sync:资料同步写入内存和硬盘
no_root_squash:客户机用root访问该共享文件夹时,不映射root用户。(root_squash:客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户)
no_subtree_check:不检查父目录的权限。
2.5-nfs是一个RPC程序,使用它前,需要映射好端口,通过rpcbind 设定:

sudo service rpcbind restart restart

2.6-重启nfs服务:

sudo service restartnfs-kernel-server restart

2.7 刷新配置

启动之后可以通过status来查看状态,如果下次修改了配置,可以重启服务来使配置生效,也可以直接执行如下命令刷新配置:

exportfs -a

2.8挂载指令
在任意一台服务器中执行挂载指令,则可以将指定ip服务器上的共享路径,挂载到本地。挂载成功后可在客户机nfs-client路径下查看nfs中文件。

sudo mount -t nfs ***.***.***.***:/opt/studyarm/rootfs /nfs-client/     //红色为nfs服务器主机地址,绿色是主机共享文件夹绝对路径。蓝色为客户机上挂载点文件夹绝对路径。


三、uboot 引导参数配置

    内核启动时需要根据内核传入的配置参数来决定从哪里加载根文件系统,需要在include/configs/mini2440.h中更改配置参数。配置参数如下所示。

#define CONFIG_BOOTARGS         "noinitrd root=/dev/nfs rw nfsroot=192.168.1.187:/opt/studyarm/rootfs init=/linuxrc console=ttySAC0 " \

                "ip=192.168.1.69:192.168.1.1:192.168.1.1:255.255.255.0:"  

四、内核中开启nfs编译选项

    需要将nfs以及nfsroot编译进内核镜像文件。根据如下步骤操作即可。Linux内核版本为2.6.32.2,友善之臂提供。




五、镜像烧录与内核启动

5.1 烧录uboot

    使用友善之臂提供烧录工具烧录uboot。使用norflash启动方式,启动后在终端输入v升级boot,使用super vivi选择uboot镜像并烧录。


5.2 烧录内核

         需要重新编译uboot能识别的uimage镜像,可从网上参考内核镜像制作方法。使用友善之臂提供烧录工具烧录内核。使用norflash启动方式,启动后在终端输入k升级kernel,使用super vivi选择kernel镜像并烧录。

 5.3 网络环境检测与启动内核

       uboot启动后进入命令模式,通过ping Ubuntu主机方式确定网络是否正常。出现红色方框提示表示网络正常。然后输入boot命令,直接启动内核。



猜你喜欢

转载自blog.csdn.net/dashanque/article/details/80962419