Linux系统镜像构建(3):根文件系统

1. 根文件系统的介绍

1.1. 根文件系统简介

根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。 相当于windows下的C盘,保存了系统启动后的应用程序和系统配置

1.2. 根文件系统目录简介

/bin目录

该目录下的命令可以被root与一般账号所使用,由于这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。 /bin目录下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir等。我们之后在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。

/sbin 目录

该目录下存放系统命令,即只有系统管理员(俗称最高权限的root)能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统和修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中。 /sbin目录下常用的命令有:shutdown、reboot、fdisk、fsck、init等,本地用户自己安装的系统命令放在/usr/local/sbin目录下。

/dev目录

该目录下存放的是设备与设备接口的文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。比如通过”dev/ttySAC0”文件可以操作串口0,通过”/dev/mtdblock1”可以访问MTD设备的第2个分区。比较重要的文件有/dev/null, /dev/zero, /dev/tty, /dev/lp*等。

/etc目录

该目录下存放着系统主要的配置文件,例如人员的账号密码文件等。一般来说,此目录的各文件属性是可以让一般用户查阅的,但是只有root有权限修改。对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。

/lib目录

该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,比如:/bin /sbin 目录下的程序。

/home目录

系统默认的用户文件夹,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。

/root目录

系统管理员(root)的主文件夹,即是根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。

/usr目录

/usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。

/var目录

与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。

/proc目录

这是一个空目录,常作为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。

/mnt目录

用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、移动存储设备等。

/tmp目录

用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。

对于嵌入式Linux系统的根文件系统来说,一般可能没有上面所列出的那么复杂,比如嵌入式系统通常都不是针对多用户的,所以/home这个目录在一般嵌入式Linux中可能就很少用到,而/boot这个目录则取决于你所使用的BootLoader是否能够重新获得内核映象从你的根文件系统在内核启动之前。一般说来,只有/bin,/dev,/etc,/lib,/proc,/var,/usr这些需要的,而其他都是可选的。

1.3. 常见的根文件系统

根文件系统本质都是一些文件和配置信息组成,之间的界限没有很明确的界定,以下大致列出一些根文件系统的特点

未找到图片youquedian

2. Buildroot根文件系统的构建

2.1. 什么是Buildroot?

Buildroot是Linux平台上一个开源的嵌入式Linux系统自动构建框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件。

2.2. 安装一些依赖文件

sudo apt-get install zlib1g-dev unzip gcc g++ aptitude lib32stdc++6-4.8-dbg make build-essential libncurses5 libncurses5-dev u-boot-tools traceroute -y

2.3. 安装交叉编译工具链

可以到官网下载 Linaro Releases 也可以使用我们提供的工具包 交叉编译器下载 找一个自己熟悉的位置放置,我放在 /home/lhf 文件夹下 解压 tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar

未找到图片arm1

进入工具链文件夹 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf 获取路径 pwd 我的路径为 /home/lhf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf 该路径需要记录一下,等会设置工具链的时候需要使用

cd gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
pwd
/home/lhf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf

2.4. Buildroot构建

我们可以到官网地址下:Buildroot - Making Embedded Linux Easy 打开后如图

选择DOWNLOAD

未找到图片1

我们选择长期支持版本(LTS),两个压缩格式,选择其中一个即可

未找到图片2

也可使用我们提供的源码包 Buildroot下载 构建根文件系统

tar -vxf buildroot-2021.02.3.tar.gz
cd buildroot-2021.02.3
make menuconfig

 2.4.1. 配置Target options

Target options
        -> Target Architecture = ARM (little endian)
        -> Target Binary Format = ELF
        -> Target Architecture Variant = cortex-A7
        -> Target ABI = EABIhf
        -> Floating point strategy = NEON/VFPv4
        -> ARM instruction set = ARM

未找到图片

2.4.2. 配置Toolchain

Toolchain
   -> Toolchain type = External toolchain
   -> Toolchain = Custom toolchain //选择用户的交叉编译器
   -> Toolchain origin = Pre-installed toolchain
   -> Toolchain path =/home/lhf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf //这里填入我们上面获得的交叉编译器路径
   -> Toolchain prefix = arm-linux-gnueabihf //前缀
   -> External toolchain gcc version = 7.x
   -> External toolchain kernel headers series = 4.10.x
   -> External toolchain C library = glibc/eglibc
   -> [*] Toolchain has SSP support? (NEW) //选中
   -> [*] Toolchain has RPC support? (NEW) //选中
   -> [*] Toolchain has C++ support? //选中
   -> [*] Enable MMU support (NEW) //选中

未找到图片toolchain

2.4.3. 配置System configuration

System configuration
   -> System hostname = Embedfire_imx6ull //平台名字
   -> System banner = Welcome to embedfire i.mx6ull //欢迎语
   -> Init system = BusyBox //使用 busybox
   -> /dev management = Dynamic using devtmpfs + mdev //使用 mdev
   -> [*] Enable root login with password (NEW) //使能登录密码
   -> Root password = root //登录密码为 root

未找到图片system

2.4.4. 配置Filesystem images

这个选项是配置将编译生成什么格式的根文件系统,可以做如下配置

-> Filesystem images
   -> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4
      -> ext2/3/4 variant = ext4 //选择 ext4 格式
-> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs

对于本教程,我们需要配置也可以。我们是使用nfs挂载网络根文件系统

未找到图片

2.4.5. 关闭kernel和uboot的编译

Buildroot不仅能构建根文件系统,还可以编译kernel和uboot,但是这些源码是从官网下载的,很可能是没包含各芯片厂商的驱动文件。所以我们关闭kernel和uboot编译即可,kernel和uboot的教程可参考

《kernel编译》

《uboot编译》

1
2
-> Kernel
-> [ ] Linux Kernel //取消 Linux Kernel 选项!

未找到图片

1
2
-> Bootloaders
-> [ ] U-Boot //取消 U-Boot 选项!

未找到图片

2.4.6. 编译Buildroot

执行 sudo make

需要注意的是buildroot下载的源码网速会比较慢,我们可以自己手动下载再放到buildroot源码目录下的 dl 文件夹中

编译完成后文件在 ./output/images 文件夹中 rootfs.tar 为本教程需要的文件

未找到图片

2.5. 搭建NFS网络系统

先更新一下apt包 sudo apt-get update

1
sudo apt-get update

安装 NFS服务器端 sudo apt-get install nfs-kernel-server

1
sudo apt-get install nfs-kernel-server

创建NFS共享目录 mkidr ~/nfs

1
mkidr ~/nfs

编辑指定目录 sudo vim /etc/exports

1
sudo vim /etc/exports

添加入下代码 /home/你的用户名/nfs *(rw,sync,no_root_squash)

1
/home/你的用户名/nfs *(rw,sync,no_root_squash)

未找到图片exoirts

给目录添加权限 sudo chmod -R 777 ~/nfs && sudo chown root:root ~/nfs/ -R

1
sudo chmod -R 777 ~/nfs && sudo chown root:root ~/nfs/ -R

启动 NFS 服务 /etc/init.d/nfs-kernel-server restart

1
/etc/init.d/nfs-kernel-server restart

未找到图片

如图就是启动成功了

我们把刚得到的rootfs.tar 解压到nfs目录下

1
2
cp /home/lhf/buildroot-2021.02.3/output/images/rootfs.tar /home/lhf/nfs
tar -vxf /home/lhf/nfs/rootfs.tar -C /home/lhf/nfs

先看一下我们NFS主机的地址 ifconfig 我这里地址为 192.168.0.139

未找到图片zhujiip

再看一下网关地址 traceroute baidu.com 第一条地址一般为网关地址,我这里为 192.168.0.1

未找到图片ipway

我们在局域网中找一个没有用到的地址,我这里为 192.168.0.142 要根据你们的网段来更改 **192.168.0**的部分

未找到图片errip

没有ping通,很大概率没有设备在使用这个地址 192.168.0.142

2.6. 设置Uboot环境参数

上电快速按回车进入Uboot

1
2
3
4
5
6
setenv gatewayip '192.168.0.1'
setenv netmask '255.255.255.0'
setenv ipaddr '192.168.0.142'
setenv serverip '192.168.0.139'
setenv args_mmc_old 'setenv bootargs console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.0.139:/home/lhf/nfs rw ip=192.168.0.142:192.168.0.139:192.168.0.254:255.255.255.0::eth0:off'
saveenv

我们试一下开发板能否ping通到主机 ping 192.168.0.139

未找到图片pingzhuji

发现可以ping的通,我们试试能否自动挂载上我们的根文件系统用命令 reset 重启

未找到图片loding

这样就成功挂载上我们的根文件系统了。账号密码都为 root

我们发现我们的命令行在任何目录下都是 # 

我们可以修改 **/etc/profile**文件来让其显示具体路径

1
vi /etc/profile

做如图修改

未找到图片lujingxiugai

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
PS1='\u@\h:\w$:'
export PS1
export EDITOR='/bin/vi'
# Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; do
      if [ -r "$i" ]; then
               . $i
      fi
done
unset i

然后重启即可

1
reboot

如图

未找到图片lujky

3. busybox根文件系统的构建

3.1. 什么是busybox

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的shell。

3.2. 下载源码

BusyBox 可以到官网下载

未找到图片down

点击左侧的Download Source

下载当前最新版本busybox-1.33.1.tar.bz2 也可以使用我们提供的文件

busybox-1.33.1.tar.bz2

3.3. 安装一些依赖文件

sudo apt-get install zlib1g-dev unzip gcc g++ aptitude lib32stdc++6-4.8-dbg make build-essential libncurses5 libncurses5-dev u-boot-tools traceroute sudo gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y

3.4. busybox构建

将busybox-1.33.1.tar.bz2放置到一个你熟悉的目录,我这里选择为 /home/lhf 解压 busybox-1.33.1.tar.bz2

tar -vxf busybox-1.33.1.tar.bz2
cd busybox-1.33.1
make menuconfig

3.5. 配置busybox

3.5.1. 修改Makefile

在第164行,将 CROSS_COMPILE ?= 修改为 CROSS_COMPILE :=arm-linux-gnueabihf- 注意: **arm-linux-gnueabihf-**为你交叉编译器前缀,若编译其他soc请使用官方提供的交叉编译工具

#CROSS_COMPILE ?=
CROSS_COMPILE :=arm-linux-gnueabihf-

3.5.2. 配置menuconfig

执行 make menuconfig

Settings
        -> Build static binary (no shared libs)  //选中静态编译,便于调用的文件不会因为库文件的更改和报错

未找到图片jtaibiany

Linux System Utilities
        ->mdev  //支持mdev

未找到图片mdev

3.5.3. 编译

执行 make 和 make install

默认生成在busybox目录下的_install文件夹中 我们进入到 _install 目录进行一些修改 

cd _install
mkdir dev etc lib var proc tmp home root mnt sys
cd ./dev
sudo mknod console c 5 1
sudo mknod null c 1 3
cd ../etc
vi inittab

 在 inittab 中添加一句

console::askfirst:-/bin/sh

:wq 保存退出

将 _install 目录下的文件拷贝到我们的nfs中进行测试 注意:

./目录是_install

 /home/lhf/nfs是你的nfs网络文件系统根目录,

cd ../ #从etc目录回到_install目录
cp -rf ./* /home/lhf/nfs

 重启开发板 等开发板启动成功后我们进入了我们编译好的busybox根文件系统 我们看看根文件系统整体大小为 du -sh

编译好的busybox根文件系统 我们看看根文件系统整体大小为 du -sh

未找到图片wanc

3.6. 小结

仅占1.5M,虽然占用空间是小了,但是功能也非常少,若要安装某项功能还需自行交叉编译到文件系统。仅适合对存储比较敏感且只需完成某一项功能的系统使用。如果想使用较全的功能对存储不敏感的用户可以使用debain根文件系统。我们将会在下一节讲解ubuntu根文件系统的构建

3.7. 参考资料

https://baike.baidu.com/item/busybox/427860?fr=aladdin 韦东山笔记之用busybox构建根文件系统 - 恒久力行 - 博客园 用BusyBox制作Linux最小系统 - wchonline - 博客园

4. Ubuntu Base构建根文件系统

4.1. 什么是Ubuntu Base

Ubuntu 针对不同的 CPU 架构提供相应的 ubuntu base 根文件系统,目前提供的架构有amd64、arm64、armhf、i386、s390x、ppc64.

4.2. 下载Ubuntu Base

我们可到官网下载自己需要的版本 Index of /ubuntu-base/releases 目前最新版本到21.04,

未找到图片2004

未找到图片release

未找到图片down

也可以使用我们提供的20.04版本

ubuntu-base-20.04.1-base-armhf.tar.gz

不使用最新版本是因为国内对于ubuntu-arm的镜像站比较少,目前阿里云所支持的最新版本ubuntu镜像为20.04,等支持21.04版本后大家可以构建ubuntu 21.04,我这里就以20.04版本举例说明构建方法

4.3. 安装一些依赖文件

sudo apt-get install tar qemu-user-static vim -y

4.4. 配置根文件系统

我们创建一个文件夹ubuntu_rootfs存放我们的根文件系统

mkdir ubuntu_rootfs && cd ubuntu_rootfs
tar -vxf ubuntu-base-20.04.1-base-armhf.tar.gz
sudo cp /usr/bin/qemu-arm-static ./usr/bin/
sudo cp ./etc/apt/sources.list ./etc/apt/sources.list.back
sudo echo "nameserver 8.8.8.8"  > ./etc/resolv.conf
sudo vim ./etc/apt/sources.list

阿里云镜像站 我们需要注意的是,这个站点默认提供的是amd64的ubuntu 镜像,所以我们需要在ubuntu后面加上-ports,如下所示

如果是ubuntu 20.04版本则可以将如下链接填入 ./etc/apt/sources.list 中

deb http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu-ports/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse

 保存退出

sudo chroot ./
apt install vim sudo kmod net-tools ethtool ifupdown language-pack-en-base rsyslog htop iputils-ping -y //添加一些需要的应用
passwd root //设置root的密码
exit

现在我们可以把该目录放置到我们的NFS中试试能否启动,/home/lhf/nfs是你的nfs网络文件系统根目录,

sudo cp -rf ./* /home/lhf/nfs

4.5. 启动开发板

su root

未找到图片sufl

成功启动了我们的ubuntu根文件系统,往后可以通过apt进行应用的安装。

5.Debian根文件系统的构建

5.1. 前言

我们这里使用目前Debian社区较为推荐的Multistrap构建Debian根文件系统,与传统的debootstrap不同,multistrap在包的选择上更具灵活性

Multistrap的详细信息可以看 multistrap(1) — multistrap — Debian bullseye — Debian Manpages

5.2. 安装依赖

sudo apt-get install tar qemu-user-static vim multistrap -y

5.3. 配置config_file

我们创建一个文件config_file存放我们需要安装的包信息

touch ./config_file
mkdir ./rootfs
vim ./config_file

填入如下内容

 [General]
  #directory=target-rootfs
  cleanup=true
  noauth=true
  unpack=true
  debootstrap=Debian Net Utils Ebf
  aptsources=Debian
  noauth=true # GPG error

  [Debian]
  packages=apt kmod lsof
  #source=https://mirrors.sjtug.sjtu.edu.cn/debian/
  source=https://mirrors.tuna.tsinghua.edu.cn/debian/
  keyring=debian-archive-keyring
  suite=buster
  components=main contrib non-free

  [Net]
  # Basic packages to enable the networking
  packages=netbase net-tools ethtool udev iproute2 iputils-ping ifupdown isc-dhcp-client ssh
  #source=https://mirrors.sjtug.sjtu.edu.cn/debian/
  source=https://mirrors.tuna.tsinghua.edu.cn/debian/

  [Utils]
  # General purpose utilities
  packages=locales vim adduser less wget dialog usbutils
  #source=https://mirrors.sjtug.sjtu.edu.cn/debian/
  source=https://mirrors.tuna.tsinghua.edu.cn/debian/

  [Lhf]
  packages=python3 mate-desktop-environment
  source=http://mirrors.bfsu.edu.cn/debian
  suite=buster
  components=main contrib non-free

  [Ebf]
  packages= ifupdown rsyslog htop iputils-ping
  source=http://mirrors.bfsu.edu.cn/debian
  suite=buster
  components=main

 其中只需要将需要的安装包添加到 [Ebf] 中的 packages 即可

5.4. 下载与构建

然后执行 multistrap -a armhf -d ./rootfs/ -f ./config_file

multistrap -a armhf -d ./rootfs/ -f ./config_file

等待配置完成后执行如下代码配置密码

cd ./rootfs
sudo cp /usr/bin/qemu-arm-static ./usr/bin/
sudo echo "nameserver 8.8.8.8"  > ./etc/resolv.conf
sudo chroot ./
passwd root //设置root的密码
exit

 现在我们可以把该目录放置到我们的NFS中试试能否启动,/home/lhf/nfs是你的nfs网络文件系统根目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值