AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1457595
Accepted
Paddy Landau
Paddy Landau
Asked: 2023-03-04 00:56:25 +0800 CST2023-03-04 00:56:25 +0800 CST 2023-03-04 00:56:25 +0800 CST

如何判断哪些包由于分阶段更新而被阻止

  • 772

很长一段时间以来,我一直在寻找这个问题的答案,虽然我已经看到了建议的解决方案,但没有一个有效。

我可以使用此命令看到所有准备好更新的包:

apt list --upgradable

其中一些由于分阶段更新而被阻止。我想知道哪些会升级,哪些会被阻止。

到目前为止,我所要做的就是发出这个命令(每个包一次):

apt-cache policy [packagename]

如果输出包含字符串(phased …%)(百分号前的一位、两位或三位数字),则表示该包是分阶段更新的一部分。但它并没有说明它现在是否会安装在我的机器上。

我如何判断哪些待处理的软件包将立即安装,哪些将由于分阶段更新而被阻止?

我正在运行 Ubuntu 22.04,以防万一。

谢谢

package-management
  • 3 3 个回答
  • 324 Views

3 个回答

  • Voted
  1. user535733
    2023-03-04T03:36:05+08:002023-03-04T03:36:05+08:00

    这是一种方法:

    //The list of all upgradeable packages
    
    $ apt list --upgradeable | cut -d'/' -f1
    Listing...
    tcpdump
    ubuntu-advantage-tools
    
    //The list of upgradeable packages that are NOT phased
    //...or are phasing, and it's your turn for install
    
    $ apt upgrade --simulate | grep Inst | cut -d' ' -f2
    ubuntu-advantage-tools
    

    phasing packages 列表当然是列表之间的区别。

    • 7
  2. Best Answer
    Andrew Lowther
    2023-03-04T07:59:15+08:002023-03-04T07:59:15+08:00

    我还拼凑了一些命令。我主要apt使用解析输出awk,但如果其他人知道更多本机命令,那就太好了。

    如果您想查找所有进行分阶段更新的包及其相关的阶段百分比。

    apt-cache dumpavail | awk '/^Package: /{p=$2} /^Phased-Update-Percentage/{print p,$2}'
    

    但是,根据这个问题,您可能只关心正在经历分阶段更新的已安装软件包。

    apt-cache dumpavail | awk '/^Package: /{p=$2} /^Phased-Update-Percentage/{cmd="dpkg -l "p" 2>&1 | grep -c ^ii";cmd | getline out;close(cmd); if(out > 0){print p,$2}}'
    

    您还可以找到将被阻止的包裹。在这种情况下,在full-upgrade.

    apt-get --simulate full-upgrade | awk '/^The following packages have been kept back:/{save=1;next} /^[[:graph:]]/{save=0;next} save{kp=kp$0} END{split(kp,kpa);for(kpi in kpa){print kpa[kpi]}}'
    

    但是你想“告诉哪些挂起的包现在会被安装,哪些会因为分阶段更新而被阻止”。把它们放在一起。

    apt-cache dumpavail | 
      awk -v OFS="," -v kp="$(
      apt-get --simulate full-upgrade | awk '/^The following packages have been kept back:/{save=1;next} /^[[:graph:]]/{save=0;next} save{kp=kp$0} END{print kp}'
      )" \
      'BEGIN{split(kp,kpa);for(kpi in kpa){kpd[kpa[kpi]]=""}} /^Package: /{p=$2} /^Phased-Update-Percentage/{cmd="dpkg -l "p" 2>&1 | grep -c ^ii";cmd | getline out;close(cmd); if(out > 0){if(p in kpd){print p,"phased "$2,"held back"}else{print p,"phased "$2,"not held back"}}}'
    

    这是打过补丁的 22.04 服务器上的示例输出(通过管道传输到column)。

    root@ubuntu:~# apt-cache dumpavail | awk -v OFS="," -v kp="$(apt-get --simulate full-upgrade | awk '/^The following packages have been kept back:/{save=1;next} /^[[:graph:]]/{save=0;next} save{kp=kp$0} END{print kp}')" 'BEGIN{split(kp,kpa);for(kpi in kpa){kpd[kpa[kpi]]=""}} /^Package: /{p=$2} /^Phased-Update-Percentage/{cmd="dpkg -l "p" 2>&1 | grep -c ^ii";cmd | getline out;close(cmd); if(out > 0){if(p in kpd){print p,"phased "$2,"held back"}else{print p,"phased "$2,"not held back"}}}' | column -t -s ,
    grub-efi-amd64-bin           phased 0   held back
    grub-efi-amd64-signed        phased 0   held back
    libmbim-glib4                phased 70  held back
    libmbim-proxy                phased 70  held back
    libmm-glib0                  phased 70  not held back
    libqmi-glib5                 phased 70  held back
    libqmi-proxy                 phased 70  held back
    libsasl2-2                   phased 70  held back
    libsasl2-modules             phased 70  held back
    libsasl2-modules-db          phased 70  held back
    modemmanager                 phased 70  held back
    python3-software-properties  phased 0   held back
    shim-signed                  phased 62  held back
    software-properties-common   phased 0   held back
    tcpdump                      phased 20  not held back
    ubuntu-advantage-tools       phased 20  held back
    

    结果匹配full-upgrade输出

    root@ubuntu:~# apt-cache --simulate full-upgrade
    ...
    The following packages have been kept back:
      grub-efi-amd64-bin grub-efi-amd64-signed libmbim-glib4 libmbim-proxy libqmi-glib5 libqmi-proxy libsasl2-2 libsasl2-modules libsasl2-modules-db modemmanager python3-software-properties shim-signed software-properties-common ubuntu-advantage-tools
    The following packages will be upgraded:
      isc-dhcp-client isc-dhcp-common libmm-glib0 tcpdump
    
    

    笔记

    • 我在 Ubuntu 22.04 上用 apt 测试了这些命令2.4.8。
    • 这些命令可能无法处理某些情况。
    • 这不是一个快速的解决方案,需要超过 10 秒才能在我的最小规格 VM 上运行。
    • 处理分阶段更新的方式似乎正在发生变化。在进入这个兔子洞之前,我曾经apt-cache policy确定包裹是否被阻止。这似乎不再可靠。我找到了一个有用的 apt 配置选项APT::Get::Phase-Policy=True,但结果与实际的 apt 行为不一致。这是我在解析 的输出时生成的输出apt-cache policy,但它与 apt 的操作不匹配。
    root@ubuntu:~# for i in $(apt-cache dumpavail | awk '/^Package: /{p=$2} /^Phased-Update-Percentage/{cmd="dpkg -l "p" 2>&1 | grep -c ^ii";cmd | getline out;close(cmd); if(out > 0){print p}}'); do apt-cache -o=APT::Get::Phase-Policy=True policy $i | awk -v p=$i 'NR==2{iv=$2} NR==3{cv=$2} /phased/{pv=$1;pp=$3" "$4;exit} END{if( cv == pv ) { printf "%s,%s,not held back\n",p,pp }else{printf "%s,%s,held back\n",p,pp}}'; done | column -t -s ,
    grub-efi-amd64-bin           (phased 0%)   held back
    grub-efi-amd64-signed        (phased 0%)   held back
    libmbim-glib4                (phased 70%)  held back
    libmbim-proxy                (phased 70%)  held back
    libmm-glib0                  (phased 70%)  not held back
    libqmi-glib5                 (phased 70%)  not held back
    libqmi-proxy                 (phased 70%)  not held back
    libsasl2-2                   (phased 70%)  held back
    libsasl2-modules             (phased 70%)  held back
    libsasl2-modules-db          (phased 70%)  held back
    modemmanager                 (phased 70%)  not held back
    python3-software-properties  (phased 0%)   held back
    shim-signed                  (phased 62%)  held back
    software-properties-common   (phased 0%)   held back
    tcpdump                      (phased 20%)  not held back
    ubuntu-advantage-tools       (phased 20%)  held back
    
    • 6
  3. mook765
    2023-03-04T02:46:10+08:002023-03-04T02:46:10+08:00

    的输出apt upgrade将准确告诉您哪些包将被升级,哪些包将被保留。

    您也可以使用apt -s upgrade它来运行模拟,这将为您提供相同的所需信息。

    $ apt -s upgrade
    NOTE: This is only a simulation!
          apt needs root privileges for real execution.
          Keep also in mind that locking is deactivated,
          so don't depend on the relevance to the real current situation!
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    Calculating upgrade... Done
    Get more security updates through Ubuntu Pro with 'esm-apps' enabled:
      libimage-magick-perl imagemagick libdcmtk16 libopenexr25 libmagick++-6.q16-8
      libmagickcore-6.q16-6-extra libimage-magick-q16-perl libmagickwand-6.q16-6
      imagemagick-6.q16 libeditorconfig0 libmagickcore-6.q16-6
      imagemagick-6-common
    Learn more about Ubuntu Pro at https://ubuntu.com/pro
    The following packages have been kept back:
      grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed libsasl2-2 libsasl2-modules libsasl2-modules-db
      libsnmp-base libsnmp40 shim-signed tcpdump
    0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
    
    • 5

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行判断机器是否需要重新启动?

  • 有没有办法重置所有包/源并从头开始?

  • 如何回滚到 PHP 5.2?

  • 包管理器之间有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve