根文件系统
- 1 介绍
- 1.1 根文件系统介绍
- 1.2 根文件系统目录
- 1.3 常见的根文件系统
- 2 Buildroot 根文件系统的构建
- 2.1 介绍
- 2.2 依赖文件
- 2.3 交叉编译工具
- 2.4 构建
- 2.4.1 配置 Target options
- 2.4.2 配置 Toolchain
- 2.4.3 配置 System configuration
- 2.4.4 配置 Filesystem images
- 2.4.5 关闭 kernel 和 uboot 的编译
- 2.4.6 编译 Buildroot
- 2.5 搭建 NFS 网络系统
- 2.6 设置 u-boot 环境参数
- 3 busybox 根文件系统的构建
- 3.1 busybox 简介
- 3.2 下载源码
- 3.3 安装依赖
- 3.4 构建 busybox
- 3.5 配置 busybox
- 3.5.1 修改 Makefie
- 3.5.2 配置 menuconfig
- 3.5.3 编译
- 4 Ubuntu Base 构建根文件系统
- 4.1 什么是 Ubuntu Base
- 4.2 下载Ubuntu Base
- 4.3 安装一些依赖文件
- 4.4 配置根文件系统
- 4.4 启动开发板
- 5 Debian 根文件系统的构建
- 5.1 安装依赖
- 5.2 配置config_file
- 5.3 下载与构建
- 5.4 调试与烧写
- 参考
1 介绍
1.1 根文件系统介绍
根文件系统首先是内核启动时所 mount 的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。相当于 windows 下的 C 盘,保存了系统启动后的应用程序和系统配置。
1.2 根文件系统目录
目录 | 描述 |
---|---|
/ | 根目录,所有其他目录和文件的起点 |
/bin | 存放系统命令的二进制文件,如ls 、cp 、cat 、chgrp 、chmod 、cp 、ls 、sh 、kill 、mount 、umount 、mkdir 等 |
/sbin | 存放系统管理命令的二进制文件,通常由root使用,系统命令还可以存放在/usr/sbin ,/usr/local/sbin 目录下,/sbin 目录中存放的是基本的系统命令,它们用于启动系统和修复系统等,与 /bin 目录相似,在挂接其他文件系统之前就可以使用 /sbin ,所以/sbin 目录必须和根文件系统在同一个分区中。/sbin 目录下常用的命令有:shutdown、reboot、fdisk、fsck、init 等,本地用户自己安装的系统命令放在 /usr/local/sbin 目录下。 |
/etc | 系统配置文件存放的目录,例如人员的账号密码文件、各种服务的其实文件等。 |
/dev | 包含设备文件,例如硬盘、打印机等 |
/lib | 存放系统库文件,包括动态链接库、内核模块等 |
/proc | 虚拟文件系统,包含进程和内核信息,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。 |
/var | 存放经常变化的文件,如日志文件 |
/tmp | 存放临时文件的目录 |
/usr | 用户相关的应用程序和文件,/usr 目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的 /usr 目录下。里面存放的是共享、只读的程序和数据,这表明 /usr 目录下的内容可以在多个主机间共享,这些主要也符合 FHS 标准的。/usr 中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如 /var 。 |
/usr/bin | 用户使用的系统命令的二进制文件 |
/usr/sbin | 用户使用的系统管理命令的二进制文件 |
/usr/local | 存放本地安装的软件和文件 |
/home | 用户的个人目录,存放用户文件 |
/opt | 存放可选包的目录 |
/mnt | 临时挂载文件系统的挂载点,用来临时挂载光盘、移动存储设备等。 |
/boot | 存放启动加载程序和内核文件 |
/root | root用户的主目录 |
/sys | 另一个虚拟文件系统,包含系统设备信息 |
/srv | 存放服务相关数据的目录 |
/lost+found | 文件系统损坏时,存放恢复文件的目录 |
对于嵌入式 Linux 系统的根文件系统来说,一般可能没有上面所列出的那么复杂,比如嵌入式系统通常都不是针对多用户的,所以 /home 这个目录在一般嵌入式 Linux 中可能就很少用到,而 /boot 这个目录则取决于你所使用的 BootLoader 是否能够重新获得内核映象从你的根文件系统在内核启动之前。一般说来,只有 /bin,/dev,/etc,/lib,/proc,/var,/usr 这些需要的,而其他都是可选的。
1.3 常见的根文件系统
根文件系统本质都是一些文件和配置信息组成,之间的界限没有很明确的界定,以下大致列出一些根文件系统的特点。
2 Buildroot 根文件系统的构建
2.1 介绍
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
2.3 交叉编译工具
可以到官网下载 https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/
arm-linux-gnueabihf/ 也可以使用我们提供的工具包 交叉编译器下载找一个自己熟悉的位置放置,
我放在 /home/lhf 文件夹下解压 tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar
进入工具链文件夹 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 构建
我们可以到官网地址下:https://buildroot.org/ 打开后如图
选择 DOWNLOAD
我们选择长期支持版本 (LTS),两个压缩格式,选择其中一个即。
也可使用我们提供的源码包 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) //选中
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
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
-> [ ] Linux Kernel //取消 Linux Kernel 选项!
-> Bootloaders
-> [ ] U-Boot //取消 U-Boot 选项!
2.4.6 编译 Buildroot
sudo make
需要注意的是 buildroot 下载的源码网速会比较慢,我们可以自己手动下载再放到 buildroot 源码
目录下的 dl 文件夹中编译完成后文件在 ./output/images 文件夹中 rootfs.tar 为本教程需要的文件。
2.5 搭建 NFS 网络系统
sudo apt-get updat
# 安装 NFS 服务器端 sudo apt-get install nfs-kernel-server
sudo apt-get install nfs-kernel-server
# 创建 NFS 共享目录 mkidr ~/nfs
mkidr ~/nfs
# 编辑指定目录 sudo vim /etc/exports
sudo vim /etc/exports
# 添加入下代码 /home/你的用户名/nfs *(rw,sync,no_root_squash)
/home/你的用户名/nfs *(rw,sync,no_root_squash)
# 给目录添加权限 sudo chmod -R 777 ~/nfs && sudo chown root:root ~/nfs/ -R
sudo chmod -R 777 ~/nfs && sudo chown root:root ~/nfs/ -R
# 启动 NFS 服务 /etc/init.d/nfs-kernel-server restart
/etc/init.d/nfs-kernel-server restart
# 我们把刚得到的 rootfs.tar 解压到 nfs 目录下
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
再看一下网关地址 traceroute baidu.com 第一条地址一般为网关地址, 我这里为 192.168.0.1
我们在局域网中找一个没有用到的地址,我这里为 192.168.0.142 要根据你们的网段来更
改。
2.6 设置 u-boot 环境参数
上电快速按回车进入 u-boot
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
发现可以 ping 的通,我们试试能否自动挂载上我们的根文件系统用命令 reset 重启
这样就成功挂载上我们的根文件系统了。账号密码都为 root
我们发现我们的命令行在任何目录下都是 # 修改 /etc/profile 文件来让其显示具体路径
vi /etc/profile
# 导出PATH环境变量,包含基本的系统命令路径
export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
PS1='\u@\h:\w$:'
export PS1
# 设置默认的文本编辑器为vi
export EDITOR='/bin/vi'
# 注释掉的行,不会执行
# Source configuration files from /etc/profile.d
# 以下是一个for循环,用于加载/etc/profile.d目录下的所有.sh脚本文件
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
. "$i"
fi
done
# 取消设置的变量
unset i
然后重启即可, reboot
3 busybox 根文件系统的构建
3.1 busybox 简介
BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。BusyBox 包含了一些简单的工具,例如 ls、cat 和 echo 等等,还包含了一些更大、更复杂的工具,例 grep、find、mount 以及 telnet。
有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。
3.2 下载源码
https://busybox.net/ 可以到官网下载
下载当前最新版本 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 解压 busybox1.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 修改 Makefie
在第 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
make menuconfig
Settings
-> Build static binary (no shared libs) //选中静态编译,便于调用的文件不会因为库文件的更改和报错
Linux System Utilities
->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 网络文件系统根目录,若未搭建 nfs 网络文件系统,请参考 6.5 小节 搭建 NFS 网络系统
cd ../ # 从 etc 目录回到_install 目录
cp -rf ./* /home/lhf/nfs
重启开发板等开发板启动成功后我们进入了我们编译好的 busybox 根文件系统我们看看根文件系统整体大小为 du -sh
仅占 1.5M,虽然占用空间是小了,但是功能也非常少,若要安装某项功能还需自行交叉编译到文件系统。仅适合对存储比较敏感且只需完成某一项功能的系统使用。如果想使用较全的功能对存储不敏感的用户可以使用 debain 根文件系统。
4 Ubuntu Base 构建根文件系统
4.1 什么是 Ubuntu Base
Ubuntu 针对不同的 CPU 架构提供相应的 ubuntu base 根文件系统,目前提供的架构有 amd64、arm64、armhf、i386、s390x、ppc64.
4.2 下载Ubuntu Base
我们可到官网下载自己需要的版本 http://cdimage.ubuntu.com/ubuntu-base/releases/ 目前最新版本到 21.04。
也可以使用我们提供的 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 网络文件系统根目录,若未搭建 nfs 网络文件系统,请参考参考 6.5 小节 搭建 NFS 网络系统
sudo cp -rf ./* /home/lhf/nfs
4.4 启动开发板
su root
成功启动了我们的 ubuntu 根文件系统,往后可以通过 apt 进行应用的安装。
5 Debian 根文件系统的构建
我们这里使用目前 Debian 社区较为推荐的 Multistrap 构建 Debian 根文件系统,与传统的 debootstrap 不同,multistrap 在包的选择上更具灵活性 Multistrap 的详细信息可以看 https://manpages.debian.org/bullseye/multistrap/multistrap.1.en.html
5.1 安装依赖
sudo apt-get install tar qemu-user-static vim multistrap -y
5.2 配置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.3 下载与构建
然后执行 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
5.4 调试与烧写
现在我们可以把该目录放置到我们的NFS中试试能否启动,/home/lhf/nfs是你的nfs网络文件系统根目录,若未搭建nfs网络文件系统,请参考 Buildroot根文件系统的构建章节的第5小节 搭建NFS网络系统
如果要烧写到开发板中,参考 根文件系统的几种烧写方法
参考
1、野火–构建系统