昨天编译并下载好了内核,但是内核还是无法正常启动,原因就是没有挂载根文件系统。今天讲的就是如何去创建一个根文件系统并将它挂载到内核上。
一、创建根文件系统
1.创建目录
#mkdir rootfs
#cd rootfs
#mkdir bin dev etc lib proc sbin sys usr mnt tmp var
#mkdir usr/bin usr/lib usr/sbin lib/modules
2、创建设备文件
(1)在Linux中设备都以文件的形式存在和操作。
(2)这些文件都在dev目录
(3)在启动Linux系统的时候必须要使用两个设备文件console和null
#cd rootfs/dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3
3、加入配置文件(一般都是借鉴已有的)
#tar etc.tar.gz
#mv etc/* ../rootfs/etc/ -rf
4、添加内核模块
进入内核文件目录中执行以下命令
#make modules ARCH=arm CROSS_COMPILE=arm-linux-(编译内核模块)
#make modules_install ARCH=arm INSTALL_MOD_PATH=…/rootfs(将散落的模块统一移至rootfs中的子文件夹中)
5、编译安装busybox
make
make install
busybox主要存放的是一些实现linux命令的函数,比如cd,ls之类的。
经过以上5步,一个简易的根文件系统就制作好了,接下来就该挂载到内核中了。
二、将根文件系统挂载到内核中
根据存储设备的硬件特性、系统需求,不同的文件系统类型有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为 RAM 和FLASH,常用的基于存储设备的文件系统类型包括:jffs2, yaffs2, ubifs, ramdisk等。
1、initfamfs
根文件系统一般用initfamfs,基于内存的文件系统掉电丢失,但是速度快。一般一个系统是多个文件系统混合使用。
要使用initramfs就必须使用软链接
ln -s ./bin/busybox init
在当前文件夹产生init的快捷方式对应于./bin/busybox
配置内核要选上 initramfs选项(General里),且紧接着填写根文件系统所在位置。再重新编译内核。
设置UBOOT环境变量(传给内核的启动参数)
setenv bootargs noinitrd console=ttySAC0,115200
但是这样,如果要添加文件则必须要重新编译内核使得文件系统得到更新,因为此时的文件系统是通过解压存在内存里面的。即这种方式的文件系统是包含在内核里的。
2、nfs
(1)内核配置
取消initramfs
进入File System
根文件系统onNFS选上
(2)编译内核
(3)设置UBOOT启动参数
bootargs是启动参数,它的值意义分别为:控制台用串口0,波特率115200、init=/init(这个我也不造。。)、root=/dev /nfs,说明根文件系统采用dev目录下的nfs,也就是说使用网络文件系统、rw可读可写、nfsroot根文件系统地址为nfs服务器的/home /bumblebee/exercise/.../rootfs目录,其中ip为nfs服务器的ip,也就是我linux的ip、 ip=192.168.0.101开发板ip,192.168.0.103linux的ip,192.168.1.1网关ip(可不 改),255.255.255.0(掩码,不知道是啥东西,同不改),后面的都照抄不用改了。就是这么任性!这样nfs文件系统就挂载好了。