Ubuntu(debian)上的dep和CentOS的rpm打包方式有相同之处,
- 都是shell定义安装,安装之后,卸载之前,卸载之后的操作
- 都需要定义软件包的包名,版本,维护者等等信息。
但定义的方式略有不同,
- rpm包有一个spec文件,通过%build, %install, %post等等来定义对应执行操作
- dep包需要定义一个DEBIAN文件夹,下面必须有文件control来定义包的信息,通过可执行文件(需设置shebang #!/bin/sh): postinst, prerm, postrm来定义安装,卸载等操作 。
分步指南
一、程序路径
deb包安装时会直接解压到根目录,所以在打包时,需要定义好相对于打包目录的路径,例如:
打包命令:
dpkg -b ~/rpmbuild/SOURCES/ubuntu/ ~/rpmbuild/RPMS/testdeb-kylinv10-desktop.deb
打包目录为~/rpmbuild/SOURCES/ubuntu/
,我们希望程序app的安装到/home/admin/
,
那么需要在~/rpmbuild/SOURCES/ubuntu/
下新建home/admin/
, 即~/rpmbuild/SOURCES/ubuntu/home/admin/
,
再将程序app解压或者拷贝到~/rpmbuild/SOURCES/ubuntu/home/admin/
,
所需的DEBIAN文件夹, 放到~/rpmbuild/SOURCES/ubuntu/
目录下
二、安装卸载行为
安装卸载之前,之后需要做的操作,需要定义到DEBIAN目录中的shell脚本,preinst, postinst, prerm, postrm中,
比如需要在安装之后启动程序,并设置程序服务开机自启动,我们的服务名为testdeb的postinst文件:
#!/bin/sh
cp /home/admin/app/testdeb.service /lib/systemd/system/
systemctl enable testdeb
systemctl daemon-reload
systemctl start testdeb
其中,
- 因为是shell脚本,shebang#!/bin/sh 必须定义,同时需要有可执行权限(chmod +x)
- 如果需要执行某些脚本,直接./scriptname.sh执行可能会报Syntax error: “(” unexpected错误,这是因为sh和bash不兼容,通过bash ./scriptname.sh执行即可
- Ubuntu中有多个放service服务文件的位置,/lib/systemd/system/, /etc/systemd/system/, 这些目录下都能通过service testdeb start启动,但是只有在/lib/systemd/system/下时,执行systemctl enable testdeb不会报错
三、deb包信息
包信息是定义在DEBIAN目录下的control文件中,例如:
Package: debtest
Version: 6.0
Section: free
Prioritt: optional
Architecture: arm64
Maintainer: Me
Description: debtest for Test
其中Architecture比较重要,如果与待安装系统的架构不同,会不能安装。
四、安装卸载
debtest 是包名,testdeb-kylinv10-desktop.deb是安装包文件名
通过命令dpkg -i testdeb-kylinv10-desktop.deb
安装,对应DEBIAN下的脚本会被安装到/var/lib/dpkg/info/
下,
分别对应debtest.postinst, debtest.postrm 等等。
dpkg -r debtest
可以卸载程序, dpkg --remove --force-remove-reinstreq debtest
强制卸载
dpkg -X testdeb-kylinv10-desktop.deb .
解压安装包到当前目录