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$
3.2创建根文件系统目录
3.3创建设备文件
3.4加入配置文件
配置文件主要是/etc目录下面的文件,可以在这里下载http://download.csdn.net/detail/atmega_chen/9772351
下载下来后,将压缩包解压到创建好的rootfs的/etc目录下面去
解压之后可以看到/etc目录下面有下面几个文件
fstab init.d inittab profile
3.5添加内核模块
添加内核模块主要是将你的内核源码里面编译出来的ko模板,安装到rootfs的/lib/modules目录下面去。
首先需要一份移植好的,可以在开发板上跑起来的linux内核,作为测试使用,之后我们会自己移植linux内核。我这里使用的是友善的tiny6410开发板,因为内核源码比较大有差不多100M,csdn上传不了这么大的资源,所以需要的话可以到友善的官网下载。不过其实不一定要用到友善移植好的tiny6410内核,也可以是其他开发的kernel。
进入到kernel目录,这里的前提是你的这份kernek已经编译通过,并且已经正确配置。
这样就在rootfs中安装好了内核模块,查看/lib/modules下的模块,可以发现有下面两个模块,具体生成的模块是根据你kernel配置的情况。
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压缩包
3.6.2进入解压出来的busybox目录
3.6.3配置busybox
这里需要用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
这样busybox就安装到了你的rootfs目录下面,可以参考到之前创建的空的rootfs目录下面多出了许多的文件,至此根文件系统也制作完成了。
4、安装nfs
在使用nfs挂载根文件系统之前,需要在虚拟机上安装nfs服务器,具体如果安装可以参考:
http://www.linuxidc.com/Linux/2016-04/129848.htm
5、配置内核支持nfs启动
进入到kernel目录,注意这里的ARCH=arm,不加的话有可能编译出来的image是x86平台的。
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函数最后进入死循环前,加入下面几句设置环境变量的代码。
其中bootargs参数中的ip参数,第一个参数为开发板ip地址,第二个为服务器ip地址,第三个是网关,第四个是掩码,第五个是开发板名字,可以不填,第六个将ip地址复制给哪个网卡,这里必须eth0,否则无法挂载nfs,第七个关闭动态ip获取。
修改好后,重新编译uboot烧写到nand flash中,可以使用dnw下载,也可以使用tftp下载。
7、配置ubuntu上的nfs挂载目录
第一个目录为表示要挂载的根文件系统目录;
*表示所有网段ip都可以访问这个目录;
rw:挂接此目录的客户端对该共享目录具有读写权限;
sync:资料同步写入内存和硬盘;
no_root_squash:客户机用root访问该共享文件夹时,不映射root用户;
no_subtree_check:不检查父目录的权限。
编辑好后source一下配置文件使nfs配置生效
重启nfs服务
8、开机启动开发板,验证挂载是否成功
在uboot和kernel都配置好并且烧写到nand flash后,就可以开启开发板,通过串口查看打印log,如果最后出现下图的现象,说明挂载成功。通过串口可以输入shell命令,则说明挂载成功。
如果出现开机到挂载文件系统时无法挂载的现象,首先要检查你的网络是否有正确设置,如果网络不通,则无法挂载,具体网络设置可以参考前面的文章,然后检查windows和ubuntu的防火墙是否关闭,如果都没问题,则要检查各个步骤参数是否有输入错误,再仔细核对每一步。
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的防火墙是否关闭,如果都没问题,则要检查各个步骤参数是否有输入错误,再仔细核对每一步。
相关文章推荐
- 友善之臂6410开发环境搭建之——NFS文件系统挂载。(为什么这么做,自行查,方便开发)补充
- Linux开发环境搭建(系统、samba、ssh、nfs、开发板挂载)
- 嵌入式应用/驱动开发网络环境设置-使用NFS网络文件系统挂载根文件系统
- arm开发网络文件系统环境搭建 nfs
- Linux环境下NFS文件系统的简单搭建过程
- Tiny4412 ARM开发环境搭建—NFS网络根文件系统制作
- 搭建tiny6410驱动开发环境_NFS起文件系统_NoSharedLibs
- 重新安装一个linux系统后如何快速搭建可用于开发板nfs挂载根文件系统的过程
- 搭建tiny6410驱动开发环境_NFS共享文件
- Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)
- mini6410基于linux2.6.36内核通过NFS启动根文件系统总结(四制作根文件系统及通过NFS挂载文件系统)
- 用qemu搭建CentOS 6 for colinux虚拟系统——《Windows下搭建CentOS 6开发环境之一》
- Ubuntu10.04+mini2440下ARM-linux开发环境搭建(2)----NFS服务器的配置及通过NFS启动linux
- OK6410开发板开发环境搭建-NFS文件启动和使用dnw2烧写镜像文件
- VMware中Linux开发板的NFS文件系统的挂载
- mini6410基于linux2.6.36内核通过NFS启动根文件系统总结(一搭建开发环境——建立tftp服务器)
- mini6410基于linux2.6.36内核通过NFS启动根文件系统总结(一搭建开发环境——建立NFS服务器)
- mini6410基于linux2.6.36内核通过NFS启动根文件系统总结(四制作根文件系统及通过NFS挂载文件系统)
- VMware中Linux开发板的NFS文件系统的挂载
- 设置BootLoader环境变量,通过NFS挂载文件系统