当使用PPA或更新软件包列表时,如何修复404错误?

PPA似乎一直处于离线状态。每当我使用sudo apt-get update时,都会显示这个错误:
W: Failed to fetch http://ppa.launchpad.net/ 404  Not Found

怎么修复这些错误?

由于这似乎是主要的“无法获取”答案之一,我想在这里指出,Ubuntu“partner”URL也可能出现这种情况,请检查错误以确定是否是这些URL,并尝试将其注释掉。我在从Quetzal升级时遇到了这个问题(和解决方案)。 - joseph_morris
9个回答

自动删除

跳到这个答案底部以获取在Ubuntu 15.04之前的所有Ubuntu版本上删除有问题软件源的脚本化方法

404错误是什么

404或未找到错误消息是一个HTTP标准响应代码,表示客户端能够与服务器通信,但服务器无法找到所请求的内容。

当用户尝试访问损坏或失效链接时,网站托管服务器通常会生成"404 - 页面未找到"的网页。

更新管理器中这些错误的原因是什么

通常,主要有三个方面导致更新管理器中出现这些错误。

  • 一个用户刚刚升级并重新启用了一个不再存在的PPA软件源
  • enter image description here
  • 一个用户手动输入了一个新的软件源,但是输入错误
  • enter image description here
  • 一个PPA被添加了进来,但是维护者随后删除了一些或全部的PPA
  • 这些软件源在哪里

    PPA通常保存在以下两个位置之一

    1. /etc/apt/sources.list
    2. 在一个以.list文件扩展名命名的适当文件中,位于/etc/apt/sources.list.d/目录下,例如webupd8team-jupiter-natty.list

    这个列表文件通常包含:

    deb http://ppa.launchpad.net/webupd8team/jupiter/ubuntu oneiric main
    # deb-src http://ppa.launchpad.net/webupd8team/jupiter/ubuntu oneiric main
    

    在文本行的前面加上#表示该行是注释,不会被软件包管理器检查。

    如何消除这些错误

    通常情况下,如果您从终端运行sudo apt-get update或者在点击刷新按钮后,在更新管理器中单击详细信息按钮,您将看到以下错误:

    enter image description here

    如果错误是由于PPA引起的-通常取消勾选与错误消息中显示的URL同名的PPA将解决此问题。

    enter image description here

    如果 404 错误是由于在 /etc/apt/sources.list 中添加了一个额外的软件源导致的,那么可以在行首添加 # 字符注释掉有问题的软件源。

    gksu gedit /etc/apt/sources.list
    

    enter image description here

    更多信息

    这里是关于更新管理器的错误报告,以解决这个问题:

    如果您在没有PPA的情况下遇到这些问题,请查看以下问题:

    通过脚本自动删除404未找到的PPA

    这是一个用于自动删除所有404未找到的PPA的脚本。将下面的代码复制并粘贴到一个文件中,并将其命名为ppa-remove

    #!/bin/bash
    sudo rm /tmp/update.txt
    tput setaf 6
    echo "Initializing.. Please Wait" 
    sudo apt-get update >> /tmp/update.txt 2>&1
    awk '( /W:/ && /launchpad/ && /404/ ) { print substr($5,26) }' /tmp/update.txt > /tmp/awk.txt
    awk -F '/' '{ print $1"/"$2 }' /tmp/awk.txt > /tmp/awk1.txt
    sort -u /tmp/awk1.txt > /tmp/awk2.txt
    tput sgr0
    if [ -s /tmp/awk2.txt ]; then
      tput setaf 1
      printf "PPA's going to be removed\n%s\n" "$(cat /tmp/awk2.txt)"
      tput sgr0
      while read -r line; do
        echo "sudo add-apt-repository -r ppa:$line"
      done < /tmp/awk2.txt > out
      bash out
    else
      tput setaf 1
      echo "No PPA's to be removed"
      tput sgr0
    fi
    

    给脚本赋予执行权限
    sudo chmod +x ppa-remove
    

    ppa-remove文件复制并粘贴到/usr/bin目录中,这样您就可以从任何地方访问它。

    使用方法

    sudo ppa-remove
    

    脚本描述

    [ -f /tmp/update.txt ] && sudo rm /tmp/update.txt; tput setaf 6; echo "Initializing.. Please Wait" || echo "No update file"
    

    tput setaf 6命令将终端文本颜色设置为绿色。然后以绿色显示"正在初始化,请稍候"。
    sudo apt-get update >> /tmp/update.txt 2>&1; awk '( /W:/ && /launchpad/ && /404/ ) { print substr($5,26) }' /tmp/update.txt > /tmp/awk.txt; awk -F '/' '{ print $1"/"$2 }' /tmp/awk.txt > /tmp/awk1.txt; uniq /tmp/awk1.txt > /tmp/awk2.txt
    
    1. sudo apt-get update >> /tmp/update.txt 2>&1;

      将命令sudo apt-get update的标准输出和错误输出都写入文件/tmp/update.txt

    2. awk '( /W:/ && /launchpad/ && /404/ ) { print substr($5,26) }' /tmp/update.txt > /tmp/awk.txt; awk -F '/' '{ print $1"/"$2 }' /tmp/awk.txt > /tmp/awk1.txt;

    Awk在文件/tmp/update.txt中搜索包含W:launchpad404的行。如果找到了这样的行,它会在该行中显示(标准输出)从第26个位置开始的所有字母。然后将此标准输出重定向(写入)到文件/tmp/awk.txt

    例如:

    W: Failed to fetch http://ppa.launchpad.net/pitti/postgresql/ubuntu/dists/saucy/main/binary-i386/Packages  404  Not Found
    

    第五列 - http://ppa.launchpad.net/pitti/postgresql/ubuntu/dists/saucy/main/binary-i386/Packages 在第五列中从第26个字符开始 - pitti/postgresql/ubuntu/dists/saucy/main/binary-i386/Packages 上述行已存储到/tmp/awk.txt文件中。现在执行下一个命令,
    awk -F '/' '{ print $1"/"$2 }' /tmp/awk.txt > /tmp/awk1.txt;  
    

    awk 找出以分隔符 / 连接的列1和列2,这些列1和列2来自于 /tmp/awk.txt 文件,并将标准输出重定向到 /tmp/awk1.txt 文件。

    现在 /tmp/awk1.txt 文件包含了一行 pitti/postgresql

    uniq /tmp/awk1.txt > /tmp/awk2.txt

    如果有两行相同,unique 命令只显示(stdout)一行。那一行被写入到 /tmp/awk2.txt 中。最后,/tmp/awk2.txt 包含了唯一的PPA名称。

    tput sgr0
    

    这个命令将终端文本的颜色改为白色。

    最后,if条件语句将被执行。if [ -s /tmp/awk2.txt ]检查/tmp/awk2.txt文件是否存在内容。如果是,则从/tmp/awk2.txt中取出第一行,并执行sudo add-apt-repository -r ppa:$line命令。它会一直执行到最后一行。

    如果没有内容,则表示没有内容可移除。所以它会显示"没有PPA需要移除"。

    截图

    Screenshots

    Screenshots


    /usr/bin/ppa-remove: 第32行:语法错误:意外的文件结尾 - Shravan40

    你之所以出现这些错误,是因为你的PPA仓库没有为你的Ubuntu发行版(即quantal)提供软件包。
    请查看以下截图: ppa:petrakis/wdt-main Launchpad logo

    wdt-main

    ppa:screenlets/ppa Launchpad logo

    screenlets

    你可以看到,quantal目录丢失了,因此你会收到404 Not Found Error Messages
    为了摆脱这些错误信息,你需要从系统中删除这些PPA存储库。请参考以下问题以了解如何删除PPA:

    如何调查并得出这个结论?

    以下是您在wdt-main PPA收到的错误信息:

    W:Failed to fetch http://ppa.launchpad.net/petrakis/wdt-main/ubuntu/dists/quantal/main/source/Sources  404  Not Found
    , W:Failed to fetch http://ppa.launchpad.net/petrakis/wdt-main/ubuntu/dists/quantal/main/binary-amd64/Packages  404  Not Found
    , W:Failed to fetch http://ppa.launchpad.net/petrakis/wdt-main/ubuntu/dists/quantal/main/binary-i386/Packages  404  Not Found
    

    打开您的浏览器标签并打开链接,该链接显示404 Not Found错误。在这种情况下,访问http://ppa.launchpad.net/petrakis/ 并深入查看导致错误的链接。您将能够看到实际问题是什么。

    最有可能发生的情况是PPA不再维护,需要被移除。你可以通过以下方式来做到这一点:
    sudo rm /etc/apt/sources.list.d/ppaname-ppa-$(lsb_release -sc).list*
    

    3这刚刚避免了重复提问的情况发生。我已经准备好我的问题正文,就在我开始输入标题时找到了链接。为什么他们不把所有的列表都放在一个地方呢!我在/etc/apt/sources.list中检查了一些,但不知道还要看/etc/apt/sources.list.d/。谢谢。 - rusty
    这样做,然后添加适当的新PPA,结果对我来说是最好的(唯一有效的)解决方案。 - markus-tharkun

    选择旧版本仓库

    如果你真的需要来自那个仓库的软件包,你可以使用旧版本的镜像。

    然而,请注意,并非所有旧版本都与你的主要软件包仓库向后兼容;其中一些会与你的主要软件包仓库发生冲突。

    当发生冲突时,你唯一能做的就是从源代码构建或等待提供者发布适用于你的Ubuntu版本的仓库。我们无法确定软件包提供者何时会为我们的版本发布他们的软件包,所以你需要负责检查他们的仓库是否适用于你的版本。

    这适用于任何基于Debian的仓库。然而,并不能保证成功。

    步骤

    在添加PPA/存储库后,请执行常规的sudo apt update命令。在更新过程中,您可能会注意到有404错误,但请忽略它们。 404错误 使用浏览器打开导致404错误的存储库目录;在这种情况下,它是https://dl.winehq.org/wine-builds/ubuntu。通常,可用的版本位于dists/目录下。 镜像 找到目录后,打开“软件和更新”,将可用版本替换为您的发行版名称;最好选择最新或LTS版本。在二进制和源代码镜像的“Distribution”部分进行替换。在这种情况下,我将bionic替换为artful。 输入图像描述 再次执行sudo apt update命令。
    完成!现在,在更新软件包列表时不会再出现404错误。 输入图像描述 当适用于您的Ubuntu版本的软件包发布时,请重复第3步和第4步,将“Distribution”部分替换为您的发行版名称。

    如果您在尝试从官方仓库(而不是PPA)获取安全或系统文件时遇到404错误,您可以选择不同的镜像来解决此问题。
    您可以选择以下任一方式:
    A) 通过查看this list并选择最新的镜像来手动确定一个镜像(您可能还希望考虑其他因素,如距离和带宽);或者
    B) 自动选择一个镜像。
    无论哪种方式,您都可以从下面显示的“软件和更新”应用程序开始。然后选择“下载源”,再选择“其他”。然后,您可以手动从列表中选择您选择的镜像,或者点击“选择最佳服务器”按钮,该按钮将运行一些测试,并根据当前条件为您选择最佳服务器。

    SnU


    注意,这种情况已经发生在我身上,而且我已经摆脱了这些困境。而且我的一个朋友也成功解决了这个问题。尽管无法解释为什么,但有一种方法可以解决这个问题:
    1. 禁用所有的PPA; 2. 从终端运行sudo apt-get update命令; 3. 再次启用你的PPA; 4. 再次运行sudo apt-get update命令;
    突然间,它就起作用了。别问我为什么。

    对我来说没有任何影响。还是404错误。 - kwoxer
    我禁用了一些不需要的PPA,并尝试了sudo apt-get update,结果完美运行。 - Shashanth


    > 你的资源被搞乱或损坏了,但我们可以制作一个新的清单。

    打开终端并输入

    sudo rm /etc/apt/sources.list
    

    然后,输入:
    sudo rm /etc/apt/sources.list.d/ppaname-ppa-$(lsb_release -sc).list*
    

    然后打开软件源:
    sudo software-properties-gtk
    你会看到5个复选框,全部选中它们,并在下面将服务器更改为最接近你的服务器,例如如果你住在美国,你会选择美国服务器,应用选项并关闭窗口。
    然后打开终端并输入:
    sudo apt-get update && upgrade
    

    更新您的系统。