我们通常在使用Debian系的Linux系统时,常常会遇到一些deb格式安装包。我们也知道,使用dpkg命令即可安装。
当然,也会下载到一些软件是压缩包,就没那么方便了。我们能不能把它自己打包成deb安装包呢?当然是可以的。
其实,制作一个deb安装包是个很简单的事情。
1,认识deb安装包结构
在制作安装包之前,我们认识一下deb包的内容:

这是我要打包的内容,可见除了DEBIAN文件夹,其余都是应用程序文件,这里其余部分的目录模拟了安装目录(看起来和安装完成后根目录里面对应内容结构一致),这是因为deb安装包安装就是把内容释放到了根目录/下。
DEBIAN文件夹中必须有control文件,表示安装包基本信息。
除此之外,其中还可以有:
preinst软件安装之前会执行的脚本postinst软件安装完成后执行的脚本prerm软件卸载前会执行的脚本postrm软件卸载后会执行的脚本
这四个脚本非必须,如果有,这四个脚本文件必须要有可执行权限。
2,开始制作安装包
今天下载了typora,但是是压缩文件格式的,我们就以制作typora的安装包为例开始。
(1) 创建一个目录存放所有文件
我创建了一个名为pack的文件夹,位于/home/maiqu/Downloads/pack,放置安装包内容和配置。下文也以此为例。
(2) 创建DEBIAN文件夹并编写control文件
我们在pack文件夹中创建DEBIAN文件夹,并在里面新建control文件,并编辑control文件。
我这里control内容如下:
Package: typora
Version: 13.6.1
Section: utils
Priority: optional
Architecture: amd64
Installed-Size: 218600
Maintainer: swsk33<example@163.com>
Provides: typora
Description: 自己打包的Typora安装包。
上述字段意义如下:
Package包名Version版本号Section软件的类别,可以是utils、net、mail、text、devel等等Priority软件对于系统的重要程度,如required、standard、optional、extra等等Architecture架构,32位软件填写i386,64位软件填写amd64,如果是既能在32位系统运行又能在64为系统运行可以填写allInstalled-Size安装后大小,单位为kbMaintainer维护者,为维护者名<邮箱>的形式Provides供应者Description描述
上面的字段是必须字段或者常用字段,除此之外,control文件还可以有以下字段,以下字段非必须,按需加入:
Essential申明是否是系统最基本的软件包,值为yes或者no,如果是的话,这就表明该软件是维持系统稳定和正常运行的软件包,不允许任何形式的卸载Depends软件所依赖的其他软件包和库。如果是依赖多个软件包,彼此之间采用英文逗号隔开(例如该值为libc6, default-jre,说明该软件包依赖于libc6和default-jre这两个软件包,缺一不可)Pre-Depends软件安装前必须安装、配置依赖性的软件包和库Recommends这个字段表明推荐的安装的其他软件包Suggests建议安装的其他软件包
注意,control文件最末尾必须保留一个空行,否则打包会报错。
(3) 将待打包内容放进来
上面我们知道了,其余内容即为被打包的软件内容,会被直接释放到根目录。那么我们这里也需要保持目录结构。
例如我想让typora安装到/opt文件夹中,那么我们这里就在pack文件夹中创建opt文件夹,将typora文件夹放进这个opt文件夹:

我们知道了除了DEBIAN文件夹,其它内容都会被直接放到根目录,那么这时我们就要在这里模拟出安装目录,把应用程序文件进行一个组织,以让它安装到我们想要的位置。
(4) 快捷方式
之前写了个博客讲解Linux创建快捷方式的方法,这里就不再赘述Linux快捷方式文件怎么写了,直接参考这个博客即可:链接
当然,我们知道快捷方式文件都位于/usr/share/applications目录下,因此这里我们需要在我们的pack文件夹中建立起usr/share/applications,在里面新建一个desktop文件表示快捷方式。
不过需要注意的是,快捷方式的可执行文件、图标、运行目录指向必须对应为这个安装包安装完成后我们的应用程序所在位置,如下图:

3,打包
刚刚完成了安装包配置文件编写,现在就可以打包了。使用dpkg命令打包:
dpkg -b "待打包目录" "生成deb安装包目录"
我的待打包内容都在/home/maiqu/Downloads/pack文件夹下,那么我执行命令:
cd /home/maiqu/Downloads
dpkg -b "pack" "Typora-linux.deb"
等待安装包构建完成,然后我们就可以使用dpkg -i命令安装它了!

如果要卸载,还是使用apt remove命令即可,包名就是上面control文件中Package字段的值。
4,使用fakeroot保证所属用户一致性
文件权限是Linux操作系统中一个重要的部分,在我们制作安装包时,默认情况下安装后的文件所属用户是我们自己,大多数文件是744或者755权限。
如果只是在自己电脑上安装,可能不会出现什么问题,不过如果将安装包安装在其它机器上,安装后的文件所属用户和该机器上用户不一致,就有可能因为权限问题导致我们自己打包的软件在其它机器运行出现问题。
因此,推荐的做法是确保打包的文件所属用户统一为root用户即可,我们无需使用chown命令手动修改文件所属用户,而是在打包时直接借助fakeroot命令即可。
fakeroot命令用于模拟root用户,但不会实际具备root权限,这在一些需要root用户执行命令又要保证一定安全性的情景下非常适用,绝大多数系统已经自带fakeroot命令了,不过如果没有也可以通过下列命令安装:
sudo apt install fakeroot
然后打包时,在前面加上fakeroot即可:
fakeroot dpkg -b "pack" "Typora-linux.deb"
此时再安装该安装包,就会发现安装的文件所属用户是root了!建议自己制作安装包时,使用fakeroot命令进行。