250821-RHEL9.4上Docker及Docker-Compose的離線安裝

在這里插入圖片描述

離線環境下 在 RHEL (Red Hat Enterprise Linux) 系統上安裝 DockerDocker Compose,需要提前在有網絡的環境中下載相關 RPM 包及依賴,然后在目標機器上進行安裝。以下是比較完整的步驟:

1. Docker及Docker-Compose離線安裝

RHEL 9.4 上要在離線環境安裝 Docker + Docker Compose,可以更有針對性地處理。因為 RHEL9 已經不再支持舊的 Docker CE 官方 YUM 源(主要推薦 Podman),所以我們必須提前在有網環境下載好 RHEL9 對應的 RPM 包。下面是完整流程:

1.1、在有網絡的 RHEL 9.4 機器上準備 RPM 包

  1. 啟用 yum-utils

    sudo dnf install -y yum-utils
    
  2. 添加 Docker 官方倉庫(只在有網環境機器上執行)

    sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
    
  3. 下載需要的 RPM 包及依賴

    mkdir docker-rpms && cd docker-rpms
    sudo dnf download \docker-ce \docker-ce-cli \containerd.io \docker-buildx-plugin \docker-compose-plugin \--resolve
    

    --resolve 參數會把所有依賴包也一并下載。

  4. 打包帶走

    tar czvf docker-rhel9.4.tar.gz docker-rpms/
    

    然后通過 U 盤 / 內網工具傳到離線 RHEL9.4 機器。


1.2 在離線的 RHEL 9.4 機器上安裝

  1. 拷貝并解壓

    tar xzvf docker-rhel9.4.tar.gz
    cd docker-rpms
    
  2. 安裝所有 RPM

    sudo dnf install -y *.rpm
    

    推薦用 dnf install 而不是 rpm -ivh,因為 dnf 能自動處理依賴關系。

  3. 啟動 Docker 并設置開機自啟

    sudo systemctl enable --now docker
    sudo systemctl status docker
    

1.3 安裝 Docker Compose(離線)

在 RHEL9 上推薦使用 plugin 版本docker compose 命令,而不是 docker-compose)。
如果你已經在下載時加了 docker-compose-plugin,那么可以直接使用:

docker compose version

如果你需要舊版的獨立二進制:

  1. 在有網機器下載:
  • https://github.com/docker/compose/releases

    curl -L https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o docker-compose
    chmod +x docker-compose
    
  1. 拷貝到離線機器的 /usr/local/bin/docker-compose

1.4 驗證

docker run hello-world
docker compose version   # plugin 方式
# 或
docker-compose version   # 二進制方式

2. 非管理員用戶配置

在 RHEL(包括 RHEL 9.4)上通過 sudo dnf install 安裝完 Docker CEDocker Compose 之后,默認只有 root 用戶 或者 屬于 docker 用戶組的用戶 才能運行 docker 命令。


2.1 默認情況

  • 你安裝好后:

    • root 用戶可以直接運行 dockerdocker compose

    • 普通用戶(不在 docker 組里)運行時會提示:

      Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
      

      因為 /var/run/docker.sock 只允許 root 和 docker 組訪問。


2.2 讓其他用戶也能用 Docker 的方法

  1. 把用戶加入 docker 組

    sudo usermod -aG docker <用戶名>
    

    例如:

    sudo usermod -aG docker alice
    

    -aG 表示追加到組里,不會覆蓋原有組。

  2. 讓組生效
    用戶需要重新登錄一次(退出再登錄,或者 newgrp docker 臨時生效)。

  3. 驗證
    普通用戶直接運行:

    docker ps
    docker compose version
    

    能正常輸出就說明權限生效了。


2.3 注意事項

  • 安裝時用 sudo 只是確保系統文件、systemd 服務、二進制安裝位置正確。
  • 運行時是否需要 sudo,取決于用戶是否在 docker 組。
  • 如果你想限制哪些人能用 Docker,可以只給特定用戶加到 docker 組。

👉 也就是說:
安裝完之后,其他用戶默認不能直接用,必須先加到 docker 用戶組。


3. 批量用戶添加

下面給你一份在 RHEL 9.4 上可用的 Bash 腳本,幫你把指定用戶或整機的「普通用戶」批量加入 docker 組(從而無需 sudo 就能用 docker / docker compose)。

把下面內容保存為 enable-docker-users.sh,然后 chmod +x enable-docker-users.sh

#!/usr/bin/env bash
# enable-docker-users.sh
# 批量將用戶加入 docker 組(或移除)
# 適用于 RHEL 9.4 及相近發行版set -euo pipefailusage() {cat <<'EOF'
用法:sudo ./enable-docker-users.sh [選項] [用戶名1 用戶名2 ...]
選項:--all            把所有“普通人類用戶”(UID>=1000,shell 非 nologin)加入 docker 組--file FILE      從文件批量讀取用戶名(每行一個)--remove         從 docker 組移除這些用戶(默認是加入)--dry-run        只顯示將執行的操作,不實際變更-h, --help       顯示幫助示例:sudo ./enable-docker-users.sh alice bobsudo ./enable-docker-users.sh --allsudo ./enable-docker-users.sh --file users.txtsudo ./enable-docker-users.sh --all --dry-runsudo ./enable-docker-users.sh --remove alice
EOF
}require_root() {if [[ ${EUID} -ne 0 ]]; thenecho "請用 root 或 sudo 運行。" >&2exit 1fi
}ensure_docker_group() {if ! getent group docker >/dev/null; thenecho "[INFO] 未發現 docker 組,正在創建..."groupadd dockerfi
}list_human_users() {# UID >= 1000,shell 不是 nologin/falsegetent passwd | awk -F: '$3>=1000 && $7!~/nologin|false/ {print $1}'
}DRY_RUN=0
REMOVE=0
USERS=()# 解析參數
while (( "$#" )); docase "$1" in--all)mapfile -t ALL_USERS < <(list_human_users)USERS+=("${ALL_USERS[@]}")shift;;--file)[[ $# -ge 2 ]] || { echo "缺少 --file 參數的文件路徑"; exit 1; }mapfile -t FILE_USERS < <(grep -Ev '^\s*($|#)' "$2" | awk '{print $1}')USERS+=("${FILE_USERS[@]}")shift 2;;--dry-run)DRY_RUN=1shift;;--remove)REMOVE=1shift;;-h|--help)usage; exit 0;;-*)echo "未知選項:$1"; usage; exit 1;;*)USERS+=("$1"); shift;;esac
doneif [[ ${#USERS[@]} -eq 0 ]]; thenecho "未指定用戶。"usageexit 1
firequire_root
ensure_docker_group# 去重
readarray -t USERS < <(printf "%s\n" "${USERS[@]}" | awk 'NF' | sort -u)ACTION="加入"
CMD="usermod -aG docker"
if [[ $REMOVE -eq 1 ]]; thenACTION="移除"CMD="gpasswd -d"
fiecho "[INFO] 計劃${ACTION} docker 組的用戶:${#USERS[@]} 個"
for u in "${USERS[@]}"; doif ! id "$u" &>/dev/null; thenecho "[WARN] 用戶不存在:$u(跳過)"continuefiif [[ $DRY_RUN -eq 1 ]]; thenif [[ $REMOVE -eq 1 ]]; thenecho "DRY-RUN: gpasswd -d $u docker"elseecho "DRY-RUN: usermod -aG docker $u"fielseif [[ $REMOVE -eq 1 ]]; thenif id -nG "$u" | tr ' ' '\n' | grep -qx docker; thengpasswd -d "$u" dockerecho "[OK] 已從 docker 組移除:$u"elseecho "[INFO] 用戶不在 docker 組:$u(跳過)"fielse# 加組(即使已在組內也安全)usermod -aG docker "$u"echo "[OK] 已加入 docker 組:$u"fifi
doneecho
echo "完成。注意事項:"
echo "1) 用戶需要重新登錄會話后生效(或執行:newgrp docker)。"
echo "2) 可用命令驗證:docker ps  和  docker compose version"

3.1 使用步驟(推薦)

  1. 保存并授權執行:
chmod +x enable-docker-users.sh
  1. 將所有普通用戶加入 docker 組:
sudo ./enable-docker-users.sh --all

或只加指定賬號:

sudo ./enable-docker-users.sh alice bob
  1. 讓用戶重新登錄(或各自執行一次 newgrp docker),再用:
docker ps
docker compose version

3.2 小貼士

  • 想先看看會做什么再執行,可用 --dry-run
  • 需要回滾/移除權限:sudo ./enable-docker-users.sh --remove alice
  • 腳本會自動創建 docker 組(若不存在)。

4. 舊環境的清理

下面是一份在 RHEL 9.4 上“一鍵卸載 Docker & Docker Compose”的腳本。支持可選參數來刪除容器/鏡像徹底清空數據目錄


4.1 使用方法

# 1) 保存腳本
cat > uninstall_docker_rhel9.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefailRED='\033[31m'; GREEN='\033[32m'; YELLOW='\033[33m'; NC='\033[0m'confirm() {local prompt="${1:-Are you sure?} [y/N] "if [[ "${ASSUME_YES:-0}" == "1" ]]; thenreturn 0firead -r -p "$prompt" ans[[ "$ans" == "y" || "$ans" == "Y" ]]
}log()   { echo -e "${GREEN}[OK]${NC} $*"; }
warn()  { echo -e "${YELLOW}[WARN]${NC} $*"; }
err()   { echo -e "${RED}[ERR]${NC}  $*" >&2; }usage() {cat <<USAGE
Usage: sudo ./uninstall_docker_rhel9.sh [options]Options:--remove-all    停止前先刪除所有容器、鏡像、卷(危險操作)--purge-data    卸載后刪除數據目錄:/var/lib/docker 與 /var/lib/containerd(危險操作)--yes           對所有確認直接回答 yes(無人值守)-h, --help      顯示幫助說明:
- 默認僅卸載 Docker 相關軟件包與 docker-compose 二進制(若存在),不會刪除數據目錄。
- 如需兼容舊腳本,可保留 --remove-all 與 --purge-data 一起使用進行“全清理”。
USAGE
}REMOVE_ALL=0
PURGE_DATA=0
ASSUME_YES=0for arg in "$@"; docase "$arg" in--remove-all) REMOVE_ALL=1 ;;--purge-data) PURGE_DATA=1 ;;--yes)        ASSUME_YES=1 ;;-h|--help)    usage; exit 0 ;;*) err "未知參數: $arg"; usage; exit 1 ;;esac
doneif [[ $EUID -ne 0 ]]; thenerr "請使用 root 權限運行(加 sudo)。"exit 1
fiecho "=== RHEL 9.4 Docker/Compose 卸載腳本 ==="# 1) 嘗試刪除所有容器/鏡像/卷(可選)
if [[ $REMOVE_ALL -eq 1 ]]; thenwarn "將刪除所有容器、鏡像、未使用的卷,這不可恢復!"if confirm "確認繼續刪除容器/鏡像/卷嗎?"; thenif command -v docker >/dev/null 2>&1; thensystemctl is-active --quiet docker && systemctl stop docker || truedocker ps -aq >/dev/null 2>&1 && \( [[ -z "$(docker ps -aq)" ]] || docker rm -f $(docker ps -aq) ) || truedocker images -q >/dev/null 2>&1 && \( [[ -z "$(docker images -q)" ]] || docker rmi -f $(docker images -q) ) || true# 刪除未使用的卷(安全起見放在最后)if docker volume ls -q >/dev/null 2>&1; thenVOLS=$(docker volume ls -q || true)[[ -z "$VOLS" ]] || docker volume rm -f $VOLS || truefilog "已嘗試刪除所有容器/鏡像/卷。"elsewarn "未檢測到 docker 命令,跳過容器/鏡像/卷刪除。"fielsewarn "已取消刪除容器/鏡像/卷。"fi
fi# 2) 停止并禁用服務
for svc in docker.service docker.socket containerd.service; dosystemctl stop "$svc"  >/dev/null 2>&1 || truesystemctl disable "$svc" >/dev/null 2>&1 || true
done
systemctl daemon-reload || true
log "已停止并禁用 docker 與 containerd 服務(如存在)。"# 3) 卸載通過 dnf 安裝的包
# 常見包名列表(按 Docker 官方倉庫/插件命名)
PKGS=(dockerdocker-cedocker-ce-clidocker-ce-rootless-extrasdocker-buildx-plugindocker-compose-plugindocker-scan-plugincontainerd.io
)TO_REMOVE=()
for p in "${PKGS[@]}"; doif rpm -q "$p" >/dev/null 2>&1; thenTO_REMOVE+=("$p")fi
doneif [[ ${#TO_REMOVE[@]} -gt 0 ]]; thenecho "將卸載軟件包: ${TO_REMOVE[*]}"if confirm "確認卸載以上軟件包嗎?"; thendnf remove -y "${TO_REMOVE[@]}"log "已卸載 dnf 安裝的 Docker 相關包。"elsewarn "已取消 dnf 軟件包卸載。"fi
elsewarn "未發現通過 dnf 安裝的 Docker 相關包。"
fi# 4) 刪除手動安裝的 docker-compose 二進制
if [[ -f /usr/local/bin/docker-compose ]]; thenif confirm "檢測到 /usr/local/bin/docker-compose,是否刪除?"; thenrm -f /usr/local/bin/docker-composelog "已刪除 /usr/local/bin/docker-compose。"elsewarn "保留 /usr/local/bin/docker-compose。"fi
elselog "未發現手動安裝的 docker-compose 二進制。"
fi# 5) 清理配置與運行時殘留(溫和清理)
if [[ -d /etc/docker ]]; thenif confirm "是否刪除 /etc/docker 配置目錄?(如 daemon.json 等)"; thenrm -rf /etc/dockerlog "已刪除 /etc/docker。"elsewarn "保留 /etc/docker。"fi
fi# 6) 徹底清空數據目錄(可選,危險)
if [[ $PURGE_DATA -eq 1 ]]; thenwarn "將永久刪除 /var/lib/docker 與 /var/lib/containerd,所有鏡像/層/卷數據將丟失!"if confirm "確認繼續徹底清空數據目錄嗎?"; thenrm -rf /var/lib/docker /var/lib/containerdlog "已刪除數據目錄 /var/lib/docker 與 /var/lib/containerd。"elsewarn "已取消刪除數據目錄。"fi
fi# 7) 最終檢查
echo "=== 驗證 ==="
if command -v docker >/dev/null 2>&1; thenwarn "docker 命令仍存在:$(command -v docker)"
elselog "docker 命令已不存在。"
fiif docker compose version >/dev/null 2>&1; thenwarn "'docker compose' 子命令仍可用(可能仍有殘留或 PATH 中有其它版本)。"
elselog "'docker compose' 子命令不可用。"
fiif [[ -x /usr/local/bin/docker-compose ]]; thenwarn "舊版 docker-compose 二進制仍存在:/usr/local/bin/docker-compose"
elselog "舊版 docker-compose 二進制不存在。"
fiecho -e "${GREEN}完成。${NC}"
EOF# 2) 賦予執行權限
chmod +x uninstall_docker_rhel9.sh# 3) 試運行(會交互確認)
sudo ./uninstall_docker_rhel9.sh

4.2 無人值守(全部清理)

危險:會刪除容器、鏡像、卷和所有數據目錄!

sudo ./uninstall_docker_rhel9.sh --remove-all --purge-data --yes

4.3 說明

  • 默認行為是卸載軟件包并清理可能的舊版 docker-compose 二進制,不會刪除你的數據目錄。
  • --remove-all 會在卸載前嘗試通過 docker 命令刪除所有容器/鏡像/卷(如果 docker 仍可用)。
  • --purge-data 會直接 rm -rf /var/lib/docker /var/lib/containerd,請務必確認沒有需要保留的數據。
  • 如果系統中從未安裝過某些軟件包或文件,腳本會自動跳過。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94064.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react相關知識

1.類組件和函數組件&#xff08;1&#xff09;類組件import React, { Component } from react;class UserProfile extends Component {constructor(props) {super(props);this.state {userData: null,isLoading: true,};this.timerId null;}componentDidMount() {// 模擬 API…

算法第五十五天:圖論part05(第十一章)

并查集理論基礎并查集主要有兩個功能&#xff1a;將兩個元素添加到一個集合中。判斷兩個元素在不在同一個集合class UnionFind:def __init__(self, n):"""初始化并查集"""self.n nself.father list(range(n)) # 每個節點自己是根self.rank […

雨霧天氣漏檢率驟降80%!陌訊多模態車牌識別方案實戰解析

一、行業痛點&#xff1a;車牌識別的天氣敏感性據《智慧交通系統檢測白皮書》統計&#xff0c;雨霧環境下傳統車牌識別漏檢率高達42.7%&#xff08;2024年數據&#xff09;。主要存在三大技術瓶頸&#xff1a;1.??水膜干擾??&#xff1a;擋風玻璃水漬導致車牌區域紋理模糊2…

PostgreSQL15——查詢詳解

PostgreSQL15查詢詳解一、簡單查詢1.1、單表查詢1.2、無表查詢1.3、消除重復結果1.4、使用注釋二、查詢條件2.1、WHERE子句2.2、模式匹配2.3、空值判斷2.4、復雜條件三、排序顯示3.1、單列排序3.2、多列排序3.3、空值排序四、限定結果數量4.1、Top-N查詢4.2、分頁查詢4.3、注意…

03-容器數據卷

卷就是目錄或文件&#xff0c;存在于一個或多個容器中&#xff0c;由 docker 掛載到容器&#xff0c;但不屬于聯合文件系統&#xff0c;因此能夠繞過 UnionFS&#xff0c;提供一些用于持續存儲或共享數據。 特性&#xff1a;卷設計的目的就是數據的持久化&#xff0c;完全獨立于…

Linux內核進程管理子系統有什么第三十三回 —— 進程主結構詳解(29)

接前一篇文章&#xff1a;Linux內核進程管理子系統有什么第三十二回 —— 進程主結構詳解&#xff08;28&#xff09; 本文內容參考&#xff1a; Linux內核進程管理專題報告_linux rseq-CSDN博客 《趣談Linux操作系統 核心原理篇&#xff1a;第三部分 進程管理》—— 劉超 《…

從代碼學習深度強化學習 - 目標導向的強化學習-HER算法 PyTorch版

文章目錄 1. 前言:當一個任務有多個目標 2. 目標導向的強化學習 (GoRL) 簡介 3. HER算法:化失敗為成功的智慧 4. 代碼實踐:用PyTorch實現HER+DDPG 4.1 自定義環境 (WorldEnv) 4.2 智能體與算法 (DDPG) 4.3 HER的核心:軌跡經驗回放 4.4 主流程與訓練 5. 訓練結果與分析 6. 總…

前端 H5分片上傳 vue實現大文件

用uniapp開發APP上傳視頻文件&#xff0c;大文件可以上傳成功&#xff0c;但是一旦打包為H5的代碼&#xff0c;就會一提示鏈接超時&#xff0c;我的代碼中是實現的上傳到阿里云 如果需要看全文的私信我 官方開發文檔地址 前端&#xff1a;使用分片上傳的方式上傳大文件_對象…

Linux服務器Systemctl命令詳細使用指南

目錄 1. 基本語法 2. 基礎命令速查表 3. 常用示例 3.1 部署新服務后&#xff0c;設置開機自啟并啟動 3.2 檢查系統中所有失敗的服務并嘗試修復 3.3 查看系統中所有開機自啟的服務 4. 總結 以下是 systemctl 使用指南&#xff0c;涵蓋服務管理、單元操作、運行級別控制、…

【JVM內存結構系列】二、線程私有區域詳解:程序計數器、虛擬機棧、本地方法棧——搞懂棧溢出與線程隔離

上一篇文章我們搭建了JVM內存結構的整體框架,知道程序計數器、虛擬機棧、本地方法棧屬于“線程私有區域”——每個線程啟動時會單獨分配內存,線程結束后內存直接釋放,無需GC參與。這三個區域看似“小眾”,卻是理解線程執行邏輯、排查棧溢出異常的關鍵,也是面試中高頻被問的…

紅帽認證升級華為openEuler證書活動!

如果您有紅帽證書&#xff0c;可以升級以下相應的證書&#xff1a;&#x1f447; 有RHCSA證書&#xff0c;可以99元升級openEuler HCIA 有RHCE證書&#xff0c;可以99元升級openEuler HCIP 有RHCA證書&#xff0c;可以2100元升級openEuler HCIE 現金激勵&#xff1a;&#x1f4…

迭代器模式與幾個經典的C++實現

迭代器模式詳解1. 定義與意圖迭代器模式&#xff08;Iterator Pattern&#xff09; 是一種行為設計模式&#xff0c;它提供一種方法順序訪問一個聚合對象中的各個元素&#xff0c;而又不暴露該對象的內部表示。主要意圖&#xff1a;為不同的聚合結構提供統一的遍歷接口。將遍歷…

epoll 陷阱:隧道中的高級負擔

上周提到了 tun/tap 轉發框架的數據通道結構和優化 tun/tap 轉發性能優化&#xff0c;涉及 RingBuffer&#xff0c;packetization 等核心話題。我也給出了一定的數據結構以及處理邏輯&#xff0c;但竟然沒有高尚的 epoll&#xff0c;本文說說它&#xff0c;因為它不適合。 epo…

微前端架構常見框架

1. iframe 這里指的是每個微應用獨立開發部署,通過 iframe 的方式將這些應用嵌入到父應用系統中,幾乎所有微前端的框架最開始都考慮過 iframe,但最后都放棄,或者使用部分功能,原因主要有: url 不同步。瀏覽器刷新 iframe url 狀態丟失、后退前進按鈕無法使用。 UI 不同…

SQL Server更改日志模式:操作指南與最佳實踐!

全文目錄&#xff1a;開篇語**前言****摘要****概述&#xff1a;SQL Server 的日志模式****日志模式的作用****三種日志模式**1. **簡單恢復模式&#xff08;Simple&#xff09;**2. **完整恢復模式&#xff08;Full&#xff09;**3. **大容量日志恢復模式&#xff08;Bulk-Log…

git的工作使用中實際經驗

老輸入煩人的密碼 每次我git pull的時候都要叫我輸入三次煩人的密碼&#xff0c;問了deepseek也沒有嘗試成功 出現 enter passphrase for key ‘~/.ssh/id_rsa’ 的原因: 在生成key的時候,沒有注意,不小心設置了密碼, 導致每次提交的時候都會提示要輸入密碼, 也就是上面的提示…

科技賦能,寧夏農業繪就塞上新“豐”景

在賀蘭山的巍峨身影下&#xff0c;在黃河水的溫柔滋養中&#xff0c;寧夏這片古老而神奇的土地&#xff0c;正借助農業科技的磅礴力量&#xff0c;實現從傳統農耕到智慧農業的華麗轉身&#xff0c;奏響一曲科技與自然和諧共生的壯麗樂章。一、數字農業&#xff1a;開啟智慧種植…

imx6ull-驅動開發篇36——Linux 自帶的 LED 燈驅動實驗

在之前的文章里&#xff0c;我們掌握了無設備樹和有設備樹這兩種 platform 驅動的開發方式。但實際上有現成的&#xff0c;Linux 內核的 LED 燈驅動采用 platform 框架&#xff0c;我們只需要按照要求在設備樹文件中添加相應的 LED 節點即可。本講內容&#xff0c;我們就來學習…

深度學習中主流激活函數的數學原理與PyTorch實現綜述

1. 定義與作用什么是激活函數&#xff1f;激活函數有什么用&#xff1f;答&#xff1a;激活函數&#xff08;Activation Function&#xff09;是一種添加到人工神經網絡中的函數&#xff0c;旨在幫助網絡學習數據中的復雜模式。類似于人類大腦中基于神經元的模型&#xff0c;激…

Linux高效備份:rsync + inotify實時同步

一、rsync 簡介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系統下的數據鏡像備份工具&#xff0c;支持本地復制、遠程同步&#xff08;通過 SSH 或 rsync 協議&#xff09;&#xff0c;是一個快速、安全、高效的增量備份工具。二、rsync 特性 支持鏡像保存整個目錄樹和…