repository 镜像站用来干什么?

GNU/Linux是一种基于网络协作的 release 套件,在其上部署软件是推荐使用在线包管理工具完成软体部署的。通过搭建repository镜像站,可以解决在离线环境下借助Linux包管理工具部署软件的问题。

搭建repository使用什么工具?

搭建repository站点可以使用的工具有很多,其根本原理就是对目标站点进行复刻以制作成镜像站点。针对特定的Linux软件仓库,推荐使用清华大学开源站基于go语言开发的 tunasync。tunasync的工作原理是使用 rsync 做增量同步。

tunasync 设计架构:

linux 如何load镜像 linux的镜像_运维

Tunasync Release:
https://github.com/tuna/tunasync https://github.com/tuna/tunasync/releases

依赖工具:

rsync
 (如果要通过编译源代码的形式安装tunasync,还需要配置go运行环境)*******************************************************************************************************
Step 1 初始化OS基础环境(以CentOS 7 2207 为例)
 关闭SELinux、Firewalld[ 如果是在有特殊网络安全要求的内网环境中运行即将搭建的Repository则建议合理配置SELinux和Firewalld策略,而不是选择关闭之。]
 Step 2 创建运行tunasync服务的OS账户
 useradd -m -s /bin/bash tunasync
 passwd tunasync
 Step 3 创建Repository数据存储目录[ 此处假定是使用了local-storage作为存储路径,也可以为tunasync配置远程持久化存储路径。]
 mkdir -pv /data/{mirrors,logs,dbs}
 chown -R tunasync:tunasync /data
 Step 4 安装并配置tunasync服务
 tunasync服务安装路径:/usr/bin/
 tunasync服务配置文件路径:/etc/tunasync/
 拟部署方式:worker 和 manager 都在本机部署。
 wget https://github.com/tuna/tunasync/releases/download/v0.8.0/tunasync-linux-amd64-bin.tar.gz  
 tar xzvf tunasync-linux-bin.tar.gz -C /usr/bin/编辑配置文件 /etc/tunasync/manager.conf[ 模板文件参考https://github.com/tuna/tunasync/blob/master/docs/zh_CN/get_started.md。]
 debug = false[server]
 addr = "127.0.0.1"[ manager服务监听地址。]
 port = 12345[ manager服务监听端口。]
 ssl_cert = ""[ SSL加密通信的证书,如果你 worker 和 manager 都是在本机,那么没必要使用 https。此时 ssl_key 和 ssl_cert留空。worker 的 ca_cert 也留空,api_base 以 http:// 开头。如果需要加密的通信,则需要指定 ssl_key 和 ssl_cert。worker 也要指定 ca_cert,并且 api_base 应该是 https:// 开头。]
 ssl_key = ""[ SSL加密通信的密钥,如果你 worker 和 manager 都是在本机,那么没必要使用 https。此时 ssl_key 和 ssl_cert留空。worker 的 ca_cert 也留空,api_base 以 http:// 开头。如果需要加密的通信,则需要指定 ssl_key 和 ssl_cert。worker 也要指定 ca_cert,并且 api_base 应该是 https:// 开头。][files]
 db_type = "bolt"[ 除了 bolt 以外,还支持 badger、leveldb 和 redis 的数据库后端。对于 badger 和 leveldb,只需要修改 db_type。如果使用 redis 作为数据库后端,把 db_type 改为 redis,并把下面的 db_file 设为 redis 服务器的地址: redis://user:password@host:port/db_number。]
 db_file = "/data/dbs/manager.db"[ 此路径为数据库后端路径,可以自定义。]
 ca_cert = ""
编辑配置文件 /etc/tunasync/worker.conf[ 模板文件参考https://github.com/tuna/tunasync/blob/master/docs/zh_CN/workers.conf。]
 [global]
 name = "CentOS"[ 定义进程名,方便识别该进程。]
 log_dir = "/data/logs/tunasync/{{.Name}}"[ 定义同步镜像时产生的日志。]
 mirror_dir = "/data/mirrors/"[ 被同步的数据的存储路径。]
 concurrent = 10[ 同步时的线程数。]
 interval = 120[ 同步周期,单位为分钟。][manager]
 api_base = "http://localhost:12345"[ 定义tunasync-manager地址。]
 token = ""
 ca_cert = ""[cgroup]
 enable = false[ 表示不启用cgroup。]
 base_path = "/sys/fs/cgroup"
 group = "tunasync"[server]
 hostname = "localhost"
 listen_addr = "127.0.0.1"
 listen_port = 6000[ 该 worker 自身的监听端口,如果同一台服务器上有多个 worker,各个 worker 的配置文件中务必配置不同端口。]
 ssl_cert = ""
 ssl_key = ""[[mirrors]]
 name = "elvish"[ 填写被同步对象名,比如被同步的CentOS、docker、Kubernetes、Ubuntu等。此处同步的是elvish。tunasync 会在镜像根目录下建立一个该名称的目录用于存储对应的镜像。]
 provider = "rsync"
 upstream = "rsync://rsync.elv.sh/elvish/"[ 数据同步的源地址。注意,最后需要有“/”,否则启动 tunasync 时会报错。]
 use_ipv6 = false[ 表示不启用IPv6.][[mirrors]]
 name = "centos"
 provider = "rsync"
 upstream = "rsync://mirrors.tuna.tsinghua.edu.cn/centos/"
 use_ipv6 = false[[mirrors]]
 name = "epel"
 provider = "rsync"
 upstream = "rsync://mirrors.tuna.tsinghua.edu.cn/epel/"
 use_ipv6 = false编写tunasync启停脚本 /etc/init.d/tunasync-manager
 #!/bin/sh
 # Provides:          tunasync-manager 
 # Description:       Mirror job management tool.# Author: whsir <wh@whsir.com>
NAME=tunasync
 TUNASYNC_NAME=tunasync-manager
 TUNASYNC_BIN=/usr/bin/$NAME
 OPTIONS="manager --config /etc/tunasync/manager.conf"
 StatBin=/bin/pscase "$1" in
     start)
         if $StatBin -ef | grep -v grep | grep -q "tunasync manager";then
             TUNASYNC_PID=`ps -ef | grep -v grep | grep "tunasync manager" | awk -F" " '{print $2}'`
             echo "$TUNASYNC_NAME (pid $TUNASYNC_PID) already running."
         else
             $TUNASYNC_BIN $OPTIONS > /dev/null &
             echo "Starting $TUNASYNC_NAME... "
         fi
     ;;    status)
         if $StatBin -ef | grep -v grep | grep -q "tunasync manager";then
             TUNASYNC_PID=`ps -ef | grep -v grep | grep "tunasync manager" | awk -F" " '{print $2}'`
             echo "$TUNASYNC_NAME (pid $TUNASYNC_PID) is running."
         else
             echo "$TUNASYNC_NAME is not running."
         fi
     ;;    stop)
         if $StatBin -ef | grep -v grep | grep -q "tunasync manager";then
             TUNASYNC_PID=`ps -ef | grep -v grep | grep "tunasync manager" | awk -F" " '{print $2}'`
             kill $TUNASYNC_PID
             echo "Stop $TUNASYNC_NAME...."
         else
             echo "$TUNASYNC_NAME already stopping."
         fi
     ;;    restart)
         $0 stop
         $0 start
     ;;     *)
         echo "Usage: $0 {start|stop|restart|status}"
         exit 1
     ;;
 esac编写tunasync启停脚本 /etc/init.d/tunasync-worker
 #!/bin/sh
 # Provides:          tunasync-worker
 # Description:       Mirror job management tool.# Author: whsir <wh@whsir.com>
NAME=tunasync
 TUNASYNC_NAME=tunasync-worker
 TUNASYNC_BIN=/usr/bin/$NAME
 OPTIONS="worker --config /etc/tunasync/worker.conf"
 StatBin=/bin/pscase "$1" in
     start)
         if $StatBin -ef | grep -v grep | grep -q "tunasync worker";then
             TUNASYNC_PID=`ps -ef | grep -v grep | grep "tunasync worker" | awk -F" " '{print $2}'`
             echo "$TUNASYNC_NAME (pid $TUNASYNC_PID) already running."
         else
             $TUNASYNC_BIN $OPTIONS > /dev/null &
             echo "Starting $TUNASYNC_NAME... "
         fi
     ;;    status)
         if $StatBin -ef | grep -v grep | grep -q "tunasync worker";then
             TUNASYNC_PID=`ps -ef | grep -v grep | grep "tunasync worker" | awk -F" " '{print $2}'`
             echo "$TUNASYNC_NAME (pid $TUNASYNC_PID) is running."
         else
             echo "$TUNASYNC_NAME is not running."
         fi
     ;;    stop)
         if $StatBin -ef | grep -v grep | grep -q "tunasync worker";then
             TUNASYNC_PID=`ps -ef | grep -v grep | grep "tunasync worker" | awk -F" " '{print $2}'`
             kill $TUNASYNC_PID
             echo "Stop $TUNASYNC_NAME...."
         else
             echo "$TUNASYNC_NAME already stopping."
         fi
     ;;    restart)
         $0 stop
         $0 start
     ;;     *)
         echo "Usage: $0 {start|stop|restart|status}"
         exit 1
     ;;
 esac启动tunasync服务[ 建议使用tunasync用户执行。]
 /etc/init.d/tunasync-manager start
 /etc/init.d/tunasync-worker start查看tunasync同步状态
 tunasynctl list -p 12345 --all同步清华大学提供的centos和epel仓库
rsync -aHvh --no-o --no-g --stats --exclude .~tmp~/ --delete --delete-after --delay-updates --safe-links --timeout=120 --contimeout=120 rsync://mirrors.tuna.tsinghua.edu.cn/epel/ /data/mirrors/epel
rsync -aHvh --no-o --no-g --stats --exclude .~tmp~/ --delete --delete-after --delay-updates --safe-links --timeout=120 --contimeout=120 rsync://mirrors.tuna.tsinghua.edu.cn/centos/ /data/mirrors/centos
**********************************************************************************************************

如果要把此repository镜像提供为内网软件仓库服务,可以通过 ftp 服务或者 web 服务把该仓库路径暴露出来,目标客户机只需要在其软件仓库配置文件中将mirrors地址指向本软件仓库即可。