一、构建debian-installer

1.安装debian系统

选择并下载系统: https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/

iso文件方式安装: 使用virtualbox虚拟机安装

制作U盘启动盘方式安装:

a. 给优盘分两个区/dev/sdx1、/dev/sdx2     
b. 使用 U 盘的第一个分区,而不是整个设备
c. 安装mbr:`install-mbr /dev/sdx`
d. 建立文件系统:`mkdosfs /dev/sdx1`
e. 拷贝镜像里的文件到优盘的第一个分区



2.设置/etc/apt/sources.list中的软件源

deb http://ftp.debian.org/debian sid main
deb-src http://ftp.debian.org/debian sid main



3.安装工具软件

apt-get install myrepos git curl
apt-get install fakeroot



4.获得debian-installer源码

使用: mr bootstrap https://salsa.debian.org/installer-team/d-i/raw/master/.mrconfig debian-installer
或: https://wiki.debian.org/DebianInstaller/CheckOut 中的其他方式

目录结构如下图:

debian modules 加载 debian installer main menu_linux



5.构建debian-installer

a. 处理依赖问题:

cd debian-installer
apt build-dep debian-installer
apt-get install “要安装的包”

b. 修改 “installer/config/common” 配置文件:

LINUX_KERNEL_ABI ?= 5.10.0-8
USE_UDEBS_FROM = stable

c. 清理操作: make reallyclean

d. 构建: fakeroot make build_cdrom_gtk

ps:http://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/ 可以找到已经编译好的现成的安装器的打包



一个问题:

a.编译好的initrd系统里,像user-setup-udeb这些包究竟放在了哪里?

debian modules 加载 debian installer main menu_加载_02


debian modules 加载 debian installer main menu_linux_03



6.构建installation-guide

a. 路径中不要包含中文,否则会报xml解析错误:

debian modules 加载 debian installer main menu_运维_04


b. 处理依赖问题

dpkg-checkbuilddeps
aptitude install -R “要安装的包”

c. 构建

cd installation-guide
dpkg-buildpackage

d. 得到如下deb包

debian modules 加载 debian installer main menu_运维_05


e. 解压一个deb即得到文档

debian modules 加载 debian installer main menu_debian modules 加载_06

**ps:**其实debian镜像中已经分发的有文档了,在镜像的 doc/manual/zh_CN/install.zh_CN.pdf 即是




二、debian-installer启动流程

官方说明文档在这里: https://d-i.debian.org/doc/internals/

这里结合个人理解进行一些讲解:



1.安装器系统加载的大致流程

a.系统启动的时候,加载内核
通过 内核调试技术 可以模拟一个x86机器上的linux内核加载过程:

例子:

debian modules 加载 debian installer main menu_debian_07


比对debain-installer的安装 日志 可以确定安装器的初始化开始的时机:

debian modules 加载 debian installer main menu_加载_08


b.内核初始化完成后执行/init程序执行了"/sbin/busybox init",读取/etc/inittab配置文件

debian modules 加载 debian installer main menu_linux_09



2.debian安装器运行在哪里?

a. debian安装器在打包的时候会生成initrd.gz文件,启动系统安装的时候,安装器就运行在这个“定制版的“initrd系统里

第一进程是 /sbin/busybox init

debian modules 加载 debian installer main menu_linux_10

debian modules 加载 debian installer main menu_debian_11

debian modules 加载 debian installer main menu_运维_12

debian modules 加载 debian installer main menu_linux_13

安装前文件系统的挂载情况

debian modules 加载 debian installer main menu_运维_14

debian-installer-setup.d执行完后触发initab的从新加载

debian modules 加载 debian installer main menu_debian_15

b. debain安装器的initrd系统和装好后的initrd系统是 不一样的

使用内核解压命令:“gunzip initrd.gz”、“cpio -ivdu < initrd”

debian modules 加载 debian installer main menu_加载_16

c. 安装好后的sbin中的init都指向了systemd (uos和debian的对比)

debian modules 加载 debian installer main menu_debian modules 加载_17



3.从加载main-menu模块到显示安装器界面的过程

mian-menu 的加载是由 /lib/debian-installer.d/S70Menu 脚本中执行 /lib/debian-installer/menu 脚本触发的, /lib/debian-installer/menu 脚本中执行:“exec debconf -o d-i $MENU” 其中变量值 $MENU 就是 mian-menu。这里开始 debconf 首先完成自己初始化操作,根据nDEBIAN_FRONTEND标志位判断加载gtk库还是newt字符库,之后debconf对gtk组件与main-menu程序进行绑定,触发main-menu初始化,加载第一个界面组件localchooser

debian modules 加载 debian installer main menu_linux_18


Installer-Menu-Item: 控制菜单组件的加载顺序

debian modules 加载 debian installer main menu_运维_19


4.安装过程

安装基本系统:使用 debootstrap 工具

debian modules 加载 debian installer main menu_加载_20



5.一些想法

a. debain安装器的装系统方案和uos的装系统方案区别有哪些?

debain安装器安装系统的过程是“扩展式”,从/sbin/busybox init开始->初始化安装器设置->显示安装器界面程序main-menu->挂载/cdrom->加载分区、网络等组件->debootstrap构建安装“基本系统“->安装软件包->完成

uos服务版安装系统的时候文件系统的挂载情况:

debian modules 加载 debian installer main menu_linux_21

b. debian安装器启动系统的第一进程是 “/sbin/busybox init”,uos安装器启动后第一进程是什么呢?

uos安装器启动后第一进程是 “/sbin/init livcd-insraller splash”,/sbin/init 是 /lib/systemd/system的链接

debian modules 加载 debian installer main menu_linux_22

c. 对于uos安装器,debian安装器有哪些可借鉴之处呢?
1)debian安装器在网络设置阶段是首先尝试自动配置网络,以便提供网络镜像支持
2)debain安装器的组件集使用




三、参考文档

跟我一起写Makefile

kill -HUP pid

内核启动流程

linux文件系统初始化过程

Linux文件描述符到底是什么?

Linux上的文件描述符3有什么特别之处?

Linux中getopt函数、optind等变量使用详解

linux c解析命令行选项getopt、optarg、optind、opterr、optopt

BusyBox init及inittab文件详解

解压vmlinuz和解压initrd(initramfs)

操作系统真象还原