创建Ubuntu安装包服务镜像的脚本
为了创建一个可靠的镜像服务,需要包含所有的文件,以及在正确的时候。 'File not found'-错误会引起很多问题,给使用者带来烦恼。这里提供了一个脚本来同步镜像文件,并且防止出现 404 错误(http的文件找不到的错误码)。
镜像创建与使用流程
创建Ubuntu安装包服务镜像可以加速Ubuntu的安装包安装速度,避免重复下载,节约出口网络带宽。一般包括:
- 镜像安装包原始文件,因为一些设置,直接rsync可能无法使用,可以使用这里的脚本。
- 创建镜像服务。
- 局域网内部使用,可以使用Nginx创建静态网站即可。
- 使用IPFS创建安装包服务,https://discuss.ipfs.io/t/ubuntu-archive-on-top-of-ipfs/1579
- 客户机设置,将apt-get的安装源指向新的服务URL。
- 编辑/etc/apt/sources.list文件,将其中的地址替换为新的地址。
- 定期更新镜像文件,可以通过设定任务来完成。
ubumirror
可以使用 ubumirror project 来保持镜像同步,或者使用下面的脚本。
该项目已经 packaged since Lucid onwards, 请报告建议和问题到 against it.
Archive mirrors
为了存档mirrors, 在 Packages.gz-文件更新前不要删除 packages是非常重要的,该文件保存了packages可用的很多种重要信息。因此,需要 'Two stage sync'。意味着,首先下载新的packages, 然后再下载Packages.gz 。 下载完 Packages.gz后, 再删除 old packages就是安全的。
The script
#/bin/dash fatal() { echo "$1" exit 1 } warn() { echo "$1" } # Find a source mirror near you which supports rsync on # https://launchpad.net/ubuntu/+archivemirrors # rsync://<iso-country-code>.rsync.archive.ubuntu.com/ubuntu should always work #RSYNCSOURCE=rsync://archive.ubuntu.mirror.isp.com/ubuntu # 实验发现rsync不通了,用下面这个: RSYNCSOURCE=archive.ubuntu.com::ubuntu # Define where you want the mirror-data to be on your mirror #BASEDIR=/var/www/ubuntuarchive/ # 改成自己的目录: BASEDIR=/media/smw/Appdata/ipfs-export/mirrors/ubuntu echo "From:" $RSYNCSOURCE echo "To:" $BASEDIR if [ ! -d ${BASEDIR} ]; then warn "${BASEDIR} does not exist yet, trying to create it..." mkdir -p ${BASEDIR} || fatal "Creation of ${BASEDIR} failed." fi rsync --recursive --times --links --safe-links --hard-links \ --stats \ --exclude "Packages*" --exclude "Sources*" \ --exclude "Release*" --exclude "InRelease" \ ${RSYNCSOURCE} ${BASEDIR} || fatal "First stage of sync failed." rsync --recursive --times --links --safe-links --hard-links \ --stats --delete --delete-after \ ${RSYNCSOURCE} ${BASEDIR} || fatal "Second stage of sync failed." date -u > ${BASEDIR}/project/trace/$(hostname -f)
Releases mirrors
对于 Releases mirrors, 事情就没有那么复杂了。因为 files之间没有依赖, 可以直接使用rsync。
The script
#/bin/dash fatal() { echo "$1" exit 1 } warn() { echo "$1" } # Find a source mirror near you which supports rsync on # https://launchpad.net/ubuntu/+cdmirrors # rsync://<iso-country-code>.rsync.releases.ubuntu.com/releases should always work RSYNCSOURCE=rsync://releases.ubuntu.mirror.isp.com/releases # Define where you want the mirror-data to be on your mirror BASEDIR=/var/www/ubuntureleases/ if [ ! -d ${BASEDIR} ]; then warn "${BASEDIR} does not exist yet, trying to create it..." mkdir -p ${BASEDIR} || fatal "Creation of ${BASEDIR} failed." fi rsync --verbose --recursive --times --links --safe-links --hard-links \ --stats --delete-after \ ${RSYNCSOURCE} ${BASEDIR} || fatal "Failed to rsync from ${RSYNCSOURCE}." date -u > ${BASEDIR}/.trace/$(hostname -f)