技术知识库
debootstrap 为什么分成两个阶段
debootstrap 为什么分成两个阶段
摘要
Bootstrap 是从“还没有目标系统”的状态构造出一个能够自行运行和管理软件包的最小系统。跨架构执行 debootstrap --foreign 时,第一阶段只下载并解包目标架构的 Debian 包;第二阶段必须运行这些目标程序,完成 dpkg 配置、脚本执行和基础系统初始化。
Bootstrap 解决什么问题
普通安装软件依赖一个已经存在的系统和包管理器;创建 rootfs 时,目标系统尚不存在。debootstrap 从 Debian 仓库取得最小包集合,逐步建立目录树、动态加载器、libc、Shell、dpkg 和 APT,使这个目录最终成为自洽的 Debian 用户空间。
第一阶段:下载与解包
Debian 仓库
↓ 下载 arm64 .deb
校验 Release 与软件包
↓ 解包
目标目录中出现 /bin、/lib、/etc、/usr、/debootstrap
这一阶段可以由 x86_64 主机完成,因为解包只是数据操作,不要求执行 ARM64 程序。
第二阶段:执行目标架构程序
第二阶段会运行包的配置脚本和目标系统中的 dpkg、Shell、动态加载器等程序。完成后才会形成有效的软件包数据库和已经配置的基础系统。
跨架构场景需要 binfmt_misc 与 QEMU user-mode 如何支持跨架构 chroot。如果只完成第一阶段,目录虽然看起来像 Linux rootfs,但仍是未完成的半成品。
--foreign 的含义
foreign 表示当前主机不能原生执行目标架构程序,因此暂时停在第一阶段。它不是“从外国镜像下载”,而是“目标架构相对主机架构不同”。
完成判据
- second stage 输出
Base system installed successfully。 dpkg --print-architecture返回arm64。/etc/os-release显示目标 Debian 版本。dpkg-query能查询基础包及版本。