参考朱有鹏uboot全集
(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.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方式不适合真正的产品,一般作为产品开发阶段调式使用。
实验结果
(1)这个程序是一个可执行的程序,和内核的源码一点关系也没有。
(2)这个/linuxrc在开发板当前的内核系统下是可执行的,因此在ARM的SOC的Linux系统下面,这个应用程序就是用arm-linux-gcc.编译连接的。
如果是在PC机Linux系统下面,那么这个程序就是用gcc编译连接的。 否则你就没有办法运行。
(3)/Linux如果是静态编译连接的,那么直接可以运行,如果是动态编译连接的。那么我们还必须给他提供必要的库文件才能运行。
但是因为我们linuxrc这个程序是由内核直接调用执行的。 因此用户没有机会导出库文件的路径,因此实际上这个linuxrc没有办法动态连接,一般都是静态连接的。
PS:因为静态编译能够独立的运行,因为静态编译把需要的文件,变量都加载进去了,但是动态编译不能独立运行,里面需要加载库文件的路径,调用库文件。
(1)操作系统启动后再一系列的自己运行配置之后,最终会给用户提供一个操作界面,也许是cmdline,也许是GUI。
这个用户的操作界面就是由linuxrc带出来的。
(2)用户界面很多事情并不是linuxrc程序中负责的,用户界面有自己专门的应用程序,但是用户界面的应用程序是直接或者间接被linxurc调用执行的。
这就是用户界面和其他的应用程序,也即是进程2,进程3,都是由进程1印出来的。
(1)就好像一个房子建好之后不能直接入住,还要装修一样,操作系统启动起来后也不能直接用,要配置下。
(2)操作系统启动后的应用层的配置(一般叫做运行时配置,英文etc) 为了我们的操作系统用起来更方便。
(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。
(1)最重要的就是上节课讲过的linuxrc
(2)发行版就是内核加一个根文件系统
最小文件系统: 在Linux中一切皆是文件: 因此一个硬件设备被虚拟化成一个设备文件来访问。 在Linux系统中/dev/xxx就是表示一个硬件设备。 我们要操作这个硬件时就是open打开这个设备文件。 然后read/write/ioctl操作这个设备。
/dev目录下的设备文件
在最小根文件系统是不能少的。 这里面有一两个设备文件不是必须的。
/sys /proc:就是我们的调试的目录。在最小的rootfs也是不可省略的。 这两个目录也是和驱动有关的。属于Linux中虚拟文件系统。 内核的一扇窗户。
/usr:也是用户自己安装的程序的库,交叉工具编译工具链。 这个目录也是系统的用户所有的一些文件存放地。 这个东西不用我们自己创建,BusyBox会自己填充。
/etc目录是很关键,很重要的一个,目录中所有的文件全部都是运行时的配置文件。/etc目录下面所有的配置文件会直接或者间接的被;linuxrc所调用执行操作系统的运行时配置。
是我们制作rootfs的关键,所有以我们下一个课程专门讲这个目录。
/lib :也是rootfs不能,是当前操作系统中存放动态或者静态链接库文件。 动态连接库:运行时必须提供相应的库。
找不到这个东西,你就用不了。
参考: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