有没有适用于ARM的ports.ubuntu.com的替代软件源?

6个回答

是的,有一些。虽然不多。
我编写了以下脚本,它将从Launchpad镜像列表中解析所有镜像,并检查它们是否包含路径/dists/$DIST/$REPO/binary-$ARCH/,其中:
  • $DIST 是您的Ubuntu发行版,例如precisesaucytrusty等。
  • $REPO 是您要查找的存储库,即mainrestricteduniversemultiverse
  • $ARCH 是您要查找的架构,例如armhf
为了举例说明,假设您使用的是Ubuntu 13.10(Saucy)。那么您可能想要在镜像中搜索路径/dists/saucy/main/binary-armhf/,以便找到提供armhf架构的main软件源的镜像。如果一个镜像包含这个路径,意味着它应该有Saucy Salamander版本的main软件源的armhf架构的二进制软件包,并且脚本将输出FOUND:以及镜像的URL。
请注意:镜像上存在这个路径并不是真正的保证,只是表示它包含所需的软件包;然而,如果一个镜像包含了这个路径但没有这些软件包,至少我们可以说这个镜像有些可疑。
另请注意,此脚本需要curl。如果您没有安装它,请执行sudo apt-get install curl进行安装。
因此,使用这个脚本,你可以快速找到Launchpad镜像列表中哪些镜像提供你所需的内容。请注意,由于脚本需要联系列表中的每个服务器,所以可能需要一段时间才能运行完毕。这些服务器分布在全球各地,其中一些可能很慢或无法访问(导致curl在连接尝试超时之前可能会停顿)。它可以很容易地改进为仅扫描特定的镜像(例如,只在你的国家),但这是一个很好的起点。
编辑:更新为并行处理,现在应该只需要大约一分钟。
#!/bin/bash

# URL of the Launchpad mirror list
MIRROR_LIST=https://launchpad.net/ubuntu/+archivemirrors

# Set to the architecture you're looking for (e.g., amd64, i386, arm64, armhf, armel, powerpc, ...).
# See https://wiki.ubuntu.com/UbuntuDevelopment/PackageArchive#Architectures
ARCH=$1
# Set to the Ubuntu distribution you need (e.g., precise, saucy, trusty, ...)
# See https://wiki.ubuntu.com/DevelopmentCodeNames
DIST=$2
# Set to the repository you're looking for (main, restricted, universe, multiverse)
# See https://help.ubuntu.com/community/Repositories/Ubuntu
REPO=$3

mirrorList=()
# First, we retrieve the Launchpad mirror list, and massage it to obtain a newline-separated list of HTTP mirrors
for url in $(curl -s $MIRROR_LIST | grep -Po 'http://.*(?=">http</a>)'); do
  mirrorList+=( "$url" )
done

for url in "${mirrorList[@]}"; do
  (
    # If you like some output while the script is running (feel free to comment out the following line)
    echo "Processing $url..."
    # retrieve the header for the URL $url/dists/$DIST/$REPO/binary-$ARCH/; check if status code is of the form 2.. or 3..
    if curl --connect-timeout 1 -m 1 -s --head "$url/dists/$DIST/$REPO/binary-$ARCH/" | head -n 1 | grep -q "HTTP/1.[01] [23]..";
    then
        echo "FOUND: $url"
    fi
  ) &
done

wait

echo "All done!"

我将脚本保存为find_mirrors,并将其设置为可执行(chmod 755 find_mirrors),然后按照以下方式执行它:
$ ./find_mirrors armhf saucy main | grep FOUND
FOUND: http://ftp.tu-chemnitz.de/pub/linux/ubuntu-ports/

对我来说大约花了10-15分钟。我很惊讶地发现在Launchpad的镜像列表中,只有一个适用于Saucy的armhf架构的镜像,即位于TU Chemnitz(这是位于德国的镜像;相比之下,ports.ubuntu.com似乎是位于英国,但可能对你来说仍然更快)。所以看起来对你的问题的答案更像是“是的,有一个备用镜像供你使用...”;-)

好消息是,我确实手动检查了这个镜像,它确实是ports.ubuntu.com的完整镜像,包含所有活跃的Ubuntu版本的所有软件包。所以,请尝试一下吧!

还要注意,你可能在其他版本的Saucy上运气更好。

备选方案(不推荐)

我提到这一点是为了完整性的目的,但我不建议这样做。您当然可以通过谷歌搜索镜像,而不是查看Launchpad 镜像列表

一种方法是简单地谷歌搜索字符串*/dists/saucy/main/binary-armhf/*(如前所述,根据您的需求选择适合的发行版、存储库和体系结构)。这将找到许多备选镜像,但大多数并未在 Launchpad 官方注册。因此,Ubuntu 镜像团队没有进行质量检查;它们可能速度较慢、不定期更新,或者仅包含完整 Ubuntu 系统所需软件包的子集,甚至有些可能是修改过的软件包。如果你仔细想想,如果某人想要公开他们的镜像,他们可能已经在 Launchpad 上注册了它,那么上面的脚本就能找到它。所以自己决定是否谷歌搜索镜像时要承担风险。如果问我的话,不要这样做。


这个脚本存在一个问题,就是一些镜像在文件不存在时返回的是错误页面,而不是真正的404页面。例如:http://mirrors.edge.kernel.org/ubuntu/dists/focal/main/binary-arm64 - Rusty Weber
非常有用的脚本,谢谢! - Lucky Mike
截至目前,saucy发行版的armhf架构只能在https://mirror.bjtu.edu.cn/ubuntu/找到。 我刚刚尝试了所有已知的Ubuntu镜像,来自http://mirrors.ubuntu.com/ - Jan

上面的脚本由Malte Skoruppa和Can Özokur编写,运行良好。然而,当您运行它时,它会创建566+个新的Bash进程,并同时建立566+个网络连接,这可能会对低功率机器和差劲的网络连接造成压力。
您可以使用GNU parallel来限制并发作业和网络连接的数量,就像下面的示例一样。 这是一个检查Ubuntu软件仓库并实现速率限制的脚本
#!/usr/bin/env bash
# Requires: Bash, GNU grep and parallel, htmlq, and httpie or xh.
# Usage: 
#        ./find-mirrors.sh ARCH DISTRO REPOSITORY PROTOCOL JOBS
# Example: 
#        ./find-mirrors.sh armhf focal main https 6
#
# Copyright 2022 Alex DeLorenzo. Licensed under the GPLv3.
#
export ARCH="${1:-amd64}"
export DISTRO="${2:-focal}"
export REPOSITORY="${3:-main}"
export PROTOCOL="${4:-http}"
export JOBS="${5:-4}"

export URL_PATH="dists/$DISTRO/$REPOSITORY/binary-$ARCH/"
export LIST_URL="https://launchpad.net/ubuntu/+archivemirrors/"
export SELECTOR="#mirrors_list > tbody > tr > td:nth-child(2) > a"
export TIMEOUT=10

export RC_MISSING_DEPS=1
export NO_PARALLEL="GNU parallel is missing, installing with apt...\n"
export NO_HTMLQ="You need to install htmlq: https://github.com/mgdm/htmlq\n"


quiet() {
  $@ &> /dev/null
}
export -f quiet


exists() {
  quiet which $@
}


getDependencies() {
  exists parallel || {
    printf "%s" "$NO_PARALLEL"
    sudo apt install parallel
  }

  exists xh || exists http ||
    python3 -m pip install --upgrade httpie &&
    export http=http ||
      return $RC_MISSING_DEPS

  exists xh &&
    export http=xh

  exists htmlq || {
    printf "%s" "$NO_HTMLQ"
    return $RC_MISSING_DEPS
  }
}


getMirrors() {
  $http --body --follow "$LIST_URL" \
    | htmlq "$SELECTOR" --attribute href \
    | grep -i "$PROTOCOL:"
}


checkRepo() {
  local url="$1"

  quiet $http "$url" \
    --quiet --quiet \
    --timeout $TIMEOUT \
    --verify=no \
    --ignore-stdin \
    --follow \
    --headers \
    --check-status
}
export -f checkRepo


testMirror() {
  local url="$1"
  local repoUrl="$url/$URL_PATH"

  checkRepo "$repoUrl" &&
    printf "Valid: %s\n" "$url"
}
export -f testMirror


testMirrors() {
  parallel --will-cite --jobs "$JOBS" testMirror
}


main() {
  getDependencies &&
    getMirrors | testMirrors
}


main

请参见:https://gist.github.com/alexdelorenzo/8cdb21718c2d2d3f5f8beaad0bf6c843 需要以下软件包:bash、parallel、htmlq和httpie 以下是语法:
./find-mirrors.sh ARCH DISTRO REPOSITORY PROTO JOBS

如果你想找到armhf架构的替代方案,你可以这样做:
./find-mirrors.sh armhf jammy main http 6

不错的方法,但是如果你不需要一般的锈蚀,htmlq/cargo 的依赖树 250 MB 还是相当庞大的。 - Heiko Robert

使用另一个答案中的脚本来查找与Ubuntu Touch(xenial armhf)一起使用的镜像,以下是我的发现:
phablet@ubuntu-phablet:~$ ./find_mirrors.sh armhf xenial main | grep FOUND
FOUND: http://mirror.kumi.systems/ubuntu-ports/
FOUND: http://mirror.exid.us/ubuntu-archive/
FOUND: http://mirror.telcotech.com.kh/Linux/ubuntu-releases/
FOUND: http://mirrors.layeronline.com/ubuntu/
FOUND: http://mirror.rcg.sfu.ca/mirror/ubuntu/
FOUND: http://linux.xjtuns.cn/ubuntu/
FOUND: http://klid.dk/ftp/ubuntu/
FOUND: http://ftp.tu-chemnitz.de/pub/linux/ubuntu-ports/
FOUND: http://www.ubuntu.org.tw/
FOUND: http://kebo.vlsm.org/ubuntu/
FOUND: http://mirror.unej.ac.id/ubuntu/
FOUND: http://ir.ubuntu.sindad.cloud/ubuntu/
FOUND: http://twitchdarkbot.com/ubuntu-ports/
FOUND: http://ftp.daum.net/ubuntu/
FOUND: http://ntc.net.np/ubuntu/
FOUND: http://mirror.chmuri.net/ubuntu/
FOUND: http://cesium.di.uminho.pt/pub/ubuntu-archive/
FOUND: http://ubuntu.mirror.ac.za/ubuntu-archive/
FOUND: http://dafi.inf.um.es/ubuntu/
FOUND: http://mirrors.c0urier.net/linux/ubuntu/
FOUND: http://ubuntu.vargonen.com/ubuntu/
FOUND: http://mirrors.coreix.net/ubuntu/
FOUND: http://mirrors.us.kernel.org/ubuntu/
FOUND: http://lug.mtu.edu/ubuntu/
FOUND: http://mirrors.avalonhosting.services/ubuntu-archive/
FOUND: http://mirror.vcu.edu/pub/gnu+linux/ubuntu/

phablet@ubuntu-phablet:~$ ./find_mirrors.sh armhf xenial universe | grep FOUND
FOUND: http://mirror.kumi.systems/ubuntu-ports/
FOUND: http://mirror.exid.us/ubuntu-archive/
FOUND: http://mirror.telcotech.com.kh/Linux/ubuntu-releases/
FOUND: http://mirrors.layeronline.com/ubuntu/
FOUND: http://mirror.rcg.sfu.ca/mirror/ubuntu/
FOUND: http://klid.dk/ftp/ubuntu/
FOUND: http://ftp.tu-chemnitz.de/pub/linux/ubuntu-ports/
FOUND: http://www.ubuntu.org.tw/
FOUND: http://kebo.vlsm.org/ubuntu/
FOUND: http://mirror.unej.ac.id/ubuntu/
FOUND: http://ir.ubuntu.sindad.cloud/ubuntu/
FOUND: http://twitchdarkbot.com/ubuntu-ports/
FOUND: http://ftp.daum.net/ubuntu/
FOUND: http://ntc.net.np/ubuntu/
FOUND: http://mirror.chmuri.net/ubuntu/
FOUND: http://cesium.di.uminho.pt/pub/ubuntu-archive/
FOUND: http://ubuntu.mirror.ac.za/ubuntu-archive/
FOUND: http://dafi.inf.um.es/ubuntu/
FOUND: http://mirrors.c0urier.net/linux/ubuntu/
FOUND: http://mirrors.coreix.net/ubuntu/
FOUND: http://mirrors.us.kernel.org/ubuntu/
FOUND: http://lug.mtu.edu/ubuntu/
FOUND: http://mirrors.avalonhosting.services/ubuntu-archive/
FOUND: http://mirror.vcu.edu/pub/gnu+linux/ubuntu/

phablet@ubuntu-phablet:~$ ./find_mirrors.sh armhf xenial multiverse | grep FOUND
FOUND: http://mirror.kumi.systems/ubuntu-ports/
FOUND: http://mirror.exid.us/ubuntu-archive/
FOUND: http://mirror.telcotech.com.kh/Linux/ubuntu-releases/
FOUND: http://mirrors.layeronline.com/ubuntu/
FOUND: http://mirror.rcg.sfu.ca/mirror/ubuntu/
FOUND: http://klid.dk/ftp/ubuntu/
FOUND: http://ftp.tu-chemnitz.de/pub/linux/ubuntu-ports/
FOUND: http://kebo.vlsm.org/ubuntu/
FOUND: http://mirror.unej.ac.id/ubuntu/
FOUND: http://ir.ubuntu.sindad.cloud/ubuntu/
FOUND: http://twitchdarkbot.com/ubuntu-ports/
FOUND: http://ftp.daum.net/ubuntu/
FOUND: http://ntc.net.np/ubuntu/
FOUND: http://mirror.chmuri.net/ubuntu/
FOUND: http://cesium.di.uminho.pt/pub/ubuntu-archive/
FOUND: http://ubuntu.mirror.ac.za/ubuntu-archive/
FOUND: http://dafi.inf.um.es/ubuntu/
FOUND: http://mirrors.c0urier.net/linux/ubuntu/
FOUND: http://mirrors.coreix.net/ubuntu/
FOUND: http://mirrors.us.kernel.org/ubuntu/
FOUND: http://lug.mtu.edu/ubuntu/
FOUND: http://mirrors.avalonhosting.services/ubuntu-archive/
FOUND: http://mirror.vcu.edu/pub/gnu+linux/ubuntu/

官方的https://launchpad.net/ubuntu/+archivemirrors镜像列表现在有一些名字中带有“ports”的镜像,例如:

虽然它的名字中没有“港口”一词,但中国的清华大学2也是一个港口镜像。

我在上述所有镜像中都看到了armhf和arm64。

(如果镜像列表已过时,请随意编辑此帖)


感谢你提供的信息。我特意在寻找带有arm64的完整映像镜像。上面的脚本也非常有用,但是这个列表直接给了我一个可用的镜像。 - Lucky Mike


关于上述答案。如果您还想要进行延迟测试,以下是提取此信息的方法。您需要将其融入到脚本中。
它会进行4次ping测试,并计算每次的平均值。
host=`echo "$url" | awk -F/ '{print $3}'`
latency=`ping -c 4 "$host" | tail -1 | awk '{print $4}' | cut -d '/' -f 2`