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
标签:文件,dev,etc,init,nfs,mynfs,挂载 From: https://www.cnblogs.com/zxz-FINE/p/17920694.htmlnfsroot=[<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
*/