netselect-apt 无法在 MX-Linux 中找到最快的存储库

netselect-apt 无法在 MX-Linux 中找到最快的存储库

最近,我不小心对系统中的 /etc/apt/sources.list 文件进行了一些更改。因此执行后apt-get update输出充满了警告。所以我用谷歌搜索默认的sources.list并将其替换为我的。但是,当我使用存储库管理器为我找到最快的 debian 存储库时,该过程失败并显示以下消息:netselect-apt 无法检测到最快的存储库。为了您的方便,我附上照片。 在此输入图像描述

当我使用终端命令时sudo netselect-apt,它给出以下输出:

使用分布稳定。
正在从 www.debian.org 检索镜像列表...

由于 HSTS 策略,URL 转换为 HTTPS
--2021-06-05 09:09:00-- https://www.debian.org/mirror/mirrors_full
正在解析 www.debian.org (www.debian.org)... 128.31.0.62, 130.89.148.77, 149.20.4.15, ...
正在连接 www.debian.org (www.debian.org)|128.31.0.62|:443...已连接。
HTTP 请求已发送,正在等待响应... 200 OK
长度:129107 (126K) [text/html]
保存到:'/tmp/netselect-apt.HIfkAg'

/tmp/netselect-apt.HIfkAg 100%[============================================ =================================================== ==============>] 0.9秒内126.08K 137KB/s    

2021-06-05 09:09:03 (137 KB/s) - “/tmp/netselect-apt.HIfkAg”已保存 [129107/129107]

使用 netselect 选择主 Debian 镜像。
netselect-apt 无法从以下位置获取有效主机列表
从 url“http://www.debian.org/mirror/mirrors_full”下载的文件。
发生这种情况可能是由于以下任一原因:
   - 文件中有错误
   - 文件不是 netselect-apt 预期的格式
   - netselect-apt 中有一个错误
请手动检查该文件。如果您认为其内容正确,请归档
针对 netselect-apt 的错误(提示:使用“reportbug”)并将文件提供为
以及程序生成的输出(提示:使用“脚本”)。

有办法解决这个问题吗?我担心我的系统中存在损坏的软件包。

答案1

解决问题。 (netselect-apt使用netselect命令检查最快的镜像。参见/usr/bin/netselect-apt脚本)

您可以通过 手动查找最快的镜像netselect,将主机提供给netselect,它将返回最快的镜像。例如:

netselect ftp.is.co.za debian.xtdv.net
687 ftp.is.co.za

使用可用的 Debian 镜像获得最快的镜像Debian 全球镜像站点(大约360个镜像),使用以下命令:

curl https://www.debian.org/mirror/mirrors_full |\
awk 'BEGIN{FS="<tt>";RS="</tt>"}/Site/{print $2}' |xargs netselect

curl将抓取 html 格式的网页。

awk<tt>将通过提取之间的内容并</tt>使用匹配来过滤结果Site

xargs将结果作为参数传递给netselect.

例如:

curl https://www.debian.org/mirror/mirrors_full | awk 'BEGIN{FS="<tt>";RS="</tt>"}/Site/{print $2}' |xargs netselect
...
netselect: unknown host ftp2.cn.debian.org
165 debian.connesi.it

你应该得到不同的结果,最近的镜子取决于你的地理位置。

sources.list然后用最近的镜子编辑你的。

答案2

MX Linux 中的存储库组织方式可能不同,不确定。无论如何,MX 有自己的工具 MX Repo Manager,它有一个按钮可以选择最快的存储库。

答案3

我编辑了位于 /usr/bin 位置的 netselect-apt 文件。我将代码粘贴到这里。遇到此问题的任何人都需要将 netselect-apt 文件中的内容替换为以下内容。

#!/bin/bash
#
# A script to create an apt sources.list file automatically by downloading
# the list of Debian mirrors and choosing the fastest using netselect.
#
# Author: Avery Pennarun <[email protected]>
# Enhancements:
#    - Filippo Giunchedi <[email protected]>
#    - Javier Fernandez-Sanguino <[email protected]>
#
# License: public domain.  Please feel free to improve this script.  It
# doesn't really belong in the netselect package, particularly since the
# netselect package doesn't depend on wget and this script does.  If you
# feel like merging this into another package, or creating a new package,
# please do.  Then tell me, so I can remove it from the netselect package.
#
# TO DO:
#   - test the generated files automatically.  Some mirrors in the list
#       are broken.  We should at least verify that the Packages and Sources
#       files exist and aren't ancient.
#   - maybe generate redundant entries, in case one server is missing files?

# our defaults
# RATIONALE for WANT_SOURCES and WANT_NONFREE environmental variables:
# both variables can be system wide and can be useful to not always specify
# them on the commandline

want_sources=${WANT_SOURCES:-0}
want_nonfree=${WANT_NONFREE:-0}
want_security=1
infile=""
tmpinfile="1"
# File to generate
outfile="sources.list"
# Default distribution
distro="stable"
# Default protocol
protocol="HTTP"
# Number of fastest hosts that will be validated
test_hosts="10"
# URL where the mirror list is retrieved from 
url="http://www.debian.org/mirror/mirrors_full"
# Test file retrieve from sites to valide
test_file="README"     
# Country used to filter the list
country=""
# Debug mode?
DEBUG=""
if [ -x /usr/bin/dpkg-architecture ] ; then
    arch=$(/usr/bin/dpkg-architecture -qDEB_HOST_ARCH)
else
    arch=$(dpkg --print-architecture)
fi

options="-o a:dsi:o:O:t:c:nfhu -l arch:,debug,sources,infile:,outfile:,tests:,country:,nonfree,ftp,help"

trap '[ "$tmpinfile" = "1" ] && rm -f "$infile"' TERM INT EXIT

# misc functions
log()
{
    echo "$@" >&2
}

# tests a list of hosts and returns a (filtered) list of those
# that you can connect to using a defined protocol
tests_hosts()
{
    local host_list="$*"
    local host_filtered=""
    [ -n "$DEBUG" ] && log "DEBUG: Filtering host list is $host_list"
    # Do not continue if curl is not installed 
    [ ! -x /usr/bin/curl  ] && echo $host_list 
    host_filtered=""
    for host in $host_list; do
# Test using curl
        [ -n "$DEBUG" ] && log "DEBUG: Testing host $host with curl"
        test_host $host
        if [ $? -eq 0 ]; then
            [ -n "$DEBUG" ] && log "DEBUG: Host $hot is ALIVE"
            if [ -z "$host_filtered" ] ; then
                host_filtered="$host"
            else
                host_filtered="$host_filtered $host"
            fi
        fi
    done
    [ -n "$DEBUG" ] && log "DEBUG: Filtered host list is $host_filtered"
    echo $host_filtered
}

validate_hosts()
{
    for host in $*; do
        [ -n "$DEBUG" ] && log "DEBUG: Testing host $host with curl"
        test_host $host
        if [ $? -eq 0 ]; then
            [ -n "$DEBUG" ] && log "DEBUG: Host $host is valid"
            echo $host
            return 0
            # We return as soon as we have a valid host since netselect
            # returns them in order (fastest to slowest)
        fi
        [ -n "$DEBUG" ] && log "DEBUG: Host $host is INVALID"
    done
    return -1
}

# Test a single host using Curl, if available
test_host()
{
    local host="$1"
    local rv=0
    [ ! -x /usr/bin/curl  ] && return 255
    [ -z "${host}" ]        && return 255

    # First test: does it actually serve anything?
    curl -m 2 -q -s "$host"  >/dev/null 2>&1
    [ $? -ne 0 ] && return $?

    # Second test: do we have the test file we are looking for?
    [ -n "$DEBUG" ] && log "DEBUG: Checking if the file '$test_file' is available in site"
    temp=`tempfile`
    [ ! -e "$temp" ] && return 0 # Return without error if we cannot create
                                 # a temporary file
    curl -m 2 -q -s "$host/$test_file"  >$temp 2>&1
    rv=$?
    if [ $rv -ne 0 ] ; then
        rm -f $temp
        return $rv
    fi

    # Third test: does the file have any reference to 'Debian'
    [ -n "$DEBUG" ] && log "DEBUG: Checking the contents of the '$test_file' file (downloaded to '$temp')"
    grep -qi debian $temp 
    rv=$?
    if [ $rv -ne 0 ] ; then
        rm -f $temp
        return $rv
    fi
    # Fourth test: does it have the content we expected
    head -1 $temp | grep -qi "See http://www.debian.org/"
    rv=$?
    if [ $rv -ne 0 ] ; then
       rm -f $temp
        return $rv
    fi

    # All tests completed succesfully, remove temporary file and exit
    [ -e "$temp" ] && rm -f $temp
    return 0
}

run_netselect()
{
    SEARCH="$1"
    PROTO="$2"
        hosts=$(cat "$infile" \
        | perl -n -e '
            $/="<br><br>";
                        $country_name  = ".*";
                        $country_iso  = "..";
                        $country = "'"$country"'";
                        $my_country = 1;
                        if ( $country ne "" ) {
                          $my_country = 0;
                          if ( $country =~ /^\w{2}$/ ) {
                            $country_iso  = uc($country);
                            $country_name = "";
                          }  else {
                            $country_iso  = "";
                            $country_name = ucfirst(lc($country));
                          } ;
                        }
            while(<>){
                                if ( /<h3><a name="$country_iso">/ ||
                                     /<h3><a name=".*?">$country_name<\/a>/ ) {
                                    $my_country = 1 ;
                                }
                                if ( $_ =~ /<h3>/ && $_ !~ /<h3><a name="$country_iso">/ &&
                                     $_ !~ /<h3><a name=".*?">$country_name<\/a>/ ) {
                                    $my_country = 0 ;
                                }
                next if $_ !~ /Site:/;
                if( ( /Includes architectures:.+'"$arch"'.+/i ||
                        $_ !~ /Includes architectures:/ ) &&
                        m@'"$SEARCH"':.*<a.*?href="('"$PROTO"'://.*?)">@i && $my_country == 1
                    ){
                    print("$1\n");
                }}')
        [ -z "$hosts" ] && return 200
        [ -n "$DEBUG" ] && log "DEBUG: Running netselect: 'netselect $netselect_options $hosts'"
    out=`netselect $netselect_options  $hosts`
    rv=$?
    # Throw away hosts with negative scores to workaround a netselect bug.
    # (netselect 0.3.ds1-25 seems to have problems pinging round-robin DNS)
    corruptedhosts=$(echo "$out" | egrep '^ *-')
    if [ $? -eq 0 ]; then
        log "Detected corrupt scores from bug in netselect: $corruptedhosts"
        out=$(echo "$out" | sed -e '/^-/d')
    fi


    # Remove the score number leaving just the host.
        echo $out | sed -e 's/[0-9]\+\s\+/ /g'
    return $rv
}

netselect_generic_error()
{
    log "netselect was unable to find a mirror, this probably means that"
    log "you are behind a firewall and it is blocking ICMP and/or"
        log "UDP traceroute. Or the servers test are actively blocking"
        log "ICMP and/or UDP traceroute probes."
}

netselect_permission_error()
{
    log "netselect was unable to operate successfully, please check the errors,"
    log "most likely you don't have enough permission."
}

netselect_parse_error ()
{
    
    log "netselect-apt was unable to obtain a list of valid hosts from"
        if [ "$tmpinfile" = "0" ] ;then
            log "the file provided ($infile)."
        else
            log "the file downloaded from the url '$url'."
        fi
        if [ -n "$country" ] ; then
            log "You told the program to only look for hosts in country '$country' "
            log "and there might no mirrors to chose from that country. Remove the "
            log "option -c and try again."
        else
            log "This might happen because of any of the following reasons: "
            log "   - there was an error in the file "
            log "   - the file is not in the format netselect-apt expected "
            log "   - there is a bug in netselect-apt "
            log "Please manually check the file. If you believe its contents are correct, file "
            log "a bug (hint: use 'reportbug') against netselect-apt and provide the file as "
            log "well as the output generated by the program (hint: use 'script')."
        fi
}

netselect_aborted_error ()
{
    log "netselect aborted before it was able to find a mirror."
}



usage()
{
    log "Usage: netselect-apt [OPTIONS] [ debian_release ]"
    log "       debian_release is one of stable, testing, unstable, experimental"
    log "       or a codename etch, lenny, squeeze, wheezy, jessie, stretch, sid"
    log "Options:"
    log "   -a, --arch ARCH        Use mirrors containing arch ($arch)"
    log "   -s, --sources          Include deb-src lines in generated file (no)"
    log "   -i, --infile INFILE    Use INFILE as the input file (temp file)"
    log "   -o, --outfile OUTFILE  Use OUTFILE as the output file (sources.list)"
    log "   -n, --nonfree          Use also non-free packages in OUTFILE (no)"
    log "   -f, --ftp              Use FTP as the protocol for OUTFILE (HTTP)"
    log "   -t, --tests #          Number of hosts to test ($test_hosts)"
    log "   -c, --country COUNTRY  Restrict search to servers in that country"
    log "   -d, --debug            Enable debugging"
}

# Sanity tests
NETSELECT=`which netselect`
# Does netselect exist?
if [ -z "$NETSELECT" ] ; then
    log "Sorry, I cannot find the 'netselect' binary in my PATH"
    exit 1
fi
# Are we root?
if [ "`id -u`" -gt 0 ] ; then
# If we are not, is netselect setuid?
    if [ ! -u "$NETSELECT" ] ; then
        log "Sorry, you need to be root to run $0 since the netselect"
        log "binary we will use ($NETSELECT) is not setuid."
        exit 1
    fi
fi


# commandline parsing
# TODO: We should do some sanity checking of some values
# (such as test_hosts to ensure it is a number > 1)
temp=$(getopt $options -n 'netselect-apt' -- "$@")
if [ $? != 0 ]; then echo "Terminating..." >&2; exit 2; fi
eval set -- "$temp"
while true; do
    case "$1" in
        -a|--arch) arch=$2; shift 2 ;;
        -s|--sources) want_sources=1; shift ;;
        -i|--infile) infile="$2"; tmpinfile="0"; shift 2 ;;
        -o|--outfile) outfile="$2"; shift 2 ;;
        -O) netselect_options="$netselect_options $2"; shift 2 ;;
        -n|--nonfree) want_nonfree=1; shift ;;
        -c|--country) country=$2; shift 2 ;;
        -t|--tests) test_hosts=$2; shift 2 ;;
        -f|--ftp) protocol="FTP"; shift ;;
        -d|--debug) DEBUG=1; shift ;;
        -h|--help) usage; exit 0;;
        --) shift; break;;
        *) echo "Internal Error!"; echo "args: $@"; exit 1;;
    esac
done

# Default netselect options
netselect_options="-D -I -v -s $test_hosts"
# The '-s number' option can be used to display the top 'number' best
# hosts. This is useful for finding the best host to use in a sources.list file
# that is shared between several hosts on different networks in the same
# geographical location. For example, it would be better to choose a host that
# is #2 on all hosts than #1 on one host but is #50 on all the rest.

# distro is a non-option for backward compatibility
case "$1" in
    # don't forget to update the usage with new codenames
    stable|testing|unstable|experimental|etch|lenny|squeeze|wheezy|jessie|stretch|sid) distro="$1" ;;
    '') ;;
    *) log "Invalid distribution: $1"; exit 1 ;;
esac

if [ "$distro" != "stable" ]; then
    want_security=0
fi

# netselect starting
log "Using distribution $distro."

if [ "$tmpinfile" = "0" -a ! -f "$infile" -a ! -x /usr/bin/wget ]; then
    log "Sorry, this script requires the 'wget' package in order to run."
    log "You can also download the mirrors list yourself and pass it"
    log "with -i option, consult the manpage for further details:"
    log "        $url"
    exit 2
fi

if [ ! -f "$infile" ]; then
    if [ "$tmpinfile" = "1" ]; then
        infile=$(mktemp -t netselect-apt.XXXXXX) ||
            { log "unable to create tempfile"; exit 2; }
    fi

    log "Retrieving the list of mirrors from www.debian.org..."
    log

    if ! /usr/bin/wget -O "$infile" "$url"; then
        log "$0: wget failed to retrieve $url."
                log "Please try to correct the problem by reading the wget "
                log " messages printed above."
        exit 2
    fi
else
    log "$infile has been found."
    log "I'll use that, rather than downloading it again."
    log
fi

log "Choosing a main Debian mirror using netselect."
if [ -n "$country" ]; then
    log "(will filter only for mirrors in country $country)"
fi
hosts_netselect=$(run_netselect "Packages over $protocol" $protocol)
netselect_rv=$?
if [ $netselect_rv -eq 0 ] ; then
        if [ ! -z "$hosts_netselect" ] ; then
            if [ "$test_hosts" -gt 1 ]; then
                log "The fastest $test_hosts servers seem to be:"
                echo "$hosts_netselect" | sed -e 's/\s\+/\n\t/g'
                log
            else
                log "The fastest server seems to be:"
                log "          $hosts_netselect"
                log
            fi
            main=$(validate_hosts $hosts_netselect)
            if [ ! -z "$main" ] ; then
                    if [ "$test_hosts" -gt 1 ]; then
                        log "Of the hosts tested we choose the fastest valid for $protocol:"
                        log "        $main"
                        log
                    else
                        log "and is a valid server for $protocol."
                    fi
            else
                    log "No valid servers were found that could be reachable"
                    log "through $PROTO. Netselect found these hosts to be "
                    log "closest to you, but we could not connect to any "
                    log "of them using that protocol."
                    exit 2
            fi
        else
        netselect_generic_error
            exit 2
        fi
elif [ $netselect_rv -eq 6 ]; then
    netselect_permission_error
    exit 2
elif [ $netselect_rv -eq 130 ]; then
    netselect_aborted_error
    exit 2
elif [ $netselect_rv -eq 200 ]; then
    netselect_parse_error
    exit 2
else
    netselect_generic_error
    exit 2
fi

log "Writing $outfile."

if [ -f "$outfile" ]; then
    destfile="$outfile.$(date +%s)"
    log "$outfile exists, moving to $destfile"
    mv $outfile $destfile
fi

sections="main contrib"
if [ "$want_nonfree" -eq 1 ]; then sections="$sections non-free"; fi

(
    echo "# Debian packages for $distro"
    echo "deb $main $distro $sections"
    echo "# Uncomment the deb-src line if you want 'apt-get source'"
    echo "# to work with most packages."
    if [ "$want_sources" -eq 0 ]; then
        echo -n "# "
    fi
    echo "deb-src $main $distro $sections"

    echo
    echo "# Security updates for stable"
    if [ "$want_security" -eq 0 ]; then
        echo -n "# "
    fi
    echo "deb http://security.debian.org/ stable/updates $sections"

) > $outfile

echo "Done."

如果有人仍然遇到任何进一步的问题,请在此发表评论。

相关内容