Debian Linux包管理机制

Linux演化手记:Unix哲学、GNU工具、Debian治理与Ubuntu实践 Linux并非单一技术,而是Unix设计哲学、GNU自由软件工具链、Debian工程治理范式与Ubuntu人本实践四股力量长期演化的结果。其核心原理植根于‘一切皆文件’‘小工具大组合’等Unix信条,依赖glibc、bash、coreutils等GNU组件实现系统可运行性,依托Debian的严格包管理与社会契约保障稳定性,并通过Ubuntu的LTS发布、桌面体验优化和云原生集成推动大众化落地。这种历史脉络直接决定现代问题的归因逻辑——如docker权限报错本质是Unix域套接字权限模型与systemd服务协 阅读详情

Debian是linux史上的一个非常重要的发行版(话说,笔者写这篇博客时使用的系统就是Debian 8.6,嘿嘿~~在工作中使用debian这两年来,感觉debina是异常稳定哦,注意是异常稳定,至少我这里从来没有出现过各种奇怪的灵异现象~~),这个发行版本是很多Linux的上游版本,比如Ubuntu等著名发行版。Debian的地位的取得不仅仅是因为它创造了一个坚如磐石的Linux发行版,更多的原因在于它确立了一种Linux世界的应用包的构建,发行,管理一套流程的规范和标准,这就是deb包标准(Linux世界有两大软件包标准,一个是RPM,另一个就是DEB)。本篇博文就梳理下有关deb包的各种知识。
需要说明的是,本篇博文的内容整理自debian的官方handbook,debian people,debian wiki的一些文章,文章中图比较多,如果看不清楚,请下载下来查看哦。Debian的handbook我已经上传的到我的百度网盘,大家可以下载(你也可以去官方下载,但是网速好像不太好):
链接: https://pan.baidu.com/s/1qYfJDvQ 密码: c2r7
debian people的链接如下:
https://people.debian.org/~srivasta/MaintainerScripts.html(信息非常全面,建议看这个)
https://wiki.debian.org/MaintainerScripts
××××××××××××××××××××××××××××××××××××××××××××分割线××××××××××××××××××××××××××××××××××××××××××××××××××××

Deb包的组成结构

Deb包都是以deb为后缀名的文件,并且按照debian项目的定义,deb包有两种形式:binary和source。顾名思义,binary就是二进制格式的,这个格式的包中的内容全部都是二进制的,也就是源代码经过编译之后的,可执行或者可链接平台相关的二进制文件。source格式的就是包中有程序的源代码,这部分的内容在安装到机器上之前是需要进行编译的。下面,我们将这两个类型的包都进行一下结构分析。

Binary格式

想要查看一个deb包中的都有哪些内容,可以使用ar这个命令(命令具体用法请man),下面我们以unetbootin_575-1_amd64.deb这个包为例看下这个包中都有那些内容:
首先,我们使用ar命令查看其中内容:
这里写图片描述
可以看到,这个 包中的有三个文件,现在我们使用ar命令将这些内容解压出来:
这里写图片描述
现在我们已经把包中的内容解压出来了,我们发现多了debian-binary,control.tar.gz,data.tar.gz这三个文件,其中有两个是压缩文件。我们首先来查看debian-binary这个文件是什么:
这里写图片描述
原来这个文件是一个纯文本文件,内容只有2.0这个字符串。这里的2.0是什么意思呢?这个的意思是这个deb包使用的格式版本,自2015之后的deb格式全面升级到2.0版本了。这个是开发者在使用debian官方工具打包的时候自动生成的。
现在,我们来看下剩下的2个压缩是什么。首先我们查看control.tar.gz中的内容:
这里写图片描述
我们把control压缩包中的内容解压到control目录下,并且这个目录下生成了4个文件。我们挨个看下,首先查看control文件:
这里写图片描述
可以看到,这个control文件也是一个纯文本文件,并且其中的内容记述了这个包的各种详细信息,比如包名,版本,支持的架构,维护者,安装大小,依赖,建议安装包,功能描述等等重要信息。这些信息都是给系统包管理工具看的(准确来说是dpkg工具,后面我们会介绍它)。可以这么理解,这个control文件就向一个deb安装包的身份证件,其中包含了关于这个包的详细说明,至于这些每项说明是什么含义,我们后面会详细说明。
接下来我们再来看看md5sum文件:
这里写图片描述
这个文件也是一个纯文本文件,从名字上可以看出,这个文件应该是一个MD5摘要的记录文件,用于核验文件是不是被篡改了。这个文件中记录了这个包会安装的所有文件的md5校验值。
接下来,我们在看看postinst这个文件:
这里写图片描述
这个文件是一个POSIX的脚本文件,看到其中的执行内容是由dh_installmenu工具自动添加的,主要用于更新debian的menu系统,关于debian menu system的信息请查看:
https://www.debian.org/doc/packaging-manuals/menu.html/
因为这部分的内容是打包工具自动添加的,因此内容我们可以暂时不去关心。需要注意的是这个文件的作用,从名字上看这个文件就是在安装完成之后做的事情(postinst = post install),实时上确实如此。
同样滴,postrm这个文件就是在remove之后执行的脚本文件,内容如下:
这里写图片描述
到此,我们就弄清楚了control压缩包中的内容了。现在我们看下data压缩包中的内容是什么,我们把这个包中的内容解压到data目录下:
这里写图片描述
这里的内容我们看起来就比较熟悉了,这不就是安装之后的全部的数据吗???对的,这就是安装的数据文件,安装的过程中其实就是把这些数据抽取出来到你的系统中去!!我们可以做这件事情,我们直接执行解压出来的usr/bin目录下的可执行文件:
这里写图片描述
看见没有?他们是可以直接运行的,所有这就是安装的文件!!

package包的元数据—control文件信息

上面我们见识到了control文件中的信息,现在我们详细说明一下这个文件中的信息的含义。这个文件的记录的信息,我们称之为包的元数据信息,我们可以不用通过解压一个包的方式来查看control信息,我们可以通过apt-cache命令来查看某个包的元信息(这里我们以apt这个包本身为例,因为这个包的信息比较全):
这里写图片描述
下面我们来介绍一下重点的信息。

依赖信息:depends数据域

这个数据域记录了这个包中的程序需要基于的一些系统库,或者三方库,没有这些库的话,这个包中的程序可能无法运行或者功能不完整。比如上图中我们的apt这个包依赖了manpages-it等包。因为每个包都会有自己的版本,因此在指出依赖的时候还必须要说明依赖的版本信息,版本信息使用一下规则指明:
<<:表示需要小于这个版本的包
<=:表示需要小于等于这个版本的包
=:表示需要等于这个版本的包
>=:表示需要大于等于这个版本的包
>>:表示需要大于这个版本的包
同时,对于包之间的关系,存在与和或的关系,比如某个包需要A或者B,和C包的话,这里的以来可以写成:A | B, C,也就是说使用“|”来表示或的关系,“,”表示与的关系。包和包之间的依赖关系是linux世界软件之间的基本逻辑关系,是构建linux用户空间的重要逻辑。但是依赖逻辑还有另外一个重要用途,那就是用于构建一个软件体系。什么意思呢?我们可以这样,直接构建一个空包,这个包中没有安装的文件,只有一堆的依赖关系,这样的话,如果安装了这个包的话,就相当于安装了这个包中的所有的依赖包,这个包本身并不会产生任何影响。这样的包有很多,比如大名鼎鼎的gnome, kde-full和Linux-image-amd64等等,这些包本身没有东西,只是知己包含了大量的依赖内容。如果不这样写的话,将所有的内容都放到这个包中的话,这个包会异常庞大,拿kde-full来说的话,这个包包含了kde桌面系统的所有部件,整个内容加起来1G多。。。。。。

Recommends,suggests和enhance数据域

Recommends,suggests数据域描述的依赖内容不是强制的。重要的是,recommend数据的依赖虽然不是强制的,但是却是包功能完整发挥必不可少的部件。按照debian policy来说的话,如果你没有足够的理由证明你真的不需要这些Recommend包的话,你一定要安装他们。相反的是,suggest部分的包是给这个包的功能进行锦上添花的,比如说这个包可以让你的软件字体更加好看等等。这部分的包按照debian policy的说法就是:如果你没有足够的理由证明你确实需要这些包,那么你就不要安装他们。enhance部分描述的也是一种依赖关系,但是这种依赖关系是最弱的,这部分的包基本上就是一切增强功能的包,比如软件的插件,主题,美化字体等等。

Conflicts数据域

这个数据域描述的包就是不能和本包同时存在于一个系统中的包,他们之间是逻辑上冲突的。最常见的情形就是这些包中都包含同样名称的文件,或者提供同样的系统服务(比如监听在同一个TCP端口上),或者相互之间的业务逻辑冲突的。
dpkg软件管理系统会拒绝和目前已经安装软件冲突的软件包,并且通过给出错误告警信息,除非这个包申明它会覆盖(replace)和它冲突的包,这样的情况下dpkg会使用新的包来替换已经存在的包文件。

Breaks数据域:不兼容描述

这部分数据的描述和conflicts描述的内容有点相似,但是含义上有些许不同。这部分指出,安装这个包会破坏(break)另外一个已经安装的包。两个包之间的不兼容关系是短暂的,并且break关系通常明确指明不兼容的软件包的版本。
同样的,dpkg也会拒绝安装和现有安装包有break关系的包,不用的是apt工具会尝试去解决这个问题,比如升级有break关系的软件包到一个兼容的版本。
通常,这种情况会出现在系统升级了一个不向后兼容的包的时候,这些新版本的软件可能不在提供旧版本的某些功能。这个时候break关系会保证系统不会进入到这样的问题中,因此压根就不会安装他们或者解决这个问题。

Provides数据域

这个涉及到一个deb包中非常有趣的一个概念:虚拟包。这个包在系统中有很多角色,其中最重要的角色有两个。第一个是利用虚拟包来申明提供一个系统服务,第二个是指明一个包完全取代了另一个,这样的话就可以满足其他依赖包的依赖关系。下面我们看下这两个角色的含义。

提供一个服务

这里我们举一个简单的例子,在linux中,有好几个包都可以提供email投递服务,比如:postfix, sendmail等。这些包虽然名字都不一样,但是都会提供一个这样的服务:mail-transport-agent,这个服务的存在就是一个虚拟包。这个包并不实际存在,但是系统中确实有这个包。这样的话,如果你的系统安装了一个邮件投递服务包的话,那么如果你想再次安装另外一个的话,系统会报错,因为系统中已经有包可以提供相同的系统服务了。这样可以防止系统中安装了大量相同功能的包,可以很好地防止系统过分臃肿。

和其他包之间的互换性

我们举一个perl语言模块的例子,libdigest-md5-perl在Perl 5.6之前是一个可选的包,但是在Perl 5.8之后就是一个系统默认自带的包。在这个情况下,Perl 5.8版本的运行环境可以申明一个libdigest-md5-perl的虚拟包,这样的话,基于libdigest-md5-perl这个包的旧版本的应用程序任然可以运行,另外用户升级的时候,libdigest-md5-perl这个实际的包也会被移除,因此系统中老版本的Perl已经移除了,新版本中的自带这个包中的功能,因此他也就没有存在的必要了,会被自动删除。描述的情况如下图:
这里写图片描述
这里需要说明的是,元数据包和虚拟包是不一样的,虽然他们在逻辑上有点相似。元数据包是实际存在的一个deb包,虽然它里面什么都没有。而虚拟包是实际不存在的,只是逻辑上的一个东西。同时,虚拟包的名字也不能随意定义,为了避免虚拟包名的混乱,debian项目组定义了一个目前的虚拟包名的名称列表,因此如果你要开发一个包的话,请注意不要和这个列表中的名字重复:
https://www.debian.org/doc/packaging-manuals/virtual-package-names-list.txt

Replaces数据域

这个数据域描述的信息说明了这个包中的某些文件会替换系统中已经存在的文件所属于的包,但是这个替换行为是合法的。如果没有这个声明的话,那么dpkg会拒绝安装这个包,因为可能这个包会破坏当前的系统(虽然你可以使用–force-overwrite选项来强制覆盖,但是这终究不是一个靠谱的做法)。
这个数据域的通常使用场景就是软件包的升级,一个新的版本可能完全覆盖老版本的所有文件,然而这一切是合法,合理的。

Source格式

一个source合适的软件包,通常都由3个文件组成:一个.dsc文件,一个.orig.tar.gz文件,一个.debian.tar.gz(或者.diff.gz)文件。我们可以从source包构建deb二进制包,这些source包中的数据就是使用程序语言编写的源代码。我们可以从163的镜像源中看下source格式的软件包和deb二进制的文件包 ,这里我们以abx这个软件包为例:
这里写图片描述
可以看到,上图中有各个硬件架构的deb二进制软件包,剩下的就是source软件包了。那些deb的二进制包都是使用source包编译构建出来的。
下面我们看下这3个文件都是什么内容,首先我们看下dsc文件,dsc是Debian Source Control的简写,是一个纯文本文件,类似于上面deb的control文件,这个文件使用了RFC 2822标准的数据格式,描述了source包的元数据信息。通常如下内容,还是以上面的abx包为例:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Format: 3.0 (quilt)
Source: abx
Binary: abx
Architecture: any
Version: 0.0~b1-1
Maintainer: Chow Loong Jin <hyperair@debian.org>
Homepage: http://phintsan.kapsi.fi/abx.html
Standards-Version: 3.9.4
Build-Depends: debhelper (>= 9.0.0), dpkg-dev (>= 1.16.1), dh-autoreconf, autoconf-archive, portaudio19-dev, libsndfile1-dev, libgtk2.0-dev
Package-List: 
 abx deb sound extra
Checksums-Sha1: 
 20577adf12245c7b3b2d9a2383a8e90f846710f2 156146 abx_0.0~b1.orig.tar.gz
 b7c153e9999f4c781c23bd76a71034995dcc83cf 2311 abx_0.0~b1-1.debian.tar.gz
Checksums-Sha256: 
 66ceb8e8408ad5f75e1c6b0507ebcbc8963676659a8bebdf1e595fafefd07f1f 156146 abx_0.0~b1.orig.tar.gz
 f998bee0f1f693f14ad8e0064fdf08b145d24a03e1fd00ba2f4be5e0455b51bc 2311 abx_0.0~b1-1.debian.tar.gz
Files: 
 a42fb6d3d966fccece2af80f8ba8bf0a 156146 abx_0.0~b1.orig.tar.gz
 a1b5e51918101fb40165864e5a12b9b6 2311 abx_0.0~b1-1.debian.tar.gz

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)

iQIcBAEBAgAGBQJSPYZuAAoJEPvVIltYh1KhH00P/R9kpWoi1ozQNJVNt+wG512o
vZMY6LnxU1dv5AGUEV7XZYJD/xlc+R5hbVMQGnnYUjJK2qpeTlDZUKHxySW9tTsg
Y49x5cOPLUh4J98YMXfGw7jIJpGqCyBiS82jJfnNUregBSIzFG1py7sUmS9fOQf4
enTlJCjq5DceAsrXseqnDP/tzMxreiyD7lSnGkTwNeL5gfXcCmuK0XoOcRV5UGW5
kA855QnHfURRqvhWU9Ach4e+Y3TmRoaaPqIoNJAkoXTpX7vnaEBxJxszbc/u6HW2
RfP60F34c2XSC55T7IGHaS+1OdN+GBSw+/p244eIMtYRFqKUQdFtt/enLGXW717k
7u13RKJBj99G6+AMaoWrZXNvWIRgoB5GVmjuLnfgPz/7L2Bpku0gwy2HnORc9QHx
55fawPzPK26TmGjI9hzkzsNOd/QVGI0Hf+CXjFEx8s/tCiUzqKT2Spfevrq1zD/w
phIh+UrkmOpBrIJ4rzCNePJsr9113BHZJtCr6Q/Fh/u5sx5Vx0M44BnhKDvqLpDb
jlKYtn/+26gDqNF6yPl/8OJHScWkM72GjcHK+vLE5kEAMGMIzCbRbuG+BaGmxL4t
PHPnT8S24+X2ux7L17Qfs9EgqmBQ/pJGyBR0lSSphPyNTbLV5ma63MqBVipPCF1x
ibE366O2xfFjreH5RDbk
=P9DT
-----END PGP SIGNATURE-----

可以看到,这个文件中的内容是经过GPG签名的,信息由软件包的开发者或者维护者填写。同时,需要注意的是,source包也是有依赖的,只不过这个依赖是编译时的依赖,这一点和Binary包是截然不同的。这里我们需要进一步说明的是,一个source包可能会编译生成多个deb包。这就是为什么dsc文件中有source和Binary数据域的原因。Binary数据域表示了有多少个deb二进制包会生成。那为什么要将一个source包编译成多个deb包呢?这涉及到系统设计的考量。因为很多的软件包都会对外提供共享库给三方开发者,这样的话,用户就可以选择只安装这个软件包中的部分,也就是共享库的那部分。另外还有一种情况就是,这个软件包是C/S架构的,因此需要编译成server端和client端程序,以便独立安装部署。另外,很多的软件都会在source中提供doc文档,因此文档这部分组要单独编译成一个deb包,然后代码部分编译成不同架构的deb包,这样就不用每个硬件架构的deb包都携带doc内容,因此可以节省服务器上的存储资源。

dpkg工具安装,卸载,升级deb包

dpkg是debian系统中底层的软件包管理程序,他提供了非常基础底层的功能,在它的基础之上人们开发出了很多的上层的,更加易用的软件管理程序,比如apt,aptitude等。
dpkg管理下的所有软件包都处于以下状态之一:
Not-Installed state : 包还没有安装
Config-Files state : 当前只有这个包的配置文件存在于本地系统上
Half-Installed state : 安装中间状态,这个包的安装已经开始了,但是由于某些原因还没有完成安装
Unpacked state : 包已经被解包,但是还没有开始配置
Half-Configured state : 配置中间状态,这个包已经被解包,并且配置也已经开始了,但是由于某些原因这个步骤还没有结束
Triggers-Awaited state : 有其他的包等待这个包的触发操作
Triggers-Pending state : 另一个包已经激活了这个包先前表示感兴趣的触发器,现在有一些工作需要完成
Fully Installed state : 这个包已经被解包,并且正确地配置,这个包已经完全安装
除了上面提到的状态,dpkg还有标记一些特殊的包,目前而言,这些标记的位有:
reinst-required flag:某个包被打上这个标记就意味着这个包已经损坏并且需要重新安装,这些包不能被卸载移除,除非通过强制移除选项:–force-remove-reinstreq。
通常来讲,针对一个包的操作可以是下面的一种:安装,卸载,重新安装,升级。这里我们重点关注安装,卸载和升级deb包的过程,因为其他的过程都是在这个基础之上发展的,基本类似。

安装一个deb包

这里我们说明一下,安装一个包是指这个包目前并没有安装到当前系统上,这个包是全新安装。安装一个包是包管理系统中的最基础,最重要的一个功能,这个过程通常包含以下几个步骤:
1. 从deb包中抽取出control文件
2. 如果当前系统中有这个包的老版本,那么在正式安装这个包之前需要执行老版本包的prerm脚本
3. 运行preinst脚本(如果有的话)
4. 解压deb文件,同事备份旧版本的文件,以便安装出现问题的时候可以回滚到旧版本中。到这一步位置,任何配置都没有进行
5. 如果系统中安装有这个包的旧版本,那么此时运行这个旧版本的postrm脚本。注意,这个脚本是在新包的preinst脚本运行之后运行的,因为新文件已经写入当前系统同时旧版本的文件就被删除。
6. 配置这个包,配置过程包含以下步骤:解压conf文件,同时备份老版本的配置文件,以便出错回滚;然后运行postinst脚本,如果这个脚本有的话。
下面我们使用一个UML的状态图来描述安装的状态(就像上面提到的),图片来自https://people.debian.org/~srivasta/MaintainerScripts.html:
这里写图片描述
这个图描述了安装过程中的操作:当用户要求安装一个包的时候,这个包可能根本就不会安装,会结束在安装过程中状态,上图中只有绿色的状态才是成功的一个状态。
上面我们提到了很多的配置文件,下面我们给出一张图来解释各种配置文件的调用过程(图片来自https://wiki.debian.org/MaintainerScripts):
这里写图片描述
我们简单解释一下这个图,当一个包被安装的时候,首先preinst install会被调用,然后就是postinst configure,如果一切顺利的话,然后这个包的状态就是installed。但是如果在preinst install期间除了什么问题,那么postrm abort-install会调用。如果调用成功的话,用户会得到一个错误信息,提示安装失败,并且这个包的状态就是not installed。但是如果postrm abort-install也失败了,这个包就会进入一个比较尴尬的状态:half install,也就是安装了一半的状态,这个时候这个包是需要重新安装的,除非你使用上面提到的强制卸载选项,否则你得重新安装这个包。如果在postinst configure期间出错了,用户也会得到一个错误信息,兵并且这个包的状态就是Failed-Config状态。
为了有一个全面的安装过程理解,我们下面给出安装过程的全部过程图(来自https://people.debian.org/~srivasta/MaintainerScripts.html):
这里写图片描述
这个图中描述的deb安装版本是V1版本,绿色的部分就是正常情况下deb包应该处于的状态。维护脚本文件是在菱形的选择框中执行的,因为后续的结果取决于这个脚本执行是否成功。同时这个图中只是描述了安装的主体过程,没有给出依赖解决,冲突解决等过程。

卸载一个deb包

同样地我们这里说的卸载是指卸载一个已经正确完整安装的包。还需要说明的是,卸载一个包默认情况下是不会删除这个包的配置文件的,除非用户明确说明(加上purge选项,这个选项的意思就是移除和这个包有关的所有东西!!慎用!!)。如果没有加上purge选项的话,系统在下次安装这个包的时候,并不会重新配置这个包,而是直接使用这个包已有的配置。如果没有说明–purge的话,卸载包含以下步骤:
1. 执行prerm脚本
2. 移除安装的文件
3. 执行postrm脚本
下面是卸载一个包的时候的系统状态流转图(来自https://people.debian.org/~srivasta/MaintainerScripts.html):
这里写图片描述
同样这个途中正常状态就是绿色部分的状态,从installed到not installed状态。
下图是维护脚本的调用过程,不使用purge(来自https://wiki.debian.org/MaintainerScripts):
这里写图片描述
这个图的解释和理解和安装的一样。下面是使用–purge的情况,大体类似,只是多了移除配置文件的过程:
这里写图片描述
两个图合起来的状态就是下面这样,也就是用户执行apt-get purge 包名的情形:
这里写图片描述
这里需要说明的是,如果用户卸载包的时候没有使用purge选项,也即是说这个包的配置文件被保留了下来,因此下次安装的时候,系统会跳过重新配置的步骤,直接使用系统中原有的配置:
这里写图片描述
注意上图中的postinst configure 1.2-3中的1.2-3指明了使用现有系统中旧版本的配置文件。
下面我们使用流程图整体描述卸载软件包的过程(来自https://people.debian.org/~srivasta/MaintainerScripts.html):
这里写图片描述

升级一个deb包

升级一个包是指这个包已经在当前系统中正确安装,现在有一个新的版本需要升级。一个软件包的升级过程是比较复杂的,步骤较多。
下面我们首先给出这个步骤中的状态描述图:
这里写图片描述
这个图描述了从V1升级到V2的过程。
下面我们给出一个将foo包从1.2-3版本升级到1.2-4版本的过程:
这里写图片描述
你可以看到,升级的过程中中间步骤非常多,但是上面的图给出了比较直观的描述。
接下来我们还是给出升级的全部流程图:
这里写图片描述

包维护脚本的执行状态图

上面我们描述了很多的包维护脚本,下面我们给出包在安装,卸载,升级等过程中的所有脚本执行图:
这里写图片描述

dpkg的数据库

到现在为止,大家应该对deb包的管理过程有一个大致的了解了,现在我们来想一个问题,我们在系统中随时都可以查询一个已经安装的包的状态,那么这些信息是存在哪里的呢?另外,我们上面提到的deb的维护脚本,这些脚本又是存储在系统的什么位置的呢?这些都是存储在dpkg的database里面,这个数据库并不是我们理解的sql的数据库,而是一个专用的系统目录,这个目录下存储了很多关于包管理的信息,这个目录就是/var/lib/dpkg。我们先看下这个目录下都有什么,以我的电脑为例(debian 8.6):
这里写图片描述
可以看到,这个目录下保存了很多的信息,其中需要注意的就是info目录,lock文件,status文件。info目录下存储就是系统中所有安装包的信息,包括包的control信息,维护脚本,md5校验值等信息:
这里写图片描述
这里我们以xterm包为例,info目录下保存了它的配置文件信息文件,安装文件信息文件,md5校验值文件,维护脚本文件。大家可以到自己的系统目录下查看这些文件的内容。

APT工具集合

APT是一个很庞大的开源的deb包管理项目,他提供了apt-get,apt-cache,apt等著名的上层用户友好的包管理工具,这个工具是基于dpkg系统的,因此只是在dpkg的基础之上封装了一套用户友好的逻辑。
更多关于apt的信息请看官网:https://wiki.debian.org/Apt,笔者后期会持续更新这部分的内容。

其他高级工具

debian系列系统的魅力就在于他提供了丰富多彩的高级包管理工具,按照debian官网的说明,这些高级工具有以下内容(来自https://www.debian.org/doc/manuals/debian-reference/ch02.en.html):
这里写图片描述
除了上面的工具之外,这里笔者强烈给大家推荐一个上面没有列出的管理软件gdebi,这个软件在解决包的依赖上非常出色,可以省去很多的烦恼,这个工具是使用python语言开发的,逻辑简单明了,项目地址:
https://launchpad.net/gdebi
大家可以去上面看看文档,非常简单易用。

linux/ubuntu系统管理(11)软件包管理(1)初步认识Debian包和apt-get命令 在本教程中,学习使用 Debian 包管理工具来管理 Linux 系统上的包。安装、重新安装、升级和删除 Debian 二进制包寻找包含特定文件或库的包(即使该包未安装)获取版本、内容、依赖关系、包完整性和安装状态等包信息(即使该包未安装)过去,许多 Linux 程序以源代码的形式发行,用户将源代码构建为所需的程序或程序集,源代码还附带所需的手册页、配置文件,等等。现在,大多数 Linux 发行商都使用称为包的预先构建的程序或程序集,这些包便于在该发行版上安装。 阅读详情

相关推荐

44、Fedora与Debian GNU/Linux系统使用指南

本文详细介绍了Fedora与Debian GNU/Linux系统的使用与安装方法。涵盖Fedora的启动流程、Firstboot初始配置及常用软件添加;深入解析Debian的软件包机制、APT与dpkg包管理工具、版本发布流程,并提供完整的Debian安装步骤,包括硬件要求、分区策略、网络和用户设置等。同时列出获取Debian帮助的官方资源,适合Linux初学者和系统管理员参考使用。

o9p0q1的博客 107

dpkg原理与实战:Debian系Linux包管理底层机制解析

dpkg是Debian及其衍生发行版(如Ubuntu、统信UOS、麒麟)中负责.deb软件包安装、卸载、查询和配置的核心工具,它不解决依赖、不联网、不自动修复冲突,而是以极简、可审计、可复现为设计原则,直接操作本地包文件并维护纯文本状态数据库/var/lib/dpkg/status。其本质是包管理器(如apt)的底层执行引擎,支撑着从桌面环境到信创国产化系统的离线部署、安全审计与嵌入式定制等关键场景。掌握dpkg命令结构(-i/-r/-P/-l)、工作流(preinst→unpack→postinst→st

weixin_34128237的博客 367

【网络安全】Centos7安装杀毒软件----ClamAV

Clam AntiVirus是一个Linux系统上使用的反病毒软件包。主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库。

你在看屏幕的同时,屏幕也在注视着你 8828

Debian policy --虚拟包

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34353714的博客 611

Zemax序列模式下激光二极管(LD)光源建模与像散校正实战

本文详细讲解了在Zemax序列模式下精确建立激光二极管(LD)光源模型并校正其像散的核心方法。通过将椭圆光束的发散角转换为渐晕系数,并巧妙利用理想柱面镜模拟像散,实现了对LD光源特性的高精度模拟。该方法特别适用于激光耦合、激光雷达等需要对像散光束进行精密控制的光学系统设计。

weixin_28455801的博客 440

Claude Code启动失败解决方案,执行文件不兼容一键修复

Claude Code命令行工具突然报错,显示"不支持的16位应用程序"。作者排查Node版本无果后,发现是Anthropic更新导致Windows兼容性问题。解决方法很简单:卸载旧版、切换npm镜像源、重装最新版即可恢复。经验教训:遇到类似问题应先搜索社区反馈,避免无谓排查,同时注意npm源使用后及时还原。整个踩坑过程虽折腾,但最终只是简单的重装问题。

1461

Debian常用包管理命令用法详解

apt是一个高级工具,自动处理软件包依赖,能够从软件仓库中下载和安装软件包,进行更新和升级。apt依赖dpkg来实际执行软件包的安装和卸载。在Debian和Ubuntu及其衍生发行版中,apt-get 和 apt-cache 是两个常用的命令行工具,用于管理和查询软件包。apt是Debian中用于管理软件包的高级工具,能够处理依赖关系、更新软件包列表、安装、升级和卸载软件包等操作。dpkg-source 命令是用于处理Debian源码软件包的工具,主要用于构建和管理.dsc文件以及源码包。

yang1fei2的博客 1398

hcaptcha逆向实战:从API解析到参数构造的完整链路

本文详细拆解了hcaptcha验证码的逆向实战流程,从环境准备、捕获API与版本号,到解析核心加密逻辑hsw.js,再到构造getcaptcha请求参数,最后完成验证提交。文章重点剖析了motionData、n、c等关键参数的获取与构造方法,为开发者模拟浏览器行为、实现自动化验证提供了清晰的完整链路指南。

ik678901的博客 630

deb 软件包管理

deb软件包基本管理

m0_59551305的博客 982

拯救者R7000用户实测:用华为电脑管家11.0版搞定MatePad Pro多屏协同(附驱动与显卡避坑指南)

本文详细介绍了如何在非华为笔记本联想拯救者R7000上安装华为电脑管家11.0版,实现与MatePad Pro的多屏协同功能。从驱动优化到显卡配置,提供了全面的避坑指南和实用技巧,帮助用户解决连接失败等常见问题,提升跨设备生产力体验。

weixin_30788619的博客 398

科研党必备:5分钟搞定Arxiv论文批量导入NoteExpress(附PDF自动下载技巧)

本文为科研人员提供了一套高效的自动化工作流,实现从Arxiv批量检索论文、自动下载PDF到无缝导入NoteExpress的全过程。通过Python脚本和NASA ADS等工具,可大幅提升文献管理效率,特别适合需要追踪前沿动态的研究生和科研团队。

orange的博客 398

deb软件包管理

deb软件包管理

weixin_52627168的博客 2013

18、AI在基础设施管理与运维中的应用及未来趋势

本文探讨了人工智能(AI)在基础设施管理和运维中的广泛应用,包括性能优化、成本节约、网络安全等多个场景。文章详细介绍了AI在不同领域的应用工具、实际案例以及面临的挑战,并展望了未来AI在基础设施管理中的发展趋势。此外,还分析了AI与Site Reliability Engineering(SRE)框架的结合优势,展示了AI如何提升运维效率和系统可靠性。

n7o8p的博客 148

linux 包管理机制,Debian和Gentoo包管理机制比较及延伸 (1)

如果你现在想安装一套Linux,又不想随着Linux发行版本的版本号,不停的格式化系统,重新安装,或者升级安装。那么,最适合你的只有LFS、Debian和Gentoo。本文尝试对Debian、Gentoo的包管理机制进行比较,并由此得出了几个有趣的结论。本文对于Debian、Gentoo的包管理,主要谈缺陷和不足,并且尝试提出解决方法。最后,本人水平有限,失误、不足之处在所难免,还望大家批评指正。...

weixin_33980357的博客 764

自定义Usecase/Pipeline

Summary of Custom Usecase and Pipeline Configuration in SA8650 QCX Framework This article elaborates on the complete process of customizing a new Usecase and Pipeline based on the SA8650 QCX framework to meet OEM and Tier1 customization requirements, with

qq_39257814的博客 930

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Linux版本:Debian,Gentoo的包管理机制比较及延伸

如果你现在想安装一套Linux,又不想随着Linux发行版本的版本号,不停的格式化系统,重新安装,或者升级安装。那么,最适合你的只有LFS、Debian和Gentoo。    本文尝试对Debian、Gentoo的包管理机制进行比较,并由此得出了几个有趣的结论。本文对于Debian、Gentoo的包管理,主要谈缺陷和不足,并且尝试提出解决方法。最后,本人水平有限,失误、不足之处在所难免,还望

Eric 1364

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Debian和Gentoo包管理机制比较及延伸

如果你现在想安装一套Linux,又不想随着Linux发行版本的版本号,不停的格式化系统,重新安装,或者升级安装。那么,最适合你的只有LFS、Debian和Gentoo。 本文尝试对Debian、Gentoo的包管理机制进行比较,并由此得出了几个有趣的结论。本文对于Debian、Gentoo的包管理,主要谈缺陷和不足,并且尝试提出解决方法。最后,本人水平有限,失误、不足之处在所难免,还望大家

冷剑魂的专栏——垃圾场 2474

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Kunbutu Linux使用手纪

新版本的Kunbutu Linux发行版这个月要发布了,Kubuntu是一份专注于KDE桌面环境的Ubuntu Linux发行版,后者是一份改造于Debian的发行版,专注于GNOME桌面环境和相关易用性。Kubuntu Linux从Ubuntu Linux中独立发布才不到6个月,几周前,Kubuntu Linux紧随Ubuntu Linux发布了代号为"Hoary Hedgehog"的5.04发

ZCatLinux --资讯与技术社区--Open Source World----Linux/Shell/DevOPS-- 2733

[导入]Debian和Gentoo包管理机制比较及延伸 (1)

Debian和Gentoo包管理机制比较及延伸 (1) 文章来源:http://blog.youkuaiyun.com/zgqjymx/archive/2008/05/06/2399255.aspx 转载于:https://www.cnblogs.com/zgqtxwd/archive/2008/05/18/1201733.html...

weixin_30378623的博客 109

Linux Ubuntu下 apt-get包管理

注意不同系统下包 管理机制也是不同的: 1.RedHat系列:Redhat、Centos、Fedora等 2.Debian系列:Debian、Ubuntu等 RedHat 系列 1 常见的安装包格式 rpm包,安装rpm包的命令是“rpm -参数” 2 包管理工具 yum 3 支持tar包 Debian系列 1 常见的安装包格式 deb包,安装deb包的命令是“dpkg -参数” 2 包管...

从简的博客 1055

安装linux系统步骤_图解Debian10Linux系统的安装步骤

​Debian 作为最早最老牌的 Linux 发行版之一,它在创建之初便紧密遵循 GNU 规范并坚守 Unix 和开源自由软件的精神。最大优点是极其稳定快速,同时拥有强大的 APT 包管理机制和丰富的软件源,可以方便地安装和平滑升级软件和系统,省去很多编译安装和版本升级的麻烦Debian 10 Buster 正式版 (GNU/Linux) 可以称得上是 Linux 发行版中的典范,它的稳定版 (S...

weixin_39970855的博客 1387

Debian与Linux与Ubuntu的关系

Debian 是一个完全由社区维护的、自由开放的操作系统,也是现存最古老的 Linux 发行版之一(1993 年诞生)。下面为你梳理这三者的关系。

m0_69109139的博客 311

Linux云服务器系统选型:Ubuntu Server、Rocky Linux、Debian哪个更稳定易维护?

如果你是个人站长和开发者,你还没有自己的服务器,日常测试开发学习,推荐几个还可以性价比高的服务器,有99元1年续费同价,也有3年期的服务器可选,2G内存或者4G内存的都有。我见过用 Ubuntu 跑五年不重启的服务器,也见过 Rocky 因配置错误天天宕机。每台都跑过半年以上,部署过网站、API、数据库、定时任务。→ 追求系统简洁、愿意深挖原理、长期运行无人值守服务的人。→ 企业运维、项目、计划走 Linux 职业路线的人。日常装软件、查日志、排错,Ubuntu 最省心。选一个你愿意花时间去了解的系统。

2403_89345764的博客 909

linux系统包管理工具下载,Linux包管理工具——apt原理

apt是Debian系列的Linux操作系统的包管理工具,最近的项目中使用了stretch Linux,它也是使用apt来进行包管理的。apt工作原理apt采用集中式的软件仓库机制,将各式各样的软件分门别类的放在软件仓库之中,从而进行有效的组织和管理。然后,将软件仓库放置在许多镜像服务器中,并保持基本一致。这样一来,所有的用户都能获取最新的软件安装包。对用户而言,这写镜像就是软件源。由于用户所处网...

weixin_33492955的博客 416

5分钟搞懂apt与yum:Linux包管理工具终极选择指南

Linux命令大全搜索工具是一个涵盖Linux命令手册、详解、学习和搜集的开源项目,能帮助用户轻松查询和学习各种Linux命令。而在Linux系统管理中,包管理工具是不可或缺的,其中apt与yum是最常用的两款。新手往往会困惑于该选择哪款工具,本文将为你详细解析apt与yum的核心功能、适用场景及实用操作,助你快速掌握Linux包管理技巧。 [![Linux命令大全搜索工具界面](https:/

gitblog_00420的博客 866

Debian如何彻底卸载软件

Debian系统卸载软件更干净的方法:通过sudo apt purge 软件名可彻底删除软件及其系统配置文件,配合sudo apt autoremove清理无用依赖包,比Windows标准卸载更彻底。由于Debian的包管理系统会记录安装文件,能精准识别和删除相关文件,而Windows依赖软件自带的卸载程序,容易残留文件。完全清理还需手动删除用户配置文件(如~/.config/和~/.local/share/下的相关目录)。通过dpkg -l | grep ^rc可检查残留配置。Debian的包管理机制使其

一名java后端开发小菜的学习笔记 403
上一篇: Java Native Interface(JNI)从零开始详细教程
下一篇: Android应用界面布局
createchance
博客等级 码龄15年 156粉丝 90原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值