制作 deb 安装包

使用 dpkg 制作 deb 安装包。


介绍

deb 是 ubuntu/debian 的格式,是 debian 发行版的软件包,ubuntu 是基于 debian 发行的所以可以用。

dpkg 是 Debian Package 的简写,是为D ebian 专门开发的套件管理系统,方便软件的安装、更新及移除。所有源自 Debian 的 Linux 发行版都使用dpkg,例如 Ubuntu、Knoppix 等。

包结构

参考下面的目录结构:

jerry@jerry-Standard-PC-Q35-ICH9-2009:~/Code/DeepLink$ tree ./mydeb/
./mydeb/
├── DEBIAN
│   ├── control
│   ├── postinst
│   ├── postrm
│   ├── preinst
│   └── prerm
├── opt
│   └── deeplink
│       ├── deeplink
│       └── deeplink_ui
└── usr
    └── share
        └── applications
            └── deeplink.desktop

6 directories, 8 files

这里除了 DEBIAN 文件夹,其余都是应用程序文件,这里其余部分的目录模拟了安装目录(看起来和安装完成后根目录里面对应内容结构一致),这是因为 deb 安装包安装就是把内容释放到了根目录 / 下。

deeplinkdeeplink_ui 即需要安装的应用程序,将被安装在 /opt/deeplink/ 目录下。

/usr/share/applications/deeplink.desktop 是创建桌面快捷方式需要的文件。

DEBIAN 文件夹中必须有 control 文件,表示安装包基本信息。 还可能有 postinst(postinstallation)、postrm(postremove)、preinst(preinstallation)、prerm(preremove)、copyright (版权)、changlog (修订记录)和 conffiles 等。

  • preinst 软件安装之前会执行的脚本
  • postinst 软件安装完成后执行的脚本
  • prerm 软件卸载前会执行的脚本
  • postrm 软件卸载后会执行的脚本

这四个脚本非必须,如果有,这四个脚本文件必须要有可执行权限。

control 文件可能会有以下字段: - Package:包名 - Version:版本号 - Description:对包的描述 - Section:申明软件的类别,常见的有utilsnetmailtextdevel 等 - Architecture:软件包结构,如基于i386amd64m68ksparcalphapowerpc等 - Priority:申明软件对于系统的重要程度,如requiredstandardoptionalextra等 - Essential:申明是否是系统最基本的软件包(选项为yes或者no),如果是的话,这就表明该软件是维持系统稳定和正常运行的软件包,不允许任何形式的卸载(除非进行强制性的卸载) - Installed-Size:安装的包大小 - Maintainer:包的制作者,联系方式等 - Depends:软件所依赖的其他软件包和库文件。如果是依赖多个软件包和库文件,彼此之间采用逗号隔开 - Pre-Depends:软件安装前必须安装、配置依赖性的软件包和库文件,它常常用于必须的预运行脚本需求 - Recommends:这个字段表明推荐安装的其他软件包和库文件 - Suggests:建议安装的其他软件包和库文件

示例

control 文件内容如下:

Package: DeepLink
Version: 1.0.1.2
Section: utils
Priority: optional
Architecture: amd64
Installed-Size: 128000
Maintainer: jerry<jerry@congtu.cloud>
Provides: DEEPCLOUDX
Description: https://www.deeplink.cloud/

注意,很多博客都说 control 文件最末尾必须保留一个空行,否则打包会报错。但是我没有空行,打包也没报错。

preinst 文件内容如下:

#!/bin/sh
echo "prepare to install deeplink"

postinst 文件内容如下:

#!/bin/sh
echo "post install..."
/opt/deeplink/deeplink -i
echo "install deeplink service ok"
/opt/deeplink/deeplink_ui --init
echo "initialize deeplink configuration ok"
echo "successfully installed"
echo "official url of https://www.deeplink.cloud/"

prerm 文件内容如下:

#!/bin/sh
echo "prepare to remove deeplink"
/opt/deeplink/deeplink -t
echo "stop deeplink service ok"
/opt/deeplink/deeplink -u
echo "uninstall deeplink service ok"
/opt/deeplink/deeplink_ui --terminate
echo "terminate deeplink ui process ok"
/opt/deeplink/deeplink_ui --clear_cache
echo "clear deeplink cache ok"

postrm 文件内容如下:

#!/bin/sh
echo "deeplink successfully removed from your computer."

deeplink.desktop 文件内容如下:

[Desktop Entry]
Name=DeepLink
Version=1.0.1.2
Exec=/opt/deeplink/deeplink_ui
Path=/opt/deeplink
Icon=/opt/deeplink/deeplink_ui
Terminal=false
Type=Application
Categories=Network;Utility
StartupNotify=true

dpkg

使用 dpkg 命令将 mydeb/ 目录打包生成 deeplink.deb:

dpkg -b mydeb/ deeplink.deb

除此之外,dpkg 命令还有很多用法:

dpkg -c xxx.deb // 安装前根据 deb 文件查看
dpkg -L debname // 安装后根据包名查看
dpkg -i xxx.deb // 安装 deb 包,如果提示错误,可以加参数 —force-all 强制安装,但不推荐这样做
dpkg -r debname // 移除卸载 deb 包
dpkg -S filepath // 查看某个文件属于哪个 deb 包
dpkg -X xxx.deb dirname // 释放安装内容到 dirname 目录中
dpkg -e xxx.deb  // 释放控制信息到当前目录下的 DEBIAN 子目录中

参考资料