本文介绍如何为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