目录
前言:
第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/rcor/etc/rc.dor/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、chmoddf、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
mkdirbootbin 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
# Begin /etc/inittabid:3:initdefault:si::sysinit:/etc/rc.d/init.d/rc sysinitl0:0:wait:/etc/rc.d/init.d/rc 0l1:S1:wait:/etc/rc.d/init.d/rc 1l2:2:wait:/etc/rc.d/init.d/rc 2l3:3:wait:/etc/rc.d/init.d/rc 3l4:4:wait:/etc/rc.d/init.d/rc 4l5:5:wait:/etc/rc.d/init.d/rc 5l6:6:wait:/etc/rc.d/init.d/rc 6ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r nowsu:S016:once:/sbin/sulogin1:2345:respawn:/sbin/agetty tty1 96002:2345:respawn:/sbin/agetty tty2 96003:2345:respawn:/sbin/agetty tty3 96004:2345:respawn:/sbin/agetty tty4 96005:2345:respawn:/sbin/agetty tty5 96006:2345:respawn:/sbin/agetty tty6 9600# End /etc/inittab
(4)修改init.d/rcS
#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=Sprevlevel=Numask 022export PATH runlevel prevlevelmount -aecho /sbin/mdev > /proc/sys/kernel/hotplugmdev -s/bin/hostname -F /etc/sysconfig/HOSTNAMEifconfig eth0 192.168.1.10
(5)修改fstab:需要自动挂载的文件系统, 包括RAM文件系统
# /etc/fstab# Created by anaconda on Sun Aug 7 05:42:06 2016# Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info/dev/mapper/VolGroup-lv_root / ext4defaults1 1UUID=4eff9bdb-7e0b-4d25-8931-dc776537bc73 /boot ext4defaults1 2/dev/mapper/VolGroup-lv_home /home ext4defaults1 2/dev/mapper/VolGroup-lv_swap swapswapdefaults0 0tmpfs/dev/shmtmpfsdefaults0 0devpts /dev/ptsdevpts gid=5,mode=620 0 0sysfs/syssysfs defaults0 0proc/proc proc defaults0 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/nfsnfsroot=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)根文件系统镜像的制作
#!/bin/sh1、先制作一个空的镜像文件rootfs.ext4rm -f romfs rootfs.ext4 rootfs.img.gzdd if=/dev/zero of=rootfs.ext4 bs=1M count=322、然后把此镜像文件格式化为ext4格式mkfs.ext4 rootfs.ext43、然后把此镜像文件挂载,并把根文件系统复制到挂载目录# 通过文件系统之间的拷贝,把主机上的rootfs拷贝到目标的根文件系统中。mkdir -p romfssudo mount -o loop rootfs.ext4 romfssudo cp -rf rootfs/* romfs4、卸载该镜像文件sudo umount romfs5、把rootfs.ext4镜像压缩成压缩文件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)启动应用程序的流程,在后续文章中单独阐述。