本文介绍如何为Debian/Ubuntu制作.deb
安装包
介绍
本文介绍两种制作 .deb
包
手动制作
依赖安装
apt install build-essential binutils lintian debhelper dh-make devscripts
初始化
apt-cache search <pkg-name>
mkdir -p helloworld/DEBIAN
- 在目录
helloworld/DEBIAN
创建 control
文件(参考),内容如下
cat << EOF > helloworld/DEBIAN/control
Package: helloworld
Version: 0.2
Maintainer: me@xiexianbin.cn
Architecture: all
Description: hello world
EOF
- 在目录
helloworld/DEBIAN
创建 postinst
文件,需要有可执行权限
$ cat << EOF > helloworld/DEBIAN/postinst.ex
#!/bin/sh
# postinst script for abc
echo "..."
exit 0
- 复制文件到安装包,以路径
helloworld/
相对 Linux 系统的根目录 /
$ mkdir -p helloworld/usr/local/bin
$ cat << EOF > helloworld/usr/local/bin/helloworld.sh
#!/bin/bash
echo "hello world!"
EOF
创建软件包
dpkg-deb --build helloworld
测试
dpkg -i helloworld.deb
dpkg-deb -b extract build/
使用 dh-make 创建
依赖安装
apt install build-essential binutils lintian debhelper dh-make devscripts
环境变量
export DEBEMAIL="me@xiexianbin.cn"
export DEBFULLNAME="xiexianbin"
初始化
使用 dh_make
初始化
# 目录初始化
$ mkdir abc-1.0.0 && cd abc-1.0.0
# 安装包的文件
$ cat << EOF > abc
echo `date`
EOF
$ chmod a+x abc
- 在目录
abc-1.0.0
下执行,并生成 debian
目录
$ dh_make --createorig -s
$ tree debian/
debian/
├── abc.cron.d.ex
├── abc.doc-base.EX
├── abc-docs.docs
├── changelog # 变更记录文件
├── control # control文件
├── copyright
├── manpage.1.ex
├── manpage.sgml.ex
├── manpage.xml.ex
├── postinst.ex # 安装时执行的脚本
├── postrm.ex
├── preinst.ex # 安装前执行的脚本
├── prerm.ex # 删除时执行的脚本
├── README.Debian
├── README.source
├── rules # rules 文件
├── salsa-ci.yml.ex
├── source
│ └── format
└── watch.ex
1 directory, 19 files
cat debian/postinst.ex
#!/bin/sh
# postinst script for abc
case "$1" in
configure)
chmod a+x /usr/local/bin/abc
# or start service
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
...
exit 0
cat << EOF > debian/install
abc /usr/local/bin/
EOF
打包
# 生成debian包描述文件
dpkg-source -b .
# 打包文件
dpkg-buildpackage
# 调试方式
dpkg-buildpackage -nc -i
dpkg-buildpackage -uc -us
安装
$ ls ../
abc_1.0.0-1_amd64.deb ...
deb 文件格式
$ file abc_1.0.0-1_amd64.deb
abc_1.0.0-1_amd64.deb: Debian binary package (format 2.0), with control.tar.xz, data compression xz
本地deb软件源
方法一
生成 Packages 文件:在软件源目录中运行以下命令,生成 Packages 文件:
apt-get install dpkg-dev
# 到 deb 包目录执行
dpkg-scanpackages packages . /dev/null | gzip -9c > Packages.gz
dpkg-scanpackages sources . /dev/null | gzip -9c > Sources.gz
这将扫描软件源目录中的软件包,并生成一个压缩的 Packages.gz 文件。
apt-ftparchive packages . > Packages
apt-ftparchive release . > Release
deb file:///data/packages/ hasty main universe multiverse
# 或
deb file:///var/ packages/
方法二:apt-ftparchive
以下操作在 /data/debs
目录下进行
- 生成索引文件(使用与 apt > 1.5 的版本)
apt-ftparchive packages . > Packages
apt-ftparchive release . > Release
$ gpg --gen-key
$ gpg -a --export <gpg-uuid> | apt-key add -
OK
gpg --clearsign -o InRelease Release
gpg -abs -o Release.gpg Release
- 配置
/etc/apt/sources.list
文件,或使用 nginx 对外发布
deb file:///data/debs/ /
其他
F&Q
No secret key
$ dpkg-buildpackage
...
gpg: skipped "Name Lastname <your@mail.com>": No secret key
gpg: dpkg-sign.GW_cpMSS/abc_1.0.0-1.dsc: clear-sign failed: No secret key
dpkg-buildpackage: error: failed to sign .dsc file
dpkg-buildpackage --no-sign