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编辑器:

linux搭建文件管理系统_linux系统建立文件夹命令_linux建文件系统

配置路径:

->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文件系统类型

linux系统建立文件夹命令_linux建文件系统_linux搭建文件管理系统

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组合键用于重

启系统

linux搭建文件管理系统_linux建文件系统_linux系统建立文件夹命令

第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版权合同,转载请附上原文出处链接及本申明。

原文链接:

本文原创地址://gulass.cn/srljlxtqdgwj.html编辑:刘遄,审核员:暂无