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命令进入配置界面进行配置。
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目录下即可。
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通开发板。