快速搭建 Linux 软件 repository 的镜像站

本文介绍了如何利用tunasync工具在GNU/Linux上搭建离线环境下的repository镜像站,包括使用rsync进行增量同步,以及如何配置tunasync服务和初始化操作系统环境。还提到如何通过FTP或Web服务将内网仓库提供给目标客户机。
摘要由CSDN通过智能技术生成

repository 镜像站用来干什么?

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

搭建repository使用什么工具?

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

tunasync 设计架构:


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/ps

case "$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/ps

case "$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地址指向本软件仓库即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值