仅适用于 amd64 Xenial 16.04 的镜像存储库子集,不含 Ubuntu 主机

仅适用于 amd64 Xenial 16.04 的镜像存储库子集,不含 Ubuntu 主机

我正在尝试通过镜像 Ubuntu 软件存储库来使离线计算机(16.04 amd64 笔记本电脑)保持最新状态。不幸的是,我有许多无法控制的限制:

  1. 主机(已连接到互联网)是 CentOS 7。我没有apt-mirrordebmirror或管理员权限。我有wgetrsync并且我已经编译了lftp
  2. 虽然我有rsync,但是却rsyncd.service没有运行。

    $ systemctl list-unit-files | grep rsync
    ...
    rsyncd.service                                disabled
    ...
    

    所以我不确定我是否能按照以下说明使用 rsyncRsyncmirror 文档根据这个答案

  3. 便携式驱动器只有 1TB,剩余空间约为 850GB。我不需要存储库中的任何源代码,只需要二进制文件,但即便如此,我是否还有足够的空间?
  4. 网络速度慢。其实不算什么限制,但很烦人。我可以让这个下载持续一个周末或更长的时间,但我更喜欢支持并行下载的东西。

我尝试过的:

  1. rsync -a --bwlimit=128 rsync://archive.ubuntu.com/ubuntu /media/mirror/ubuntu 这会失败,并出现与所示相同的错误这个答案。没有管理员我就无法启动rsynd.service,所以我认为这是行不通的。
  2. 太天真了wget --recursive http://se.archive.ubuntu.com/ubuntu/。这会拉入太多东西,而且速度很慢。不知道有什么方法可以过滤掉我不需要的文件或进行任何并行下载。
  3. lftp。我认为这是目前最有希望的。例如:

    $ lftp http://mirror.math.princeton.edu/pub/ubuntu/
    cd ok, cwd=/pub/ubuntu
    lftp mirror.math.princeton.edu:/pub/ubuntu> mirror -n -parallel=10
    

    效果很好,但当然也会拉入所有内容。我可以使用--exclude-globs 排除我想要的任何内容(例如--exclude-glob "*trusty*/" --exclude-glob "*artful*/" --exclude-glob "*bionic*/" --exclude-glob "*precise*/" --exclude-glob "*.tar.gz"),但我应该排除什么来缩减大小,同时仍获取内容以构建工作存储库。

我知道,在获得所有软件包后,我将不得不使用dpkg-scanpackages或类似的东西将其真正变成一个可用的存储库。我可以使用 Ubuntu/Debian 工具从离线笔记本电脑上完成此操作,因此我并不担心。我真的只是想获得一些关于如何仅下载与我的机器相关的软件包的建议。

答案1

我意识到采用加法方法而不是减法方法可能更有意义;也就是说,获取我需要的所有文件/包的列表,然后只下载那些(而不是尝试过滤所有我不想要的文件/包)。

软件包清单存储在 中Packages.gz,因此我编写了一个脚本来下载我想要的所有压缩软件包清单,从清单中提取软件包名称,将此列表编写成脚本lftp,然后启动lftp

我认为这至少已经足够了,但我还同步了其他几个文件夹,其中包含一些似乎很重要的元数据。

#!/bin/sh
remote="http://mirror.math.princeton.edu"
dists=( xenial xenial-security xenial-updates)
repos=( main restricted universe multiverse)
package_lists=()

printf "open %s \ncd /pub/ubuntu/\n" "$remote" > sync-mirror.lftp

echo "mirror -n -v -O ubuntu/indices -f indices/md5sums.gz" >> sync-mirror.lftp

for dist in "${dists[@]}"; do
    for repo in "${repos[@]}"; do
        pkg_lists+=("$remote/pub/ubuntu/dists/$dist/$repo")
        echo "mirror -n -v --parallel=10 -O ubuntu/indices -f indices/override.$dist.$repo" >> sync-mirror.lftp
        echo "mirror -n -v --parallel=10 -O ubuntu/dists/$dist/$repo -F dists/$dist/$repo/binary-amd64" >> sync-mirror.lftp
        echo "mirror -n -v --parallel=10 -O ubuntu/dists/$dist/$repo -F dists/$dist/$repo/dep11" >> sync-mirror.lftp
        echo "mirror -n -v --parallel=10 -O ubuntu/dists/$dist/$repo -F dists/$dist/$repo/i18n" >> sync-mirror.lftp
    done
done

for pkg_list in "${pkg_lists[@]}"; do
    curl "$pkg_list/binary-amd64/Packages.gz" | \
        gunzip | \
        grep Filename | \
        sed 's|Filename: \(.*\)|mirror -n -v --parallel=10 -O ubuntu/\1 -f \1 |g' >> sync-mirror.lftp

done

printf "\n exit\n" >> sync-mirror.lftp

 lftp -f sync-mirror.lftp

我想只提供mirror一个文件列表并告诉它并行下载,但我还没有找到这样做的方法。我认为当前方法花费的时间比预期的要长,因为所有单独的调用mirror。此外,我不确定该--parallel标志是否与一起执行任何操作,-f因为它只获取单个文件。

周末运行脚本,回来后进行测试。将用结果更新答案。

相关内容