Linux根文件系统的原型的制作1

本文详细讲解了在嵌入式系统中构建Linux根文件系统的方法,包括使用mke2fs创建ext2格式的镜像,以及通过nfs网络文件系统启动系统的过程。深入探讨了linuxrc的作用及配置,揭示了busybox在嵌入式Linux中的重要性。
摘要由CSDN通过智能技术生成

Linux根文件系统的原型的制作1

参考朱有鹏uboot全集

0、自己制作ext2格式的根文件系统

(1)mke2fs介绍:是一个应用程序,在ubuntu中默认是安装了的,这个应用程序就是默认用来制作镜像的。

(2)一般用来制作各种不同格式的rootfs的应用程序的名字都很相似,类似于mkfs.xxx(比如用来制作ext2格式的rootfs的工具)

(3)mkfs.ext2等都是mke2fs的符号链接而已。

(4)命令的条件: 4.1/创建一个rootfs.ext2并且将之挂载到一个目录下方便我们访问他。

dd if=/dev/zero of=rootfs.ext2 bs=1024 count=2048 losetup /dev/loop1 rootfs.ext2 mke2fs -m 0 /dev/loop1 2048 mount -t ext2 /dev/loop1 ./rootfs/

4.2/我们向这个镜像中写入一个镜像文件:linuxrc 这个文件就会成为我们制作的镜像中的/linuxrc,内核挂载了这个镜像后,就会尝试去运行/linuxrc,执行就会失败

我们将来实验看到的现象就应该是,我们能够挂载成功,但是我们执行/linuxrc失败。

添加必要的内容:

4.3、将来真正去做有用的rootfs时就要在这一步添加真正可以执行的linuxrc,然后还要添加别的/lib目录下面的库文件,/etc目录下的配置文件等。

4.4、卸载,然后这个镜像就做好了(如果没有卸载的话,那么就会有问题) umount /dev/loop1 losetup -d /dev/loop1

挂载的意思:就是通过你挂载的目录可以看到这个窗口里面的东西。 虽然里面什么都没有写,但是还是可以挂载成功。

其中因为我们的后缀是ext2,而我们使用的是ext3,所以我们改一下后缀即可挂载成功。 这里面要注意传参的bootargs传参的设置。

1、使用nfs方式启动自制的简易文件

1.1、什么是nfs? nfs是一种网络通讯协议,由服务器和客户端构成

nfs作用: 可以让我们客户端和服务器之间进行网络通信。 利用nfs的协议,可以做出很多的直接性的应用,

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

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

Networking support 
    Networking options 
        TCP/IP networking
                IP: kernel level autoconfiguration
                    [*] IP: DHCP support
                    [*] IP: BOOTP support
2、配置开启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.2、导出到nfs的共享目录里面来 sudo vim /etc/exports

把导出的目录的权限放开: chmod 777 -R xxx

要先更新一下 sudo exportfs -r sudo showmount localhost -e

最后我们重启网卡: sudo /etc/init.d/nfs-kernel-server restart

2.1/配置内核以支持nfs作为rootfs (1)设置nfs根文件系统,我们要的就是挂载成功,而不是运行成功。 

总结: (1)nfs方式启动相当于开发板上的内核远程挂载到主机上面的rootfs (2)uboot和内核可以在开发板上面,内核启动起来之后要通过网线挂载我们的根文件系统。这时候的开发吧必须要连接到主机上面。开发板上面的内核就很尴尬了。相当于开发板上面的内核远程挂载上去了。

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

实验结果

 

2、到底什么是linuxrc ?

(1)这个程序是一个可执行的程序,和内核的源码一点关系也没有。

(2)这个/linuxrc在开发板当前的内核系统下是可执行的,因此在ARM的SOC的Linux系统下面,这个应用程序就是用arm-linux-gcc.编译连接的。

如果是在PC机Linux系统下面,那么这个程序就是用gcc编译连接的。 否则你就没有办法运行。

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

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

PS:因为静态编译能够独立的运行,因为静态编译把需要的文件,变量都加载进去了,但是动态编译不能独立运行,里面需要加载库文件的路径,调用库文件。

3、Linuxrc执行时引出用户界面

(1)操作系统启动后再一系列的自己运行配置之后,最终会给用户提供一个操作界面,也许是cmdline,也许是GUI。

这个用户的操作界面就是由linuxrc带出来的。

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

这就是用户界面和其他的应用程序,也即是进程2,进程3,都是由进程1印出来的。

4、Linuxrc负责系统启动后的配置

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

(2)操作系统启动后的应用层的配置(一般叫做运行时配置,英文etc) 为了我们的操作系统用起来更方便。

5、linuxrc在嵌入式Linux中一般都是busybox

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

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

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

(3)busybox为当前的Linux系统提供了一整套的shell命令程序集。 比如vi,cd,mkdir,pwd。

但是在嵌入式的Linux中,为了省事,我们把vi,cd等所有的常用的shell 命令集合到一起构成一个shell的命令包,起名叫做busybox。

6、rootfs还应该有什么?

(1)最重要的就是上节课讲过的linuxrc

(2)发行版就是内核加一个根文件系统

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

/dev目录下的设备文件

在最小根文件系统是不能少的。 这里面有一两个设备文件不是必须的。

/sys /proc:就是我们的调试的目录。在最小的rootfs也是不可省略的。 这两个目录也是和驱动有关的。属于Linux中虚拟文件系统。 内核的一扇窗户。

/usr:也是用户自己安装的程序的库,交叉工具编译工具链。 这个目录也是系统的用户所有的一些文件存放地。 这个东西不用我们自己创建,BusyBox会自己填充。

/etc目录是很关键,很重要的一个,目录中所有的文件全部都是运行时的配置文件。/etc目录下面所有的配置文件会直接或者间接的被;linuxrc所调用执行操作系统的运行时配置。

是我们制作rootfs的关键,所有以我们下一个课程专门讲这个目录。

/lib :也是rootfs不能,是当前操作系统中存放动态或者静态链接库文件。 动态连接库:运行时必须提供相应的库。

找不到这个东西,你就用不了。

7、使用nfs作为根文件系统启动的基本理论分析

参考:https://www.cnblogs.com/lifexy/p/7049743.html 1.1、print

我们从内核到启动根文件系统的区别有两种方式: 一种是使用根目录启动的是在flash上面。

bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0

uboot的环境变量有两个值得注意的两个bootcmd和bootargs

bootcmd:前面有说过,bootcmd是自动启动时默认执行的一些命令,因此你可以定义在当前环境中定义各种不同配置,不同环境参数设置,然后设置bootcmd为你经常使用的那种参数。

bootargs:是环境变量中的重中之重,甚至可以说整个环境变量都是围绕bootargs来设置的,bootargs的种类非常非常多,我们平时只是使用了几种而已。

root:指定rootfs的位置:根文件系统的目录 root=/dev/mtdblock3 :在设置的块3里面定义。

console:使用虚拟串口终端设备: console=ttySAC0

init:指定的是内核启动起来后,进入系统中运行的第一个程序,一般都是init=/linuxrc 请注意,很多初学者以为,linuxrc是固定写法,但是不是,/linuxrc指的是.目录下面的linuxrc脚本,一般就是一个连接而已。

接下来我们使用nfs模式配置bootargs:我们使用的根文件系统在网络文件系统上面。 setenv bootargs root=/dev/nfs nfsroot=192.168.0.103:/home/rootfs/rootfs ip=192.168.0.10:192.168.0.103:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值