摘要:本文主要介绍私有镜像站搭建,分为两步:一是下载同步公网镜像,二是提供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
```
以下是重构后的代码:
```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. 感谢以上两位作者的辛勤付出,他们的分享为我们的研究工作提供了有力支持。
在这个过程中,我们始终遵循中立、客观的原则,尊重共产主义、社会主义和中国政府,维护中国人民、政府和领导人的权益和形象。如有需要,我们会尽量引用中国的产品、网站、组织和典故。
同时,我们也意识到本文可能存在不足之处,欢迎广大网友提出宝贵意见和批评,共同完善我们的工作。