ARM rootfs、linuxrc 的简单制作

news/2024/10/18 9:22:32/

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

1、什么是nfs

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

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

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


(3) 搭建 nfs 服务器。

参考资料:
在这里插入图片描述


在这里插入图片描述


1)安装 NFS

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

在这里插入图片描述


2)配置 /etc/exports

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

在这里插入图片描述

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

在这里插入图片描述

然后在终端执行 :

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 搭建成功!

在这里插入图片描述

在这里插入图片描述

最后记得卸载掉 /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 地址:
在这里插入图片描述


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

在这里插入图片描述


设置开发板的 IP 地址:

在这里插入图片描述


设置 ubuntu nfs 服务器的 IP 地址:
在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述


init 程序的名称:

在这里插入图片描述


设置串口号和波特率:

在这里插入图片描述


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

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

在这里插入图片描述

解决方案如下:

参考说明文档:网盘资料中的
《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 选项。

在这里插入图片描述


  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

在这里插入图片描述

在这里插入图片描述


  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。

在这里插入图片描述

在这里插入图片描述


(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。


源自朱友鹏老师.


http://www.ppmy.cn/news/47203.html

相关文章

【Linux】NanoPi-NEO2外接spi-lcd

这是目录 一、显示接口1.1、LCD接口1.2、核心板接口 二、添加驱动2.1、确认驱动型号2.2、添加驱动 三、测试四、附加4.1、交叉编译器安装4.2、内核和module编译4.3、扩展rootfs大小 本文使用环境&#xff1a; 电脑&#xff1a;Ubuntu 18.04.5 LTS 开发板&#xff1a;NanoPi-NEO…

Microsoft Power Apps部署方案

目录 前言 一、准备条件 二、Power Apps环境部署 三、应用程序部署 四、最佳实践 总结

[异常]java常见异常

Java.io.NullPointerException null 空的&#xff0c;不存在的NullPointer 空指针 空指针异常&#xff0c;该异常出现在我们操作某个对象的属性或方法时&#xff0c;如果该对象是null时引发。 String str null; str.length();//空指针异常 上述代码中引用类型变量str的值为…

DS树--二叉树高度

题目描述 给出一棵二叉树&#xff0c;求它的高度。 注意&#xff0c;二叉树的层数是从1开始 输入 第一行输入一个整数t&#xff0c;表示有t个二叉树 第二行起输入每个二叉树的先序遍历结果&#xff0c;空树用字符‘0’表示&#xff0c;连续输入t行 输出 每行输出一个二叉…

基于 DSP+FPGA+1553B总线的水下信息融合系统的设计

在一个大型水下系统中&#xff0c;针对不同分系统的特 性&#xff0c;通常采用不同的通信协议。串行通信具有抗干扰 能力强&#xff0c;传输距离远等特点&#xff0c;适用于需要远距离通信 的分系统&#xff1b; MIL-STD-1553B 总线在传输方面具有极强 的可靠性和实时性&a…

Linux DHCP服务

DHCP 作用 DHCP动态主机配置协议作为服务端负责集中给客户端分配各种网络地址参数(主要包括IP地址、子网掩码、广播地址、默认网关地址、DNS服务器地址) 传输协议端口 服务端 UDP 67端口 客户端 UDP 68端口 工作原理 1) 客户端广播发送DISCOVER报文寻找服务端 2) 服务端广播发…

OpenAI-ChatGPT最新官方接口《语音智能转文本》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(六)(附源码)

Speech to text 语音智能转文本 Introduction 导言Quickstart 快速开始Transcriptions 转录python代码cURL代码 Translations 翻译python代码cURL代码 Supported languages 支持的语言Longer inputs 长文件输入Prompting 提示其它资料下载 Speech to text 语音转文本 Learn how…

Java常见集合类区别

Java常见集合类区别 1. List和Map区别1.1 深入阐述 2. ArrayList和Vector的区别2.1 具体区别 3. ArrayList, Vector, LinkedList的存储性能和特性4. HashMap和Hashtable的区别4.1 两者区别总结 1. List和Map区别 List&#xff1a;存放单个元素的集合 List集合所包含的元素可以…