一、什么是文件系统
文件系统可以简单理解为两个部分,一个是文件,另一个是系统。文件系统是一个用来组织和管理文件的系统,有了文件系统之后,就可以轻松操作存储在存储介质上的文件,比如文件的增、删、查、改等基本操作。文件系统的格式有很多种(fat32、ext2、ext3、ntfs等)。
根文件系统:最顶端称为根,在Linux上用“ \ ”表示,然后将一个按照特定目录组成的文件系统挂载到根上,这个系统就叫做根文件系统。
二、不同工具构建文件系统的优缺点
三、Busybox
Busybox是一个集成大量Linux命令的工具,例如ls,cat,cp等命令,使用busybox可以很容易构建出根文件系统需要的命令。
3.1 从官网下载busybox的源码并解压
Busybox官网:https://busybox.net/
3.2 使用命令make menuconfig进入图形界面来配置busybox
找到对应的交叉编译器进入该编译器目录的bin文件下,复制它的绝对路径到图形界面的对应地方,并未路径后面加上编译器的头部。
在绝对路径bin之后还需要添加编译器名称的头部,复制过去即可
最后回车退出保存,这样交叉编译器就配置好了
然后配置Build static binary是否选中,取消选中,因为静态编译会使编译后的文件变得很大。最后配置busybox支持中文,需要修改libbb/printable_string.c,注释掉两处if(c>=0x7f) break;
还需要修改libbb/unicode.c,同样需要将if(c>=0x7f) 修改掉
接着再打开图形配置界面,选中vi-style line editing commands,support unicode选中mdev(热插拔功能)。
输入make编译busybox,编译成功后输入make install,完成后就可以看到busybox生成的文件夹
3.3 完善根文件系统
制作的文件系统还需要新建“dev,etc,lib,lib64.mntprocsys,tmp,var”文件夹,在安装目录install/使用命令:sudo mkdir devetc liblib64 mnt proc sys tmp var
创建文件,接下来的工作重点是etc和lib这两个文件夹
3.3.1lib文件
对于lib这个文件的完善我们需要把对应的交叉编译器的库拷贝到lib文件夹下
你可以选择复制整个文件夹也可以使用sudo cp <绝对路径>*
的方式拷贝所有目录
3.3.2 etc文件
首先进入到创建好的etc文件下,使用命令“vim ethO-setting
”创建网络配置信息文件,这个文件里面 存放都是如IP地址,网关等网络信息,使用命令“chmod777eth0-setting
修改权限为777,并在“eth0-setting” 文件里输入下面的内容:
IP=192.168.1.230
Mask-255.255.255.0
Gateway=-192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90
IP:开发板启动后默认设置的IP地址,IP地址为192.168.1.230
Mask:开发板启动后默认设置的掩码,掩码为,255.255.255.0
Gateway:开发板启动手默认配置的网关,网关为192.168.1.1
DNS:开发板启动后默认设置的DNS,DNS为192.168.1.1
MAC:开发板启动后默认设置的MAC地址,MAC地址为08:90:90:90:90:90
MAC地址和本文保持一致即可,其余网络信息大家依据自己的网络情况设置即可
接下来还需要在etc文件下输入sudo mkdir init.d
创建一个文件,使用“cdinit.d
”命令进入到“init.d”文件夹,并在“init.d” 文件夹下面使用“vim ifconfig-eth0
”命令建立“ifconfig-eth0”文件, 然后在里面输入以下内容,最后使用命令“sudo chmod777ifconfig-eth0
”修改权限为777
#!/bin/sh
echo -n Try to bring eth0 interface up. >/dev/ttS0
if[-f/etc/eth0-setting];then
source /etc/eth0-setting|
if grep -q "^/dev/root/nfs "/etc/mtab;then
echo-n NFS root..> /dev/ttyS0
else
ifconfig eth0 down
ifconfig eth0 hw ether$MAC
ifconfig ethO $IP netmask $Mask up
route add default gw $Gateway
6
echo nameserver $DNS >/etc/resolv.conf
else
if grep -q"^/dev/root/nfs"/etc/mtab;then
echo -n NFS root.> /dev/ttyS0
else
/sbin/ifconfigeth0192.168.253.12 netmask255.255.255.0up fi
fi
echo Done >/dev/ttyS0
ifconfig-eth0是一个网络配置文件,大致工作流程就是读取我们创建的eth0-setting文件来设置网络,如果eth0-setting文件不存在就使用默认配置
最后,在“init.d”文件夹下使用“sudo vi rcS
”命令建立“rcS”文件,并输入以下内容, 最后使用命令“sudo chmod 777 rcS
”修改权限为777。rcS文件也是一个配置文件,是用来配置 Linux系统的
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin: runlevel=S
prevlevel-N
umask 022
dxport PATH runlevel prevlevel
B
#Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
trap":"INT QUIT TSTP
/bin/hostname iTOP-LS2K1000
mount -a
echo/sbin/mdev>/proc/sys/kernel/hotplug /sbin/mdev -s
mkdir-p /dev/pts
/bin/mount-n -t devpts none /dev/pts-o mode-0622 mkdir p /var/empty
mkdir-p /var/log
mkdir-p /var/log/boa
mkdirp /var/lock
mkdir p /var/run
mkdir-p /var/tmp
sysloqd
/etc/rc d/init.d/netd start
mkdir /mnt/disk
/sbin/ifconfiglo 127.0.0.1 /etc/init.d/ifconfig-eth0 sleep 1
echo 如****4
~/dev/ttySO
echo **
****************"> /dev/ttyS0
返回到“initd”文件夹的上一级目录“etc”,并使用命令使 用“sudo vi passwd
”命令建立文件“passwd”,并输入以下内容,最后使用命令使用“sudo chmod 755 passwd
” 命令修改“passwd” 文件的权限为777
root:x:0:0:root/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:9999:Nobody/:
在inittab文件里面执行了console:askfirst:-/bin/sh
语句,启动/bin/sh 的时候会启动 /etc/profile 文件的配置信息,后面我们也会创建 inittab文件,这里我们先来编写 profile 文件.使用“sudo vi profile
”命令在“etc”目录建立“profile”文件,并输入以下内容 最后使用“sudo chmod 755 profile
”命令修改“profile”文件的权限,如下图所示:
#Ash profile
#vim: syntax=sh
#No core files by default
ulimit-Sc 0>/dev/null2>&1
USER="`id-un`"
LOGNAME=SUSER
PS1=TSUSER@SHOSTNAME]#
PATH=SPATH
HOSTNAME=`/bin/hostname`
eXport USER LOGNAME PS1 PATH
netd文件是用用来配合 profile文件里面的/etc/rcd/init.d/netd start
的这行代码来启 动netd服务的。这里我们就来一起创建这个文件,使用“sudo mkdir rcd
”命令在“etc”目录建立文件夹“rcd,然后使用“cd rcd
” 命令进入到刚才建立的“rcd”文件夹,接下来在“rc.d”目录下使用“sudo mkdir init.d
”命令建立“init.d”文件夹, 使用“cd init.d
” 命令进入到刚才建立的“init.d”文件夹下,输入命令sudo vi netd
,写入以下代码:
#!/bin/sh
base-inetd
#See how we were called.
case "$1" in
start)
/usr/sbin/$base
stop)
pid-/bin/pidof Sbase if[-n "$pid"];then kill-9 $pid
fi
esac exit 0
我们返回到etc目录下,并使用命令sudo vim inittab
创建inittab文件,并写入以下 内容,接着使用命令sudo chmod 777 inittab
修改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
回到etc 目录下,使用命令sudo vim fstab
创建fstab文件,然后输入以下内容,输入完成后并修改权限为777,fstab文件是配置Linux 系统启动以后自动挂载的分区。
proc /proc proc defaults 0 0
tmpfs /tmp tmpfsdefaults 0 0
sysfs /sys sysfs defaults 0 0
在etc 目录下面,使用命令sudo vim mdev.conf
新建mdev.conf 文件,因为我们在rcS文件里面配置了热拔插功能,但是还需要mdev.conf配合,mdev.conf 文件是U 盘 sd卡的热拔插文件,我们在 mdev.conf 输入以下内容:
sd[a-z][0-9] 0:0 666 @ /etc/hotplug/udisk inserting
sd[a-z]D:0 666$/etc/hotplug/udisk removing
然后在hotplug 文件夹下创建 udisk_inserting 和udisk_removing 文件,并把权限修改 成777,在里面输入以下内容:
udisk_inserting:
#!/bin/sh
echo"usbdisk insert!">/dev/console
if[-e"/dev/$MDEV" I ;then
mkdir -p/mnt/usbdisk/$MDEV
mount/dev/$MDEV/mnt/usbdisk/$MDEV
echo"/dev/$MDEV mountedin/mnt/usbdisk/$MDEV">/dev/console
fi
udisk_removing
#!/bin/sh
echo "usbdisk remove!">/dev/console umount-I/mnt/usbdisk/sd*
rm -rf/mnt/usbdisk/sd*
我们需要在etc 目录下创建mtab文件,/etc/mtab是当前的分区挂载情况,记录的是当前系统已挂载的分区。每次挂载/卸载分区时会更新/etc/mtab文件中的信息。所以在 ifconfig-eth0 文件里面我们就是通过这个/etc/mtab来判断当前的文件系统是不是nfs网络文件系统。
3.4打包busybox文件系统
首先返回到文件系统源码所在文件下的上一级目录,在这个目录下创建一个rootfs文件,然后输入命令dd if = /dev/zero of = rootfs.img bs = 1M count = 300
,接下来将打包好的文件格式化为ext4格式的mkfs.ext4 rootfs.img 然后将rootfs.img 挂载到rootfs文件下sudo mount rootfs.img rootfs
最后将我们制作好的sys复制到rootfs文件下sudo cp -rfpd sys/* ./rootfs
,取消挂载sudo umount rootfs
,到这里文件系统就已经打包好了,我们可以将这个文件系统烧写到开发板上