1、1、根文件系统构建路线

1、先逐步构建文件夹形式的根文件系统然后在制作烧录镜像

2、1、busybox移植实战

1、busybox中是一些shell命令集

2、busybox×××

(1)busybox是一个开源代码,可以在网上下载

(2)busybox的版本新旧无所谓,随便下载一个,busybox安装在我们创建的那个根文件系统文件夹形式的目录下,先将文件解压到一个自己创建的文件夹下

(3)busybox的玩法和Linux内核的玩法很像,都是需要配置的

3、makefile的修改

(1)ARCH = arm

(2)CROSS_COMPINE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

4、make menuconfig进行配置

(1)配置参考老师提供的文档

5、然后make,然后make install

(1)make 编译,如果有错误,第一种方法就是去看哪个地方出错了,进行源代码的修改。但是一般情况下,出错的地方的那个应该实现的功能可能是我们不想要的,一般出错是由于我们的arm-gcc交叉编译工具链和我们的这个busybox中的makefile不兼容导致的,所以我们第二种方法就是让他不编译那个出错的文件,用find -name “xxx”来查找这个文件在地方。发现这个文件所在的目录后,看这个目录下有没有makefile,如果有在makefile中将这个文件不添加编译就行,如果没有,就看有没有kbuid这个文件,也可以在这个文件中将那个文件不进行编译,怎么做呢,就是在对应的makefile或者kbuid中找到这个文件所对应的那个CONFIG宏,完了之后再make menuconfig中将这个宏对应的东西配置成没有就好了,如果没有这个宏,那么就直接用出错的那个文件的名字找就行了,找到后给它去掉,将来make的时候就不会编译这个文件了,在次进行make 编译后,编译出来了busybox这个东西,就在证明编译通过了

(2)make install 执行的时候就是执行busybox顶层目录的一个目标install,就是在执行这个目标

(3)make install 在所有的Linux下的软件中,这个目标的一个作用就是安装软件,源代码安装,安装的作用就是将编译生成的可执行程序及其依赖的库文件和配置文件头文件等这些有用的东西安装到我们当前系统中我们指定的目录下,一般都是可以自己指定安装到哪个目录下,如果不指定一般都有个默认目录下,默认的目录不同软件是不样的,所以我们一般是自己去指定,在make menuconfig的Busybox Settings--->中有一个install的默认安装地方,可以看出来默认是安装在哪里的,也可以在这里进行修改,我们要安装到我们的那个根文件系统文件夹下

2、2、inittab详解

1、一个配置文件,在根文件系统的文件夹下,创建一个etc文件夹,将inittab放到这里,在次启动内核用nfs挂载这个根文件系统就成功了,最小的根文件系统

2、inittab格式详解

(1)这个inittab的工作原理被/linuxrc(也就是busybox)执行时调用起作用

(2)inittab在/etc目录下,所以是一个运行时的配置文件,是文本格式的(内容是由很多字符构成的,按照一定格式组织的),实际工作的时候busybox会按照一定的格式去解析这个inittab文件,这个格式是由busybox决定的,在busybox的代码中可以体现,然后根据解析的内容来决定怎么工作

(3)busybox究竟如何完成解析,并且解析的结果如何去工作(busybox中,实现/etc/inittab的原理并不是我们的目标,这些是写busybox的人需要知道的),我们的重点是要知道inittab的格式是怎么样的,我们看到一个inittab后怎么去分析inittab对启动的影响,明白inittab这样写是什么意思

(4)inittab的格式在busybox中定义的。网上可以找到。

(5)#是行注释

(6):冒号在里面是分隔符,分隔开各个部分

(7)inittab是以行为单位的,行和行之间没有关联,每行是一个配置项,每一个配置项表示已个独立的含义

(8)每一行的配置项都是由三个冒号分隔开的四个配置值共同确定的,这四个配置值是id:runlevels:action:process

但是有些配置值可以空缺,但是空缺了冒号是不能丢的。所以有时会看到连续的冒号

(9)每一行的配置项中,四个配置值,最重要的就是action和process,action是一种状态,process是一个可被执行的程序pathname,合起来的意思就是,当满足action的条件时,就会执行process的程序,这个在busybox的源代码中可以分析出来,因为busybox最后是进入到了一个死循环中,在这个死循环中,busybox不断的去检查action满足的条件,满足一个就去执行一个对应的process进程。所以我们的这个busybox进程1(也就是linuxrc,也就是init)最后始终在死循环中,不断的检查者个inittab文件中的action是否条件成立,如果成立执行一个对应的pricess,所以在整个操作系统运行起来的过程中,这个inittab是一直在被用的

(10)明白各个action是什么意思

::sysinit:/etc/init.d/rcS  这个action是sysinit,意思是当控制台启动之前执行后面的process,其他的action是什么含义在网上搜busybox inittab就可以知道了

2、3、busybox源码的分析1

1、进行解压

2、整理目录

3、建立SI工程

4、整个程序的入口确认

(1)在uboot中和内核中,因为操作系统还没有运作起来,我们程序的入口要看链接脚本中指定的入口是哪里

(2)但是我们busybox程序是一个Linux内核启动起来后运行的,这个busybox将来是安装到根文件系统中的,所以这个busybox是一个应用程序,所以对于应用程序而言,对于操作系统运行起来的情况下,我们的程序入口就应该是main函数。

我们程序入口是在Appletlib.c中的main函数中,当我们在命令行下输入一个命令的时候,这个命令就作为这个函数的argv[0]了,通过这个argv来找到对应的那个xxx_main函数去运行执行这个命令,在返回到这个mian函数中,在次去看argv,所以busybox就是靠这种方法,来实现一个程序可以当做很多命令的程序的

2、4、busybox源码的分析2

1、inittab解析与执行

(1)inittab解析是在busybox中的init.c中的init_main中,启动的时候执行的真正的函数

2、pwd命令执行路径分析

3、busybox体积优势管理

2、5、rcS文件介绍

1、/etc/init.d/rcS这个文件是一个配置文件,是我们Linux运行中最重要的一个配置文件,这个文件是在busybox调用/etc/inittab这个配置文件时,被运行的。在后面的其他的配置文件,都是由这个文件引出来的,这个文件可以复杂也可以简单的,里面有很多配置项

2、PATH=XXX

(1)PATH这个环境变量是Linux系统内部定义的一个环境变量,含义是操作系统在执行一个程序时会默认的奥PATH指定的各个目录下去寻找,如果找不到就认定这个程序不存在,如果找到了就去执行他,将一个可执行程序的目录导出到PATH,可以让我们不带路径的去执行这个程序。

(2)所以我在做根文件系统的时候,我们的/etc/init.d/rcS这个配置文件中的PATH作用就是,让我们在执行那些命令集的时候也就是执行那些应用程序的时候,可以不用指定路径,达到我们Ubuntu中的那个效果。

(3)可是我们当前的情况是,我们并没有将这个文件添加到我们/etc/init.d目录下,我们没有这个文件,但是内核挂载了这个根文件系统后,再命令行下,我们直接ls也是好使的,而不用加上路径去执行这个程序?也就是说为什么我们的rcS文件还没有添加,我们系统就有了PATH中的值?因为在busybox的源码中,busybox用硬编码的方式导出了一些环境变量,其中就有PATH,并且有个默认值

3、runlevel=S

(1)runlevel和运行阶段有关,就是从系统启动到启动完毕的几个阶段,=S表示将系统设置为单用户模式

4、prevlevel=N

5、umask 022

(1)umask是Linux的一个命令,作用是设置Linux系统的umask值

(2)umask的值决定当前用户在创建文件时的文件的默认的权限

6、mount -a

(1)mount命令是用来挂载文件系统的,mount -a的意思是挂载所有的应该挂载的文件系统,在busybox中mount -a时会去查找一个文件/etc/fstab、并执行这个文件,这个文件中按照一定的格式列出了应该被挂载的文件系统(包括了虚拟文件系统),所以想要mount -a工作,就必须要有fstab这个文件来配合

7、目前为止的根文件系统制作实战

(1)在之前的我们的根文件系统文件夹下的,按照我们的inittab中的第一步要执行的东西,我们知道要在etc目录下中创建一个init.d文件夹,将rcS这个配置文件放到里面,因为rcS中用到mount -a要挂载fstab中列出的所有文件系统包括虚拟文件系统,所以需要用到fstab这个配置文件。所以我们将fstab这个配置文件在放到/etc目录下,之后去启动内核nfs挂载这个根文件系统文件夹,发现还是说这个rcS不存在,是因为rcS这个脚本文件中的内容是在windows中编写的,回车有差异,改下即可。可以说明如果在shell脚本中,如果内容格式不对,运行时会被认为文件不存在

(2)有时一个应用程序在执行的时候也会提示文件不存在,可能是因为这个应用程序所调用的一个动态链接库找不到

(3)PATH和runlevel的测试

因为在busybox源码中,PATH默认的值就给出来了,是/sbin:/bin:/usr/sbin:/usr/bin,所以我们在rcS中不加这个PATH的时候,在命令行下,也是能看到PATH被赋值了的,所以我们可以不用设置这个值。

runlevel这个是运行级别,就是我们inittab配置文件中的每一个配置项对应的那个id:runlevel:action:process中的那个runlevel级别,但是在busybox中是不支持的,以后如果想更加详细的去理解,可以去网上搜索学习

(4)umask

umask是设置我们当前用户下创建文件时该文件的文件权限的,经过测试,知道

当我们将umask的值设置成022时,我们创建文件后,文件拥有的权限是644,

当我们将umask的值设置成044时,创建一个文件的时候,文件的权限是622

当我们将umask的值设置成444时,创建一个文件的时候,文件的权限是222

所以可以看出来umask的值含义就是0对应文件权限6就是可读可写,2对应的文件权限是4也就是可读,4对应的文件权限是2,也就是可写,加起来是666.

(5)mount测试

当前挂载的时候全部出错

原因是我们当前的根文件系统中找不到挂载点,挂载点就是我们要将目标文件系统(当然这里是虚拟文件系统)挂载到当前文件系统的某一个目录中,这个目录就是挂载点

解决方案就是,自己在制作的根文件系统的根目录下,创建挂载点目录就行

验证是否挂载是否成功,可以看我们挂载时的一个输出信息,没有报错就挂载成功了,还可以在启动后,去看我们的proc和sys文件夹,如果在Ubuntu中看里面没有东西,在我们开发板中的这些文件能看到东西,就说明挂载成功了

8、mdev -s

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

(1)medv是udev的嵌入式简化版本,udev/mdev是用来配合Linux驱动工作的一个应用层的软件,mdev/udev的作用就是配合Linux驱动生成相应的设备文件,/dev目录下

(2)在rcS文件中,没有启动mdev的时候,我们的/dev目录下启动后是没有东西的,在rcS文件中添加上mdev相关的两行内容后,在次启动系统,发现我们的/dev目录下有内容了,全是设备驱动文件。

(3)/dev目录下的设备驱动文件,就是mdev生成的,这就是mdev的意义

9、hostname

(1)hostname是Linux中的一个命令,这个命令执行后(hostname xxx)可以用来设置当前系统的主机名,直接hostname可以显示当前系统的主机名

(2)/bin/hostname -F /etc/sysconfig/HOSTNAME

/bin/hostname 执行了这个程序,-F指定了一个主机名的配置文件(这个文件的一般文件名叫hostname或者大写的HOSTNAME)。

(3)使用方法就是在根文件系统中,将关于hostname的这一行内容添加到rcS中,在根文件系统的/etc目录下创建一个sysconfig文件夹,在这个文件夹下创建一个HOSTNAME文件,在这个文件中写入我们想要的主机名字就行了。

10、ifconfig

(1)有时我们希望看机后,进入命令行时,我们的IP地址就有一个指定的IP地址,这时我们就可以在rcS文件中ifconfig eth0 一个IP地址

11、profile文件和用户登录理论

(1)之前我们在HOSTNAME中输入了我们的主机名字,可是我们的命令下还是没有变,所以把这个profile配置文件添加到etc目录下就可以解决这个问题了。

(2)添加这个profile文件后,发现在命令行下我们的主机名字能显示出来了,但是我们用户名还没有,所以只有我们添加用户登录功能以后,这个用户名才能显示出来,就达到了我们Ubuntu中的效果了,比如root用户,就是root@Ubuntu

(3)profile的工作原理:也是被init进程调用执行的,所以是认名字的,profile这几个字不能写错。自己去网上搜吧

12、如何看到用户登录界面

(1)因为之前的inittab中有一个配置项::askfirst:-/bin/sh,作用是当我们系统启动后,就去执行/bin/sh,执行这个后当我们按下回车后就会进入命令行,因此我们这样安排的话。就不会出现用户登录界面,会直接进入命令行

(2)我们要出现登录界面,就不能执行这个/bin/sh程序,而应该执行一个负责负责出现登录界面并且能管理用户名和密码的一个程序,busybox中集成了一个这样的程序,这个程序就是/bin/login或者/sbin/getty,这两个都行。

13、用户名和密码的设置

(1)用户名和密码的设置肯定是和我们的登录程序有关的,是在登录程序中写死的,但是所有的Linux的用户名和密码的管理几乎都是一样的

(2)密码一般都是加密的文字,意思就是系统中的密码肯定是在系统的一个专门用来存放密码的文件中存储的,不是明文,不然你得系统被攻破了以后,别人就可以直接知道你的密码。

14、用户登录的实战

(1)将inttab配置文件中的askfirst这个action注释掉,添加一个sysinit action对应process是/bin/login、

(2)重启系统后,可以进入到登录界面,我们当前用的是单用户模式,所以只能是root用户登录,但是我们的密码怎么输都不对

(3)因为我们根本就没有给root用户设置密码,所以当然不对了

(4)添加psswd和shadow文件,Linux系统中用来描述用户名和密码的文件是psswd和shadow文件,这两个文件都要在etc目录下,shadow文件中存储的是密文的密码,psswd中存储的是用户密码的设置

(5)我们直接复制Ubuntu中的/etc/psswd 和 /etc/shadow这两个文件到我们的根文件系统的etc目录下就行,在进行相应的修改就行,比如在psswd文件中留下我们用的用户root,将root用户登录后对应的目录创建或者自己修改,将登录root用户后执行的脚本改成/bin/sh,因为busybox中不支持bash只支持sh默认。

(6)我们可以先将root用户对应的shadow那段密码的位置,弄成没有,完了之后启动系统,我们直接输入root就可以进入root用户了,默认是无密码的,我可以通过psswd root给这个root用户设置密码、

(7)有时如果我们忘记了操作系统的密码,我们怎么办呢,解决方法就是我们在启动这个操作系统的时候进入到uboot界面bootloader界面,告诉内核我们的根文件系统是nfs的,之后拿一根网线和我们另一台电脑上,用这台电脑登录一个类似于Ubuntu的系统,在这个系统上搭建nfs服务器,创建对应根文件系统的文件夹,我们把启动忘记密码的那操作系统后,就会挂载到我们的这个Ubuntu根文件系统文件夹下,我们在这个文件夹下找到那个加密的文件,将用户对应的密码设置成空,在重启系统就好了。

(8)id号的提示,提示串口的id号,可以在inittab中,将对应的id号添加上就好了。我们用的是串口,在/dev目录下找到那个串口2的名字写到inittab中,我们添加的那个action是sysinit,proess是/bin/login上的id中

15、getty的做法和login的做法是一样的,两者应该在busybox中没有区别

1、16、动态链接库的拷贝

1、静态链接hellowrod程序并执行

(1)我们在Ubuntu中写一个C语言程序,写完后如果我们是用gcc编译的话,就不能再我们的arm平台上运行,因为我的Ubuntu是80386架构的,所以我们要用arm-linux-gcc去交叉编译成可以在arm平台上运行的可执行程序

(2)我们先静态编译链接这个helloword程序,也就是用 arm-linux-gcc hello.c -o hello_static -static 这样去静态编译链接

(3)实验结果是,我们静态编译生成的hello_static可以成功的运行在我们的系统上,

2、动态链接并执行

(1)动态链接:

arm-linux-gcc hello.c -o hello_dynamic

(2)如果不加动态链接库的话,是不能运行在我们开发板系统上的。

(3)动态链接的hello中,当在我们的开发板的系统上运行时,执行那个printf函数时找不到当前运行时环境对应的动态链接库,也就是说,在根文件系统中找不到lib中对应的动态链接库文件,因为动态链接的程序,是在程序运行的时候,将调用的函数在动态链接库中找到那个代码段,进行加载运行的。所以我们的rootfs中没有动态链接,在执行动态链接的程序的时候就会找到不相应的代码段,就会出错

(4)所以我们应该将arm-linux-gcc的动态链接库文件复制到根文件系统目录下的/lib目录下,添加动态链接库就好了

(5)arm-linux-gcc这个交叉编译工具对应的动态链接库,就在我们安装这个交叉编译工具链时所在的某个目录下,我的是在/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib中,所以复制这个目录中的东西到我们的根文件系统的/lib中,其他一些的交叉编译工具对应的动态链接库可能不在这个目录下,我们可以用find -name “*libm.so*”去找。

(6)复制的时候,参数要加上 -rdf 目的是为了让符号链接复制过来后还是符号链接。

复制方法是用 cp xxx/*so* xxx/ -rdf  用*so* 来把不是动态链接库的东西过滤出去

(7)复制过来后,因为这些动态链接库文件中包含了一些调试用的符号信息,占空间,所以可以用arm-linux-strip *so* 用这个strip工具,将调试符号信息去掉,就省了一些空间了

2、6、开机自启动与主流的rcS格式是什么样的

1、开机自动启动这里的意思是说,在开发板上的操作系统起来以后可以让一些应用程序自动执行。

(1)实现方法就是在rcS脚本中,加上想要开机直接执行的应用程序就行。因为根文件系统挂载后,会执行init进程1,这个进程就是/linuxrc,就是busybox,他先执行inittab,inittab中先执行了rcS,所以这个rcS中的内容会先被执行,可以在这里进行添加

2、前台运行和后台运行

(1)前台运行:程序运行占用了当前的控制台,所以这个程序叫做前台运行的程序。程序不结束会不到控制台。比如我们写一个hello.c让这个程序一直在执行,回不到控制台的命令行下,那么这个程序就是前台运行,默认执行程序的时候就是前台运行的。

(2)后台运行:后台运行就是让这个程序运行,并且让这个程序让出控制台,这时候这个程序还能运行,并且还能不影响当前控制台的使用。在执行一个程序的时候在后面加上&符号就行,如 ./xxx &.

总结:根文件系统制作的流程和原理分析

(1)我们的内核在启动后最后要去挂载根文件系统,执行根文件系统下的linuxrc这个程序,也就是init进程,也就是进程1,执行这个进程为了从内核态进入到用户态,这时才表明操作系统真正的运行起来了

(2)先通过nfs的文件夹形式的根文件系统调试好,搭建主机端的nfs服务器,配置开发板内核支持nfs协议。bootargs传参告诉内核是nfs的根文件系统。

(3)我们linuxrc程序其实是busybox这个程序,我们在网上下载这个busybox程序,任意版本就行,因为我们busybox这个程序将来是要在我们的开发板上运行的,所以编译这个程序的时候必须用arm的交叉编译工具链,所以我们将这个程序下载下来后要看makefile中CROSS_COMPINE这个环境变量的值是不是我们交叉编译工具链所在的位置,ARCH架构是不是arm,之后再参考老师的提供的文档用make menuconfig对busybox进行配置,有错误的话,进行排查,配置的时候要安装路径也配置好,编译好后安装到我们的根文件系统文件夹下,主机端创建的文件夹,这个位置是nfs通信的那个文件夹。

(4)安装好后,这个时候根文件系统就有linuxrc这个程序了,开发板系统启动时执行了这个程序,但是因为busybox要调用/etc下的inittab这配置文件,所以我们要在etc目录下添加一个这个inittab配置文件,这个配置文件应该很好懂,看了就知道,不知道可以去百度。

(5)添加了inittab配置文件后,在启动的时候说找不到/etc/init.d目录下的rcS程序,因为inittab这个配置文件中,第一个配置项就是执行这个rcS程序,所以在etc目录下创建init.d目录,并且将rcS配置文件添加进来,我们打开rcS可以发现这里面有一系列内容,因为要mount -a挂载所有文件系统,所以需要在etc目录下添加一个fstab这个配置文件,因为这个配置文件中有很多挂载点,所以要在根文件系统根目录下创建这些挂载点,因为rcS中涉及到主机名,看内容知道主机名被指定在/bin/hostname -F /etc/sysconfig/HOSTNAME中,所以要在etc目录下创建sysconfig目录创建HOSTNAME文件,这个文件中的内容就是我们的主机名,我写的是why210,想让这个主机名生效,在我们命令行下显示出来就需要profile这个配置文件的配合,所以还要在etc目录下添加这个profile配置文件,这个时候在启动就可以在命令行下看到主机名了。

(6)为了实现用户登录还有密码,因为这个用户登录和密码在busybox中是支持的,所以busybox中的程序就有这个的实现,所以我们为了让用户登录在命令行出现之前就出现,我们就要在inittab配置文件,在命令行出来之前添加这个用户登录的执行程序,所以添加了一个action和process,用户登录很密码需要两个文件的配合,可以在Ubuntu中将/etc下的passwd和shadow复制到我们的根文件系统etc目录下,一个中告诉了用户登录后的目录,一个中记录了密文密码。在这两个文件的配合下,我们的用户登录就可以实现了。但是提示这个需要有id号,所以将我们使用的串口id号添加到对应的这个inittab中的配置项的id中。

(7)为了实现动态链接的程序可以在开发板上运行,需要将arm-linux-gcc对应的动态链接库文件拷贝到我们的根文件系统下的lib目录中。以支持交叉编译的动态链接库。

(8)之后就可以制作成可烧录的镜像了,步骤如下

dd if=/dev/zero of=rootfs.ext2 bs=1024 count=10240

losetup  /dev/loop1 rootfs.ext2

mke2fs -m 0 /dev/loop1 10240

mount -t ext2 /dev/loop1 ./ext2_rootfs/

复制我们的根文件系统文件夹形式的内容到ext2_roofs文件中,这样就可以放在roofs.ext2镜像中了

umount /dev/loop1

losetup -d /dev/loop1

linux 开机 找不到 文件系统 下载文件系统就好了,根文件系统构建和实验过程相关推荐

  1. linux 制作box文件夹,用busybox制作自己简易的根文件系统

    当使用Busybox-1.2.0制作根文件系统 交叉编译器为3.3.2 make-3.8.1 STEP 1: 创建根文件系统目录,主要包括以下目录/bin,/etc,/dev,/mnt,/sbin,/ ...

  2. linux dev input使用消失_Linux驱动04 | 启动分析之根文件系统

    1. 概述 linux内核挂载的第一个文件系统,该根文件系统是挂载到根目录下的文件系统.rootfs,它是一个容器,也称之为一个"包",里面包含: [root@6818 /]#ls ...

  3. linux 开机 找不到 文件系统 下载文件系统就好了,开机启动找不到文件系统的修复步骤...

    问题描述,电脑开机后出现错误,找不到文件系统,如上图:一般是grub找不到引导文件,只需要让他找到引导文件就好了.步骤如下 1.输入  命令"set",  查看grub指向哪个盘, ...

  4. linux跳过文件系统检查,CentOS – 跳过“检查根文件系统”

    推荐文章 通过docker的run 创建并启动了一个容器,大家一般会这样来创建: docker run -it --link=sql:sql --name test  --hostname test ...

  5. Linux学习笔记---记一次rootfs根文件系统下载时掉进的大坑

    俗话说要想技术好,踩坑少不了.技术的好坏和踩坑的多少基本是成正比的.这次就大大的提升了一次技术(大大的踩了一次坑).废话少说,直奔主题. 最近入手了一块正点原子的IMX6ULL开发板,跟着视频教程和开 ...

  6. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  7. Linux内核移植和根文件系统制作(详细步骤精讲)

    第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...

  8. 【正点原子Linux连载】第三十八章 根文件系统构建 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  9. [架构之路-30]:目标系统 - 系统软件 - Linux OS根文件系统rootfs的概念、组成、制作以及用busybox制作根文件系统

    目录 前言: 第1章 什么是根文件系统 1.1 什么是文件 1.2 什么是文件系统 1.3 文件系统组织文件的方式:树形结构 1.4 统一的虚拟文件系统 1.5 物理存储介质与物理文件系统类型 1.5 ...

最新文章

  1. Spring Boot 实现通用 Auth 认证的 4 种方式
  2. C语言Socket动态ajax网页,简单的ajax聊天网页 socket
  3. What Does TTY Stand for in Linux?
  4. Django学习(一)
  5. 【4】 Java基础 四
  6. ajax请求使用utf-8,Ajax,请求标头UTF-8到ISO字符集[重复]
  7. 解决word、excel、ppt文件图标是空白的问题
  8. Leetcode每日一题:176.second-highest-salary(第二高的薪水)
  9. 2、认识常见网络设备
  10. lol鲁大师帧数测试软件,lol配置检测
  11. Tkinter教程之Frame篇
  12. html静态网站基于数码类电商购物网站网页设计与实现共计30个页面.rar(项目源码+毕业设计+论文+答辩PPT)
  13. (PhotoShop)如何用PS给证件照换底色(目前换底最成功的一个教程)
  14. 计算机考试中栏间距怎么弄,word中栏间距怎么设置
  15. c++中struct构造函数
  16. python+pyautogui+pyperclip实现QQ自动加好友功能
  17. ESP32学习笔记(23)——NVS(非易失性存储)接口使用
  18. 小米Mix2s刷机教程
  19. 科技引领未来,银联开放平台诚邀你的加入
  20. Apache Hadoop3.x 分布式集群配置安装

热门文章

  1. 使用jq实现全选 反选 和全不选-冯浩的博客
  2. 万全r680g7配置raid_联想万全R680G7服务器安装部署Vmware虚拟化系统说明书模板
  3. 制作一个简单的FLV播放器 【转】
  4. 【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战
  5. 7款同步备份手机通讯录工具
  6. 麻将胡牌算法lua 不支持癞子
  7. 提振信心!1-7月新车智能化「持续增长」,同比增速超70%
  8. Qt编写雷达模拟仿真工具(模拟点/歼击机/航母/发射导弹/爆炸效果/激光雷达等)
  9. PICE(5):MongoDBStreaming - gRPC -MGO Service
  10. python音频处理(一):双声道转成单声道,降采样