Alpine Linux 在 chroot 环境中
在 chroot 环境中,您可以构建、调试和运行 Alpine 软件包或开发项目。这是在不替换系统或使用虚拟机的情况下执行此操作的最为人所知的方式。本文档解释了如何在主机 Linux 发行版下的 chroot 中设置 Alpine 构建环境,该环境也可用于从非 Alpine Linux 系统或 live 环境安装 Alpine Linux。
要求
- 用于执行所有过程的工作 Linux 安装
- Linux 内核 2.6.22,并安装了
curl
和chroot
二进制文件 - 目标介质至少 100M,更完整的解决方案至少 900MB
- 互联网连接
先决条件
以下变量
- ${chroot_dir} = 应该指向新的根目录
- ${mirror} = 应该替换为 可用的 Alpine Linux 镜像之一。
- ${arch} = 应该是 CPU 架构,如 x86 (i386) 或 amd64(x86_64)。
设置 APK
下载最新的 apk 静态软件包(替换${version}为实际版本)
curl -LO ${mirror}/latest-stable/main/${arch}/apk-tools-static-${version}.apk
.apk 软件包只是 gzipped tarball,您可以使用以下命令解压缩它们
tar -xzf apk-tools-static-*.apk
将 Alpine 基础安装安装到 chroot
./sbin/apk.static -X ${mirror}/latest-stable/main -U --allow-untrusted -p ${chroot_dir} --initdb add alpine-base
设置 chroot
在您更改根目录到新目录之前,您需要创建所需的设备
方法 1.a 简单方法:使用主机的 /dev
mount -o bind /dev ${chroot_dir}/dev
方法 1.b 手动方法:创建需要的节点

mknod -m 666 ${chroot_dir}/dev/full c 1 7 mknod -m 666 ${chroot_dir}/dev/ptmx c 5 2 mknod -m 644 ${chroot_dir}/dev/random c 1 8 mknod -m 644 ${chroot_dir}/dev/urandom c 1 9 mknod -m 666 ${chroot_dir}/dev/zero c 1 5 mknod -m 666 ${chroot_dir}/dev/tty c 5 0
如果您需要 SCSI 磁盘访问,您可以像这样创建设备节点
mknod -m 666 ${chroot_dir}/dev/sda b 8 0 mknod -m 666 ${chroot_dir}/dev/sda1 b 8 1 mknod -m 666 ${chroot_dir}/dev/sda2 b 8 2 mknod -m 666 ${chroot_dir}/dev/sda3 b 8 3 mknod -m 666 ${chroot_dir}/dev/sdb b 8 16 mknod -m 666 ${chroot_dir}/dev/sdb1 b 8 17
使 process fs 和 /sys fs 可用
mount -t proc none ${chroot_dir}/proc mount -o bind /sys ${chroot_dir}/sys
设置域名解析
域名解析需要 resolv.conf 文件
您可以复制主机的 resolv.conf
cp -L /etc/resolv.conf ${chroot_dir}/etc/
或者,您可以创建一个新的(此示例使用 OpenDNS)
echo -e 'nameserver 8.8.8.8\nnameserver 2620:0:ccc::2' > ${chroot_dir}/etc/resolv.conf
准备 APK 仓库
设置 APK 主仓库(替换${branch}为最新的稳定分支名称,例如 v3.3)
mkdir -p ${chroot_dir}/etc/apk echo "${mirror}/${branch}/main" > ${chroot_dir}/etc/apk/repositories

进入您的 chroot
然后,您可以 root 用户 (UID 0) 身份运行此命令来进入您的 chroot。
chroot ${chroot_dir} /bin/ash -l
准备 init 服务
如果您计划将 chroot 与 init 系统一起使用或在另一个设备上设置新系统,则应添加这些服务
rc-update add devfs sysinit rc-update add dmesg sysinit rc-update add mdev sysinit rc-update add hwclock boot rc-update add modules boot rc-update add sysctl boot rc-update add hostname boot rc-update add bootmisc boot rc-update add syslog boot rc-update add mount-ro shutdown rc-update add killprocs shutdown rc-update add savecache shutdown
故障排除
硬化内核或 Alpine 作为 chroot 主机
如果您使用 Alpine 作为原生构建系统,您需要确保可以从 chroot 运行 chmod
。将以下内容添加到 /etc/sysctl.conf
kernel.grsecurity.chroot_deny_chmod = 0
然后重新加载 sysctl 配置
sysctl -p
chroot: cannot run command ' ... Exec format error
这通常表明您使用一种架构(例如 armf)启动,并尝试 chroot 进入另一种架构(例如 x86_64)。二进制文件必须为宿主机运行的架构构建!
请注意,有一个例外,您可以在 x86_64 中运行 32 位 x86 chroot,但反之则不行!
WARNING: Ignoring APKINDEX.xxxx.tar.gz
确保 ${chroot_dir}/etc/apk/repositories
有效并运行
apk update
外部链接
- 您还可以使用脚本 alpine-chroot-install
- https://web.archive.org/web/20190808203313/https://isc.sans.edu/forums/diary/Forensic+use+of+mount+bind/22854/
- Alpine Linux 在 Fedora 上的 chroot : https://git.alpinelinux.org/cgit/user/fab/scripts/tree/alpine-chroot.sh [失效链接] 脚本
- Alpine Linux aarch64 在 AWS Linux 上的 chroot : https://gist.github.com/emolitor/0567e51c0ce04f4b025fc78d2cf0b4f1 脚本