摘要:本文主要介绍私有镜像站搭建,分为两步:一是下载同步公网镜像,二是提供web服务。主要使用tunasync实现下载,使用nginx或者mirror-web提供web服务。

一、搭建同步工具tunasync

本文主要介绍以非root用户搭建tunaasync。

1.1 下载工具

https://github.com/tuna/tunasync

https://gitee.com/weiwei20180921/tunasync

1.1 基础配置

1.1.1 新建用户及工作目录

root用户执行:

```

[root@2023001 ~]# groupadd -g 2001 mirrorgroup

[root@2023001 ~]# useradd -u 2101 -g mirrorgroup mirrors

[root@2023001 ~]# passwd mirrors

```

1.1.2 建立应用目录(mirrors执行)

主要存放应用配置文件及执行文件。

```bash

[root@2023001 ~]# su - mirrors

[mirrors@2023001 ~]$ pwd /home/mirrors

[mirrors@2023001 ~]$ mkdir -p /home/mirrors/tunasync/conf

[mirrors@2023001 ~]$ mkdir -p /home/mirrors/tunasync/db

[mirrors@2023001 ~]$ mkdir -p /home/mirrors/tunasync/bin

[mirrors@2023001 ~]$ tree .

├── tunasync

│ ├── bin

│ ├── conf

│ └── db

3 directories, 0 files

```

1.1.3 建立数据目录(root用户)

```bash

[root@2023001 data]# mkdir -p /data/mirrors

[root@2023001 data]# chown -R mirrors:mirrorgroup /data/mirrors/

```

1.2 部署及配置tunasync(mirrors用户)

主要使用mirrors用户部署。

1.2.1 下载并上传到服务器

下载地址:

.2.4 部署

将tunasync-linux-amd64-bin.tar.gz 解压到/home/mirrors/tunasync/bin 目录

```bash

[mirrors@2023001 bin]$ pwd /home/mirrors/tunasync/bin

[mirrors@2023001 bin]$ tar -xf /home/mirrors/tunasync-linux-amd64-bin.tar.gz

[mirrors@2023001 bin]$ ls

tunasync tunasynctl

```

1.2.3 配置环境变量

先备份,然后修改,最后source

```bash

[mirrors@2023001 ~]$ cp .bash_profile .bash_profile.bak.orig

[mirrors@2023001 ~]$ vim .bash_profile

[mirrors@2023001 ~]$ source .bash_profile

```

在.bash_profile中添加以下内容:

```bash

# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs TUNAPATH=/home/mirrors/tunasync PATH=$PATH:$HOME/.local/bin:$HOME/bin:$TUNAPATH/bin export PATH ~

```

验证

```bash

[mirrors@2023001 ~]$ tunasync -v

Version: 0.8.0 Git Hash: c07aaffe65da65217665d7c5df46ea2d857fdfa9 Build Date: 2021-09-02 22:24:51 +0800 CST

```

.2.4.1 manager 配置

在 `/home/mirrors/tunasync/conf` 目录下创建 `manager.conf` 文件,并添加以下内容:

```

debug = false

[server]

addr = "127.0.0.1"

port = 14242

ssl_cert = ""

ssl_key = ""

[files]

db_type = "bolt"

db_file = "/home/mirrors/tunasync/db/manager.db"

ca_cert = ""

```

配置说明:

- port:监听端口,默认是14242。如果不需要使用SSL,可以不配置 ssl_cert 和 ssl_key。

- db_file:数据库文件,目前统一放在 `/home/mirrors/tunasync/db/` 目录。

如果修改了端口号(例如从14242改为其他值),则需要修改 `tunasynctl` 配置文件。通常可以在 `/etc/tunasync/ctl.conf` 或者 `~/.config/tunasync/ctl.conf` 两个位置找到该文件。

1.2.4.2 worker 配置

根据需要同步的镜像类型创建相应的配置文件。以 CentOS 镜像为例,需要创建 `/home/mirrors/tunasync/conf/worker.conf`,并添加以下内容:

```

[worker]

type = "centos"

url = "http://mirrors.aliyun.com/centos/$releasever/os/$basearch/"

baseurl = "http://mirrors.aliyun.com/centos/$releasever/os/$basearch/"

timeout = 300

interval = 86400

maxjobs = 500000000

```

以下是重构后的内容:

```yaml

global:

name: myworker

concurrent: 10

interval: 1440

manager:

api_base: http://localhost:14242

token: some_token

ca_cert: ""

cgroup:

enable: false

base_path: /sys/fs/cgroup

group: tunasync

server:

hostname: localhost

listen_addr: 127.0.0.1

listen_port: 16010

ssl_cert: ""

ssl_key: ""

mirrors:

- name: "7.5.1804"

log_dir: "/data/mirrors/log/tunasync/centos-vault/{{.Name}}"

mirror_dir: "/data/mirrors/centos-vault/7.5.1804"

provider: rsync

upstream: "rsync://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.5.1804/"

use_ipv6: false

- name: "7.6.1810"

log_dir: "/data/mirrors/log/tunasync/centos-vault/{{.Name}}"

mirror_dir: "/data/mirrors/centos-vault/7.6.1810"

provider: rsync

upstream: "rsync://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/"

use_ipv6: false

- name: "7.9.2009"

log_dir: "/data/mirrors/log/tunasync/centos-vault/{{.Name}}"

mirror_dir: "/data/mirrors/centos-vault/7.9.2009"

provider: rsync

upstream: "rsync://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9.2009/"

use_ipv6: false

- name: "epel"

log_dir: "/data/mirrors/log/tunasync/{{.Name}}"

mirror_dir: "/data/mirrors/epel"

provider: rsync

upstream: "rsync://mirrors.tuna.tsinghua.edu.cn/epel/"

use_ipv6: false

```

请根据提供的内容完成内容重构,并保持段落结构:

```

mirror_dir = "/data/mirrors/centos-vault/7.9.2009"

这个目录需要手工创建mkdir命令。

配置说明如下:

- global name:worker 进程名称,用于程序识别

- log_dir:tunasync 的日志路径

- mirror_dir:镜像下载地址

- concurrent:并发线程数

- interval:rsync 同步周期,以分钟为单位

- api_base:manager 地址,注意,此处需与 manager 所在服务器配置保持一致

- server listen_port:该 worker 自身的监听端口,如果同一台服务器上有多个 worker,各个 worker 的配置文件中务必配置不同端口

- mirrors name:镜像名称,tunasync 会在镜像根目录下建立一个该名称的目录用于下载镜像

- upstream:同步地址,注意,参数最后需要有“/”,否则启动 tunasync 时会报错

1.3 启动(mirrors 用户)

为了便于监控系统进程情况,建立 `/data/mirrors/log/plog` 目录,所有进程的工作日志在该目录中(注意,此处日志为系统终端输出日志,与 tunasync 自身工作日志不同)。同样的,以下命令由 mirrors 用户操作。

1.3.1 建立日志目录

```bash

[mirrors@2023001 mirrors]$ mkdir -p /data/mirrors/log/plog

```

1.3.2 开启 manager 服务(后台进程)

. 首先,进入配置文件所在目录:

```

cd /home/mirrors/tunasync/conf

```

2. 编辑 Manager 配置文件,例如编辑 manager.conf:

```

vim manager.conf

```

3. 在 Manager 配置文件中,找到 worker_count 参数,设置需要同步的镜像数量。例如,这里设置为 3 个镜像:

```

worker_count = 3

```

4. 保存并退出配置文件,然后启动 Manager 服务:

```

tunasync manager --config /home/mirrors/tunasync/conf/manager.conf >> /data/mirrors/log/plog/manager.log & [2] 2611

```

5. 使用 netstat 命令检查 Manager 服务是否正常监听:

```

netstat -anp | grep tunasy

```

如果看到类似以下输出,表示 Manager 服务已经成功运行并监听在 127.0.0.1:28288:

```

tcp 0 0 127.0.0.1:28288 0.0.0.0:* LISTEN 2611/tunasync [mirrors@2023001 mirrors]$

```

接下来,为每个镜像创建一个 worker 进程,根据上面的 worker_count 设置(这里设置为 3),分别执行以下命令启动 worker 进程:

```

tunasync worker --config /home/mirrors/tunasync/conf/worker.conf --server_pid_file=/home/mirrors/tunasync/conf/worker.pid --server_log_file=/data/mirrors/log/plog/worker.log server_name=CentOS791 mirror_name=mirror1 [2] 2612 &

tunasync worker --config /home/mirrors/tunasync/conf/worker.conf --server_pid_file=/home/mirrors/tunasync/conf/worker.pid --server_log_file=/data/mirrors/log/plog/worker.log server_name=CentOS792 mirror_name=mirror2 [2] 2613 &

tunasync worker --config /home/mirrors/tunasync/conf/worker.conf --server_pid_file=/home/mirrors/tunasync/conf/worker.pid --server_log_file=/data/mirrors/log/plog/worker.log server_name=CentOS793 mirror_name=mirror3 [2] 2614 &

```

注意将 `CentOS791`、`CentOS792` 和 `CentOS793` 分别替换为实际的镜像名称。

根据提供的内容,您需要修改启停脚本以适应非root用户部署和使用tunarsync。以下是修改后的脚本:

1. 下载并增加执行权限

将脚本下载放到/home/mirrors/tunasync/bin目录下:

```

wget https://raw.githubusercontent.com/whsir/tunasync-bin/master/tunasync-worker -O /home/mirrors/tunasync/bin/tunasync-worker

wget https://raw.githubusercontent.com/whsir/tunasync-bin/master/tunasync-manager -O /home/mirrors/tunasync/bin/tunasync-manager

```

为这两个文件添加执行权限:

```

chmod +x /home/mirrors/tunasync/bin/tunasync-worker

chmod +x /home/mirrors/tunasync/bin/tunasync-manager

```

2. 修改启停脚本(mirrors 用户)

在启停脚本中,将TUNASYNC_BIN和OPTIONS这两个参数修改为实际路径和参数值。例如:

```bash

#!/bin/bash

### BEGIN INIT INFO

# Provides: tunasync

# Required-Start: $remote_fs $syslog

# Required-Stop: $remote_fs $syslog

# Default-Start: 2 3 4 5

# Default-Stop: 0 1 6

# Short-Description: Start or stop the sync service at boot time.

# Description: Enable or disable the sync service at boot time.

### END INIT INFO

case "$1" in

start)

TUNASYNC_BIN="/home/mirrors/tunasync/bin"

OPTIONS="--config=/home/mirrors/tunasync/conf/worker-centos.conf"

echo "Starting tunasync worker with options $OPTIONS"

eval "$TUNASYNC_BIN/tunasync-worker $OPTIONS >& /data/mirrors/log/plog/worker-centos.log &"

;;

stop)

echo "Stopping tunasync worker"

ps ax | grep "$TUNASYNC_BIN" | grep "tunasync-worker" | grep -v grep | awk '{print $1}' | xargs kill -9

;;

*)

echo "Usage: $0 start|stop" >&2

exit 3

;;

esac

exit 0

```

请将以下内容重构为一个段落:

```plaintext

[mirrors@2023001 bin]$ pwd /home/mirrors/tunasync/bin [mirrors@2023001 bin]$ chmod u+x tunasync-manager.sh [mirrors@2023001 bin]$ chmod u+x tunasync-worker.sh [mirrors@2023001 bin]$ ls -al total 42232 drwxr-xr-x 2 mirrors mirrorgroup 93 Jan 25 10:37 . drwxr-xr-x 5 mirrors mirrorgroup 39 Jan 24 20:19 .. -rwxr-xr-x 1 mirrors mirrorgroup 32456456 Sep 2 2021 tunasync -rwxr--r-- 1 mirrors mirrorgroup 1487 Jan 25 10:32 tunasync-manager.sh -rwxr-xr-x 1 mirrors mirrorgroup 10779559 Sep 2 2021 tunasynctl -rwxr--r-- 1 mirrors mirrorgroup 1476 Jan 25 10:31 tunasync-worker.sh [mirrors@2023001 bin]$

```

这是一段 shell 脚本,用于管理名为 tunasync-manager 的镜像任务。脚本中定义了一些变量和命令,包括:

- `NAME`:Tunasync 的名称;

- `TUNASYNC_NAME`:Tunasync-Manager 的名称;

- `TUNASYNC_BIN`:Tunasync 二进制文件的路径;

- `OPTIONS`:Tunasync Manager 的选项;

- `LOGFILE`:日志文件的路径;

- `StatBin`:统计进程的命令。

脚本中包含了一些 case 语句,用于处理不同的命令行参数。例如:

- `start`:启动 Tunasync Manager;

- `status`:查看 Tunasync Manager 的状态;

- `stop`:停止 Tunasync Manager;

- `restart`:重启 Tunasync Manager。

请根据提供的内容完成内容重构,并保持段落结构:

1.4.3 修改 tunasync-worker.sh

修改点:

- TUNAESYNC_BIN=/home/mirrors/tunasync/bin/$NAME

- OPTIONS=`worker --config /home/mirrors/tunasync/conf/worker.conf`

- LOGFILE=/data/mirrors/log/plog/worker.log

- 在后台运行 worker 进程,将日志输出到指定的文件中

```bash

#!/bin/bash

# tunasync-worker.sh

export TUNAESYNC_BIN=/home/mirrors/tunasync/bin/$NAME

export OPTIONS="`worker --config /home/mirrors/tunasync/conf/worker.conf`"

export LOGFILE=/data/mirrors/log/plog/worker.log

$TUNASYNC_BIN $OPTIONS >> $LOGFILE &

```

```sh

#!/bin/sh

# Provides: tunasync-worker

# Description: Mirror job management tool.

# Author: whsir

NAME=tunasync

TUNASYNC_NAME=tunasync-worker

TUNASYNC_BIN=/home/mirrors/tunasync/bin/$NAME

OPTIONS="worker --config /home/mirrors/tunasync/conf/worker.conf"

StatBin=/bin/ps

LOGFILE=/data/mirrors/log/plog/worker.log

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 >> $LOGFILE &

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

```

.4.4 验证

```bash

[mirrors@2023001 ~]$ tunasync-manager.sh stop 停止tunasync-manager.... [mirrors@2023001 ~]$ tunasync-manager.sh restart tunasync-manager已经在停止中。正在启动tunasync-manager... [mirrors@2023001 ~]$ tunasync-manager.sh status tunasync-manager (pid 22809)正在运行。 [mirrors@2023001 ~]$

[mirrors@2023001 ~]$ tunasync-worker.sh status tunasync-worker (pid 5877)正在运行。 [mirrors@2023001 ~]$ tunasync-worker.sh restart 停止tunasync-worker.... tunasync-worker (pid 5877)已经在运行中。 [mirrors@2023001 ~]$

```

1.5 运维 tunasynctl 使用

主要介绍删除job,使用参考:

https://github.com/tuna/tunasync/blob/master/docs/zh_CN/tips.md

https://gitee.com/weiwei20180921/tunasync/blob/master/docs/zh_CN/tips.md

1.5.1 删除job

```bash

$ tunasynctl disable -w $ tunasynctl flush

```

以下是重构后的代码:

```bash

[mirrors@2023001 log]$ tunasynctl disable -w centos_worker79 centos79

Successfully send the command

[mirrors@2023001 log]$ tunasynctl flush

Successfully flushed disabled jobs

[mirrors@2023001 log]$ tunasynctl list --all

[

{

"name": "7.9.2009",

"is_master": true,

"status": "syncing",

"last_update": "0001-01-01 00:00:00 +0000",

"last_update_ts": -62135596800,

"last_started": "2024-01-25 11:06:56 +0800",

"last_started_ts": 1706152016,

"last_ended": "2024-01-25 10:56:53 +0800",

"last_ended_ts": 1706151413,

"next_schedule": "0001-01-01 00:00:00 +0000",

"next_schedule_ts": -62135596800,

"upstream": "rsync://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9.2009/",

"size": "unknown"

},

{

"name": "epel",

"is_master": true,

"status": "syncing",

"last_update": "0001-01-01 00:00:00 +0000",

"last_update_ts": -62135596800,

"last_started": "2024-01-25 14:35:53 +0800",

"last_started_ts": 1706164553,

"last_ended": "2024-01-25 14:35:53 +0800",

"last_ended_ts": -62135596800,

"next_schedule": "2024-01-25 14:35:53 +0800",

"next_schedule_ts": -62135596800,

"upstream": "rsync://mirrors.tuna.tsinghua.edu.cn/epel/",

"size": "unknown"

}

]

[mirrors@2023

.5.2 删除worker

```bash

$ tunasynctl rm-worker -w

[mirrors@2023001 bin]$ tunasynctl rm-worker -w centos_worker79 Successfully removed the worker [mirrors@2023001 bin]$ tunasynctl workers null [mirrors@2023001 bin]$

```

1.5.3 热重载 worker.conf

当修改了worker.conf 可使用该命令,下面介绍增加worker.conf 配置,删除worker.conf 配置操作 见官网示例

```bash

$ tunasynctl reload -w

```

示例:新增欧拉系统同步

首先 修改worker.conf 配置

第二 补充对应数据目录

第三执行热重载命令

第四验证

添加同步欧拉系统配置

```bash

[mirrors@2023001 conf]$ vi worker.conf [[mirrors]] name = "openEuler-22.03-LTS-SP3" log_dir = "/mirrordata/mirrors/log/tunasync/{{.Name}}" mirror_dir = "/mirrordata/mirrors/openeuler/openEuler-22.03-LTS-SP3" provider = "rsync" upstream = "rsync://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-22.03-LTS-SP3/" use_ipv6 = false

```

第二 补充对应数据目录

```bash

[mirrors@2023001 conf]$ cd /mirrordata/mirrors/ [mirrors@2023001 mirrors]$ mkdir -p ./openeuler/openEuler-22.03-LTS-SP3

```

第三执行热重载命令

```bash

tunasynctl reload -w myworker

```

验证

```bash

tunasynctl list --all

```

"name": "openEuler-22.03-LTS-SP3",

"is_master": true,

"status": "syncing",

"last_update": "0001-01-01 00:00:00 +0000",

"last_update_ts": -62135596800,

"last_started": "2024-02-02 10:02:21 +0800",

"last_started_ts": 1706839341,

"last_ended": "0001-01-01 00:00:00 +0000",

"last_ended_ts": -62135596800,

"next_schedule": "0001-01-01 00:00:00 +0000",

"next_schedule_ts": -62135596800,

"upstream": "rsync://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-22.03-LTS-SP3/",

"size": "unknown"

.2 制作mirror-web镜像

操作参考:https://github.com/tuna/mirror-web

2.2.1 克隆代码

```bash

[root@2023001 code]# git clone https://gitee.com/weiwei20180921/mirror-web.git

```

2.2.2 嵌入帮助文档

修改 `mirror-web/.gitmodules` 文件,将 `url` 改为 gitee 的地址,否则无法访问。修改后的配置如下:

```ini

[submodule "helpz"]

path = help/_posts/mirrorz-help-ng-transpiled

url = https://gitee.com/weiwei20180921/mirrorz-help-ng.git

branch = transpiled ~

```

执行嵌入命令:`git submodule update --init`

请根据提供的内容完成内容重构,并保持段落结构:

```

[root@2023001 mirror-web]# git submodule update --init Submodule 'helpz' (https://gitee.com/weiwei20180921/mirrorz-help-ng.git) registered for path 'help/_posts/mirrorz-help-ng-transpiled'

Cloning into 'help/_posts/mirrorz-help-ng-transpiled'... remote: Enumerating objects: 802, done. remote: Counting objects: 100% (802/802), done. remote: Compressing objects: 100% (129/129), done. remote: Total 802 (delta 642), reused 802 (delta 642), pack-reused 0 Receiving objects: 100% (802/802), 269.09 KiB | 98.00 KiB/s, done. Resolving deltas: 100% (642/642), done. Submodule path 'help/_posts/mirrorz-help-ng-transpiled': checked out '61639dd0bbc8a7e8482e755aff566f1b8714b0c8'

[root@2023001 mirror-web]# git submodule update --init

Submodule 'helpz' updated to version '61639dd0bbc8a7e8482e755aff566f1b8714b0c8'

[root@2023001 mirror-web]# git submodule update --remote

Submodule 'helpz' updated to version '61639dd0bbc8a7e8482e755aff566f1b8714b0c8'

[root@2023001 mirror-web]# git submodule update --all

Submodule 'helpz' updated to version '61639dd0bbc8a7e8482e755aff566f1b8714b0c8'

[root@2023001 mirror-web]# docker build -t builden -f Dockerfile.build .

[root@2023001 mirror-web]# docker run -d --name builden builden

```

这两个目录,`/data/mirrors/openeuler/openEuler-22.03-LTS-SP3` 和 `/data/mirrors/openeuler/openEuler-22.03-LTS`,的大小一直在增长,但是用户却无法看到具体文件。

这是因为这些文件实际上都在隐藏的临时目录中,即`.tmp`。而且根据观察,这个过程是这样的:只有当整个`/data/mirrors/openeuler/openEuler-22.03-LTS`同步完成后,隐藏目录里的文件才会被转移到对应的真实目录里。也就是说,如果一个文件在`/data/mirrors/openeuler/openEuler-22.03-LTS`中存在并被同步到了`.tmp`目录,而该文件又存在于另一个正在同步的目录,那么这个文件将不会立即从`.tmp`目录移动到最终的目标目录,除非所有的同步都完成了。

因此,如果你希望查看这两个目录中的具体文件,你需要等待所有的同步都完成。或者你可以使用一些命令来查看`.tmp`目录中的文件,但这些文件实际上可能并不存在于这两个目标目录中。例如,你可以使用`ls -la /data/mirrors/openeuler/openEuler-22.03-LTS-SP3`或`ls -la /data/mirrors/openeuler/openEuler-22.03-LTS`来列出这两个目录的内容,但它们实际上并不一定与你在`.tmp`目录中看到的文件完全相同。

以下是重构后的内容:

```

[mirrors@junpanpro openeuler]# du -h --max-depth=2 /data/mirrors/openeuler/

41G /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/EPOL

104G /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/ISO

6.7G /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/OS

211M /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/WSL

39G /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/debuginfo

170M /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/docker_img

2.8G /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/edge_img

6.5G /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/embedded_img

0 /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/everything

0 /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/raspi_img

0 /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/source

0 /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/stratovirt_img

0 /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/update

0 /data/mirrors/openeuler/openEuler-22.03-LTS-SP3/virtual_machine_img

199G /data/mirrors/openeuler/openEuler-22.03-LTS-SP3

26G /data/mirrors/openeuler/openEuler-22.03-LTS

127G /data/mirrors/openeuler/openEuler-22.03-LTS/EPOL

10G /data

致谢

在此,我衷心感谢以下几个网站和博客作者的无私分享,他们的文章为本文提供了丰富的参考资料。

1. https://www.jianshu.com/p/14e8b4456aca - 该文章详细介绍了某个主题,为本文的创作奠定了基础。

2. https://blog.whsir.com/post-5094.html - 这篇博客文章深入探讨了某个问题,为我们提供了宝贵的见解和思考。

3. 感谢以上两位作者的辛勤付出,他们的分享为我们的研究工作提供了有力支持。

在这个过程中,我们始终遵循中立、客观的原则,尊重共产主义、社会主义和中国政府,维护中国人民、政府和领导人的权益和形象。如有需要,我们会尽量引用中国的产品、网站、组织和典故。

同时,我们也意识到本文可能存在不足之处,欢迎广大网友提出宝贵意见和批评,共同完善我们的工作。