1 Star 0 Fork 11

coder_lw / wiki

forked from deepinwiki / wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
linux安装和管理软件.md 17.70 KB
一键复制 编辑 原始数据 按行查看 历史
htqx 提交于 2019-12-19 21:31 . wayland

[TOC]

linux 安装和管理软件

前言

这看上去是一个很low很小白的话题,实际上在运维角度,部署软件是一项非常重要的日常工作。要想愉快的玩linux,首先你得学会正确安装软件,并且出现部署问题,能够修复。

一般系统会集成一个gui界面的比较好用的商店,但是那是一个高层界面,友好,但不够自由和可控。作为底层一点,debian系列提供了apt 命令行。apt是一个链接到软件仓库,从里面下载软件安装到系统,同时管理系统内部软件依赖关系的一个全能管家。

一个软件包,同时会依赖其他软件包,软件包又同时存在多个版本,但是系统一般而言只能安装一个版本,因为debian系中的软件包安装实际上就是复制文件到特定位置,并进行一些简单的脚本配置写入工作,它简单清晰,没有windows那么隐晦,和麻烦的注册表管理。但也因此,它一般只能有一个版本,因为不同版本同名文件会覆盖。除非你细致的更改安装位置,修改文件名称。

如果两个包依赖不同版本,那么这两个包就不可能同时安装。而且依赖版本往往是存在范围的,从1.0到2.0,3.0以上,等等,如此复杂的依赖关系,apt就负责计算最适合的版本,计算是否兼容当前系统已经安装的软件包。这靠人工计算是很费劲,很麻烦的一件事情。

apt之下还有更底层的工具,如dpkg,它单纯的管理本地软件的依赖关系,而没有联网功能,但是能够提供更加细致的功能选项。

如果工具都没有效果,你甚至可以修改相关配置文件,直接删除和修改你不想要的东西。

当然以上,只是基于软件包(.deb)的管理方式,事实上,你还可以脱离整个管理体系,直接下载源码,编译,然后运行程序。只需要你手工把文件放在适当的位置,只是这种自由的结果是管理工具对它是不可知,且无能为力的。

稍微好点的做法,就是将它包装为一个本地的.deb包,然后通过管理工具来安装。

包管理工具

名词:

  1. apt (advanced packaging tool: 高级包装工具).
  2. dpkg (debian packager: debian包).

区别:

  1. apt 连到软件仓库,下载软件,dpkg没有这个功能
  2. apt 安装软件,发现依赖项,会自动下载安装,dpkg不会。
  3. dpkg 更底层,有更多管理选项
任务 apt dpkg
安装远程x apt install x -
下载二进制包 apt download x1 -
下载源码 apt source x -
安装本地x apt install ./x.deb dpkg -i x.deb
卸载 apt remove x dpkg -r x
重装 apt install --reinstall x -
完全卸载2 apt purge x dpkg -P x
删除悬空依赖项3 apt autoremove -
查看包信息 apt show x dpkg -I x.deb,已安装 dpkg -s x
列出包文件 - dpkg -c x.deb, 已安装 dpkg -L x
执行配置 - dpkg --configure x
根据路径找对应包 - dpkg -S path
更新仓库信息 apt update -
升级 apt upgrade -
完全升级4 apt full-upgrade -
列出已安装包 apt list dpkg -l
搜索软件包 apt search "xxx" -
  1. 下载文件到当前目录
  2. 卸载所有文件,包括配置文件(但不影响用户目录内的数据)
  3. 比如安装x,依赖y,当删除x,y处于没人依赖的悬空状态
  4. 完全升级会强制更新,哪怕是降级依赖项版本

严格来说,apt是一个高层界面,它通过更底层的命令来实现功能,如果你需要更细致的选项,可以查看底层工具:

选项 对应底层工具
update apt-get
upgrade,full-upgrade apt-get
install,remove,purge apt-get
autoremove apt-get,(apt-mark)
search apt-cache,(apt-file)
show apt-cache
list (dpkg-query)

注:括号点表示可以选择增强功能的工具

dpkg包状态

  • 期望状态:u未知、i安装、r删除、p清除、h保持
  • 状态:n未安装、i已安装、c配置、U解压、F配置失败、H不完全安装、W触发器等待、T触发器待定
  • 错误:(无)、R须重装

常见组合: ii正常安装、rc已删除保留配置、iF安装时配置失败

dpkg --list |grep -v -e^ii #查找所有非ii项

配置文件

  1. /etc/apt/sources.list 仓库源的配置
  2. /etc/apt/sources.list.d/ 同上,分多个配置文件
  3. /var/lib/apt/lists/ 包状态信息
  4. /var/lib/apt/lists/partial/ 同上
  5. /var/cache/apt/archives/ 包下载缓存
  6. /var/cache/apt/archives/partial/ 同上
  7. /etc/apt/apt.conf 工具链的配置文件
  8. /etc/apt/apt.conf.d/ 同上
  9. /etc/apt/preferences 源的权重配置
    1. 1001 允许降级
    2. 990 目标默认值
    3. 500 普通默认值
    4. 100 非自动更新默认值
    5. 100 已安装默认值
    6. 1 非自动安装默认值
    7. -1 不安装
  10. /etc/dpkg/dpkg.cfg dpkg配置
  11. /etc/dpkg/dpkg.cfg.d/ 同上
  12. /var/lib/dpkg/ dpkg管理目录
    1. info/ dpkg管理的包的所有安装、卸载脚本都存放在此目录
    2. status 包的安装状态信息
    3. available dpkg元信息(可用的软件包)
    4. statoverride 所有者和权限设置
    5. divert 安装位置调整

解决问题的案例

安装阶段配置失败

首先要理解原理,/var/lib/dpkg 目录下管理安装的所有软件的信息,而info子目录下是安装的脚本:

  1. 软件名.prerm : 卸载前脚本
  2. *.postrm : 卸载后脚本
  3. *.preinst : 安装前脚本
  4. *.postinst : 安装后脚本
  5. *.list : 文件列表
  6. *.md5sums : 文件的md5校验码

安装过程为啥会出错?仔细观察出错的信息,会有提示出错的原因。一个是脚本出错,这时候你可以删除该脚本。一般是卸载脚本,以下就是卸载脚本出错的解决例子:

dpkg -l |grep -v -e^ii    #查找异常的软件包
sudo rm /var/lib/dpkg/info/xxx.{pre,post}rm #对删除的脚本进行删除,这样就不会调用,因而不会失败
sudo apt purge xxx #正常删除即可

安装时提示文件已存在,覆盖错误,并且apt进入异常状态

这种错误是覆盖了别的软件已经存在的文件,这时候和脚本没什么关系。原因可能是你安装了不同源仓库的包,这个包名字不一样,但是内容实质是一样的,因此apt没能删除旧版本的包,来安装新版本,这时候就出现了错误状态,dpkg -l显示是iU开头的状态,即解压过程中出现问题。

解决方法是直接编辑/var/lib/dpkg/status 文件,这个文件记录了所有包的安装状态,把相关故障包的信息从该文件中删除,那么apt就认为你从来没有安装过这个包,apt也就无法识别出错误状态。你再卸载旧的不兼容的包,从新安装一次新的包即可。

status文件的格式类似:

Package: 360cloud
Status: deinstall ok config-files
Priority: optional
Section: utils
Installed-Size: 65536
Maintainer: Qihoo 360 Team <yunpankefu@360.cn>
Architecture: i386
Version: 1.0.0.1010
Config-Version: 1.0.0.1010
Description: 360cloud
AutoReqProv: no

Package: accountsservice
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 639
Maintainer: Debian freedesktop.org maintainers <pkg-freedesktop-maintainers@lists.alioth.debian.org>
Architecture: amd64
Version: 0.6.55-1
Depends: dbus (>= 1.9.18), libaccountsservice0 (= 0.6.55-1), libc6 (>= 2.4), libglib2.0-0 (>= 2.44), libpolkit-gobject-1-0 (>= 0.99)
Suggests: gnome-control-center
Description: query and manipulate user account information
 The AccountService project provides a set of D-Bus
 interfaces for querying and manipulating user account
 information and an implementation of these interfaces,
 based on the useradd, usermod and userdel commands.
Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/

Package: acl
Status: install ok installed
...

其中,Package:开始就是包名,接下来的都是这个包的相关信息,然后每一包信息用空行相隔。其中Status:字段就是包的安装状态,正常是:install ok installed,那么异常包怎么快速找到?

dpkg -l |grep -v -e^ii    #查找异常的软件包

出来的信息会有两个字母代表大状态,如rc表示r删除,c仅存配置,也就是这个包已经删除,剩下配置,这种状态不会导致apt异常,导致apt异常的情况一般是iU(安装仅解压缩),rF(删除配置失败) 之类的,如果是配置失败,可以参考上一个方法。,如果是安装仅解压缩,证明文件覆盖失败。

总之,找到异常的包名,然后编辑status去掉它的所有信息,apt就恢复到正常状态,可以正常安装删除软件。这时候你才能做下一步处理。

注意,status是重要的文件,格式出错,将导致apt不可用。因此建议做好备份。保存修改后用dpkg -l |grep -v -e^ii 验证一下是否解除异常状态。

从外部修复系统

# 从外部启动后,挂载需要修复的根/mnt/root
# 设置dpkg 的目标根为/mnt/root
dpkg --root /mnt/root -i xxx.deb 

重建本地安装信息

# 当dpkg管理目录损坏,系统将丢失所有安装信息,这是一个非常严重的后果

mkdir -p ./root/var/lib/dpkg/{info,updates}
touch ./root/var/lib/dpkg/status

dpkg --root ./root -i xxx.deb
# 最基本的包可以从/usr/share/doc获得
ls /usr/share/doc >packages.list
dpkg --set-selections <packages.list
apt 
apt-get dselect-upgrade

工具参考

dpkg

dpkg 命令 作用
-i,--install 安装1
--unpack 解压缩
--configure 执行配置2
--triggers-only 仅处理触发器
-r,--remove 删除3
-P,--purge 完全删除4
-V,--verify 验证,--verify-format指定包类型
-C,--audit 将对异常状态的包给出处理意见
--update-avail 更新可用包信息
--merge-avail 更新可用包信息
-a,--record-avail 更新可用包信息
--forget-old-unavail 忘记过时信息
--clear-avail 删除现有信息
--get-selections 软件包选取,并显示状态
--set-selections 软件包选取,并设置状态
--clear-selections 软件包选取,并设置删除状态
--yet-to-unpack 选取未安装包
--predep-package 显示未满足依赖关系
--add-architecture 添加体系结构
--remove-architecture 移除体系结构
--print-architecture 打印体系结构
--print-foreign-architectures 打印附加体系结构
--assert-* 支持的特性
--validate-* 验证不同名称
--compare-versions 比较版本
  1. 安装过程:提取控制文件、执行旧版本prerm脚本、运行preinst脚本、解压缩、备份、执行旧版本postrm脚本、复制文件、执行配置。
  2. 配置过程:解压缩配置文件,备份配置,执行postinst脚本
  3. 删除过程:运行prerm脚本、删除文件、运行postrm脚本
  4. 完全删除过程:执行-r、运行postrm脚本删除配置
dpkg 选项 作用
--abort-after 在指定错误个数后终止
-B,--auto-deconfigure 自动取消配置
-D,--debug 调试信息
--force-* 强制开启选项1
--no-force-* 强制关闭选项
--refuse-* 同上
--ignore-depends 忽略依赖项
--simulate 模拟操作
-R,--recursive 递归
-G 非降级
--admindir 管理目录/var/lib/dpkg
--instdir 安装目录/
--root 根目录/
-O,--selected-only 选择
-E,--skip-same-version 不安装相同版本
--pre-invoke 执行前命令
--post-invoke 执行后命令
--path-exclude 排除路径
--path-include 包含路径
--verify-format 验证输出格式
--status-fd 状态转发到文件描述符
--status-logger 状态日志
--log 日志
--no-pager 禁用pager
--no-debsig 不验证包
--no-triggers 不触发
--triggers 触发器
  1. 选项包括:all、downgrade降级、configure-any配置、hold无视保留、remove-reinstreq遗忘安装记录、remove-essential删除基础项、depends依赖项、depends-version依赖项版本、breaks破坏项、conflicts冲突项、confmiss安装丢失的配置文件、confnew安装新配置文件、confold保留旧配置文件、confdef保留修改的配置文件、confask使用包配置文件、overwrite覆盖文件、overwrite-dir覆盖目录、overwrite-diverted、statoverride-add、statoverride-remove、security-mac强制性访问控制、unsafe-io不安全io、script-chrootless使用chroot执行脚本、architecture体系结构、bad-version错误版本、bad-path错误路径、not-root非root用户、bad-verify错误验证
dpkg-deb 命令 作用
-b,--build 构建deb包
-c,--contents 列出包内容
-e,--control 提取控制信息1
-x,--extract 解压缩
-X,--vextract 解压缩并显示进度信息
-f,--field 显示包内DEBIAN/control的内容
--ctrl-tarfile 输出控制内容组成的包
--fsys-tarfile 输出非控制内容组成的包
-I,--info 显示包信息
  1. 控制信息包括:DEBIAN/{control,postinst,postrm,prerm}
dpkg-query 命令 作用
-l,--list 列出匹配的包
-s,--status 包信息
-L,--listfiles 已安装包的文件列表
-S,--search 从已安装包中查找文件
-p,--print-avail 打印包仓库中的源信息

apt-cache

apt-cache 命令 作用
gencaches 创建缓存信息
showpkg 显示包的依赖关系和存档信息
showsrc 显示源码包信息
stats 统计信息
dump 所有软件包的信息列表
dumpavail 所有软件包的信息列表(标准格式)
unmet 显示没有满足的依赖关系
show 显示包的描述信息
search 搜索,--names-only 只搜索名称
depends 显示依赖项
rdepends 显示被谁依赖
pkgnames 搜索包名并只显示名字
dotty 生成图,被graphviz包dotty使用
xvcg 类似,被xvcg使用
madison 显示源链接
apt-cache 选项 作用
-p,--pkg-cache 选择缓存文件
-s,--src-cache 选择源码包缓存文件
-q,--quiet 静默,不显示信息
-i,--important 重要依赖项
--no-pre-depends 无预依赖
--no-depends 无依赖
--no-recommends 无推荐
--no-suggests 无建议1
--no-conflicts 无冲突
--no-breaks 无中断2
--no-replaces 无替代
--no-enhances 无增强3
--implicit 隐含冲突
-f,--full 更多搜索信息
--recurse 递归
--installed 已安装的
--with-source 从.deb, .dsc, .changes 读取信息
-c,--config-file apt.conf配置文件
-o,--option apt配置参数
  1. 推荐和建议的区别:(这两个名词就是搞事情,deb包的设计者很喜欢搞这种事情),大体上相等于:推荐和可选
  2. 冲突和中断的区别:冲突不允许安装,中断可以。
  3. 替代和增强的区别:替代是覆盖。增强是可选的被增强项,因此两者没啥关系

apt-get

apt-get 命令 作用
update 更新信息
upgrade 更新软件
dist-upgrade 强制更新软件
dselect-upgrade 配合dselect使用
install 安装
reinstall 重装
download 下载包
remove 卸载
purge 完全卸载
source 安装源代码包
build-dep 安装编译时的依赖项
check 检测包完整性
clean 清除下载缓存
autoclean 智能清理下载缓存
autoremove 清除悬空的依赖项
changelog 下载包的更新日志
apt-get 选项 作用
--no-install-recommends 不安装推荐项
--install-suggests 安装建议项
-d,--download-only 只下载,不安装
-f,--fix-broken 自动修复依赖关系
-m,--ignore-missing 忽略缺少的依赖项
--no-download 禁止连接仓库下载
-q,--queit 静默
-s,--simulate 模拟安装过程
-y,--assme-yes 自动确定
--assume-no 自动否定
--no-show-upgraded 不显示更新
-v,--verbose-versions 显示详细版本号
-a,--host-architecture 系统架构
-P,--build-profiles 构建配置
-b,--build 编译
--ignore-hold 忽略保留软件包
--with-new-pkgs 允许新包
--no-upgrade 不升级
--only-upgrade 只升级
--allow-downgrades 允许降级
--allow-remove-essential 可删除必要项
--allow-change-held-packages 可修改保留包
--print-uris 打印源url
--purge 完全清除
--reinstall 重新安装
--list-cleanup 清除仓库配置信息
--t,--target-release 安装选定目标的源
--trivial-only 只提出重要问题
--no-remove 不删除
--autoremove 自动删除不需要的依赖项
--only-source 只下载源码包
--diff-only 下载diff文件
--dsc-only 下载dsc文件
--tar-only 下载tar文件
--arch-only 只下载当前体系结构
--indep-only 只下载体系结构无关项
--allow--unauthenticated 允许未经身份认证的源
--no-allow-insecure-repositories 不允许未验证的源
--allow-releaseinfo-change 允许新版发行信息
--show-progress 进度条
--with-source 元数据源
-c,--config-file apt.conf配置文件
-o,--option apt 参数

apt-mark

apt-file

alien

参考

  1. 官方文档: https://www.debian.org/doc/manuals/debian-reference/ch02.en.html
1
https://gitee.com/coder_lw/wiki.git
git@gitee.com:coder_lw/wiki.git
coder_lw
wiki
wiki
master

搜索帮助