我试图了解包(rpm、deb、dpkg)的创建如何工作以及该架构支持和不支持什么。
现在,我很难弄清楚当软件包的安装或升级在过程的不同点失败时会发生什么 - 即,脚本错误,没有足够的磁盘空间(在开始之前检查过吗?) -。
根据我目前的理解,如果有的话,不会自动回滚到以前的工作版本。所以我的问题是,包如何处理这种情况?如果发生某些错误,脚本是否根本不用于备份文件并在事务后恢复它们?(到目前为止我找不到例子)
谢谢。
我试图了解包(rpm、deb、dpkg)的创建如何工作以及该架构支持和不支持什么。
现在,我很难弄清楚当软件包的安装或升级在过程的不同点失败时会发生什么 - 即,脚本错误,没有足够的磁盘空间(在开始之前检查过吗?) -。
根据我目前的理解,如果有的话,不会自动回滚到以前的工作版本。所以我的问题是,包如何处理这种情况?如果发生某些错误,脚本是否根本不用于备份文件并在事务后恢复它们?(到目前为止我找不到例子)
谢谢。
如何使用 dkpg -i 如果已安装,它不会更新软件包。
我很想知道~
Apt 在依赖项中是如何处理的,或者它是如何为 deb 文件定义的(我不确定语法的确切定义位置)。
我遇到了关于python3
具有依赖约束的 Ubuntu (Focal) 元包的依赖关系:(python3.8 >= 3.8.2-1~
见这里)。
我相信包版本的定义是为了让它们按词法排序,但是当我检查 ubuntu 焦点时,没有python3.8
按词法排序的版本,>=
3.8.2-1~
但是有一个版本3.8.10-0ubuntu1~20.04.4
推断 Ubuntu Focal 的依赖项被破坏(它们不是)或者有依赖中的一些特殊含义~
。
我能找到的关于该主题的唯一文档是 Debian 的Declaring Relations between packages。但这并没有提到 a ~
or 模式匹配。
那么~
.deb 依赖项中的尾随是什么意思?
dpkg -l
最近的 debian Bullseye (v11.3) 机器上的(修剪)输出:
SE Name Version Arch Description
ii bind9-host 1:9.16.27-1~deb11u1 amd64 DNS Lookup Utility
ii bind9-libs:amd64 1:9.16.27-1~deb11u1 amd64 Shared Libraries used by BIND 9
^^^^^
问题:为什么bind9-libs 包的名称字段显示架构/abi,而bind9-host 的名称字段不显示架构/abi?
FWIW:
$ dpkg --print-architecture
amd64
$ grep -A6 "Package: bind9-host" /var/lib/dpkg/status
Package: bind9-host
Status: install ok installed
Priority: standard
Section: net
Installed-Size: 376
Maintainer: Debian DNS Team <[email protected]>
Architecture: amd64
$ grep -A6 "Package: bind9-libs" /var/lib/dpkg/status
Package: bind9-libs
Status: install ok installed
Priority: standard
Section: libs
Installed-Size: 3734
Maintainer: Debian DNS Team <[email protected]>
Architecture: amd64
我已经下载了一个.deb
文件,但是当我安装它时,它抱怨没有安装一堆软件包。我正在使用一个非常简单的焦点 Docker 图像。
dpkg: dependency problems prevent configuration of wkhtmltox:
wkhtmltox depends on fontconfig; however:
Package fontconfig is not installed.
wkhtmltox depends on libfreetype6; however:
Package libfreetype6 is not installed.
wkhtmltox depends on libjpeg-turbo8; however:
Package libjpeg-turbo8 is not installed.
wkhtmltox depends on libpng16-16; however:
Package libpng16-16 is not installed.
wkhtmltox depends on libx11-6; however:
Package libx11-6 is not installed.
wkhtmltox depends on libxcb1; however:
Package libxcb1 is not installed.
wkhtmltox depends on libxext6; however:
Package libxext6 is not installed.
wkhtmltox depends on libxrender1; however:
Package libxrender1 is not installed.
wkhtmltox depends on xfonts-75dpi; however:
Package xfonts-75dpi is not installed.
wkhtmltox depends on xfonts-base; however:
Package xfonts-base is not installed.
我习惯了通常只是继续安装依赖项的软件开发包管理器。
我怎样才能做dpkg
这样的工作?谢谢。
我注意到我接管的一些 CI 脚本中有一个奇怪的反模式,这基本上归结为这段代码检查包中是否存在特定文件:
dpkg --contents some.deb > contents.txt
grep --quiet foo contents.txt
我尝试了明显的重构dpkg --contents some.deb | grep --quiet foo
,但我不断收到此错误:
dpkg-deb: 错误: tar 子进程被信号杀死 (Broken pipe)
从更多的调查来看,这绝对是一个时间问题。如果我使用在输入流早期匹配的正则表达式,我会收到错误,但如果我使用专门匹配后期行的正则表达式,它会成功。
最明显的结论是dpkg
(或可能tar
)对 SIGPIPE 做错了什么。这是一个已知的问题?
平台:
# lsb_release --all
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.6 LTS
Release: 18.04
Codename: bionic
# dpkg --version
Debian 'dpkg' package management program version 1.19.0.5 (amd64).
This is free software; see the GNU General Public License version 2 or
later for copying conditions. There is NO warranty.
# tar --version
tar (GNU tar) 1.29
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by John Gilmore and Jay Fenlason.
我正在创建一个依赖于 ROS 包 ros-noetic-moveit-core 的包。更具体地说,它包含一个链接到libmoveit_robot_model.so
.
libmoveit_robot_model.so
是 ia 的符号链接libmoveit_robot_model.so.1.1.7
,因此libmoveit_robot_model.so.1.1.7
在我的共享库的 NEEDED 部分结束。
但是,当我打包它时,dpkg-shlibdeps 只添加ros-noetic-moveit-core
到 shlibs 依赖中,没有任何版本信息。
当移动它!更新到较新的版本,就像从 1.1.6 更新时所做的那样,库libmoveit_robot_model.so.1.1.7
将被替换为libmoveit_robot_model.so.1.1.8
(例如),我的包将不再链接,而 dpkg 看不到冲突。
如何确保我的包正确告知其依赖项?我看到两个解决方案:
libmoveit_robot_model.so.1
)。如果是来自 MoveIt 的错误!packager,他们能做什么,在等待包裹修复的时候我能做什么?
关于 MoveIt! 的更多信息:
#...
libmoveit_robot_model 1.1.7 ros-noetic-moveit-core
#...
我刚刚创建了一个简单的.deb
包(使用本教程)。这是我的控制文件:
Package: bla
Version: 1.0
Architecture: x86_64
Maintainer: bla
Description: bla
Architecture
I got from uname -m
:x86_64
但是,dpkg-deb
由于_
是无效字符而中断,所以我更改为which-
工作但在安装阶段中断:
dpkg: error processing archive bla_x86_64.deb (--install):
package architecture (x86-64) does not match system (amd64)
所以我转而使用amd64
作为我的架构,瞧!
现在我只是不明白uname -m
和dpkg
...之间的架构不匹配
我在用:
dpkg-query -W -f='${package}\t${version}\t${architecture}\n'
列出已安装的软件包,但它还显示标记为要删除的软件包,即状态rc
。
如何仅获取已安装的软件包?