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 脚本
  • 设备管理
    • 不使用 OpenRC
    • 只运行一次 mdev -s 建立静态 /dev 节点
  • 特点
    • 极简、单任务、无 runlevel 概念
    • 没有包管理缓存、文档、时区数据等
    • 默认使用 mdev(轻量级设备管理)
    • 适合做多阶段构建的最终镜像
    • 无法直接用于完整系统安装(缺少很多工具)
    • 适合“只运行一个程序”的容器场景。
  • 典型使用
  FROM alpine:latest-minimal

baserootfs

  • 用途:基础系统镜像,用于构建自定义系统或容器
  • 大小:比 minirootfs 稍大,但仍精简
  • 内容
    • 内置 alpine-base 包(核心系统)
    • 包括 OpenRCapkbusybox,基础服务脚本
    • 可用于 chrootinitramfs 场景
  • 设备管理
    • 通过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),才能被程序访问。

如何响应设备插拔(热插拔)? 这就是“设备管理器”要解决的问题。目前主流的三种方案是:udeveudevmdev。它们目标相同,但设计哲学、复杂度和适用场景大不相同。

设备节点管理方式(即 /dev 目录如何生成设备文件)。

工具全称 / 来源定位依赖适合系统类型
udevDevice Manager (systemd 项目)原始 udev,与 systemd 高度耦合systemd只适用于systemd,不推荐独立使用
eudevEmbedded udev (fork)udev 的独立版本,脱离 systemd 运行无 systemd通用 Linux(Gentoo, Alpine 等)
mdevMini 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-standardalpine-desktopalpine-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