ArchLinuxStudio/ArchLinuxTutorial

关于“成为合格的系统管理” 中 pacman 的疑问

BackMountainDevil opened this issue · 8 comments

成为合格的系统管理员中:

  1. 升级系统 - pacman -Syyu
  2. 删除孤立软件包 - pacman -Rs $(pacman -Qtdq)

升级系统

在英文 wiki 系统升级 中,升级部分并没有提到,而是说使用 pacman -Syu。因此对于文中所写的 -Syyu 还望能给出来源

删除孤立软件包 - pacman -Rs $(pacman -Qtdq)

这个是我第一次见到,十分感谢打开的我的视界,本着探究的精神尝试了一下,最后的结果表面,即使是孤立的软件包,在删除前还是应该审慎。
pacman -Qtd 和 pacman -Qtdq 差了一个q,亲自尝试了发现输出差别是后者不会输出版本号。

  • 可能删除某个软件,如下面的 mpv
  • 删除的包会连其没有被依赖的包也一并删除,如 73 -> 143

第一个可能一时无法发现,或许某天用某个软件才发现这玩意不见了。。。 mpv 常用才晓得,还有一些你不知道ta在哪里干啥用的,比如我卸载完发现图标没有显示了。。桌面环境变的僵化了,后发现是某些正在使用的图标集合被删除了。

第二个原因是因为 -R 和 -Rs 的区别。这里我有一个小小的疑问,如果是要删除孤立的软件包,则要连其依赖包也一并删除吗?个人感觉这个命令风险有点高。。。

案例

在这个例子中,我尝试删除孤立的软件包,因此我会先看看有哪些,是真的多,震惊到我自己,其中有些我认识,mpv播放器、deepin*深度的东西(个人不喜欢)、python-sphinx(之前学习sphinx安装的)

$ sudo pacman -Qdtq
# 数一下这里有73个包
analitza
avfs
avogadrolibs
bamf
black-hole-solver
boost
clucene
colord
ddcutil
deepin-account-faces
deepin-anything
deepin-api
deepin-desktop-schemas
deepin-menu
deepin-network-utils
deepin-polkit-agent-ext-gnomekeyring
deepin-wallpapers
disomaster
dtc
ffmpegthumbnailer
freecell-solver
gdl
geoip
gnugo
gtkspell3
htmlcxx
imwheel
kcachegrind-common
kosmindoormap
kplotting
libabw
libatomic_ops
libcmis
libe-book
libepubgen
libetonyek
libexttextcat
libfreehand
libgsf
libkdegames
libkeduvocdocument
libkmahjongg
libkomparediff2
libktorrent
liblightdm-qt5
libmediainfo
libmspub
libmwaw
libnumbertext
libodfgen
liborcus
libpagemaker
libpwquality
libqtshadowsocks
libqxp
libstaroffice
libwps
libzmf
lpsolve
lucene++
marble-common
mimetic
mlt
mpv
openbabel
python-asn1crypto
python-pyhamcrest
python-sphinx
qhull
redland
sunpinyin
tracker3
xmlsec

$ sudo pacman -Qi mpv
名字           : mpv
版本           : 1:0.33.1-2
描述           : a free, open source, and cross-platform media player
架构           : x86_64
URL            : https://mpv.io/
软件许可       : GPL3
组             : 无
提供           : libmpv.so=1-64
依赖于         : alsa-lib  libasound.so=2-64  desktop-file-utils  ffmpeg  libavcodec.so=58-64  libavdevice.so=58-64  libavfilter.so=7-64
                 libavformat.so=58-64  libavutil.so=56-64  libswresample.so=3-64  libswscale.so=5-64  glibc  hicolor-icon-theme  jack  libjack.so=0-64
                 lcms2  liblcms2.so=2-64  libarchive  libarchive.so=13-64  libass  libass.so=9-64  libbluray  libbluray.so=2-64  libcaca  libcdio
                 libcdio-paranoia  libdrm  libdvdnav  libdvdread  libegl  libgl  libglvnd  libjpeg  libjpeg.so=8-64  libplacebo  libplacebo.so=120-64
                 libpulse  libpulse.so=0-64  libva  libva.so=2-64  libva-drm.so=2-64  libva-wayland.so=2-64  libva-x11.so=2-64  libvdpau  libx11  libxext
                 libxinerama  libxkbcommon  libxkbcommon.so=0-64  libxrandr  libxss  libxv  lua52  mesa  mujs  rubberband  librubberband.so=2-64  shaderc
                 libshaderc_shared.so=1-64  uchardet  vulkan-icd-loader  wayland  xdg-utils  zlib
可选依赖       : youtube-dl: for video-sharing websites playback
依赖它         : 无
被可选依赖     : 无
与它冲突       : 无
取代           : 无
安装后大小     : 4.98 MiB
打包者         : Levente Polyak <anthraxx@archlinux.org>
编译日期       : 2021年04月27日 星期二 06时01分52秒
安装日期       : 2021年04月30日 星期五 09时44分50秒
安装原因       : 作为其他软件包的依赖关系安装
安装脚本       : 否
验证者         : 数字签名

$ sudo pacman -Rs mpv
正在检查依赖关系...
:: mlt可选依赖于rubberband: rubberband plugin
:: mlt6可选依赖于rubberband: rubberband plugin

软件包 (4) mujs-1.1.3-1  rubberband-1.9.2-1  uchardet-0.0.7-1  mpv-1:0.33.1-2

:: 打算删除这些软件包吗? [Y/n] n

$ sudo pacman -R mpv
正在检查依赖关系...

软件包 (1) mpv-1:0.33.1-2


:: 打算删除这些软件包吗? [Y/n] n

$ mpv
mpv 0.33.1-dirty Copyright © 2000-2020 mpv/MPlayer/mplayer2 projects
 built on UNKNOWN
FFmpeg library versions:
   libavutil       56.70.100
   libavcodec      58.134.100
   libavformat     58.76.100
   libswscale      5.9.100
   libavfilter     7.110.100
   libswresample   3.9.100
FFmpeg version: n4.4

Usage:   mpv [options] [url|path/]filename

Basic options:
 --start=<time>    seek to given (percent, seconds, or hh:mm:ss) position
 --no-audio        do not play sound
 --no-video        do not play video
 --fs              fullscreen playback
 --sub-file=<file> specify subtitle file to use
 --playlist=<file> specify playlist file

 --list-options    list all mpv options
 --h=<string>      print options which contain the given string in their name

$ mpv --player-operation-mode=pseudo-gui -- %U

$ sudo pacman -Rs $(pacman -Qtdq)
正在检查依赖关系...
:: grub可选依赖于libisoburn: Provides xorriso for generating grub rescue iso using grub-mkrescue
:: hugo可选依赖于python-pygments: syntax-highlight code snippets
:: hugo可选依赖于python-docutils: reStructuredText support
:: mariadb可选依赖于cracklib: for cracklib plugin
:: mlt6可选依赖于rubberband: rubberband plugin
:: qca-qt5可选依赖于botan: botan plugin
:: subversion可选依赖于libgnome-keyring: for GNOME Keyring for auth credentials

软件包 (143) alsa-utils-1.2.5.1-1  avogadro-crystals-1.0.1-1  avogadro-molecules-1.0.0-1  blur-effect-1.1.3-2  botan-2.18.1-1  coordgen-2.0.3-1
             cracklib-2.9.7-2  deepin-anything-arch-5.0.9-7  deepin-desktop-base-2:2021.5.07-1  deepin-gtk-theme-2020.06.10-1
             deepin-icon-theme-2021.03.12-1  deepin-polkit-agent-5.4.3-1  deepin-qt-dbus-factory-5.4.5-1  deepin-qt5integration-5.1.12-1
             deepin-qt5platform-plugins-5.0.23-2  deepin-sound-theme-15.10.6-1  dtkcommon-5.5.3-1  dtkcore-1:5.4.15-1  dtkgui-5.5.2-1  dtkwidget-5.5.7-1
             gdk-pixbuf-xlib-2.40.2-1  geoip-database-20210622-1  gio-qt-0.0.10-1  gsettings-qt-0.1.20170110-3  kdeedu-data-21.04.2-1
             kopeninghours-21.04.2-1  kpublictransport-21.04.2-1  libburn-1.5.4-1  libgnome-keyring-3.12.0+13+g4f8ab73-3  libgtop-2.40.0+2+g31db82ef-2
             libgusb-0.3.7-1  libisoburn-1.5.4-2  libisofs-1.5.4-1  libixion-0.16.1-6  liblangtag-0.6.3-2  libmsym-0.2.3-5  libqtxdg-3.7.1-1
             libwnck3-40.0-1  libxklavier-5.4-3  libzen-0.4.39-1  lightdm-1:1.30.0-4  lshw-B.02.19.2-1  lzlib-1.12-2  maeparser-1.2.4-4
             molequeue-0.9.0-2  mujs-1.1.3-1  papirus-icon-theme-20210601-1  python-babel-2.9.1-1  python-docutils-0.17.1-1  python-imagesize-1.2.0-4
             python-jinja-3.0.1-1  python-markupsafe-2.0.1-1  python-pygments-2.9.0-1  python-pytz-2021.1-1  python-snowballstemmer-2.1.0-1
             python-sphinx-alabaster-theme-0.7.12-6  python-sphinxcontrib-applehelp-1.0.2-6  python-sphinxcontrib-devhelp-1.0.2-6
             python-sphinxcontrib-htmlhelp-2.0.0-1  python-sphinxcontrib-jsmath-1.0.1-9  python-sphinxcontrib-qthelp-1.0.3-6
             python-sphinxcontrib-serializinghtml-1.1.5-1  rasqal-1:0.9.33-4  rubberband-1.9.2-1  spglib-1.16.1-2  startup-notification-0.12-7
             tinyxml2-9.0.0-1  uchardet-0.0.7-1  udisks2-qt5-5.0.5-1  xcur2png-0.7.1-7  analitza-21.04.2-1  avfs-1.1.4-2  avogadrolibs-1.94.0-1
             bamf-0.5.5-1  black-hole-solver-1.10.1-1  boost-1.76.0-1  clucene-2.3.3.4-11  colord-1.4.5-4  ddcutil-1.1.0-1  deepin-account-faces-1.0.12-1
             deepin-anything-5.0.9-1  deepin-api-5.4.6-1  deepin-desktop-schemas-5.9.11-1  deepin-menu-5.0.1-4  deepin-network-utils-5.4.6-1
             deepin-polkit-agent-ext-gnomekeyring-0.1.0-2  deepin-wallpapers-1:1.7.7-2  disomaster-5.0.7-1  dtc-1.6.0-3  ffmpegthumbnailer-2.2.2-2
             freecell-solver-6.2.0-1  gdl-3.34.0-2  geoip-1.6.12-2  gnugo-3.8-7  gtkspell3-3.0.10-2  htmlcxx-0.87-3  imwheel-1.0.0pre12-6
             kcachegrind-common-21.04.2-1  kosmindoormap-21.04.2-2  kplotting-5.83.0-1  libabw-0.1.3-2  libatomic_ops-7.6.10-2  libcmis-0.5.2-8
             libe-book-0.1.3-9  libepubgen-0.1.1-2  libetonyek-0.1.10-1  libexttextcat-3.4.5-2  libfreehand-0.1.2-3  libgsf-1.14.47-1
             libkdegames-21.04.2-1  libkeduvocdocument-21.04.2-1  libkmahjongg-21.04.2-1  libkomparediff2-21.04.2-1  libktorrent-21.04.2-1
             liblightdm-qt5-1:1.30.0-4  libmediainfo-21.03-1  libmspub-0.1.4-10  libmwaw-0.3.19-1  libnumbertext-1.0.7-1  libodfgen-0.1.8-1
             liborcus-0.16.1-7  libpagemaker-0.0.4-2  libpwquality-1.4.4-3  libqtshadowsocks-2.1.0-13  libqxp-0.0.2-6  libstaroffice-0.0.7-1
             libwps-0.4.12-1  libzmf-0.0.2-10  lpsolve-5.5.2.11-1  lucene++-3.0.8-2  marble-common-21.04.2-2  mimetic-0.9.8-2  mlt-7.0.1-1
             mpv-1:0.33.1-2  openbabel-3.1.1-2  python-asn1crypto-1.4.0-3  python-pyhamcrest-1.10.0-1  python-sphinx-4.0.2-1  qhull-2020.2-4
             redland-1:1.0.17-8  sunpinyin-3.0.0rc1-4  tracker3-3.1.2-1  xmlsec-1.2.32-1

mpv 播放器已被卸载

pacman -hQ   
用法:  pacman {-Q --query} [选项] [软件包]
选项:
  -b, --dbpath <路径>  指定另外的数据库位置
  -c, --changelog      查看某软件包的更新日志
  -d, --deps           列出所有作为依赖关系安装的软件包 [过滤器]
  -e, --explicit       列出所有单独指定安装的软件包 [过滤器]
  -g, --groups         查看某软件包组所属的所有软件包
  -i, --info           查看软件包信息 (-ii 查看备份文件) 
  -k, --check          检查软件包的文件存在(-kk检查文件属性)
  -l, --list           列出被查询软件包的内容
  -m, --foreign        列出没有在同步数据库时找到的已安装软件包 [过滤器]
  -n, --native         列出只在(同步)数据库中的已安装软件包 [过滤]
  -o, --owns <文件>    查询哪个软件包拥有<文件>
  -p, --file <软件包>  从某个软件包而不是数据库查询
  -q, --quiet          在查询或搜索时显示较少的信息
  -r, --root <路径>    指定另外的安装根目录
  -s, --search <regex> 搜寻符合指定字符串的已安装本地的软件包
  -t, --unrequired     列出不被任何软件包(可选)要求的软件包(-tt 忽略可选依赖) [过滤器]
  -u, --upgrades       列出所有可升级的软件包 [过滤器]
  -v, --verbose        显示详细信息
      --arch <架构>    设定另外的架构
      --cachedir <dir> 指定另外的软件包缓存位置
      --color <when>   彩色化输出
      --config <路径>  指定另外的配置文件
      --confirm        总是询问确认
      --debug          显示调试信息
      --disable-download-timeout
                       下载时用宽松的超时
      --gpgdir <路径>  设定 GnuPG 的其他主目录
      --hookdir <目录>  指定另外的钩子位置
      --logfile <路径> 指定另外的日志文件
      --noconfirm      不询问确认
      --sysroot        在一个已挂载的 guest 系统操作(仅 root)
pacman -hS
用法:  pacman {-S --sync} [选项] [软件包]
选项:
  -b, --dbpath <路径>  指定另外的数据库位置
  -c, --clean          从缓存目录中删除旧软件包 (-cc 清除所有) 
  -d, --nodeps         跳过依赖关系的版本检查 (-dd 跳过所有检查)
  -g, --groups         查看某软件包组所属的所有软件包
                       (-gg 查看所有软件包组和所属于它们的软件包)
  -i, --info           查看软件包信息 (-ii 查看更多信息)
  -l, --list <repo>    查看在该软件库中的软件包清单
  -p, --print          打印目标而不是执行操作
  -q, --quiet          在查询或搜索时显示较少的信息
  -r, --root <路径>    指定另外的安装根目录
  -s, --search <正则表达式> 按照指定字符串查询远端软件库
  -u, --sysupgrade     升级所有已安装的软件包 (-uu 可启用降级)
  -v, --verbose        显示详细信息
  -w, --downloadonly   下载但不安装/升级软件包
  -y, --refresh        从服务器下载新的软件包数据库
                       (-yy 强制更新软件包数据库)
      --arch <架构>    设定另外的架构
      --asdeps         作为非单独指定安装的软件包安装
      --asexplicit     作为单独指定安装的软件包安装
      --assume-installed <package=version>
                       添加一个虚拟包用以满足依赖要求
      --cachedir <dir> 指定另外的软件包缓存位置
      --color <when>   彩色化输出
      --config <路径>  指定另外的配置文件
      --confirm        总是询问确认
      --dbonly         仅修改数据库条目,而非软件包文件
      --debug          显示调试信息
      --disable-download-timeout
                       下载时用宽松的超时
      --gpgdir <路径>  设定 GnuPG 的其他主目录
      --hookdir <目录>  指定另外的钩子位置
      --ignore <软件包>   升级时忽略某个软件包 (可多次使用) 
      --ignoregroup <软件包组>
                         升级时忽略某个软件包组 (可多次使用) 
      --logfile <路径> 指定另外的日志文件
      --needed         不重新安装已是最新的软件包
      --noconfirm      不询问确认
      --noprogressbar  下载文件时不显示进度条
      --noscriptlet    不执行安装小脚本
      --overwrite <glob>
                       overwrite conflicting files (can be used more than once)
      --print-format <字符串>
                       指定如何打印目标
      --sysroot        在一个已挂载的 guest 系统操作(仅 root)

man pacman

-y, --refresh
Download fresh package databases from the server. Use twice to force a refresh even if databases are up to
date.

系统升级

首先,感谢各位的倾情解答。对于问题中的第一点给出了来源。

yy的含义中文解释的不太到位,看了英文版的“force a refresh even if up to date”。也就是说即使是最新版的软件也要重新安装吗?

$ pacman -hS
-y, --refresh        从服务器下载新的软件包数据库
                       (-yy 强制更新软件包数据库)

$ export LANG=en
$ pacman -hS
 -y, --refresh        download fresh package databases from the server
                       (-yy to force a refresh even if up to date)

实际例子

从这个案例中,首先和最后使用了强制刷新软件包数据库( -Syyu),中间使用的是( -Syu)。
可以看到当强制刷新的时候,会重新同步数据库;而使用-Syu则检查两者的数据库一致不一致,一致则不会花时间更新本地数据库,不一致则更新本地数据库(这一点在下面的案例中没有体现)。也就是说,什么情况下才使用强制刷新呢?如果-Syu已经可以达到目的,使用更费力的-Syyu的用意是?这一点随着深入的交流我发现显得更为重要。

$ sudo pacman -Syyu
[sudo] kearney 的密码:
:: 正在同步软件包数据库...
 core                                  134.1 KiB   221 KiB/s 00:01 [####################################] 100%
 extra                                1566.8 KiB  1284 KiB/s 00:01 [####################################] 100%
 community                               5.6 MiB  5.60 MiB/s 00:01 [####################################] 100%
 multilib                              149.6 KiB  4.87 MiB/s 00:00 [####################################] 100%
 archlinuxcn                          1881.6 KiB  6.34 MiB/s 00:00 [####################################] 100%
:: 正在进行全面系统更新...
警告:google-chrome:忽略软件包升级 (91.0.4472.101-1 => 91.0.4472.114-1)
警告:liburing:忽略软件包升级 (0.7-2 => 2.0-1)
警告:obs-studio:忽略软件包升级 (27.0.0-2 => 27.0.1-1)
警告:qemu:忽略软件包升级 (5.0.0-8 => 6.0.0-3)
警告:qemu-arch-extra:忽略软件包升级 (5.1.0-3 => 6.0.0-3)
正在解析依赖关系...
正在查找软件包冲突...

软件包 (11) drumstick-2.3.0-1  enchant-2.3.0-1  imath-3.0.5-1  iproute2-5.13.0-1  libgit2-1:1.1.1-1
            libksba-1.6.0-1  libnm-1.32.2-1  networkmanager-1.32.2-1  pacman-contrib-1.4.0-4  tor-0.4.6.6-1
            vmpk-0.8.4-1

下载大小:      13.80 MiB
全部安装大小:  78.44 MiB
净更新大小:     0.14 MiB

:: 进行安装吗? [Y/n] n

$ sudo pacman -Syu 
:: 正在同步软件包数据库...
 core 已经是最新版本
 extra 已经是最新版本
 community 已经是最新版本
 multilib 已经是最新版本
 archlinuxcn 已经是最新版本
:: 正在进行全面系统更新...
警告:google-chrome:忽略软件包升级 (91.0.4472.101-1 => 91.0.4472.114-1)
警告:liburing:忽略软件包升级 (0.7-2 => 2.0-1)
警告:obs-studio:忽略软件包升级 (27.0.0-2 => 27.0.1-1)
警告:qemu:忽略软件包升级 (5.0.0-8 => 6.0.0-3)
警告:qemu-arch-extra:忽略软件包升级 (5.1.0-3 => 6.0.0-3)
正在解析依赖关系...
正在查找软件包冲突...

软件包 (11) drumstick-2.3.0-1  enchant-2.3.0-1  imath-3.0.5-1  iproute2-5.13.0-1  libgit2-1:1.1.1-1
            libksba-1.6.0-1  libnm-1.32.2-1  networkmanager-1.32.2-1  pacman-contrib-1.4.0-4  tor-0.4.6.6-1
            vmpk-0.8.4-1

下载大小:      13.80 MiB
全部安装大小:  78.44 MiB
净更新大小:     0.14 MiB

:: 进行安装吗? [Y/n] n

$ sudo pacman -Syyu
:: 正在同步软件包数据库...
 core                                          134.1 KiB   552 KiB/s 00:00 [##########################################] 100%
 extra                                        1566.8 KiB  5.15 MiB/s 00:00 [##########################################] 100%
 community                                       5.6 MiB  4.72 MiB/s 00:01 [##########################################] 100%
 multilib                                      149.6 KiB  2.92 MiB/s 00:00 [##########################################] 100%
 archlinuxcn                                  1881.6 KiB  5.57 MiB/s 00:00 [##########################################] 100%
:: 正在进行全面系统更新...
警告:google-chrome:忽略软件包升级 (91.0.4472.101-1 => 91.0.4472.114-1)
警告:liburing:忽略软件包升级 (0.7-2 => 2.0-1)
警告:obs-studio:忽略软件包升级 (27.0.0-2 => 27.0.1-1)
警告:qemu:忽略软件包升级 (5.0.0-8 => 6.0.0-3)
警告:qemu-arch-extra:忽略软件包升级 (5.1.0-3 => 6.0.0-3)
正在解析依赖关系...
正在查找软件包冲突...

软件包 (11) drumstick-2.3.0-1  enchant-2.3.0-1  imath-3.0.5-1  iproute2-5.13.0-1  libgit2-1:1.1.1-1  libksba-1.6.0-1
            libnm-1.32.2-1  networkmanager-1.32.2-1  pacman-contrib-1.4.0-4  tor-0.4.6.6-1  vmpk-0.8.4-1

下载大小:      13.80 MiB
全部安装大小:  78.44 MiB
净更新大小:     0.14 MiB

:: 进行安装吗? [Y/n] n

-yy 是强制更新软件包数据库,不是软件。你也可以不强制刷新,使用 -Syyu 只是习惯问题而已。

如果对软件包管理器的工作原理有疑问,请参阅 这个链接,里面清晰介绍了本地软件包数据库(元数据的本地缓存)等内容。

该链接中是这样描述的

你的系统上的包管理器首先会与元数据进行交互。包管理器在你的系统上创建了一个元数据的本地缓存。当你运行包管理器的更新选项(例如 apt update)时,它会通过引用仓库中的元数据来更新本地元数据缓存。
当你运行软件包管理器的安装命令(例如 apt install package_name)时,软件包管理器会引用这个缓存。如果它在缓存中找到了包的信息,它就会使用互联网连接到相应的仓库,并在你的系统上安装之前先下载包。

按照这样理解的话,就是更新整个系统时 -Syu 会自动更新数据库(如果不是最新的话),用 -Syyu 只是作者习惯,即使是新的也要更新。

@BackMountainDevil
如果没有问题 请关闭issue

Q&A 中的第一点升级系统 Syu 中加个了个 y 指的是强制刷新软件哭,第二点 删除孤立软件包 并没有对此做出解释,个人认为这个命令容易让人以为这些包是卸载的时候落下的而进行删除