在 chroot 中使用 Alpine Linux

来自 Alpine Linux

在 chroot 环境中,您可以构建、调试和运行 Alpine 软件包或开发内容。这是在不替换您的系统或使用虚拟机的情况下执行此操作的最为人所知的方式。本文档解释了如何在宿主机 Linux 发行版下的 chroot 中设置 Alpine 构建环境,该环境也可用于从非 Alpine Linux 系统或 live 环境安装 Alpine Linux。

提示: 您可以使用 alpine-chroot-install 脚本为您完成所有这些步骤。

要求

  • 用于执行所有过程的工作 Linux 安装
  • Linux kernel 2.6.22,并安装了 curlchroot 二进制文件
  • 目标介质至少有 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

注意: 绑定挂载可以设置为只读,这将限制 chroot 写入设备
方法 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 磁盘访问,您可以像这样创建设备节点

注意: 每个设备可以有 15 个子节点,您应该始终为每个新设备递增 16

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 方法通常用于在现有系统中安装 Alpine。因此,未包含准备引导加载程序的步骤。


进入你的 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:无法运行命令 ' ... Exec format error

这通常表示您使用一种架构(例如 armf)启动,并尝试 chroot 到另一种架构(例如 x86_64)。二进制文件必须为宿主机运行的架构构建!

请注意,有一个例外,您可以在 x86_64 中运行 32 位 x86 chroot,但反之则不行

警告:正在忽略 APKINDEX.xxxx.tar.gz

确保 ${chroot_dir}/etc/apk/repositories 有效并运行

apk update

外部链接