nfs挂载

发布时间 2023-12-22 10:16:25作者: zxz-FINE

 NFS(network file system)

NFS是一种基于TCP/IP传输的网络文件系统协议。通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。

也就是说NFS服务端提供共享目录文件挂载在客户端某一个目录文件下,以供客户端去访问和使用

编辑

思路:

在虚拟机下创建根文件系统,安装并开启NFS的服务端,提供根文件系统给外界访问,JZ2440在启动时配置相关参数,将虚拟机下的根文件系统挂载到JZ2440的根文件系统下,这样在JZ2440就可以直接使用虚拟机下的根文件系统去启动了

前提:

虚拟机安装了gcc和交叉编译工具arm-linux-gcc,arm-linux-gcc已加入环境变量,已添加make menuconfig用到的相关软件及一些32位的函数库,

库文件:

sudo apt install bison flex build-essential patch libncurses5-dev libncursesw5-dev libc6-i386 lib32stdc++6 lib32z1

 linux启动所需的文件有etc/inittab  ,   etc/init.d/rcS   ,  etc/fstab这三个文件

内核引导完成后会启动第一个进程init,所有进程的父进程,该进程的源码文件也是由Busybox工具生成的,initi进程会去读取etc/inittab文件的每一行语句作为行为指针,其中一行行为是去执行etcinit.d/rcS脚本文件,而rcS中有一行脚本命令(mount -a)是去挂载etc/fstab文件中指定的所有文件系统,至此,将三个文件都联系起来

创建nfs根文件

1.创建mynfs文件夹,进入mynfs,在下方创建目录

mkdir bin dev etc lib proc sbin sys usr mnt tmp var

 2. 在dev目录下创建两个基本的设备文件console(控制台)和null(黑洞文件)

sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3

 3. 在etc目录下创建fstab,init.d/rcS和inittab文件,并编辑好内容

3.1 fstab文件内容:

#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0

 3.2 inittab文件内容:

# /etc/inittab
# 系统启动阶段,执行rcS脚本
::sysinit:/etc/init.d/rcS
# sh进程结束,又会重启sh进程
console::askfirst:-/bin/sh
# ctrl+alt+del,重启reboot
::ctrlaltdel:/sbin/reboot
# 关机时候,卸载所有设备
::shutdown:/bin/umount -a -r
::shutdown:/

 3.3 init.d/rcS文件内容:

#!/bin/sh
#mount all filesystem defined in "fstab"
echo "#mount all…"
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

init.d/rcS文件需要加上“x”可执行属性.

chmod +x rcS

 4. 使用busybox创建bin目录下的命令和生成init进程。

4.1 解压busybox源码包,进入其目录,修改Makefile,指定ARCH和CROSS_COMPILE

vim Makefile

找到并修改这两个参数 

原来的代码:

ARCH ?= $(SUBARCH)

CROSS_COMPILE ?=

 

修改后的代码:

ARCH ?= arm 

CROSS_COMPILE ?= arm-linux-

 通过厂家给定的默认文件改为默认配置文件,在用菜单配置界面修改busybox的默认配置

cp ../busybox1.22.1_config_ok ./.config

make menuconfig 

4.2 配置busybox,

确保Shells中选中ash,

Init utilities中选中init;

BusyBox         Settings/build         option,使用动态库,

BusyBox         Settings/installation         option/Don't use /usr,确定生成的文件不在use/usr下

miscellaneous utilities中,取消taskset, 

4.3 保存生成.config,重新编译和安装:

 编译Busybox

make -j16

-j表示多线程编译,会自动向下兼容 

安装Busybox中的工具到根文件系统 

make CONFIG_PREFIX=/home/a1/jz2440/rootfs/mynfs install

安装完毕后,在/home/a1/jz2440/rootfs/mynfs下会看到linuxrc文件,在/home/a1/jz2440/rootfs/mynfs/bin下会看到很多命令文件。 

5.  copy 必须的库文件到mynfs/lib中。

cd /home/a1/jz2440/crosstool/arm-linux-gcc-4.4.3/arm-none-linux-gnueabi/lib
cp *.so* /home/a1/jz2440/rootfs/mynfs/lib -d

-d or -a参数的意思是包括软链接文件也copy过来。 

6. 主机上安装和配置nfs服务

sudo apt-get install nfs-kernel-server

配置:
6.1 修改 /etc/portmap文件,把最后一行的options前加上“#”注释掉 (注:ubuntu16.04不需要)


6.2修改 /etc/exports文件,最后一行加上:

/home/a1/jz2440/rootfs/mynfs *(rw,sync,no_root_squash,no_subtree_check)

意思是 将/home/a1/jz2440/rootfs/mynfs目录下的所有内容共享出去

运行

sudo exportfs -r

更新一下。


6.3 运行NFS:

需要启动portmap、 nfs-kernel-server:

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

6.4 本机测试

将刚刚创建的根文件系统挂载到本机的/mnt/nfs目录下,先在/mnt目录下创建nfs目录(需要sudo权限)

sudo mkdir nfs

然后挂载

sudo mount 127.0.0.1:/home/a1/jz2440/rootfs/mynfs /mnt/nfs

 查看挂载的主机

showmount

查看当前的文件系统

df -h

客户端卸载从服务器上挂载在本地的目录文件

sudo umount /mnt/nfs

7. 开发板挂载nfs根文件系统

进入uboot,修改原来的本地根文件启动参数

"bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mem=64M"

为nfs启动,然后保存参数

set bootargs root=/dev/nfs rw nfsroot=192.168.0.19:/home/a1/jz2440/rootfs/mynfs/ ip=192.168.0.17 init=/linuxrc mem=64M console=ttySAC0,115200
save  

如果NFS的服务端的版本较高(版本较高的ubuntu),则要使用V3版本的协议,例如20.04版本的ubuntu的nfs协议是v3版本,且默认TCP和UDP都是打开的,可以使用一下启动参数:

set bootargs root=/dev/nfs rw nfsroot=169.254.179.207:/home/zxz/jz2440/rootfs/mynfs,v3  ip=169.254.179.203 init=/linuxrc mem=64M console=ttySAC0,115200

 

而新版本22.04ubuntu的nfs协议默认只使用的tcp的协议,则要再加上tcp的传输模式 

set bootargs root=/dev/nfs rw nfsroot=169.254.179.207:/home/zxz/jz2440/rootfs/mynfs,tcp,v3  ip=169.254.179.203 init=/linuxrc mem=64M console=ttySAC0,115200

---------------------------------------------------------------------------------------------------------------------------------

 set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.30:/work/nfs_root/temp/fs_mini_mdev 

ip=192.168.1.20:192.168.1.30:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0

nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>

/* 

 *nfsroot对应你pc机的IP和你解压的文件系统的路径,请酌情修改

 * ip指定你的开发板的IP、服务器的ip、网关、掩码,掩码后面应该是域名(可省略)

 * 再往后的,网卡eth0,不自动启动off

 */