Linux系统移植:根文件系统建立
一个Linux系统的启动有三个关键的文件
uboot:引导Linux内核启动
Linux内核:实现基础内核功能
根文件系统:内核运行的支持
本节学习一下根文件系统的建立
一、什么是根文件系统
根文件(rootFS)系统不像FATFS、FAT、EXT4、YAFFS和NTFS这样的文件系统,它更像是一个文件夹或则说目录,根文件系统的根目录和子目录中会有好多的文件,这种文件是Linux运行所必须的,例如库、常用的软件和、设备文件、配置文件等等,Linux内核启动之后挂载的第一个文件系统就根文件系统,之后Linux内核会从根文件系统中读取初始化等等执行文件,从而维持Linux内核的正常运行
单独的Linux内核未能正常工作的,必需要有根文件系统
二、根文件系统目录
里面提及根文件系统是个目录,我们以ubuntu为反例,看一下根文件系统下有啥,使用cd/回到根目录,之后复印目录
2.1子目录bin
此目录下储存着系统须要的可执行文件,通常都是一些,如ls、mv等
2.2子目录dev
该目录下储存设备文件,在Linux下,一切皆文件,如并口0在该目录下就行/dev/ttymxc0,我们通过操作文件来操作外部设备
2.3子目录etc
此目录下储存着各类配置文件
2.4子目录lib
此目录下储存着Linux所必须的库文件,命令和应用程序要使用这种库文件,例如c语言标准库哪些的都在下边
2.5子目录mnt
文件挂载目录,假如要挂载U盘、SD卡哪些的,可以临时挂载到下边
2.6子目录proc
当Linux系统启动之后会将此目录作为proc文件系统的挂载点
proc是个虚拟文件系统,没有实际的储存设备,文件都是临时存在的,通常拿来储存系统运行信息文件
2.7子目录usr
usr是UnixSoftwareResource的简写,是Unix操作系统软件资源目录,因而usr目录下储存着好多软件
2.8子目录var
此目录储存一些可以改变的数据
2.9子目录sbin
用于用户储存一些可执行文件,并且此目录下的文件、命令只有管理员能够使用,主要用于用户系统管理
2.10子目录sys
系统启动之后此目录作为sysfs文件系统的挂载点
sysfs是一个类似于proc文件系统的特殊文件系统,sysfs也是基于ram的文件系统,没有储存设备,数据临时存在
2.11子目录opt
可选的文件、软件储存区,由用户选择将什么文件或软件放在此目录
三、BusyBox创建根文件系统
BusyBox是一个集成了大量Linux命令和工具的软件,像ls、mv、ifconfig等命令BusyBox还会提供,通过它可以快速建立文件系统,官网地址为:
我在ubuntu下创建一个busybox文件夹,用于储存busybox,此处下1.29.0版本的
解压包
tar-vxjfbusybox-1.29.0.tar.bz2
3.1更改编译选项
更改顶楼makefile,添加编译选项
3.2配置busybox
busybox的配置和linux、uboot配置差不多,配置有下边几步:
先配置默认配置:
makedefconfig
进一步打开图形化配置:
makemenuconfig
有几个重要的配置须要更改:
将编译的库选为动态编译:
静态编译不须要库文件,并且编译下来的库会很大。动态编译的话要求根文件系统中有库文件,并且编译下来的busybox会小好多
配置界面编译路径如下:
->Settings
->Buildstaticbinary(nosharedlibs)
取消选中静态编译:
加入vi编辑器:
配置路径:
->Settings
->vi-stylelineeditingcommands
选中
取消modutils库:
配置路径:
->LinuxModuleUtilities
->Simplifiedmodutils
使能mdev:
mdev工具用于系统启动和热拔插或动态加载驱动程序时,手动创建设备节点
配置路径:
->LinuxSystemUtilities
->mdev(16kb)
启动全部
设置完成保存设置
3.3编译busybox
make
编译完成后将busybox安装到nfs目录下,便捷调试
makeinstallCONFIG_PREFIX=/home/jeck/linux/nfs/rootfs
安装完成后,安装目录下出现如下内容:
rootfs目录下有bin、sbin和usr这三个目录,以及linuxrc文件,linuxrc是用户空间的init程序
四、补全其他目录和文件
busybox生成了三个目录和init文件,但除此之外还有其他的目录
4.1lib添加库
在rootfs中创建一个lib文件夹,lib库文件从交叉编译器中获取,通常选择性的拷贝过去,按照实际情况剪裁,对于我这样的初学者,直接拷贝所有过去就行
cp /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/*so* /home/jeck/linux/nfs/rootfs/lib/ -d
cp /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/*.a /home/jeck/linux/nfs/rootfs/lib/ -d
cp /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib/*so* /home/jeck/linux/nfs/rootfs/lib/ -d
cp /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib/*.a /home/jeck/linux/nfs/rootfs/lib/ -d
-d表示拷贝符号链接,由于库目录下有些文件是符号链接
拷贝完如下
4.2usr/lib添加库
在rootfs的usr目录下创建一个名为lib的目录,拷贝如下文件进去
cp/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/*so*/home/jeck/linux/nfs/rootfs/usr/lib/-d
cp/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/*.a/home/jeck/linux/nfs/rootfs/usr/lib/-d
拷贝完成如下:
看一下拷贝后的大小
在emmc大小范围内,没有超过
4.3创建其他目录
创建其他运行须要文件夹
mkdirdevprocmntsystmproot
4.4创建/etc/init.d/rcS文件
Linux内核启动之后须要启动一些服务linux建文件系统,rcS规定启动什么文件的脚本文件linux建文件系统,脚本内容如下:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
PATH环境变量保存着可执行文件可能存在的目录
LD_LIBRARY_PATH环境变量保存着库文件所在的目录
export来导入环境变量,进行申明
mount命令来挂载所有的文件系统,文件系统由文件/etc/fstab来指定
创建目录/dev/pts,将devpts挂载到/dev/pts目录中
echo复印信息
mdev来管理热拔插设备,使Linux内核可以在/dev目录下手动创建设备节点
创建好文件后给其可执行权限
chmod777rcS
4.5创建/etc/fstab文件
fstab在Linux开机之后手动配置什么须要手动挂载的分区,文件格式如下:
类型功能
filesystem要挂载的设备
mountpoint挂载点
type文件系统类型
options挂载选项
dump为1的话表示准许备份,为0不备份
passc盘检测设置,为0表示不检测,通常设置为0
文件中输入如下内容
#
proc /procproc defaults 0 0
tmpfs /tmptmpfs defaults 0 0
sysfs /syssysfs defaults 0 0
4.6创建/etc/inittab文件
init程序会读取/etc/inittab这个文件,inittab由若干条指令组成,每条指令的结构相同
:::
参数功能
id每位指令的标示符,不能重复
runlevels对busybox来说此项完全没用,空着
action用于指定process可能用到的动作
process具体的动作,例如程序、脚本或命令等
action动作参数如下:
输入指令:
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount-a-r
::shutdown:/sbin/swapoff-a
指令功能:
第2行,系统启动之后运行/etc/init.d/rcS这个脚本文件
第3行,将console作为控制台终端,也就是ttymxc0并口
第4行linux,重启的话运行/sbin/init
第5行,按下ctrl+alt+del组合键的话就运行/sbin/reboot,看来ctrl+alt+del组合键用于重
启系统
第6行,死机的时侯执行/bin/umount,也就是卸载各个文件系统
第7行,死机的时侯执行/sbin/swapoff,也就是关掉交换分区
4.7创建/etc/resolv.conf文件
在rootfs中新建文件/etc/resolv.conf,输入如下内容
nameserver 114.114.114.114
nameserver 210.45.244.1
配置域名解析服务器的IP地址,以便测试网路联接
五、nfs测试rootfs
uboot上面的bootargs环境变量会设置root的值,用于指引系统找到rootfs
nfs挂载的格式如下:
root=/dev/nfsnfsroot=[:][,]ip=::::::::
server-ip:服务器IP地址,也就是储存根文件系统主机的IP地址
root-dir:根文件系统的储存路径,例如我的就是/home/jeck/linux/nfs/rootfs
nfs-options:NFS可选选项,通常不设置
client-ip:顾客端IP地址,也就是我们开发板的IP地址,Linux内核启动之后才会使用此IP地址来配置开发板
gw-ip:网段地址
netmask:子网网段,通常是255.255.255.0
hostname:顾客机的名子,通常不设置,此值可以空着
device:设备名,也就是网卡名,通常是eth0,eth1,正点原子的I.MX6U-ALPHA开
发板的ENET2为eth0,ENET1为eth1。假如笔记本只有一个网卡,这么基本只能是eth0
autoconf:手动配置,通常不使用,所以设置为off
dns0-ip:DNS0服务器IP地址,不使用
dns1-ip:DNS1服务器IP地址,不使用
对于我的配置,root值入下:
root=/dev/nfs nfsroot=210.45.244.70:/home/jeck/linux/nfs/rootfs,proto=tcp rw
ip=210.45.244.17:210.45.244.70:210.45.244.1:255.255.255.0::eth0:off
步入uboot设置启动参数完成后,从nfs挂载根文件系统linux,启动成功后测试目录
————————————————
版权申明:本文为CSDN博主「Top嵌入式」的原创文章,遵守CC4.0BY-SA版权合同,转载请附上原文出处链接及本申明。
原文链接:
本文原创地址://lrxjmw.cn/srljlxtqdgwj.html编辑:刘遄,审核员:暂无