5.3 从源码编译deb包安装
1. 概述与背景
在Linux系统中,从源代码编译安装软件是获取最新功能或进行定制化配置的常见方式。通常,这一过程的最后一步是 sudo make install,但它会将文件分散地复制到系统的多个目录(如 /usr/local/bin, /usr/local/lib 等),且不被包管理器(如dpkg)记录。这会带来两个主要问题:
- 难以卸载:您需要手动追踪并删除所有安装的文件,过程繁琐且容易出错。
- 与包管理冲突:未来如果您通过
apt安装一个官方包,该包可能会覆盖您编译安装的某些文件,导致软件冲突或无法运行。
CheckInstall 正是为了解决这些问题而生。 它是一个能够跟踪软件安装过程并生成标准安装包(如.deb包)的工具。其工作流程如下:
- 执行您指定的安装命令(通常是
make install),并监控所有文件变动。 - 根据监控结果,创建一个
.deb(或.rpm等)安装包。 - 自动将这个新生成的
.deb包安装到系统中,并将其信息注册到系统的包管理数据库中。
优点:
- 可卸载性:您可以通过
sudo dpkg -r <包名>或apt轻松、干净地卸载软件。 - 可分发性:生成的
.deb包可以保存下来,用于在其他相同架构的Ubuntu机器上快速安装,无需重新编译。 - 可管理性:您编译安装的软件现在和系统其他软件一样,被包管理器统一管理。
重要提示:
CheckInstall 非常适合个人或小范围内部使用,以方便管理源码安装的软件。但它不适合用于生成分发给大众的软件包(如上传到Ubuntu官方仓库或PPA),这需要遵循更严格的打包规范。
2. 安装 CheckInstall
在Ubuntu Server 22.04上,您可以直接从官方仓库安装它:
sudo apt update
sudo apt install checkinstall
此外,如果编译过程中可能需要解决依赖问题,建议一并安装 auto-apt:
sudo apt install auto-apt
3. 基础用法:三步生成Deb包
我们以经典的 htop 工具为例,演示从源码编译并使用 checkinstall 打包的全过程。
第一步:获取源码并配置
# 1. 下载源码(此处以htop 3.2.1为例)
wget https://github.com/htop-dev/htop/archive/refs/tags/3.2.1.tar.gz
# 2. 解压
tar -xzf 3.2.1.tar.gz
# 3. 进入目录
cd htop-3.2.1
第二步:配置与编译
通常,源码项目会包含一个 configure 脚本,用于检查编译环境和依赖。
# 4. 运行配置脚本(通常需要安装依赖,如libncurses-dev)
# 如果缺少依赖,configure会报错,您需要手动用apt安装。
./configure --prefix=/usr/local
# 5. 编译
make -j$(nproc) # -j$(nproc) 表示用所有CPU核心加速编译
第三步:使用 CheckInstall 替代 make install
这是最关键的一步。我们不直接运行 sudo make install,而是运行:
# 6. 使用 checkinstall 创建并安装 deb 包
sudo checkinstall
当您运行 sudo checkinstall 后,它会执行一系列交互式步骤:
- 准备:
checkinstall首先会创建一个临时目录来“捕获”将要安装的文件。 - 执行安装:它会默认调用
make install(将文件安装到您系统上,但实际上是记录到临时目录中)。 生成包:安装完成后,它会询问您是否要修改生成的包的一些属性。您会看到类似以下的提示:
**** Debian package creation selected *** This package will be built according to these values: 0 - Maintainer: [ root@your-server ] 1 - Summary: [ htop ] 2 - Name: [ htop ] 3 - Version: [ 3.2.1 ] 4 - Release: [ 1 ] 5 - License: [ GPL ] 6 - Group: [ checkinstall ] 7 - Architecture: [ amd64 ] 8 - Source location: [ htop-3.2.1 ] 9 - Alternate source location: [ ] 10 - Requires: [ ] 11 - Provides: [ htop ] 12 - Conflicts: [ ] 13 - Replaces: [ ] Enter a number to change any of them or press ENTER to continue:- 0 (Maintainer):建议修改为您的姓名和邮箱,例如
Your Name <your.email@example.com>。 - 1 (Summary):可以修改为一个更详细的描述。
- 3 (Version):确认版本号是否正确。
- 其他选项通常可以保持默认。输入数字进行修改,修改完成后按回车继续。
- 0 (Maintainer):建议修改为您的姓名和邮箱,例如
完成:
checkinstall会创建.deb包并自动使用dpkg -i将其安装到系统中。最后,您会看到类似以下的输出:Done. The new package has been installed and saved to /home/youruser/htop-3.2.1/htop_3.2.1-1_amd64.deb You can remove it from your system anytime using: dpkg -r htop
至此,您已经成功通过源码编译并生成了一个.deb包,而且这个htop程序已经像通过apt安装的一样,被系统包管理器所管理。
4. 进阶用法与技巧
4.1 为非标准安装命令打包
如果项目的安装命令不是标准的 make install,您可以显式指定:
sudo checkinstall make install_package
# 或者
sudo checkinstall python3 setup.py install
4.2 配合 auto-apt 自动解决依赖
auto-apt 可以帮助您在 ./configure 阶段自动安装缺失的依赖包,让过程更流畅。
# 在配置阶段使用 auto-apt run
auto-apt run ./configure --prefix=/usr/local
# 如果检测到依赖缺失,它会弹出一个对话框询问您是否安装,确认即可。
# 后续步骤相同
make
sudo checkinstall
4.3 非交互式打包
如果您希望脚本化打包过程,可以预先定义好所有参数,避免手动交互。
sudo checkinstall --pkgname=htop \
--pkgversion=3.2.1 \
--pkgrelease=1 \
--maintainer="Your Name <you@example.com>" \
--requires="libncurses6" \
--backup=no \
--deldoc=yes \
--fstrans=yes \
--default
参数说明:
--pkgname、--pkgversion:定义包名和版本。--requires:定义运行时依赖(可选,但有助于包管理器检查)。--backup=no:不创建备份。--deldoc=yes:安装后删除文档目录。--fstrans=yes:启用文件系统事务(这是核心功能)。--default:对所有问题自动回答“是”,使用默认值。
4.4 管理已生成的Deb包
- 重新安装:如果需要在另一台机器上安装,直接复制生成的
.deb文件并使用sudo dpkg -i htop_3.2.1-1_amd64.deb即可。 - 卸载:无论在哪台机器上安装的,都可以通过
sudo dpkg -r htop或sudo apt remove htop来彻底卸载。 - 查询:使用
dpkg -l | grep htop可以确认它已被系统记录。
5. 清理与卸载
如果您只是想清理编译源码的目录:
cd ..
rm -rf htop-3.2.1/ htop-3.2.1.tar.gz
如果您想彻底卸载通过 checkinstall 安装的软件:
sudo dpkg -r htop
这将会安全、完整地移除所有相关文件,这正是 checkinstall 的核心价值所在。
6. 总结
| 场景 | 推荐做法 | 理由 |
|---|---|---|
| 快速尝试、不关心管理 | ./configure && make && sudo make install |
简单直接,但清理麻烦。 |
| 长期使用、需管理、可能分发 | ./configure && make && sudo checkinstall |
由包管理器接管,可卸载、可分发、无冲突隐患。 |
| 为Ubuntu社区打包 | 遵循官方打包指南 | checkinstall 生成的包不符合社区发布标准。 |
CheckInstall 是一个桥接“从源码编译”和“系统包管理”的实用工具,它极大地提升了自制软件的可维护性,是进阶Linux用户工具箱里一个得力的助手。