
Alpine构建根文件系统
Alpine 是一个轻量级发行版,可用于构建精简的根文件系统,在嵌入式或容器场景有较为广泛的应用。
Alpine可以根据需求定制,有如下几个不同 rootfs 镜像类型(如 alpine-minirootfs
, alpine-baserootfs
)分别面向不同场景。它们对系统底层(系统完整性、依赖大小、设备管理能力 )控制程度各不相同。
Alpine 几个不同rootfs的介绍
minirootfs
- 用途:最小化容器镜像
- 大小:约 2~3MB(压缩后)
- 内容:
- busybox、最基本的
/bin/sh
、/dev
、/proc
、/sys
挂载脚本,apk
,libc
- init:通常直接用 busybox init 或
/sbin/init
脚本
- busybox、最基本的
- 设备管理:
- 不使用 OpenRC
- 只运行一次
mdev -s
建立静态/dev
节点
- 特点:
- 极简、单任务、无 runlevel 概念
- 没有包管理缓存、文档、时区数据等
- 默认使用
mdev
(轻量级设备管理) - 适合做多阶段构建的最终镜像
- 无法直接用于完整系统安装(缺少很多工具)
- 适合“只运行一个程序”的容器场景。
- 典型使用:
FROM alpine:latest-minimal
baserootfs
- 用途:基础系统镜像,用于构建自定义系统或容器
- 大小:比 minirootfs 稍大,但仍精简
- 内容:
- 内置
alpine-base
包(核心系统) - 包括
OpenRC
,apk
,busybox
,基础服务脚本 - 可用于
chroot
或initramfs
场景
- 内置
- 设备管理:
- 通过
mdevd
(守护进程),保证热插拔 - 如果
mdevd
启动失败,则 fallback 到mdev -s
(一次性扫描) - OpenRC 提供
/etc/init.d/mdevd
脚本,确保随sysinit
启动 - 通过
/run/openrc/softlevel
文件记录当前 runlevel(sysinit → boot → default),若文件缺失,OpenRC 丢失多任务依赖顺序,可能造成服务启动混乱 - 可选 eudev(udev)替换,提供更完整设备管理
- 通过
- 特点:
- 轻量 rootfs,通过OpenRC实现多任务支持管理。
- 典型使用:
- 构建定制 Linux 发行版
- 作为
initramfs
的根文件系统 - 在嵌入式系统中使用
- 特点:
- 比 minirootfs 更完整,但仍未包含 udev 等高级设备管理。
standard
- 用途:完整系统安装(物理机/VM)
- 大小:约 100MB+(ISO 镜像)
- 内容:
- 包含OpenRC(或 systemd)、大量系统工具、udev/eudev、网络管理、图形栈等
- 支持磁盘安装、网络配置、用户管理等
- 设备管理:
- udev/eudev(复杂硬件、权限规则、热插拔)
- 使用OpenRC或systemd
- 特点:
- 完整多任务操作系统
- 可以在
baserootfs
基础上运行setup-alpine
完成完整安装 - 支持选择设备管理器(udev 或 mdev)
- 适合长期运行的服务器、路由器、嵌入式设备。
udev eudev mdev区别介绍
上文中提到了,几种不同的设备管理器(dev),在Linux 系统中,硬件设备(如硬盘、USB、鼠标、声卡等)需要在 /dev
目录下创建对应的设备文件(如 /dev/sda
, /dev/ttyUSB0
),才能被程序访问。
如何响应设备插拔(热插拔)? 这就是“设备管理器”要解决的问题。目前主流的三种方案是:udev
、eudev
、mdev
。它们目标相同,但设计哲学、复杂度和适用场景大不相同。
设备节点管理方式(即 /dev
目录如何生成设备文件)。
工具 | 全称 / 来源 | 定位 | 依赖 | 适合系统类型 |
---|---|---|---|---|
udev | Device Manager (systemd 项目) | 原始 udev,与 systemd 高度耦合 | systemd | 只适用于systemd,不推荐独立使用 |
eudev | Embedded udev (fork) | udev 的独立版本,脱离 systemd 运行 | 无 systemd | 通用 Linux(Gentoo, Alpine 等) |
mdev | Mini dev (BusyBox 内建) | 不支持复杂热插拔规则,只简单静态创建设备节点。 | BusyBox | 嵌入式、容器、initramfs |
了解了以上区别可以对技术进行选型
需求 | 推荐配置 |
---|---|
Docker 镜像 | alpine-minirootfs + 无需选择 udev |
路由器/防火墙(如用 OpenWRT 风格) | alpine-baserootfs + mdev |
服务器/VM 安装 | alpine-standard + eudev |
无盘启动/内存运行 | baserootfs + mdev + lbu 保存配置 |
SDK定制镜像 | 根据原本镜像风格确定 |
构建 Alpine Linux 根文件系统
使用 apk
工具直接构建
在 Alpine Linux 系统上安装必要工具
sudo apk add apk-tools tar gzip
创建目标目录
mkdir -p alpine-rootfs
cd alpine-rootfs
初始化 apk 并下载基础系统
# 类似官方 minirootfs
sudo apk --root . --arch aarch64 --initdb add busybox apk-tools libc6-compat
# 类似官方 baserootfs
sudo apk --root . --arch aarch64 --initdb add alpine-base
说明:
--root .
:指定根目录为当前目录--arch aarch64
:指定架构(可改为x86_64
,armhf
等)--initdb
:初始化 apk 数据库alpine-base
:最小基础系统包,可继续按需添加alpine-standard
,alpine-desktop
,alpine-conf
等包
sudo apk --root . --arch x86_64 add busybox openrc
配置基本系统 创建必要的目录和文件
sudo mkdir -p etc/hostname dev proc sys tmp
echo "myalpine" | sudo tee etc/hostname
设置 inittab
(使用 OpenRC)
cat << 'EOF' | sudo tee etc/inittab
::sysinit:/sbin/openrc boot
::shutdown:/sbin/openrc shutdown
::respawn:/sbin/getty 38400 tty1
EOF
设置 fstab
cat << 'EOF' | sudo tee etc/fstab
# <fs> <mountpoint> <type> <opts> <dump/pass>
/dev/sda1 / ext4 defaults 0 1
tmpfs /tmp tmpfs defaults 0 0
devtmpfs /dev devtmpfs defaults 0 0
EOF
设置网络(可选)
echo 'auto lo' | sudo tee etc/network/interfaces
echo 'iface lo inet loopback' | sudo tee -a etc/network/interfaces
设置 root 密码(可选)
echo 'root:alpine' | sudo chroot . chpasswd
或手动设置:
sudo chroot . passwd root
使用官方 Alpine Linux 根文件系统镜像
Alpine 官方提供预构建的根文件系统 tarball。
访问:https://alpinelinux.org/downloads/
选择你需要的版本和架构,例如:
wget https://dl-cdn.alpinelinux.org/alpine/v3.20/releases/aarch64/alpine-minirootfs-3.20.0-aarch64.tar.gz
mkdir alpine-rootfs
tar -xzf alpine-minirootfs-3.20.0-aarch64.tar.gz -C alpine-rootfs
进入并自定义
sudo chroot alpine-rootfs /bin/sh
然后可安装额外软件包:
apk add vim curl bash
常用自定义包:
apk add --root alpine-rootfs \
bash \
curl \
wget \
openssh \
openrc \
e2fsprogs \
util-linux \
dhcpcd \
wpa_supplicant
构建完成后,清理缓存:
sudo apk --root alpine-rootfs cache clean
参考操作:启用 eudev 替换 mdev(baserootfs)
查看当前系统使用哪种设备管理:
ls /sys/class/ # 如果有内容,说明 sysfs 已挂载
cat /proc/mounts | grep dev
ps | grep udev # 看是否有 udevd 进程
ps | grep mdev
安装 eudev(如果使用 baserootfs):
apk add eudev openrc
rc-update add devfs
rc-update add udev-trigger boot
rc-update add udev-mount boot
禁用 mdevd
rc-update del mdevd sysinit
(或者直接 apk del mdevd-openrc
)
启用 udevd 服务
rc-update add udev sysinit
rc-update add udev-trigger sysinit
rc-update add udev-settle sysinit
udev
→ 启动守护进程 udevd
udev-trigger
→ 启动时扫描已有设备并触发规则
udev-settle
→ 等待事件处理完成,保证依赖设备的服务能正确启动
启动并验证
rc-service udev start
rc-service udev-trigger start
#查看是否运行
ps aux | grep udevd
udevadm info /dev/sda
udev 规则位置:
/etc/udev/rules.d/
(用户自定义)/lib/udev/rules.d/
(系统自带) 举例:自动给 USB 存储设置权限,可以写规则:
SUBSYSTEM=="block", KERNEL=="sd[a-z][0-9]", GROUP="disk", MODE="0660"
Comments
Leave a comment