技术知识库

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 能查询基础包及版本。

关联