您的位置:首页 > 运维架构 > Linux

linux开发环境搭建(3)-nfs挂载根文件系统

2017-03-14 22:39 609 查看
前面讲解了网卡配置和使用tftp下载内核,这次要讲的是使用nfs挂载根文件系统。

1、什么是根文件系统

所谓根文件系统,也就是系统启动后第一个挂载的目录,根文件系统包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在 Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。

2、为什么要使用根文件系统

可以将根文件系统制作成img镜像文件,烧写入nand flash或者emmc中,系统启动后从nand flash或者emmc中读出根文件系统并且挂载。这样子在开发阶段会面临的一个问题是,在开发阶段文件系统需要频繁的修改,如果每次一点小小的修改就要重新编译生成镜像然后烧写,开发效率会比较低。所以就有了nfs挂载根文件系统,文件系统并不是烧写入nand flash或者emmc中,而是放在虚拟机里面,开机系统起来后通过网络nfs挂载根文件系统,从而达到访问根文件系统的目的。这样子在根文件系统有改动的时候,只需要在rootfs目录下面替换相应的文件即可,不需要重新生成镜像烧写进nand flash或者emmc中,开发效率大大提高。

3、制作根文件系统

制作根文件系统一般使用busybox,具体制作过程为:

3.1 创建根文件系统rootfs,这个路径比较重要,后面很多地方要用到,根据自己的实际目录创建,我的rootfs目录路径为:

~/friendly_arm_source/filesystem/rootfs$

#cd ~/friendly_arm_source/filesystem/
#mkdir rootfs


3.2创建根文件系统目录

#cd ~/friendly_arm_source/filesystem/rootfs
#mkdir bin dev etc lib proc sbin sys usr mnt tmp var
#mkdir usr/bin usr/lib usr/sbin lib/modules


3.3创建设备文件

#cd rootfs/dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3


3.4加入配置文件

配置文件主要是/etc目录下面的文件,可以在这里下载http://download.csdn.net/detail/atmega_chen/9772351

下载下来后,将压缩包解压到创建好的rootfs的/etc目录下面去

#tar xzvf etc.tar.gz -C ~/friendly_arm_source/filesystem/rootfs/etc/


解压之后可以看到/etc目录下面有下面几个文件

fstab init.d inittab profile

3.5添加内核模块

添加内核模块主要是将你的内核源码里面编译出来的ko模板,安装到rootfs的/lib/modules目录下面去。

首先需要一份移植好的,可以在开发板上跑起来的linux内核,作为测试使用,之后我们会自己移植linux内核。我这里使用的是友善的tiny6410开发板,因为内核源码比较大有差不多100M,csdn上传不了这么大的资源,所以需要的话可以到友善的官网下载。不过其实不一定要用到友善移植好的tiny6410内核,也可以是其他开发的kernel。

进入到kernel目录,这里的前提是你的这份kernek已经编译通过,并且已经正确配置。

#make modules ARCH=arm CROSS_COMPILE=arm-linux-
#make modules_install ARCH=arm INSTALL_MOD_PATH=~/friendly_arm_source/filesystem/rootfs


这样就在rootfs中安装好了内核模块,查看/lib/modules下的模块,可以发现有下面两个模块,具体生成的模块是根据你kernel配置的情况。

./lib/modules/2.6.38-FriendlyARM/kernel/drivers/scsi/scsi_wait_scan.ko
./lib/modules/2.6.38-FriendlyARM/kernel/drivers/char/mini6410_hello_module.ko


3.6编译安装busybox

BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令。

本文使用的busybox可以在这里下载

http://download.csdn.net/detail/atmega_chen/9772349

3.6.1首先解压下载的busybox压缩包

#tar xzvf busybox-1.13.3.tar.gz


3.6.2进入解压出来的busybox目录

#cd busybox-1.13.3/


3.6.3配置busybox

#make menuconfig


这里需要用sudo权限打开,否则会提示scripts/basic/fixdep.c:404:1: fatal error: opening dependency file scripts/basic/.fixdep.d: 权限不够

Busybox Settings -> build Options ->

选中“Build busybox as a static binary”, 静态链接。

编辑Cross Compiler prefix,输入arm-linux-

Busybox Settings -> Installation Options->

选中“Don‘t use /usr”, 选中该项可以避免busybox 被安装到宿主系统的/usr目录下,破坏宿主系统。

编辑Busybox Installation Prefix (/xxx/rootfs),输入你的rootfs的路径,该选项表明编译后的busybox的安装位置。

3.6.4编译安装busybox

#make
#make install


这样busybox就安装到了你的rootfs目录下面,可以参考到之前创建的空的rootfs目录下面多出了许多的文件,至此根文件系统也制作完成了。

4、安装nfs

在使用nfs挂载根文件系统之前,需要在虚拟机上安装nfs服务器,具体如果安装可以参考:

http://www.linuxidc.com/Linux/2016-04/129848.htm

5、配置内核支持nfs启动

进入到kernel目录,注意这里的ARCH=arm,不加的话有可能编译出来的image是x86平台的。

#make menuconfig ARCH=arm


general setup -> 去掉Initial RAM filesystem and RAM disk (initramfs/initrd) support。要使用nfs挂载文根文件系统,则需要将基于内存的randisk或者Initramfs文件系统去掉。



File systems -> Network File Systems -> 选中Root file system on NFS,和其他和NFS相关的



修改好以后重新编译内核,将编译出来的uImage通过tftp方式下载到nand flash中,具体如何下载在前面有提到。

6、修改uboot命令行参数,支持nfs

要使用nfs挂载根文件系统,首先需要uboot在启动的时候传入的参数bootargs告诉kernel启动的rootfs,kernel才能选择启动哪种文件系统,bootargs的参数设置,在前面讲tftp下载文件的时候已经设置过,只不过当时这个参数并没有用。

在start_armboot函数最后进入死循环前,加入下面几句设置环境变量的代码。

setenv("ipaddr", "192.168.2.3");
setenv("serverip", "192.168.2.2");
setenv("gatewayip", "192.168.2.1");
setenv("bootcmd", "nand read c0008000 400000 500000; bootm c0008000");
setenv("bootargs", "noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.2.2:/home/chen/friendly_arm_source/filesystem/rootfs,proto=tcp,nfsvers=3 ip=192.168.2.3:192.168.2.2:192.168.1.1:255.255.255.0::eth0:off");
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;) {
main_loop ();
}

/* NOTREACHED - no way out of command loop except booting */


其中bootargs参数中的ip参数,第一个参数为开发板ip地址,第二个为服务器ip地址,第三个是网关,第四个是掩码,第五个是开发板名字,可以不填,第六个将ip地址复制给哪个网卡,这里必须eth0,否则无法挂载nfs,第七个关闭动态ip获取。

修改好后,重新编译uboot烧写到nand flash中,可以使用dnw下载,也可以使用tftp下载。

7、配置ubuntu上的nfs挂载目录

#vi /etc/exports
在最后加入:
/home/chen/friendly_arm_source/filesystem/rootfs *(rw,sync,no_root_squash,no_subtree_check)


第一个目录为表示要挂载的根文件系统目录;

*表示所有网段ip都可以访问这个目录;

rw:挂接此目录的客户端对该共享目录具有读写权限;

sync:资料同步写入内存和硬盘;

no_root_squash:客户机用root访问该共享文件夹时,不映射root用户;

no_subtree_check:不检查父目录的权限。

编辑好后source一下配置文件使nfs配置生效

#source /etc/exports


重启nfs服务

#/etc/init.d/nfs-kernel-server restart


8、开机启动开发板,验证挂载是否成功

在uboot和kernel都配置好并且烧写到nand flash后,就可以开启开发板,通过串口查看打印log,如果最后出现下图的现象,说明挂载成功。通过串口可以输入shell命令,则说明挂载成功。

如果出现开机到挂载文件系统时无法挂载的现象,首先要检查你的网络是否有正确设置,如果网络不通,则无法挂载,具体网络设置可以参考前面的文章,然后检查windows和ubuntu的防火墙是否关闭,如果都没问题,则要检查各个步骤参数是否有输入错误,再仔细核对每一步。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐