ARM rootfs、linuxrc 的简单制作

一、nfs 方式启动自制简易文件夹形式的rootfs

1、什么是nfs

(1) nfs 是一种网络通讯协议,由服务器和客户端构成。

(2) nfs 的作用。利用 nfs 协议,可以做出很多直接性的应用,我们这里使用 nfs 主要是做 rootfs 挂载。

开发板中运行 kernel 做 nfs 客户端,主机 ubuntu 中搭建 nfs 服务器。 在主机 ubuntu 的 nfs 服务器中,导出我们制作的文件夹形式的 rootfs 目录,则在客户端中就可以去挂载这个文件夹形式的 rootfs,进而去启动系统。


(3) 搭建 nfs 服务器。

参考资料:
ARM rootfs、linuxrc 的简单制作_第1张图片


ARM rootfs、linuxrc 的简单制作_第2张图片


1)安装 NFS

sudo apt-get install nfs-kernel-server
sudo apt-get install nfs-common

ARM rootfs、linuxrc 的简单制作_第3张图片


2)配置 /etc/exports

首先,进入我们之前制作好的 rootfs 文件夹,在里面创建一个文件 linuxrc。

ARM rootfs、linuxrc 的简单制作_第4张图片

$ sudo vi /etc/exports
 # 文本末添加下面一行
/home/aston/workspace/porting_x210/rootfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)

ARM rootfs、linuxrc 的简单制作_第5张图片

然后在终端执行 :

chmod -R 777 /home/aston/workspace/porting_x210/rootfs/rootfs

在这里插入图片描述

$ sudo showmount -e
$ sudo exportfs -r 
$ sudo showmount localhost -e

在这里插入图片描述


3) 启用

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

在这里插入图片描述


4)挂载测试

mount -t nfs -o nolock localhost:/home/aston/workspace/porting_x210/rootfs/rootfs  /opt

执行后,进入 /opt 目录中,如果可以看到 /home/aston/workspace/porting_x210/rootfs/rootfs 中的内容,则说明 nfs 搭建成功!

在这里插入图片描述

ARM rootfs、linuxrc 的简单制作_第6张图片

最后记得卸载掉 /opt 挂载点:

umount /opt/

在这里插入图片描述


2、配置内核,以支持 nfs 作为 rootfs

(1) 设置 nfs 启动方式的uboot 的 bootargs 环境变量。

setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/home/aston/workspace/porting_x210/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off  init=/linuxrc console=ttySAC2,115200 

参数的解析:

ubuntu 虚拟机的 IP 地址:
ARM rootfs、linuxrc 的简单制作_第7张图片


设置 ubuntu 虚拟机中的 nfs 文件系统路径:

ARM rootfs、linuxrc 的简单制作_第8张图片


设置开发板的 IP 地址:

ARM rootfs、linuxrc 的简单制作_第9张图片


设置 ubuntu nfs 服务器的 IP 地址:
ARM rootfs、linuxrc 的简单制作_第10张图片


设置开发板和虚拟机通信的网关和子网掩码:

ARM rootfs、linuxrc 的简单制作_第11张图片


ubuntu 通信的网卡是 eth0,off 代表关闭 dhcp 分配 IP 地址:

ARM rootfs、linuxrc 的简单制作_第12张图片


init 程序的名称:

ARM rootfs、linuxrc 的简单制作_第13张图片


设置串口号和波特率:

ARM rootfs、linuxrc 的简单制作_第14张图片


(2) 在 menuconfig 中配置支持 nfs 启动方式。

如果 kernel 不支持 nfs 文件系统的话,会报如下的错误:

ARM rootfs、linuxrc 的简单制作_第15张图片

解决方案如下:

参考说明文档:网盘资料中的
《2.uboot和linux内核移植\2.18.根文件系统的原理\210支持nfs作为根文件系统启动.txt》

《1.ARM裸机全集\1.3.ARM裸机第三部分-开发板、原理图和数据手册\param.txt》。


  1. 在 qt_x210 下执行:make menuconfig

在这里插入图片描述


  1. 配置网络部分,主要是使能 CONFIG_IP_PNP 以在 3 中能够看到 Root file system on NFS 选项。

ARM rootfs、linuxrc 的简单制作_第16张图片


  1. 配置开启 nfs 服务
    File systems —>
    Network File Systems —>
    <*> NFS client support
    [*] NFS client support for NFS version 3
    [*] NFS client support for the NFSv3 ACL protocol extension
    [*] NFS client support for NFS version 4 (EXPERIMENTAL)
    [*] NFS client support for NFSv4.1 (DEVELOPER ONLY)
    [*] Root file system on NFS

ARM rootfs、linuxrc 的简单制作_第17张图片

ARM rootfs、linuxrc 的简单制作_第18张图片


  1. 最后执行编译 make -j8。

运行成功。


Note:
使用的命令如下:

$ setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/home/aston/workspace/porting_x210/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off  init=/linuxrc console=ttySAC2,115200 

$ tftp 30008000 192.168.1.20:zImage
$ bootm 30008000
$ #注意,ubuntu 虚拟机需要启动 nfs 服务器

3、总结

(1) nfs 方式启动,相当于开发板上的内核远程挂载到主机上的rootfs。

ARM rootfs、linuxrc 的简单制作_第19张图片

ARM rootfs、linuxrc 的简单制作_第20张图片


(2) nfs 方式启动,不用制作 rootfs 镜像。

(3) nfs 方式不适合真正的产品,一般作为产品开发阶段调试使用。


二、到底什么是 linuxrc

1、/linuxrc 是一个可执行的应用程序

(1) /linuxrc 是应用层的程序,和内核源码一点关系都没有。


(2) /linuxrc 在开发板当前内核系统下是可执行的。

因此在 ARM SoC 的 linux 系统下,这个应用程序就是用 arm-linux-gcc 编译链接的;

如果是在 PC 机 linux 系统下,那么这个程序就是用 gcc 编译连接的。


(3) /linuxrc 如果是静态编译链接的,那么直接可以运行;如果是动态编译链接的,那么我们还必须给它提供必要的库文件才能运行。

但是因为 /linuxrc 这个程序是由内核直接调用执行的,因此用户没有机会去导出库文件的路径,因此实际上这个 /linuxrc 没法动态链接,一般都是静态链接的。


2、/linuxrc 执行时 引出用户界面

(1) 操作系统启动后,在一系列内核自身的运行配置之后,最终会给用户一个操作界面(也许是 cmdline,也许是 GUI),这个用户操作界面就是由 /linuxrc 带出来的。


(2) 用户界面等很多东西,并不是在 /linuxrc 程序中负责的,用户界面有自己专门的应用程序,但是用户界面的应用程序是直接或者间接的被 /linuxrc 调用执行的。

用户界面程序和其他的应用程序就是进程 2、3、4·····,这就是我们说的进程1(init 进程,也就是 /linuxrc)是其他所有应用程序进程的祖宗进程。


3、/linuxrc 负责系统启动后的配置

(1) 就好像一个房子建好之后不能直接住,还要装修一样;操作系统启动起来后也不能直接用,要配置下。


(2) 操作系统启动后的应用层的配置(一般叫运行时配置,英文简写 etc),是为了让我们的操作系统用起来更方便, 更适合用户个人的爱好或者实用性。


4、/linuxrc 在嵌入式 linux 中,一般就是 busybox

(1) busybox 是一个 C 语言写出来的项目,里面包含了很多 .c 文件和 .h 文件。这个项目可以被配置编译成各个平台下面可以运行的应用程序。

我们如果用 arm-linux-gcc 来编译 busybox ,就会得到一个可以在我们开发板 linux 内核上运行的应用程序。


(2) busybox 这个程序开发出来,就是为了在嵌入式环境下构建 rootfs 使用的,也就是说 它就是专门开发的 init 进程应用程序。


(3) busybox 为当前系统提供了一整套的 shell 命令程序集。

譬如 vi、cd、mkdir、ls 等。在桌面版的 linux 发行版(譬如ubuntu、redhat、centOS等)中,vi、cd、ls 等都是一个一个的单独的应用程序。但是在嵌入式 linux 中,为了省事我们把 vi、cd 等所有常用的 shell 命令集合到一起构成了一个 shell 命令包,起名叫 busybox。


三、rootfs 中还应该有什么

1、最重要的就是,上面讲过的 /linuxrc


2、dev 目录下的设备文件

在 linux 中一切皆是文件,因此一个硬件设备也被虚拟化成一个设备文件来访问,在 linux 系统中,/dev/xxx 就表示一个硬件设备,我们要操作这个硬件时,就是 open 打开这个设备文件,然后 read/write/ioctl 操作这个设备,最后 close 关闭这个设备。

在最小 rootfs 中,/dev 目录也是不可少的,这里面有一两个设备文件是 rootfs 必须的。


3、sys 和 proc 目录

在最小 rootfs 中也是不可省略的,但是这两个只要创建了空文件夹即可,里面是没东西的,也不用有东西。

这两个目录也是和驱动有关的。属于 linux 中的虚拟文件系统。


4、usr 目录

usr 目录是系统的用户所有的一些文件的存放地,这个东西将来 busybox 安装时会自动生成。


5、etc 目录是很关键很重要的一个

etc 目录中的所有文件,全部都是运行时配置文件。/etc 目录下的所有配置文件会直接或者间接的被 /linuxrc 所调用执行,完成操作系统的运行时配置。

etc 目录是制作 rootfs 的关键,所以后面下一个课程专门讲这个 etc 目录。


6、lib 目录

lib 目录也是 rootfs 中很关键的一个,不能省略的一个。

lib 目录下放的是当前操作系统中的动态和静态链接库文件。我们主要是为了其中的动态链接库。


四、VFS简介

1、什么是VFS

(1) VFS 是 linux 内核的一种设计理念、设计机制。VFS 就是 vitrual file system ,叫虚拟文件系统。


(2) 具体的一些文件系统,如 FAT、NTFS、ext2、ext3、jffs2、yaffs2、ubi等,主要设计目的是为了管理块设备(硬盘、Nand···)。


(3) VFS 是借鉴了文件系统的设计理念(通过文件系统,将底层难以管理的物理磁盘扇区式访问,转换成目录+文件名的方式来访问),将硬件设备的访问,也虚拟化成了对目录+文件的访问。所以有了 VFS 后,我们可以通过设备文件(目录+文件名,譬如 /dev/mmcblk0p2)的方式来访问系统中的硬件设备。


(4) 以上可以初步看出VFS的一些厉害之处,但是 VFS 不止于此。

2、VFS的意义

(1) 上面说过的对硬件设备的访问,将对硬件设备的访问和对普通文件的访问给接口统一化了(linux 中一切届是文件)。


(2) 将操作系统上层(应用层)对下层不同文件系统类型的访问细节给屏蔽掉了。

因此如果没有 VFS, 那我们写 cp 命令(其他命令也一样)的时候就不得不去考虑你 cp 的这个文件在什么文件系统类型下。所以 cp 命令非常复杂,因此要考虑具体的文件系统类型。

有了 VFS 后情况就不同了。VFS 成了一个隔离层,隔离了下层的不同文件系统的差异性,对上层应用提供一个统一的接口。


(3) VFS 将不同文件系统和下层硬件设备(块设备)驱动之间的细节也给屏蔽了。不同类型的文件系统在本身设计时是不用考虑各种不同的硬件设备的具体操作差异的,这里有一个类似于 VFS 的设计理念。


3、VFS 和我们学习的关系

(1) VFS 机制和 rootfs 挂载,和其他文件系统的挂载都是有关联的。

(2) 内核中有一些 sys proc 这种虚拟文件系统,这东西也是和 VFS 机制有关。

(3) /dev/ 目录下的设备文件都和 VFS 有关,所以学习驱动绕不开 VFS。


源自朱友鹏老师.

你可能感兴趣的:(linux,内核驱动,ARM,S5PV210,朱有鹏,linux,ARM,s5pv210,arm开发,kernel)