Linux 环境下制作 deb 软件包

linux,deb · 浏览次数 : 0

小编点评

**版本:** 1.0 **参数:** * -b、--build:创建一个新的deb包。 * --build,-c、--contents,-e、--control:设置构建选项。 * --field:指定要输出的信息。 * --extract:将原始软件包解压缩到指定目录。 * --X、--vextract:使用扩展的包管理工具进行解压缩。 * --ctrl-tarfile:创建控制文件。 * --fsys-tarfile:创建一个包含所有文件和文件夹的压缩文件。 * --no-debsig:忽略软件包的签名验证。 * --no-act|--dry-run|--simulate:仅报告要执行的操作,而不执行。 * --D|--debug=<八进制数>:开启调试模式。 * --status-fd <n>:发送状态更新到文件描述符<n>。 * --status-logger=<命令>:发送状态更新到 <命令> 的标准输入。 * --log=<文件名>:将状态更新和操作信息到 <文件名>。 * --ignore-depends=<软件包>,...:忽略关于 <软件包> 的所有依赖关系。 * --force-...:忽视遇到的问题。 * --no-force-...|--refuse-...:当遇到问题时中止运行。 * --abort-after <n>:累计遇到 <n> 个错误后中止。 * --compare-version:使用比较运算符比较软件包的版本号。 **示例命令:** ```bash dpkg -b testapp testapp-1.0.deb dpkg -i testapp-1.0.deb dpkg -l | grep testapp dpkg -s testapp dpkg -L <package> dpkg -x <package_file_path> ./<file_name> dpkg -x testapp-1.0.deb ./ ```

正文

一、简介

前面的笔记中已经展示过了,怎么移植的一个工具境到 ARM 环境中,对于使用 buildroot 和 yocto 的朋友来说,此笔记就没有作用了,因为管理工具包会帮我们把这个工作处理了,就算需要自定义包操作方式也不一样,可以参考上一篇笔记。

而对于 ubuntu 这样的操作系统,虽然可以使用 apt-get install 这样的命令去安装对应的工具,但是对于特定板子的适配,从 /etc/apt/sources.list 配置的镜像库中,找不到对应的工具包。比如 GPU、NPU、MPP、显卡等。那么这部分的适配,还得需要我们根据厂商提供的 SDK 进行移植,但是每次都将需要将一个个的 so、.a、相关的配置文件拷贝到对应的路径下也是比较麻烦的,所以我们可以将需要操作的文件直接打包成 deb 文件包,到对应的环境中安装即可。

二、dpkg 命令

这里使用 dpkg 命令进行打包,所以在了解打包流程之前,先了解一下 dpkg 命令

work@work:~$ dpkg --help
用法:dpkg [<选项> ...] <命令>

命令:
  -i|--install       <.deb 文件名> ... | -R|--recursive <目录> ...
  --unpack           <.deb 文件名> ... | -R|--recursive <目录> ...
  -A|--record-avail  <.deb 文件名> ... | -R|--recursive <目录> ...
  --configure        <软件包名>    ... | -a|--pending
  --triggers-only    <软件包名>    ... | -a|--pending
  -r|--remove        <软件包名>    ... | -a|--pending
  -P|--purge         <软件包名>    ... | -a|--pending
  -V|--verify <软件包名> ...       检查包的完整性。
  --get-selections [<表达式> ...]  把已选中的软件包列表打印到标准输出。
  --set-selections                 从标准输入里读出要选择的软件。
  --clear-selections               取消选中所有不必要的软件包。
  --update-avail <软件包文件>      替换现有可安装的软件包信息。
  --merge-avail  <软件包文件>      把文件中的信息合并到系统中。
  --clear-avail                    清除现有的软件包信息。
  --forget-old-unavail             忘却已被卸载的不可安装的软件包。
  -s|--status      <软件包名> ...  显示指定软件包的详细状态。
  -p|--print-avail <软件包名> ...  显示可供安装的软件版本。
  -L|--listfiles   <软件包名> ...  列出属于指定软件包的文件。
  -l|--list  [<表达式> ...]        简明地列出软件包的状态。
  -S|--search <表达式> ...         搜索含有指定文件的软件包。
  -C|--audit [<表达式> ...]        检查是否有软件包残损。
  --yet-to-unpack                  列出标记为待解压的软件包。
  --predep-package                 列出待解压的预依赖。
  --add-architecture    <体系结构> 添加 <体系结构> 到体系结构列表。
  --remove-architecture <体系结构> 从架构列表中移除 <体系结构>。
  --print-architecture             显示 dpkg 体系结构。
  --print-foreign-architectures    显示已启用的异质体系结构。
  --assert-<特性>                  对指定特性启用断言支持。
  --validate-<属性> <字符串>       验证一个 <属性>的 <字符串>。
  --compare-vesions <a> <关系> <b> 比较版本号 - 见下。
  --force-help                     显示本强制选项的帮助信息。
  -Dh|--debug=help                 显示有关出错调试的帮助信息。

  -?, --help                       显示本帮助信息。
      --version                    显示版本信息。

Assert 特性: support-predepends, working-epoch, long-filenames,
  multi-conrep, multi-arch, versioned-provides.

可验证的属性:pkgname, archname, trigname, version.

调用 dpkg 并带参数 -b, --build, -c, --contents, -e, --control, -I, --info,
  -f, --field, -x, --extract, -X, --vextract, --ctrl-tarfile, --fsys-tarfile
是针对归档文件的。 (输入 dpkg-deb --help 获取帮助)

选项:
  --admindir=<目录>          使用 <目录> 而非 /var/lib/dpkg。
  --root=<目录>              安装到另一个根目录下。
  --instdir=<目录>           改变安装目录的同时保持管理目录不变。
  --path-exclude=<表达式>    不要安装符合Shell表达式的路径。
  --path-include=<表达式>    在排除模式后再包含一个模式。
  -O|--selected-only         忽略没有被选中安装或升级的软件包。
  -E|--skip-same-version     忽略版本与已安装软件版本相同的软件包。
  -G|--refuse-downgrade      忽略版本早于已安装软件版本的的软件包。
  -B|--auto-deconfigure      就算会影响其他软件包,也要安装。
  --[no-]triggers            跳过或强制随之发生的触发器处理。
  --verify-format=<格式>     检查输出格式('rpm'被支持)。
  --no-debsig                不去尝试验证软件包的签名。
  --no-act|--dry-run|--simulate
                             仅报告要执行的操作 - 但是不执行。
  -D|--debug=<八进制数>      开启调试(参见 -Dhelp 或者 --debug=help)。
  --status-fd <n>            发送状态更新到文件描述符<n>。
  --status-logger=<命令>     发送状态更新到 <命令> 的标准输入。
  --log=<文件名>             将状态更新和操作信息到 <文件名>。
  --ignore-depends=<软件包>,...
                             忽略关于 <软件包> 的所有依赖关系。
  --force-...                忽视遇到的问题(参见 --force-help)。
  --no-force-...|--refuse-...
                             当遇到问题时中止运行。
  --abort-after <n>          累计遇到 <n> 个错误后中止。

可供--compare-version 使用的比较运算符有:
 lt le eq ne ge gt        (如果版本号为空,那么就认为它先于任意版本号);
 lt-nl le-nl ge-nl gt-nl  (如果版本号为空,那么就认为它后于任意版本号);
 < << <= = >= >> >        (仅仅是为了与主控文件的语法兼容)。

'apt' 和 'aptitude' 提供了更为便利的软件包管理。

注意: 关于每个命令的详细使用,我这里就不过多介绍了,百度一下很容易找到

三、deb 软件打包

  1. 创建测试程序
    这里创建一个简单的测试文件 hello.c,程序如下,并执行下面步骤

    #include <stdio.h>
    
    int main()
    {
    	printf("hello app test!\n");
    	return 0;
    }
    

    注意: 使用命令 gcc hello.c -o hello 编译成可执行文件,如果需要在 ARM 环境下,请用交叉编译工具

  2. 创建打包文件
    创建一个文件夹,用于存放需要打包的文件,并且文件的路径便是安装的路基,如下图所示

  3. 编写control 文件
    用于描述 deb 包的名称、版本、描述、作者、依赖等

    Package: testapp
    Version: 1.0
    Section: utils
    Priority: optional
    Architecture: amd64
    Depends: libc6 (>= 2.15), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.1.1)
    Maintainer: Your Name <yourname@email.com>
    Description: Test program
     Production of deb software package for testing
    

    注意: 报名不能有 _ + - 等字符,否则打包的时候会出现错误

  4. deb 打包

    dpkg -b testapp testapp-1.0.deb
    

  5. 安装 deb 软件包

    sudo dpkg -i testapp-1.0.deb
    

  6. 查看是否安装成功

    dpkg -l | grep testapp
    

  7. 程序使用测试

    hello
    

  8. 卸载程序

    # 卸载程序及配置文件
    dpkg -P <package>
    
    # 卸载程序
    dpkg -r <package>
    
  9. 其他常用命令

    # 查看软件包的内容
    dpkg -c <package_file_path>
    
    # 查看软件包(已安装)的详细信息
    dpkg -s <package> 或 dpkg --status <package>
    
    # 查看软件包的安装位置
    dpkg -L <package> 或 dpkg --list-files <package>
    
    # 解压 deb 软件包
    dpkg -x <package_file_path> ./<file_name>
    dpkg -x testapp-1.0.deb ./
    
    

参考资料

ubuntun制作deb安装包:https://blog.csdn.net/weixin_51495377/article/details/132797013
为ubuntu系统制作deb安装包:https://blog.csdn.net/weixin_44789033/article/details/132759829
手把手教你如何在linux环境下制作deb软件包:https://blog.csdn.net/qq_43257914/article/details/131609720

与Linux 环境下制作 deb 软件包相似的内容:

Linux 环境下制作 deb 软件包

一、简介 前面的笔记中已经展示过了,怎么移植的一个工具境到 ARM 环境中,对于使用 buildroot 和 yocto 的朋友来说,此笔记就没有作用了,因为管理工具包会帮我们把这个工作处理了,就算需要自定义包操作方式也不一样,可以参考上一篇笔记。 而对于 ubuntu 这样的操作系统,虽然可以使用

docker制作springboot镜像

以下步骤在具有Docker环境的Linux机器上操作。 把springboot-1.0.0.jar放到/usr/local/springboot目录下,并在该目录下创建Dockerfile文件,内容为: FROM openjdk:8-jdk-alpine ADD springboot-1.0.0.j

FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器

​AVS3是中国AVS工作组制定的第三代音视频编解码技术标准,也是全球首个已推出的面向8K及5G产业应用的视频编码标准。AVS工作组于2019年3月9日完成第三代AVS视频标准(AVS3)基准档次的制订工作,参考软件的测试表明,AVS3基准档次的性能比上一代标准AVS2和HEVC提升了约30%。 l

FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器

​AV1是一种新兴的免费视频编码标准,它由开放媒体联盟(Alliance for Open Media,简称AOM)于2018年制定,融合了Google VP10、Mozilla Daala以及Cisco Thor三款开源项目的成果。据说在实际测试中,AV1标准比H.265(HEVC)的压缩率提升了

[转帖]linux下如何避免rsyslog系统日志不停打印到console

背景:linux环境下,服务器由于某种异常导致rsyslog message不停打印到console控制台,影响我们正常使用。 ps:我遇见的场景: 解决办法:1. vim /etc/rsyslog.conf 2.找到“# Everybody gets emergency messages”后注释掉

【转帖】linux环境下使用route指令设置多个网络连接的优先级(通过修改路由表的默认网关条目)

1. 背景 在生活中的会经常遇见一台PC同时连接多个网络的场景.最典型的,一台笔记本可以同时连接一个无线网(手机热点)和一个有线网(以太网).linux和window操作系统在默认情况都会使用最早连接的网络进行互联网访问.如果我们想切换到另一个网络进行互联网访问,最粗暴的方法就是断开最先连接的网络,

[转帖]GDB调试core文件

在Linux环境下C程序经常会出现A segmentation fault(段错误),如果我们的程序只有几十行,那么我们可以通过printf输出调试来找到哪个地方出现了异常,但如果是在项目中,如果我们还是通过print找查找错误,那么效率会很低。那么我们来学习一下Linux环境下通过core文件来找

Cython加密python代码防止反编译

本方法适用于Linux环境下: 1.安装库Cython pip3 install Cython==3.0.0a10 2.编写待加密文件:hello.py import random def ac(): i = random.randint(0, 5) if i > 2: print('success

Linux/Golang/glibC系统调用

Linux/Golang/glibC系统调用 本文主要通过分析Linux环境下Golang的系统调用,以此阐明整个流程 有时候涉略过多,反而遭到质疑~,写点文章证明自己实力也好 Golang系统调用 找个函数来分析 https://pkg.go.dev/os/exec#Cmd.Wait 源码文件在s

[转帖]修改jmeter内存配置(win&mac&linux)

目录 一、背景: 二、win环境下修改jmeter内存 三、mac&linux环境下修改jmeter内存 四、验证内存是否修改成功 一、背景: 在进行大数据、高并发压测的过程性,有时会遇上JMeter卡死现象,使得测试无法进行,查看日志显示:java.lang.OutOfMemoryError: J