Theos(五):.deb 与 dm.pl

本文介绍了Ubuntu、CentOS和Debian等Linux发行版的特点及应用场景,详细解析了.deb文件结构及其安装卸载流程,并概述了dpkg与APT工具的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 免费发行版本:Ubuntu、CentOS、Debian

Linux 有非常多的发行版本,从性质上划分,可以分为:

  1. 由商业公司维护的商业版本
  2. 由开源社区维护的免费版本

商业版本以 RedHat 为代表,免费版本以 Debian 为代表。绝大多数 VPS(Virtual Private Server,虚拟专用服务器) 上只提供开源社区维护的免费版本。下面介绍的这些 Linux 免费版本,各自有的不同的特点,在不同的应用领域发挥着不同的作用,孰优孰劣,不能一概而论

  • ① Ubuntu

    Ubuntu 有着漂亮的用户界面,完善的包管理系统,强大的软件源支持,丰富的技术社区,而且对大多数硬件有着良好的兼容性(包括最新的图形显卡等等)。这一切让 Ubuntu 越来越向大众化方向发展,也决定了 Ubuntu 最佳的应用领域是桌面操作系统而非服务器操作系统。如果开发者希望在学习 Linux 的过程中有个沉浸式的环境,则 Ubuntu 的确是一个非常不错的选择。(Ubuntu 由 Debian 发展而来)

  • ② CentOS

    RHEL(RedHat Enterprise Linux)是 RedHat 黄金标准的企业发行版,它每五年左右更新一次,在系统的稳定性,前瞻性和安全性上有着极大的优势。CentOS(Community Enterprise Operating System)是 RHEL(RedHat Enterprise Linux)商业版本对应的免费版本,通常会在 RedHat 发布后很快发布。CentOS 界面简约、命令行下的人性化做得比较好、运行稳定、有着强大的英文文档与开发社区的支持。因为 CentOS 与 RedHat 有着相同的渊源,所以虽然不单独提供商业支持,但是往往可以从 RedHat 中找到相应的线索

  • ③ Debian

    Debian 适合作为服务器的操作系统,Debian 是 Ubuntu 的基础,并且 Debian 比 Ubuntu 要稳定得多,甚至可以说稳定得无与伦比。整个 Debian 系统,只要应用层面不出现逻辑缺陷,基本上固若金汤,是个常年不需要重启的系统。整个 Debian 系统的基础核心非常小、非常稳定、占用的内存空间小、占用的硬盘空间小。128 MB 内存的 VPS 即可以流畅地运行 Debian(用相同的内存去运行 CentOS 则会略显吃力)。Debian 的名称是由其创始人的妻子(Debra Murdock,黛布拉·默多克)和其创始人(Ian Murdock,伊恩·默多克)的名字组合而成

.deb 文件结构

  • 简介

    .deb 是 Debian 软件包的文件扩展名。.deb 软件包是标准的 Unix ar 归档,将包文件信息以及包内容,经过 gzip 压缩和 tar 打包而成,是 Debian 和 Ubuntu 专属的安装包格式,再配合上 APT 软件管理系统,成为了当前在 Linux 下非常流行的一种安装包。.deb 格式在进入 2.x 时代之后,Cydia 的作者 Jay Freeman(Saurik)将其(和 APT 软件管理系统一起)移植到了越狱的 iOS 平台上,成为 iOS 越狱插件分发的主要格式

    一个 .deb 包由 3 部分组成:

    1. 数据文件
    2. 控制文件
    3. 其他数据(二进制形式)
  • ① 数据文件

    包含实际安装的程序数据,文件名为 data.tar.XXXXXX 为使用的压缩格式)

    .deb 包本身可以使用不同的压缩方式,.tar 格式并不是一种压缩格式,而是直接把分散的文件和目录集合在一起,并记录其权限等数据信息

    .deb 包默认使用的压缩格式为 gzip,所以最常见的就是 data.tar.gz,其他的压缩格式还有 bzip2lzma。其中 lzma 的压缩率最高,但是压缩需要的 CPU 资源和时间都比较长

    在安装过程中,数据包 data.tar.gz 里面包含的数据会被直接解压到目标系统的根目录(/)。因此,在 .deb 打包之前,需要根据二进制程序文件(以及其他资源文件)所在位置设置好相应的 文件-目录树

  • ② 控制文件

    包含安装一个 .deb 包时所需要的控制信息,文件名为 control.tar.gz,一般由 5 个文件组成:

    1. control,用于记录软件的标识、版本号、目标平台、依赖信息等数据,是 .deb 包必须具备的文件
      同 Theos 创建的 Tweak 工程中的 control 文件

    2. preinst,在解包 data.tar.gz 之前运行的脚本。通常用于停止作用于待升级软件包的服务,直到软件包安装完成或者升级完成

    3. postinst,在解包 data.tar.gz 之后运行的脚本。通常用于进行软件包安装完成之后的配置工作,或者为(新安装/升级完成)的软件包重启服务

    4. prerm,卸载软件时,在删除文件之前运行的脚本。通常用于停止与软件包相关联的守护进程(daemon)服务

    5. postrm,卸载软件时,在删除文件之后运行的脚本。通常用于删除由该软件包创建的文件

    关于 extrainst_ 脚本:

    1. Cydia 的作者 Saurik 在为越狱插件所构建的 .deb 包(的控制文件)中添加了一个额外的脚本 extrainst_,其作用与 postinst 脚本类似

    关于缩写与前缀:

    1. instinstall(安装)的缩写
    2. rmremove(移除)的缩写
    3. preXXX 表示在 XXX 之前
    4. postXXX 表示在 XXX 之后
  • ③ 其他数据(二进制形式)

    包含文件头等信息,一般情况下看不到,需要在特定的软件中打开才可以看到

  • 举例说明

    WeChatTweak.deb 文件的内部结构,如下所示:

    ~/Desktop/TheosDemo/wechattweak/packages/WeChatTweak.deb > tree
    .
    ├── DEBIAN # DEBIAN 目录用于存储控制文件
    │   ├── control
    │   ├── preinst 
    │   ├── postinst
    │   ├── prerm 
    │   ├── postrm 
    │   ├── conffiles
    │   ├── changlog
    │   └── copyright
    └── Library # 此目录用于存储数据文件,是根据 Tweak 插件在目标越狱 iOS 设备中所处的位置而生成的
        ├── MobileSubstrate
        │   └── DynamicLibraries
        │       ├── WeChatTweak.dylib
        │       └── WeChatTweak.plist
        └── PreferenceLoader
            └── Preferences
                └── WeChatTweak
                    └── hcgImage1.png
    
    7 directories, 11 files
    

dpkg 与 APT

  • dpkg 简介

    dpkg(Debian Packager)是 Ian Murdock(伊恩·默多克)为 Debian 专门开发的软件包管理器,方便 Debian 本地软件包的:查看、创建、安装、更新、移除。所有源自 Debian 的 Linux 发行版都使用 dpkg

    dpkg 常用命令:

    # 输入 dpkg --help 可获得安装和卸载软件包的有关帮助
    # 输入 dpkg-deb --help 可获得有关操作 *.deb 文件的帮助
    # 输入 dpkg -Dhelp 可看到 dpkg 除错标志的值的列表
    # 输入 dpkg --force-help 可获得所有强制操作选项的列表
    
    ~ > dpkg-deb --help
    
    Usage(用法): 
    
    	dpkg-deb [<option>...] <command>
    
    Commands(命令):
    
    	# <deb> 是 Debian 格式归档文件的文件名
    	# <cfile> 是管理文件组件的文件名
    	# <cfield> 是主控文件中的属性字段的名字(主控文件,即 control 文件)
    	
    	-b|--build <directory> [<deb>]   		# 构建 .deb 软件包
    	-c|--contents <deb>              		# 显示软件包中的数据文件列表
    	-I|--info <deb> [<cfile>...]     		# 显示软件包的详细信息,包括:软件名称、软件版本、软件大小、软件依赖、软件描述 等等
    	-W|--show <deb>                  		# 显示软件包的简略信息,包括:软件名称、软件版本
    	-f|--field <deb> [<cfield>...]   		# 显示主控文件(即 control 文件)中字段的信息
    	-e|--control <deb> [<directory>] 		# 解压软件包中控制文件(即解压软件包中的 DEBAIN 目录)
    	-x|--extract <deb> <directory>   		# 解压软件包中的数据文件
    	-X|--vextract <deb> <directory>  		# 解压软件包中的数据文件,并列出解压的数据文件列表
    	-R|--raw-extract <deb> <directory>		# 解压软件包中的控制文件与数据文件
    	--ctrl-tarfile <deb>             		# 显示软件包的控制文件的信息
    	--fsys-tarfile <deb>             		# 显示软件包的控制文件在文件系统中的信息
    	-?, --help                       		# 显示本帮助信息
    	--version                    			# 显示版本信息
    
    Options(选项):
    
    	-v, --verbose                    		# 启用详细输出
      	-D, --debug                      		# 启用调试信息输出
    		--showformat=<format>          		# 对 --show 使用备用的输出格式
          	--deb-format=<format>          		# 选择构建格式。允许的值: 0.939000, 2.0 (默认)
          	--nocheck                    		# 阻止控制文件的检查(构建坏的软件包)
          	--root-owner-group           		# 强制设置文件属主和属组为 root
          	--[no-]uniform-compression   		# 在所有成员上使用压缩参数
    	-z#                              		# 设置构建时使用的压缩级别
      	-Z<type>                         		# 设置构建时使用的压缩类型。可用的类型: gzip, xz, bzip2, none
      	-S<strategy>                         	# 设置构建时使用的压缩策略。可用的值: none; extreme (xz); filtered, huffman, rle, fixed (gzip).
    
    Format syntax(关于参数 format 的语法):
    # format 是用于显示每一个软件包的字符串
    # format 可以包含标准的转义字符,如:\n (换行)   \r (回车)   \\ (反斜杠)
    # 可以通过加入软件包属性的变量引用来反映软件包的相关信息,要在某些字段引用属性变量的话,可以用这样的语法:${var[;width]}
    # 字段一般是靠右对齐的,除非它的宽度是负数。若其宽度是负数,那么字段将会靠左对齐
    
    其他:
    # 使用 dpkg 命令可以在系统中安装和卸载软件包,而 apt 或 aptitude 命令则用于简便的软件包管理
    # 另外,通过 dpkg-deb --extract 命令解压的软件包将不会被正确安装!
    
    # 安装给定的 .deb 文件(解包并且进行配置)
    dpkg -i <deb path>
    dpkg --install <deb path>
    
    # 解包给定的 .deb 文件(解包但不进行配置)
    dpkg --unpack <deb path>
    
    # 卸载给定的软件包,但是保留配置文件
    dpkg -r <package>
    dpkg --remove <package>
    
    # 卸载给定的软件包,同时删除配置文件
    dpkg -P <package>
    dpkg --purge <package>
    
    # 显示给定软件包的详细状态
    dpkg -s <package>
    dpkg --status <package>
    
    # 检查给定软件包的完整性
    dpkg -V <package>
    dpkg --verify <package>
    
    # 配置给定的软件包
    dpkg --configure <package>
    
  • APT 简介

    dpkg 是 Debian 软件包管理的基础,它被用来(查看、创建、安装、更新、移除)本地的软件包,但是 dpkg 没有解决软件包间的依赖关系

    APT(Advanced Packaging Tool,高级软件包管理工具)用于解决软件包间的依赖关系,它从网络服务器上的软件仓库中获取待安装的软件包及其依赖的软件包,然后调用 dpkg 的相关命令对下载到本地的软件包进行(查看、创建、安装、更新、移除)等

    (Debian 的 APT)类似于(macOS 的 Homebrew)

    APT 由几个名字以 apt- 开头的程序组成:apt-getapt-cacheapt-config、…、等等。也就是说,软件包管理命令被分散在了多个命令行管理工具中。为了解决软件包管理命令过于分散的问题,引入了 apt 命令,它包括了 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cacheapt-config 命令中经常用到的功能

Cydia 安装和卸载 .deb 包的过程

  • Cydia 安装 .deb 包的过程

    1. 读取目标 iOS 设备中的 Cydia 数据库并进行锁定,避免同时有两个安装程序在运行

    2. 读取待安装的 .deb 包中 control 文件的软件包标识(Package)和软件包版本信息(Version),并搜索目标 iOS 设备中的 Cydia 数据库
      若目标 iOS 设备中已经存在该软件包,则卸载之后再安装

    3. 读取待安装的 .deb 包中 control 文件的 DependsPre-DependsConflictsReplaces 字段
      如果在目标 iOS 设备中未找到 Depends 字段所标识的软件,则安装之
      如果在目标 iOS 设备中未找到 Pre-Depends 字段所标识的软件,则报错并终止安装
      如果在目标 iOS 设备中有找到 Conflicts 字段所标识的软件,则报错并终止安装
      如果在目标 iOS 设备中有找到 Replaces 字段所标识的软件,则卸载之

    4. 将状态数据写入到目标 iOS 设备的 /var/lib/dpkg/status 文件中

    5. 如果待安装的 .deb 包中存在 preinst 脚本,则执行之

    6. 解压待安装的 .deb 包中的程序数据 data.tar.gz,并将解压后的文件存放到目标 iOS 设备的相应位置,然后将解压的文件列表写入到 /var/lib/dpkg/info/XXX.list 文件中

    7. 如果待安装的 .deb 包中存在 postinst 脚本,则执行之
      如果待安装的 .deb 包中存在 extrainst_ 脚本,则执行之

    8. 如果整个安装过程都没有出错,则安装成功,将信息 Status:installokinstalled 写入到目标 iOS 设备的 /var/lib/dpkg/status 文件中
      如果安装失败,则在目标 iOS 设备的 /var/lib/dpkg/status 文件中写入其它状态数据,比如 Unpacked(未解包数据)、Failed-config(脚本未能成功执行)、Half-installed(安装失败)等

  • Cydia 卸载 .deb 包的过程

    1. 读取目标 iOS 设备中的 Cydia 数据库并进行锁定,避免同时有两个卸载程序在运行

    2. 根据待卸载的软件的软件包标识(Package)搜寻目标 iOS 设备中的 Cydia 数据库

    3. 检查目标 iOS 设备中是否有其他软件依赖于待卸载的软件。如果有,则提示,并中断卸载

    4. 如果待卸载的软件中存在 prerm 脚本,则执行之

    5. 读取 /var/lib/dpkg/info/XXX.list 文件,并删除该文件中记录的全部文件和非空目录

    6. 如果待卸载的软件中存在 postrm 脚本,则执行之

    7. 如果使用的卸载命令是 dpkg -r,则保留目标 iOS 设备的 /var/lib/dpkg/status 文件中的记录并改为 Status:Notinstalled
      如果使用的卸载命令是 dpkg -P,则删除全部数据

    8. 如果整个卸载过程都没有出错,则卸载成功,重新读取目标 iOS 设备中的 Cydia 数据库并解除锁定

    9. 注意:.deb 软件包安装的软件,可能会在使用过程中在目标 iOS 设备的 /var/mobile/Documents 等目录下放置存档文件,或者在目标 iOS 设备的 /var/mobile/Library/Preferences 等目录下放置配置文件
      因为这些文件并没有记录在目标 iOS 设备对应的 /var/lib/dpkg/info/XXX.list 文件里,所以在卸载软件时,不会删除这些文件

  • 关于 Cydia 的 AutoInstall 目录

    在重启 iOS 系统之后,Cydia 会通过其内置的一个启动脚本,使用 dpkg 的命令去自动安装存储在 /var/root/Media/Cydia/AutoInstall 目录下的所有 .deb 软件包。开发者如果发现越狱的 iOS 设备上不存在此目录,则可以通过 mkdir 命令手动补全

Theos 的 dm.pl 脚本

  • dm.pl 简介

    dm.pl 是一个基本的 Perl 脚本,用于无需安装 dpkg 即可制作 Debian 软件包(.deb 文件)。它可以作为 dpkg-deb -b 的替代品,具有兼容的标志

  • 安装

    dm.pl 包含在 Theos 中,并由 Theos 使用(如果您的 Theos 中没有 dm.pl,则 请更新您的 Theos!

    或者,您可以使用 npm 安装:

    npm install -g @theosdev/dm.pl
    

    或者,您可以克隆此 Git 仓库的副本:

    git clone https://github.com/theos/dm.pl.git
    

    dm.pl 适用于任何安装了 Perl 和 xz-utils 的操作系统(几乎所有的操作系统都会预装 Perl 和 xz-utils)

  • 用法

    dm.pl [options] <directory> <package>
    

    选项(options)的取值,如下所示:

    1. -b:此选项的存在仅是为了与 dpkg-deb 兼容
    2. -Z<compression>:指定软件包的压缩类型。有效值为: gzip(默认)、bzip2lzmaxzcat(无压缩)
    3. -z<compress-level>:指定软件包的压缩级别。有效值介于 0 - 9 之间。bzip2 压缩的默认值为 9,其他压缩的默认值为 6。使用 bzip2 压缩时,0 与 1 效果相同。请参阅 gzip(1)bzip2(1)xz(1) 以了解每个压缩级别的影响
    4. --help-?:打印简短的帮助信息并退出
    5. --man:打印手册页并退出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值