kernel 构建 ubuntu deb(4)deb包的构成
我们以打包modules为例,看看一个deb包里面包含了什么
0.简介
打包内核模块时,主要放入的内容包括:
- 实际功能文件:内核模块(
.ko
)和相关依赖信息。 - 控制逻辑:安装 / 卸载脚本(
preinst
/postinst
/postrm
)。 - 元数据:
control
文件(定义包名、版本、依赖等)。
1.内核模块的文件
lib/modules/5.15.0/ ├── kernel/ │ ├── drivers/ # 硬件驱动(如网卡、显卡驱动) │ ├── fs/ # 文件系统模块(如ext4、ntfs) │ ├── net/ # 网络协议模块 │ └── ... # 其他内核子系统模块 ├── modules.alias # 设备别名映射表 ├── modules.dep # 模块依赖关系 ├── modules.softdep # 软依赖关系 └── modules.order # 模块加载顺序
这些文件通常来自内核编译输出目录(如脚本中的$OUT_DIR/modules/lib/modules/$KERNEL_VERSION
)。在模块包的postinst
脚本中,会调用depmod -a <内核版本>
生成这些文件,确保系统能正确加载依赖模块
2.控制脚本
preinst
#!/bin/sh set -e kernel_version=$KERNEL_VERSION # 检查是否已安装相同版本的模块 if dpkg-query -W -f='\${Status}' "linux-modules-\$kernel_version" 2>/dev/null | grep -q "install ok installed"; then echo "Detected existing modules package: linux-modules-\$kernel_version" echo "Please uninstall first: sudo dpkg --remove linux-modules-\$kernel_version" exit 1 fi # 清理旧模块 echo "Cleaning up old kernel modules..." if [ -d /lib/modules/\$kernel_version ]; then rm -rf /lib/modules/\$kernel_version fi
postinst
#!/bin/sh set -e kernel_version=$KERNEL_VERSION echo "Starting modules post-installation process..." # 检查主内核包是否已安装 if ! dpkg-query -W -f='\${Status}' "linux-kernel-\$kernel_version" 2>/dev/null | grep -q "install ok installed"; then echo "ERROR: Main kernel package (linux-kernel-\$kernel_version) must be installed first!" exit 1 fi # 更新模块依赖关系 echo "Updating module dependencies..." depmod -a \$kernel_version # 更新 initramfs 以包含新模块 echo "Updating initramfs to include new modules..." update-initramfs -k \$kernel_version -u || echo "WARNING: Failed to update initramfs." # 更新 GRUB 引导菜单 echo "Updating GRUB configuration..." update-grub || echo "WARNING: GRUB update failed." echo "Modules package \$kernel_version installed successfully."
postrm
#!/bin/sh set -e kernel_version=$KERNEL_VERSION echo "Starting modules post-removal process..." # 更新 initramfs(移除已卸载的模块) echo "Updating initramfs..." update-initramfs -k \$kernel_version -u || echo "WARNING: Failed to update initramfs." # 更新 GRUB 引导菜单 echo "Updating GRUB configuration..." update-grub || echo "WARNING: GRUB update failed."
3.元数据文件(control)
DEBIAN/control
文件定义包的基本信息,例如:
Package: linux-modules-5.15.0 #包的唯一名称(如nginx、linux-modules-5.15.0),系统通过此名称识别包。 Version: 5.15.0 #版本号,用于区分不同版本,支持升级逻辑。 Architecture: arm64 #使用的硬件架构 Maintainer: X (维护者) Depends: linux-kernel-5.15.0 (= 5.15.0) # 明确依赖内核主包,必须先装内核包,再装这个 Description: Linux kernel modules for 5.15.0 #注释
下图是kernel包的构成
modules包的构成