• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

[架构:路-30]目标系统 - 系统软件 - Linux OS根文件系统rootfs的概念、组成、弄一个以和用busybox弄一个根文件系统

武飞扬头像
文火冰糖的硅基工坊
帮助3

目录

前言:

第1章 什么是根文件系统

1.1 什么是文件

1.2 什么是文件系统

1.3 文件系统组织文件的方式:树形结构

1.4 统一的虚拟文件系统

1.5 物理存储介质与物理文件系统类型

1.5 什么是根文件系统

第2章 根文件系统的标准结构

2.1 根文件系统的树型结构

2.2 根文件系统的内容

(1)系统文件

(2)外设文件系统

(3)内存文件系统

(4)登录用户文件系统

(5)其他

第3章 关键目录的内容

3.1 etc目录

3.2 bin:

3.3 /usr/bin:

3.4 /sbin:

3.5 /usr/sbin:

第4章 根文件系统的制作

4.1 步骤1:明确需要手工制作的根文件系统目录

4.2 步骤2: 用busybox构建rootfs中的常用命令

4.3 步骤3:利用主机交叉编译环境构建rootfs中的usr/lib目录 (*.so动态库)

4.4 步骤4:构建etc目录

第5章 根文件系统镜像的制作

5.1 目标板通过NFS加载根文件系统

5.2 目标板通过根文件系统镜像加载根文件系统

第6章 根文件系统(1号进程)的加载

6.1 Linux内核的启动流程 编辑

6.2 根文件系统的加载

6.3 执行1号进程的方式1:init进程

6.4 执行1号进程的方式1:systemD进程


前言:

根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而内核系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。根文件系统并不是Linux内核镜像的一部分,而独立于Linux内核镜像的镜像,在嵌入式系统中,根文件系统是文件系统,存放着除了Linux内核之外的所有设备厂家的程序、配置、数据。Linux内核的代码是由Linux官方提供的,根文件系统的结构也是Linux内核决定的,然而根文件系统的内容是由设备厂家决定的。因此,在讨论完Linux内核。

第1章 什么是根文件系统

1.1 什么是文件

文件是以存储介质载体存储在计算机上信息的集合

1.2 什么是文件系统

关于文件系统的定义,从不同的角度,有不同的含义:

学新通

(1)从信息的角度看,文件系统是所有文件的集合,这就是文件的内容。

(2)从文件的组织方式看,文件系统是采用树形结构组织所有文件的结构化组织方式。文件系统中的文件,通常是以树形的结构呈现在用户面前的。

文件系统是对一个存储设备上的数据和元数据进行组织的机制。

这种机制有利于用户和操作系统的交互。

(3)从内核的角度看,文件系统是管理各种文件的一整套机制。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。

学新通

(4)从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

学新通

 计算机机就是处理各种数据的,这些数据在硬盘上就是二进制,人类肯定不能直接看懂这些二进制数据,要有一个翻译器,将这些二进制的数据还原为人类能看懂的文件形式,这个工作就是由文件系统来完成的,文件系统的目的就是实现数据的查询和存储和展现。

1.3 文件系统组织文件的方式:树形结构

学新通

学新通

学新通

1.4 统一的虚拟文件系统

狭义的文件是指:存储计算机硬盘设备上的信息的组织方式,狭义的文件可以是文本文档图片程序等等。

广义的文件是指:存储计算机系统上的信息的组织方式,包括存储在硬盘设备上的信息,存储设备在内存中的信息,甚至可以是存在所有硬件设备中的信息。

Linux中文件,最初是狭义的文件内涵,后来扩展成了广义的文件内涵。

学新通

虚拟文件系统VFS就可以管辖所有类型的物理文件系统,包括FAT文件系统、EXT、Yaffs文件系统、字符设备文件系统等等。所有的硬件外设,都是VFS虚拟文件系统中的一个节点。

因此,在Linux中,有一句话是这样的:“一切皆文件:everything is file”。

Linux操作系统使用虚拟文件系统(VFS),

向上和用户进程文件访问系统调用接口,VFS屏蔽了具体文件的实现细节,向上提供统一的操作接口。

学新通

 学新通

学新通

虚拟文件系统,还为根文件系统提供了挂载点。

虚拟文件系统向下和具体不同物理文件系统的实现接口,通过VFS可以实现Linxu支持任意的文件系统。

1.5 物理存储介质与物理文件系统类型

由于使用场合、使用环境的不同,Linux 有多种物理文件系统,不同的物理文件系统支持不同的体系。

文件系统是管理数据的,而可以存储数据的物理设备有:

硬盘、U 盘、SD 卡、NAND FLASH、NOR FLASH、网络存储设备、RAM和硬件字符设备、一切硬件设备等。在Linux中,一切硬件设备,如I2C总线设备,都是存储数据的载体。

不同的存储设备其物理结构不同,不同的物理结构就需要不同的文件系统去管理,比如管理 NAND FLASH 的话使用 YAFFS 文件系统,管理硬盘、SD 卡的话就是 ext 文件系统等等。

学新通

 Linux系统核心可以支持十多种文件系统类型:

学新通

(1)传统磁盘文件系统:ext2、ext3、ext4、XFS、Btrfs、JFS、

(2)闪存文件系统:ubifs、JFFS2、YAFFS 等。

(3)网络文件系统:NTFS等

(4)数据库文件系统

(5)特殊用途的文件系统

  • swap文件系统:swap
  • RAM文件系统:procfs、sysfs、tmpfs、squashfs、debugfs 等。
  • 外设文件系统:dev

学新通

 学新通

学新通

学新通

不同的物理介质,采用不同物理文件系统,使得文件管理的效率更高。

1.5 什么是根文件系统

当我们在Windows下,提到文件系统时,你的第一反应是想到的是什么?是不是Windows下的一些Fat32、NTFS等的文件系统的类型。

而在Linux中,你可能会想到Ext2、Ext3,但你还必须要有一个根文件系统的概念。

根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于:它是内核(而不是用户)启动时所挂载(mount)的第一个文件系统,内核代码的部分文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。

根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含:

(1)系统引导和使其他文件系统得以挂载(mount)所必要的文件。

(2)根文件系统包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在 Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,

(3)动态加载的内核模块和内核设备驱动程序对应的ko文件。

(4)根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统一部分。

Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。

根文件系统和内核是虽然完全独立的两个部分。但在嵌入式中移植的内核下载到开发板上,如果没有根文件系统,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误。

没有根文件系统的Linux内核是一个孤岛。Linux没有根文件系统的话,用户和操作系统的交互也就断开了,例如我们使用最多的交互shell,包括其它的一些用户程序,都没有办法运行。在这里可以看到根文件系统相对于Linux操作系统的重要性。

根文件系统加载成功之后,还可以自动或手动挂载其他的文件系统。一个系统中可以同时存在不同的文件系统。

在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。根文件系统被挂载到根目录下“/”上后,在根目录下就有根文件系统的各个目录,文件:/bin /sbin /mnt等,再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录,文件。

学新通

第2章 根文件系统的标准结构

2.1 根文件系统的树型结构

(1)表达方式1

学新通

学新通

(2)表达方式2

学新通

(3)表达方式3

学新通

2.2 根文件系统的内容

(1)系统文件

  • /boot(可选)

        Linux的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img 文件都位于这个目录中。

        在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;

  • /bin

        基础系统所需要的那些命令位于此目录,也是最小系统所需要的命令;比如 ls、cp、mkdir等命令;

        功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。

        做为基础系统所需要的最基础的命令就是放在这里。

  • /sbin

        大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin;/usr/X11R6/sbin或/usr/local/sbin目录是相似的; 我们记住就行了,凡是目录sbin中包含的都是root权限才能执行的。

  • /lib

        库文件存放目录,存储/bin/及/sbin/的执行文件所需的链接库,以及Linux的内核模块。

  • /etc  =》 配置linux系统者关心

        系统配置文件的所在地,一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;

  • /usr

        这个是系统存放程序的目录,比如命令、帮助文件等。这个目录下有很多的文件和目录。

        当我们安装一个Linux发行版官方提供的软件包时,大多安装在这里。如果有涉及服务器配置文件的,会把配置文件安装在/etc目录中。/usr目录下包括涉及字体目录/usr/share/fonts ,帮助目录 /usr/share/man或/usr/share/doc,普通用户可执行文件目录/usr/bin 或/usr/local/bin或/usr/X11R6/bin ,超级权限用户root的可执行命令存放目录,比如 /usr/sbin 或/usr/X11R6/sbin 或/usr/local/sbin 等;还有程序的头文件存放目录/usr/include。

  • /opt

        表示的是可选择的意思,有第三方软件包也会被安装在这里,也就是自定义软件包,比如在Fedora Core 5.0中,OpenOffice就是安装在这里。

        有些我们自己编译的软件包,就可以安装在这个目录中;通过源码包安装的软件,可以通过 ./configure --prefix=/opt/目录 。

  • /var

        这个目录的内容是经常变动的,看名字就知道,我们可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。/var/www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件,比如MySQL的,以及MySQL数据库的的存放地;

(2)外设文件系统

  • /mnt

        这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom 等目录。

        可以参看/etc/fstab的定义。有时我们可以把让系统开机自动挂载文件系统,把挂载点放在这里也是可以的。主要看/etc/fstab中怎么定义了;比如光驱可以挂载到/mnt/cdrom 。

  • /media

        即插即用型存储设备的挂载点自动在这个目录下创建,

        比如USB盘系统自动挂载后,会在这个目录下产生一个目录 ;

        CDROM/DVD自动挂载后,也会在这个目录中创建一个目录,类似cdrom 的目录。

        这个只有在最新的发行套件上才有,比如Fedora Core 4.0 5.0 等。可以参看/etc/fstab的定义;

  • /dev =》驱动程序员关心

        设备文件存储目录,比如声卡、磁盘... ...

        任何硬件外设和外设驱动,内核都是以文件的方式暴露给用户空间的应用程序。

(3)内存文件系统

  • /proc  =》调试和监控内核者关心

        操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。

        /proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统,它的定义可以参见 /etc/fstab 。

  • sys =》驱动程序员关心

         展现的是进程之外内核的信息。

(4)登录用户文件系统

  • /root

        Linux超级权限用户root的家目录;

  • /home

        普通用户的根目录默认存放目录;

(5)其他

  • /misc
  • /tmp

        临时文件目录,有时用户运行程序的时候,会产生临时文件。/tmp就用来存放临时文件的。/var/tmp目录和这个目录相似。

  • /lost found

        在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。 有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。

第3章 关键目录的内容

3.1 etc目录

/etc目录
  包含很多文件.许多网络配置文件也在/etc 中. 

/etc/rc   or/etc/rc.d   or/etc/rc*.d  
  启动、或改变运行级时运行的scripts或scripts的目录. 

/etc/passwd  
  用户数据库,其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息. 

/etc/fdprm  
  软盘参数表.说明不同的软盘格式.用setfdprm 设置.

/etc/fstab  
  启动时mount -a命令(在/etc/rc 或等效的启动文件中)自动mount的文件系统列表.Linux下,也包括用swapon -a启用的swap区的信息.

/etc/group  
  类似/etc/passwd ,但说明的不是用户而是组. 

/etc/inittab  
  init 的配置文件. 

/etc/issue  
  getty在登录提示符前的输出信息.通常包括系统的一段短说明或欢迎信息.内容由系统管理员确定. 

/etc/magic  
  file 的配置文件.包含不同文件格式的说明,file 基于它猜测文件类型.


/etc/motd  
  Message Of TheDay,成功登录后自动输出.内容由系统管理员确定.经常用于通告信息,如计划关机时间的警告. 

/etc/mtab  
  当前安装的文件系统列表.由scripts初始化,并由mount 命令自动更新.需要一个当前安装的文件系统的列表时使用,例如df命令. 

/etc/shadow  
  在安装了影子口令软件的系统上的影子口令文件.影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow中,而后者只对root可读.这使破译口令更困难. 

/etc/login.defs  
  login 命令的配置文件. 

/etc/printcap  
  类似/etc/termcap ,但针对打印机.语法不同. 

/etc/profile , /etc/csh.login ,/etc/csh.cshrc  
  登录或启动时Bourne或Cshells执行的文件.这允许系统管理员为所有用户建立全局缺省环境. 

/etc/securetty  
  确认安全终端,即哪个终端允许root登录.一般只列出虚拟控制台,这样就不可能(至少很困难)通过modem或网络闯入系统并得到超级用户特权. 

/etc/shells  
  列出可信任的shell.chsh 命令允许用户在本文件指定范围内改变登录shell.提供一台机器FTP服务的服务进程ftpd检查用户shell是否列在 /etc/shells 文件中,如果不是将不允许该用户登录. 

/etc/termcap 

3.2 bin:

bin为binary的简写,主要放置系统的必备执行文件,例如:

cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

3.3 /usr/bin:

主要放置应用程序工具的必备执行文件,例如:

c 、g 、gcc、chdrv、diff、dig、du、eject、elm、free、gnome*、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb*、wget等。

3.4 /sbin:

主要放置系统管理的必备程序,例如:

cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。

3.5 /usr/sbin:

主要放置网路管理的必备程序,例如:

dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等

/bin,/sbin,/usr/bin,/usr/sbin区别

第4章 根文件系统的制作

学新通

4.1 步骤1:明确需要手工制作的根文件系统目录

并非根文件系统的所有目录都需要手工制作的,比如proc等RAM文件系统,mount后的文件系统,都不是手工制作的。

需要手工制作的目录包括:/linuxrc、/boot(可选)、/bin、/sbin、/user、/lib、/etc等目录。

学新通

备注:

(1)Linux Host主机:

  • 下载现成制作好的版本
  • 从网上下载常用命令的源码,然后编译

(2)嵌入式系统: 

  • 借用现有的工具构建常用的命令:busybox

5.2 步骤2:创建根文件系统根目录和主要目录

mkdir  myrootfs   //myrootfs 是示例

cd myrootfs

mkdir boot bin sbin  lib user etc

4.2 步骤2: 用busybox构建rootfs中的常用命令

(1)简介

学新通

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

BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一个比较完善的环境,可以适用于任何小的嵌入式系统。

(2)起源

BusyBox 最初是由 Bruce Perens 在 1996 年为Debian GNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。

(3)下载与解压

https://busybox.net/

(4)配置

make defconfig       //使用默认配置,让busybox包含常用命令和工具

make menuconfig   //在上述基础上,自己更改配置

要实现交叉编译,需要设置好交叉编译器前缀,可以使用以下命令设置前缀:

make CROSS_COMPILE=arm-linux-uclibcgnueabi-

或者,可以由环境变量设置CROSS_COMPILE的值,CROSS_COMPILE的默认值不是可执行文件的前缀。

学新通

(5)编译和安装busybox

make

make install

编译好后在busybox目录下生成子目录_install,里面的内容:

  • bin
  • linuxrc -> bin/busybox
  • sbin
  • usr

其中可执行文件busybox在需要制作文件系统映像烧入板子的情况下,busybox应放在根文件系统目录下的bin中,其他的都是指向该busybox符号链接.

也就是说,busybox可以搞定3个目录和1号进程linuxrc

(6)把_install目录中的所有目录拷贝到根文件系统中rootfs目录中

cp -rf .  ../myrootfs/

4.3 步骤3:利用主机交叉编译环境构建rootfs中的usr/lib目录 (*.so动态库)

(1)动态库的内容

  • 标准c语言库
  • 标准C 库
  • 其他库

(2)标准C库的构建:从交叉编译环境中拷贝获得

学新通

 (3)标准C 库的构建:从交叉编译环境中拷贝获得

学新通

4.4 步骤4:构建etc目录

(1)明确etc要构建的内容

学新通

(2)使用busybox中的etc作为基线

学新通

(3)修改inittab

  1.  
    # Begin /etc/inittab
  2.  
    id:3:initdefault:
  3.  
    si::sysinit:/etc/rc.d/init.d/rc sysinit
  4.  
    l0:0:wait:/etc/rc.d/init.d/rc 0
  5.  
    l1:S1:wait:/etc/rc.d/init.d/rc 1
  6.  
    l2:2:wait:/etc/rc.d/init.d/rc 2
  7.  
    l3:3:wait:/etc/rc.d/init.d/rc 3
  8.  
    l4:4:wait:/etc/rc.d/init.d/rc 4
  9.  
    l5:5:wait:/etc/rc.d/init.d/rc 5
  10.  
    l6:6:wait:/etc/rc.d/init.d/rc 6
  11.  
    ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
  12.  
    su:S016:once:/sbin/sulogin
  13.  
    1:2345:respawn:/sbin/agetty tty1 9600
  14.  
    2:2345:respawn:/sbin/agetty tty2 9600
  15.  
    3:2345:respawn:/sbin/agetty tty3 9600
  16.  
    4:2345:respawn:/sbin/agetty tty4 9600
  17.  
    5:2345:respawn:/sbin/agetty tty5 9600
  18.  
    6:2345:respawn:/sbin/agetty tty6 9600
  19.  
    # End /etc/inittab

(4)修改init.d/rcS

  1.  
    #!/bin/sh
  2.  
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3.  
     
  4.  
    runlevel=S
  5.  
    prevlevel=N
  6.  
     
  7.  
    umask 022
  8.  
     
  9.  
    export PATH runlevel prevlevel
  10.  
     
  11.  
    mount -a
  12.  
     
  13.  
    echo /sbin/mdev > /proc/sys/kernel/hotplug
  14.  
    mdev -s
  15.  
     
  16.  
    /bin/hostname -F /etc/sysconfig/HOSTNAME
  17.  
     
  18.  
    ifconfig eth0 192.168.1.10

(5)修改fstab:需要自动挂载的文件系统, 包括RAM文件系统

  1.  
    # /etc/fstab
  2.  
     
  3.  
    # Created by anaconda on Sun Aug  7 05:42:06 2016
  4.  
     
  5.  
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
  6.  
     
  7.  
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
  8.  
     
  9.  
    /dev/mapper/VolGroup-lv_root /                                      ext4    defaults    1 1
  10.  
     
  11.  
    UUID=4eff9bdb-7e0b-4d25-8931-dc776537bc73  /boot  ext4   defaults   1 2
  12.  
     
  13.  
    /dev/mapper/VolGroup-lv_home /home         ext4    defaults        1 2
  14.  
     
  15.  
    /dev/mapper/VolGroup-lv_swap swap           swap    defaults       0 0
  16.  
     
  17.  
    tmpfs                   /dev/shm                tmpfs   defaults        0 0
  18.  
     
  19.  
    devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
  20.  
     
  21.  
    sysfs                   /sys                       sysfs     defaults        0 0
  22.  
     
  23.  
    proc                    /proc                      proc      defaults        0 0

(6)修改profile

在Linux系统中有/etc/profile、~/.profile和~/.bashrc三个文件

/etc/profile:在所有用户登录后都会自动执行的一个脚本文件

~/.profile:在当前用户主目录下的隐藏文件,只有此用户登陆后才会自动执行的脚本文件

~/.bashrc:在当前用户主目录下的隐藏文件,只有此用户运行bash终端后会自动执行的脚

第5章 根文件系统镜像的制作

Linux内核如何加载根文件系统也是uboot通知

5.1 目标板通过NFS加载根文件系统

(1)概述

学新通

(2)uboot的配置

setenv bootargs noinitrd init=/linuxrc console=ttySAC0 root=/dev/nfs nfsroot=192.168.10.124:/home/408/nfs/rootfs ip=192.168.10.125:192.168.10.124:192.168.10.1:255.255.255.0::eth0:off

其中:

root=/dev/nfs并非真的设备,而是一个告诉内核要通过网络取得根文件系统。

nfsroot=[:][,]  ;该参数nfsroot这个参数告诉内核以哪一台机器的哪个目录以及哪个网络文件系统选项作为根文件系统使用。

指定网络文件系统服务端的IP地址。如果没有指定定,则使用nfsaddrs变量指定的值。

服务端上要作为根文件系统要挂载的目录名称。

标准的网络文件系统选项,所有选项都以逗号分开。

nfsaddrs=::::::

参数nfsaddrs设定网络通讯所需的各种网络接口地址。

如果没有给定这个参数,则内核核会试著使用反向地址解析协议或是启动协议(BOOTP)以找出这些参数。

-- 客户端的IP地址。

-- 网络文件系统服务端的IP地址。

-- 网关(gateway)的IP地址。

-- 本地网络的网络掩码。如果为空白,则掩码由客户端的IP地址导出。

-- 客户端的名称。如果空白,则使用客户端IP地址的ASCII标记值。

-- 要使用的网络设备名称。如果你只有一个设备,那么你可以不管它。

-- 用以作为自动配置的方法。

(3)内核配置要求:Linux内核需要支持NFS启动rootfs

[*] Networking support --->

--- Networking support

Networking options --->

Unix domain sockets

[*] TCP/IP networking

[*] IP: kernel level autoconfiguration

[*] Network File Systems --->

NFS client support

[*] NFS client support for NFS version 3

[*] Root file system on NFS

(4)在服务器上创建好根文件系统对应的目录和相关文件

见上一章节:《第4章 根文件系统的制作》

(5)/etc/init.d/rcS网络配置

根文件系统中/etc/init.d/rcS中网络配置不能与nfs冲突

(6)重启uboot

5.2 目标板通过根文件系统镜像加载根文件系统

(1)根文件系统镜像的制作

  1.  
    #!/bin/sh
  2.  
     
  3.  
    1、先制作一个空的镜像文件rootfs.ext4
  4.  
    rm -f romfs rootfs.ext4 rootfs.img.gz
  5.  
    dd if=/dev/zero of=rootfs.ext4 bs=1M count=32
  6.  
     
  7.  
    2、然后把此镜像文件格式化为ext4格式
  8.  
    mkfs.ext4 rootfs.ext4
  9.  
     
  10.  
    3、然后把此镜像文件挂载,并把根文件系统复制到挂载目录
  11.  
    # 通过文件系统之间的拷贝,把主机上的rootfs拷贝到目标的根文件系统中。
  12.  
    mkdir -p romfs
  13.  
    sudo mount -o loop rootfs.ext4 romfs
  14.  
    sudo cp -rf rootfs/* romfs
  15.  
     
  16.  
    4、卸载该镜像文件
  17.  
    sudo umount romfs
  18.  
     
  19.  
    5、把rootfs.ext4镜像压缩成压缩文件
  20.  
    gzip --best -c rootfs.ext4 > rootfs.img.gz

(2)烧录根文件系统到Flash或USB中

(7)将镜像写入sd卡的某个分区中
/dev/mmcblk0p3为文件系统所在分区 ;emmcblk0对应emmc的块 p3对应mtdparts第3分区

dd if=rootfs.img.gz of=/dev/mmcblk0p3

(3)配置uboot

-kernel linux-5.17.4/arch/x86_64/boot/bzImage -initrd rootfs.img.gz -append "root=/dev/ram init=/linuxrc"

(4)重启uboot

第6章 根文件系统(1号进程)的加载

6.1 Linux内核的启动流程 学新通

从上图可以看出:根文件系统是由Linux内核进行加载的,根文件系统是挂载在虚拟文件系统之下。当内核加载或挂载完根文件系统之后,Linux就会读取根文件系统中的可执行文件,执行后续的应用程序的初始化。

Linux提供了两种不同机制启动和管理根文件系统中的程序。

(1)内核版本2.6以及之前的版本,内核是通过init进程和inittab来加载根文件系统中的程序。

(2)内核版本3.10以及以后的版本,内核是通过SystemD进程和xxx.target文件来加载根文件系统中的程序。

根文件系统中的程序包括:

  • Linux的系统程序
  • 内核模块ko
  • 用户程序

6.2 根文件系统的加载

学新通

详细参考:

一文讲解Linux内核中根文件系统挂载流程 - 知乎

6.3 执行1号进程的方式1:init进程

挂载根文件系统的而目的有两个:

一是安装适当的内核模块,以便驱动某些硬件设备或启用某些功能;

二是启动存储于根文件系统中的init服务进程,以便让init服务进程接手后续的启动工作。

Linux内核启动后的最后一个动作,就是从根文件系统上找出并执行init服务进程

Linux内核会依照下列的顺序寻找init服务进程

  • 0)/linuxrc
  • 1)/sbin/是否有init服务
  • 2)/etc/是否有init服务
  • 3)/bin/是否有init服务
  • 4)如果都找不到最后执行/bin/sh

init进程的主要任务是:

(1)根据/etc/rc文件中设置的信息,执行其中设置的命令。

(2)然后根据/etc/inittab文件中的信息,为每一个允许登录的终端设备使用fork()创建一个子进程,并执行子进程。

学新通

6.4 执行1号进程的方式1:systemD进程

待续............................................................

备注:

关于一号进程(init或systemD)启动应用程序的流程,在后续文章中单独阐述。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhffkiki
系列文章
更多 icon
同类精品
更多 icon
继续加载