如何为Debian/Ubuntu制作deb安装包

发布时间: 更新时间: 总字数:900 阅读时间:2m 作者: IP上海 分享 网址

本文介绍如何为Debian/Ubuntu制作.deb安装包

介绍

本文介绍两种制作 .deb

手动制作

依赖安装

  • 安装制作 .deb 包依赖
apt install build-essential binutils lintian debhelper dh-make devscripts

初始化

  • 检查新的报名是否已被使用
apt-cache search <pkg-name>
  • 确认 License,通常为 GNU/GPL license

  • 创建目录

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

解压到extract文件夹

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
  • 修改 debian/rules

  • 修改 debian/postinst.ex,指定安装时的操作

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
  • 创建 install 文件,指定文件的安装目录
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 签名私钥信息
$ 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/ /

其他

  • sbuild

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

参考

  1. https://www.debian.org/doc/debian-policy/
  2. https://launchpad.net/ubuntu
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数