这又是一个有关错误消息的问题E: Failed to fetch ...
(示例见下面注释 2)。这个问题与我见过的其他问题的不同之处(我猜)在于以下几点。
我在代理后面运行 Ubuntu 18.04LTS。我有很多带有可用更新的软件包(我想有 200 多个)。
- 我可以毫无问题地更新许多软件包,但最终仍有 48 个软件包无法安装。
所有未安装的软件包都属于bionic-updates/universe
或。大多数与、、、bionic-updates/main
相关。完整列表在下面的注释 1 中。但我可以安装来自和的软件包(我刚刚安装了和)。java
jdk
linux
systemd
bionic-updates/universe
bionic-updates/main
qemu
bsdutils
为什么有些软件包可以安装,有些却不能?
有什么可能的解决方案(除了不使用代理连接 PC)?
笔记:
未安装软件包的完整列表
ant ant-optional apport apport-gtk fwupd fwupdate fwupdate-signed gettext gettext-base jarwrapper junit4 libasm-java libcommons-collections3-java libcommons-compress-java libcommons-httpclient-java libdb5.3 libdb5.3-java libdb5.3-java-jni libecj-java libequinox-osgi-java libhsqldb1.8.0-java libjetty9-java libnss-systemd libobjenesis-java libpam-systemd libservlet3.1-java libsystemd0 libtomcat8-java linux-generic linux-headers-generic linux-image-generic openjdk-11-jdk openjdk-11-jdk-headless openjdk-11-jre openjdk-11-jre-headless openjdk-8-jdk openjdk-8-jdk-headless openjdk-8-jre openjdk-8-jre-headless python-pip-whl python3-pip snapd systemd
这是通过
$ sudo apt list --upgradable 2> /dev/null | sed 's/\/.*//' | tail +2 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'
为了找到每个仓库所属的仓库,我使用了(printf "%30s"...
有助于在列中可视化)
$ for p in $(sudo apt list --upgradable 2> /dev/null | sed 's/\/.*//' | tail +2 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g') ; do printf "%30s" $p ; apt policy $p 2> /dev/null | tail +6 | head -1 ; done
这将生成如下输出
ant 500 http://us.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages
- 样本误差
$ sudo apt-get install apport
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
apport
1 upgraded, 0 newly installed, 0 to remove and 46 not upgraded.
Need to get 125 kB of archives.
After this operation, 20,5 kB of additional disk space will be used.
Ign:1 http://us.archive.ubuntu.com/ubuntu bionic-updates/main amd64 apport all 2.20.9-0ubuntu7.17
Err:1 http://us.archive.ubuntu.com/ubuntu bionic-updates/main amd64 apport all 2.20.9-0ubuntu7.17
403 URLBlockDownload [IP: xxx.xxx.xxx3.xxx 80]
E: Failed to fetch http://us.archive.ubuntu.com/ubuntu/pool/main/a/apport/apport_2.20.9-0ubuntu7.17_all.deb 403 URLBlockDownload [IP: 10.1.33.101 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
- 编辑:输出“请求”这个答案在这儿。
$ find /etc/apt/ -name "*.list" -exec grep -iq http {} \; -exec egrep -v '^#|^$' {} \; | uniq
deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main
deb http://us.archive.ubuntu.com/ubuntu/ bionic main restricted
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ bionic universe
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ bionic multiverse
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu bionic-security main restricted
deb http://security.ubuntu.com/ubuntu bionic-security universe
deb http://security.ubuntu.com/ubuntu bionic-security multiverse
deb https://apt.kitware.com/ubuntu/ bionic main
答案1
看起来企业防火墙阻止了 apt 的某些 URL,这就是您无法通过 apt 下载软件包的原因。您需要将源列表中提到的所有 URL 列入防火墙白名单。您需要拥有防火墙的管理员权限或请联系网络管理员。
作为替代选项,尝试将系统直接与其他互联网源(如 USB 加密狗或移动设备)连接。
答案2
这是为了给建议提供更坚实的基础这个答案。它提到防火墙过滤是罪魁祸首,并且它基于每个包使用的完整 URI,包括包名称本身。可能解释为什么给定存储库中的某些软件包可以安装,而其他一些软件包则不能安装。为了测试这一点,我获取了所有无法安装的软件包的 URI --print-uris
(请参阅下面注释 1 中的完整设计命令行),以及yudit-common
我没有但稍后可以安装的软件包的 URI。然后我尝试wget
使用这些 URI。
对于我无法安装的每个软件包,.deb
该软件包或其依赖项之一的文件都会生成
$ wget http://us.archive.ubuntu.com/ubuntu/pool/universe/a/ant/ant-optional_1.10.5-3~18.04_all.deb
--2020-09-22 10:18:35-- http://us.archive.ubuntu.com/ubuntu/pool/universe/a/ant/ant-optional_1.10.5-3~18.04_all.deb
Resolving proxy-myserver (proxy-myserver)... xx.xx.xx.xx
Connecting to proxy-myserver (proxy-myserver)|xx.xx.xx.xx|:xx... connected.
Proxy request sent, awaiting response... 403 URLBlockDownload
2020-09-22 10:18:35 ERROR 403: URLBlockDownload.
这将更有力地证实该提议。
笔记:
- 获取包的完整 URI(也在
wget
这里尝试)
for p in $(sudo apt list --upgradable 2> /dev/null | sed 's/\/.*//' | tail +2 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g') ; do for uri in $(apt install --print-uris $p 2> /dev/null | sed -n '/^After this operation/ { :a; n; p; ba; }' | awk '{ print substr($1,2,length($1)-2) }') ; echo "uri=${uri}" ; wget ${uri} ; done ; done
答案3
代理服务器可以以不同的方式设置。一种方法是允许通过通配符域访问特定站点,反之亦然。如果管理员或环境对此更加偏执,则可以使例外情况更加细化,允许通过针对特定 URI 的正则表达式公式访问特定站点。
输出是什么,
apt-get update
有错误吗?