关于Debian安装程序的操作行为

这份资料是对《Debian Installer internals》一书中的《Running Debian Installer》章节进行翻译或概要,并附加了解说。

由于原始数据似乎是Debian “etch”(2006年?)的资料,因此可能和最新的版本有所不同。
从查看”stretch”安装时的syslog来看,我认为没有太大的差异。

归因 (guī

原始资料在GNU GPL v2许可下,允许重新分发和修改。

版权所有 ©2006北京字节跳动有限公司

本文章可自由发行,您可以在GNU通用公共许可证第二版的条款下重新分发和/或修改。

Debian安装程序是什么?

Debian Installer是用于在Debian系发行版中安装操作系统的程序。
官方提供了操作系统安装镜像,但是在从安装镜像启动机器时,会运行Debian Installer程序。

在RedHat系列操作系统中,使用了一个名为Anaconda的程序。*这里的Anaconda并非指Python发行版,但是使用Python编写。(可能有点困惑)

安裝程序的概要

安裝過程分為五個階段。

    1. 启动和初始化:设置安装程序以加载附加组件

 

    1. 加载附加组件:扩展安装程序以使所有功能正常工作

 

    1. 网络设置(如果在第一阶段未完成)

 

    1. 分区

 

    安装目标系统

最开始的3个步骤根据安装方式(CD-ROM/NETBOOT*1)而有很大的区别。这3个步骤中所使用的组件(udeb*2)必须包含在initrd*3中。

以下的表格根据从CD/DVD引导和从网络引导的情况分别进行了描述,涉及到了前三个阶段的组件。

ステージCD/DVDネットワークブートコメント-initrd-preseed/preseed.cfgがある場合のみ1localechooser言語/国/ロケール選択1kbd-chooserキーボード選択1cdrom-detecteth-detectハードウェアの検出とセットアップ1
netcfgネットワーク設定-file-preseednetwork-preseedブートプロンプトで選択されている場合2
choose-mirrorミラーの選択2load-cdrom (anna)download-installer (anna)追加コンポーネントの取得と展開3eth-detect
ハードウェアの検出とセットアップ3netcfg
ネットワーク設定3choose-mirror
ミラーの選択(ステージ4に必要な場合がある)

在第4和第5阶段所需的组件无论安装方式如何都是相同的。

ステージ
コメント4hw-detect追加ハードウェアの検出4partmanパーティションの作成, ファイルシステムの作成, マウントポイントの選択5tzsetupタイムゾーンの選択5clock-setupハードウェアクロックをUTCかローカルタイムゾーンに設定する5user-setupルートと通常ユーザーを作成する5base-installerベースシステム(debootstrap*5)とカーネルのインストール5apt-setupターゲットシステムにAPTの設定を行う(sources.list)5pkgsel追加パッケージをインストールする(tasksel)5grub/lilo-installer; nobootloaderブートローダーのインストール5finish-installインストールの完了と再起動

注意

    1. 使用NETBOOT PXELINUX进行网络引导安装程序时所指的内容。

udeb中的u代表微小(μ)。udeb是仅在DebianInstaller中使用的小型deb软件包,省略了文档等以节省空间。资料中的”component”这个术语似乎指的是udeb软件包。Debian Installer将包含最小组件的初始RAM磁盘,以及动态加载其他必要组件的行为。

initrd初始RAM磁盘是在Linux系统启动时使用的临时文件系统,通常用于挂载根文件系统。检查包含在ISO安装程序中的isolinux.cfg,可以看到未指定根文件系统。换言之,Debian的安装程序是在内存中展开的初始RAM磁盘上运行的程序。顺便提一下,RedHat系列操作系统的行为稍有不同,它们会在将初始RAM磁盘展开到内存后,将ISO安装程序中包含的LiveOS/squashfs.img作为根文件系统挂载。

ISOLINUX是用于从ISO启动系统的引导加载程序,是Syslinux项目中的组件之一。

debootstrap是用于安装Debian系列操作系统的基本系统的程序。除了在Debian Installer中用于创建基本系统外,还可用于创建在chroot环境中运行的Debian环境。

启动/执行安装程序的过程

安装程序的启动过程与常规系统启动类似。引导程序(在某些情况下是系统固件)加载内核和初始RAM磁盘,并启动init。通过添加BOOT_DEBUG参数,可以对启动过程进行调试。

可以指定额外的内核参数和引导参数。这可能是为了支持不兼容的硬件而需要的。

以下的列表概述了启动步骤的说明。

1 – /init(initramfs)或/sbin/init(initrd):设置初始环境(/proc,/dev;执行udev)。

当busybox init启动时,将读取/etc/inittab文件。inittab文件中包含以下内容:

    • ::sysinit:/sbin/debian-installer-startup

 

    • ::respawn:/sbin/debian-installer

 

    VT2 (busybox shell), VT3 (/var/log/messages), VT4 (/var/log/syslog)の初期化

3 – /sbin/debian-installer-startup
3 – /sbin/debian安装程序启动

这是一个执行/lib/debian-installer-startup.d目录下的脚本或作为源代码加载的模块执行脚本。主要的执行过程如下。

    • 必要ならdevfsとsysfsをマウントする

udev/hotplugを実行する
acpiモジュールをロードする
syslogを開始する
メモリをチェックして必要ならあらかじめ指定された制限に応じてlowmemモードを有効化する
初期RAMディスクの中に存在するdebconfテンプレートを読み込む
ブートパラメーターを読み込んでdebconfパターン(/=)を見つけ出し、debconfデータベースにセットする
使用されているコンソールタイプを検出する
framebufferモジュールをロードする
インストーラーがrescueモードで実行されるべきかを検出する

4 – /sbin/debian-installer

4 – /sbin/debian安装程序

这是一个脚本,它执行/lib/debian-installer.d目录下的源脚本,类似于模块执行者的脚本。主要执行的处理是

    • フレームバッファーデバイスが利用できるかどうか検出する

 

    • コンソールを初期化する(空にする, UTF-8)

 

    • どのdebconfフロントエンドが使用されるべきか検出する(text, newt, gtk)

main-menuを開始する(詳細は次のセクション)
システムを停止または再起動する(main-menuの終了後)

以下的脚本(位于/lib/debian-installer(-startup).d)可能会根据系统架构而有所不同。

Debian安装程序菜单

组件main-menu将执行安装的其余部分。该组件动态地构建菜单并执行所选组件。请注意,只有当debconf的优先级为低或中时才显示菜单。尽管优先级高时组件仍存在,但将在不向用户显示的情况下执行。

debconf的优先级可能会自动改变。当组件执行失败或用户选择返回菜单时,优先级会设为较低。在这种情况下,如果接下来的组件执行成功,则优先级会恢复到原始值。

其中一个udeb的重要特点是postinst脚本的执行被推迟。在安装过程中,udeb只执行文件系统展开的操作,而postinst脚本的执行由main-menu负责。实际上,它会在选择了某个组件时执行。换句话说,可以表达为main-menu负责配置udeb的责任。

菜单中的组件必须在dpkg状态文件(/var/lib/dpkg/status)中包含Installer-Menu-Item行。菜单中组件的顺序首先由组件的依赖性决定。菜单项编号在不能仅通过依赖性确定组件顺序时使用。

就像下面的样例一样,Provides可以用于定义其他组件依赖的情况。 (choose-mirror 依赖于 netcfg 的 Provides: configured-network)

Package: netcfg
Status: install ok installed
Version: 1.23
Provides: configured-network
Depends: libc6 (>= 2.3.5-1), libdebconfclient0, libdebian-installer4 (>= 0.37),
         dhcp-client-udeb | dhcp3-client-udeb | pump-udeb, libiw28-udeb,
         cdebconf-udeb, ethernet-card-detection
Description: Configure the network
Installer-Menu-Item: 18

Package: choose-mirror
Status: install ok unpacked
Version: 1.19
Depends: libc6 (>= 2.3.5-1), libdebconfclient0, libdebian-installer4 (>= 0.38),
         configured-network
Description: Choose mirror to install from
Installer-Menu-Item: 23

此外,此示例表明 netcfg 执行成功(”installed”),且 choose-mirror 尚未处理(”unpacked”)。

一些组件包含在菜单中,但默认情况下不会运行。这些组件具有比finish-install更大的菜单编号。例如,包括改变debconf优先级的组件,保存调试日志,检查CD-ROM以及取消安装等。

提供额外的灵活性的挂钩

在安装的特定阶段,组件提供了脚本部件执行的机制。通过这种方式,其他组件可以将脚本放置在指定的目录中,无论postinst脚本是否已经执行,都可以在安装的特定时刻执行命令。

重要的亮点是:

/usr/lib/base-installer.d 可以被原生地用中文重新表达为:/用户/库/基本安装程序. d

    base-installerによってdebootstrapの前に実行される

/usr/lib/post-base-installer.d 的意思是“在基本安装程序之后的脚本目录”。

    base-installerによってkernelの選択/インストールの直前に実行される

/usr/lib/finish-install.d 的含义。

    finish-installによって実行される

此外,还有一些专门用于特定用途的目录,包括/usr/lib/apt-setup/generators,/lib/main-menu.d和/lib/rescue.d。

除了这些通常的挂钩外,partman由大量挂钩组成,所有脚本都被放置为挂钩以进行功能扩展。最值得注意的挂钩是将验证分区是否满足要求的脚本放置在/lib/partman/finish.d中的引导加载程序。

特殊工具

安装程序中包含了专门用于postinst脚本和preseeding脚本的特殊命令。

    • anna-install 追加の非標準d-iコンポーネント(udeb)をインストールするために使用される。このツールはannaがすでに実行されたかどうかチェックします。もしそうならばコンポーネントをすぐに展開し、そうでないならばannaが実行された際にインストールされるようスケジュールします。

 

    • apt-install 標準のパッケージ向けに(通常のaptと)同様の機能を提供し、ターゲットシステムにパッケージのインストールを行います。パッケージはbase-installerが実行済であれば即座にインストールされ、もしそうでなければ”extra”パッケージとしてbase-installerのpostinstスクリプトの終わり近くでインストールされるようスケジュールされます。

 

    • log-output コマンドを実行して出力(stdoutとstderrどちらかまたは両方)を/var/log/syslogに出力します。

 

    in-target /targetディレクトリ*1にchrootしてコマンドを実行します。このコマンドはより要求の多いコマンドを実行できるようchroot環境をセットアップします。例えばprocやsysfsをマウントしたりpolicy-rc.dを作成します。このコマンドは当然ベースシステムがインストールされた後でなければ使用できません。

注意

    /target这个目录将用于安装程序创建的分区进行挂载。

使用预种的方式实现安装的自动化

目前有三种方法来支持预配置。

initrd preseeding /preseed.cfgは初期RAMディスク内に存在している必要があります。このファイルはdebian-installer-startup処理で読み込まれます。

file preseeding preseed/fileブートパラメーターがある場合トリガーされます

network preseeding preseed/urlブートパラメーターがある場合トリガーされます

根据安装方式,可用的设置不同。

预先设置的主要目的是为debconf的问题提供默认值。请注意,在加载预配置文件之前,对于文件/网络预先设置,为问题提供默认值是没有意义的。

在使用debconf进行问题预设时,您可以为其提供默认值,而preseeding可以使用preseed/early_command和preseed/late_command在不同的时间点执行脚本。early_command将在预配置文件加载后立即执行(仅适用于文件/网络预设)。late_command将作为finish-install组件的一部分执行。

使用这些脚本可以执行复杂的操作。例如,可以通过使用apt-install将包添加到目标系统中。并且可以使用*early_command *通过anna-install安装额外的d-i组件,如果有特定时机应该执行的脚本,还可以将其作为挂钩(hook)放置在指定的目录中。

安装程序的调试

由于大部分的安装程序都是脚本,所以通过将 set -x 放置在正确的位置,可以很容易地进行调试。最直观的位置是要调试的组件的 postinst 脚本。输出可以在 /var/log/syslog 中查看。如果网络已经启动,可以使用“保存调试日志”选项来启动内部Web服务器以方便查看输出。

使用C编写的组件的调试有点困难。作为选项,可以使用strace udeb(如果需要,可以添加到自定义镜像中)或者创建一个添加了调试代码的自定义组件并使用它。

我想在组件启动时获取控制权,以便进行调试。使用命令”install debconf/priority=medium”启动安装程序是一个不错的方法。这样,在组件启动之前就会显示出菜单供选择。

当使用中优先级启动安装程序时,可以加载选项组件open-ssh-client。通过加载此组件,可以通过scp等方式将日志文件复制到其他计算机上。这对于测试新脚本和命令而无需重新创建udeb或映像也非常有用。默认情况下,nc命令包含在netcat软件包中并可供使用。

bannerAds