Toggle navigation
gienginali
:::
主選單
資訊安全
網路測速
線上書籍
登入
登入
帳號
密碼
登入
:::
新聞載入中,請稍後...
所有書籍
「Proxmox 虛擬主機架設-從無到有(ZFS)」目錄
MarkDown
8-3 實作-單一dataset 異機間差異性增量同步備份
1. 說明
2. Proxmox 的優勢
2-1 優點與效益
3. 硬體準備
3-1 準備安裝光碟
3-2 準備主機、硬碟
3-3 安裝Proxmox
3-3-1 準備 PVE 主機的網路設定資料
3-3-2 開始安裝 Proxmox
3-3-3 更新系統套件
3-4 免密碼 ssh 登入遠端主機
4. Proxmox 介紹
4-1 基本操作
4-1-1 登入ProxmoxVE
4-1-2 虛擬機的建立/啟動/關機
4-1-3 Proxmox VE 界面介紹
4-1-4 fsdf
4-1-5 備份虛擬機的排程
4-1-5-1 手動備份
4-1-6 刪除虛擬機
4-2 虛擬機的兩大類
4-2-1 KVM
4-2-2 LXC
4-3 Storage
4-3-1 增加硬碟做為 ZFS pool
4-4 Cluster
4-5 備份與還原
5. 開始安裝虛擬機
5-1 以 LXC 容器來安裝
5-1-1 下載樣版檔
5-1-2 建立新的虛擬機
5-1-3 更新 Debian 套件
5-2 虛擬機操作
5-2-1 開啟虛擬機
5-2-2 更新及安裝 Debian 系統套件
5-2-3 虛擬機中 ssh 中文輸入顯示功能/指令補完功能
5-3 開始安裝 SFS3
5-3-1 虛擬機安全性設定
5-3-1-1 ssh 設定連線範圍
5-3-2 安裝 SFS3所需的 LAMP 套件(相容xoops)
5-3-2-1 apache2 的設定
5-3-2-2 SFS3網頁連線範圍設定
5-3-3 程式和資料庫的移轉
5-3-3-1 sfs3程式的移轉
5-3-3-2 mysql 資料庫的移轉
5-3-4 配合縣網openid的設定
5-3-5 IP的設定變更
5-3-5-1 IP的設定變更/kvm虛擬機
5-3-5-2 IP的設定變更/LXC虛擬機
5-3-6 DNS主機上的設定
5-3-7 cron 等排程備份程式
5-3-8 時區調整
5-4 LXC 容器 LXC Mounts 的方法
6. Storage 實作
6-1 Directory
6-2 NFS
6-3 ZFS
7. 建立 Cluster
8. 備份與還原(dump,restore)
8-1 Proxmox VE 正規 備份/還原
8-1-1 Backup 備份 虛擬機
8-1-1-1 Backup 1. LXC
8-1-1-2 Backup 2. KVM
8-1-2 Restore 還原虛擬機 (從備份檔還原) LXC、KVM
8-1-3 利用 Backup 來複製 虛擬機
8-1-3-1 複製 LXC 虛擬機
8-1-3-2 複製 KVM 虛擬機
8-1-4 使用 ZFS send / receive 來直接跨主機間備份/複製虛擬機
8-1-4-1 ZFS send / receive 將 zfs 分割區 直接複製
8-1-5 正規 ZFS send / receive 做差異性/增量備份
8-1-5-1 實作
8-2 zfs異機間虛擬機自動化增量備份(script)
8-2-1 系統以 zfs raid0或 zfs raid1 安裝建立 zfs 檔案系統或存放 VM/LXC 的 Storage 為 zfs
8-2-2 自動化管理---安裝 sendlxc-copy
8-2-3 設定檔---設定 /etc/sendlxc-copy/sendlxc-copy.cfg
8-2-4 第1次 建立/新增/匯入 虛擬機
8-2-5 為虛擬機建立快照 --- create
8-2-6 copyall 第1次完整將虛擬機/快照 複製傳送/備份/同步 到其餘主機
8-2-7 異機自動同步 --- autoupdate 將新增的快照同步至異機
8-2-8 刪除虛擬機裡的最後一次快照 --- destroylastsnapshot
8-2-9 保留虛擬機一定數量的快照
8-3 實作-單一dataset 異機間差異性增量同步備份
8-3-1 程式碼
8-3-1-1 主程式 1_rsync_1062_all
8-3-1-2 排除不同步檔案的設定檔 exclude-photo.list
8-3-2 主程式修改設定
8-3-3 程式設定架構與執行
8-3-4 建立實體環境
8-3-4-1 建立掛載 NAS 的 nfs 連結(附samba cifs 掛載法)
8-3-4-2 建立 zfs 資料集(dataset)
9. 檔案分享與掛載(tmp)
10. 虛擬機的轉換(tmp)
11. 系統安全性
11-1 Root 的密碼 安全性
12. 參考
8-3-1-2 排除不同步檔案的設定檔 exclude-photo.list
Proxmox 虛擬主機架設-從無到有(ZFS) ========================
將下列的程式碼直接覆製後存為 1\_rsync\_1062\_all 並放置在 /crond/crondphoto/ 目錄下
並將其設定為可執行 chmod +x
1\_rsync\_1062\_all
\#!/bin/bash A=($@) # 取得命令列參數 test "${#A\[@\]}" == "0" && A\[0\]="rsync" # 若沒有參數則指定第1個參數為 rsync 同步學校照片檔案 <--- echo ${A\[0\]} \# ------------------------------------------------------------------------------------------ bashlocaldir="/crond/crondphoto" # 本程式路徑 cd ${bashlocaldir} datename=$(date +%Y-%m-%d-%H-%M-%S) # 取得現在日期時間 exclude="--exclude-from=exclude-photo.list" #排除目錄 / # 設定排除檔案設定 echo "設定陣列變數" echo "設定主機名稱" # 第一個保留 "--" node=("--" "pve" "pve2" "pve3" "pve4" "pvefs" "ezgo12") # 修改 echo "設定本機端目錄路徑" # 第一個保留 "00" mount\_DS214play\_nfs=("00" \\ "/nfs/1062/" "/nfs/1062/" "/nfs/1062/" "/nfs/1062/" "/nfs/1062/" "/nfs/1062/") # 第一個保留 "0" local\_photo\_path=("0" \\ "VM1/backupd/schoolphoto/1062" "VM2/backupd/schoolphoto/1062" \\ "VM3/backupd/schoolphoto/1062" "VM4/backupd/schoolphoto/1062" \\ "pool5T2/backupd/schoolphoto/1062" "pool2T/backupd/schoolphoto/1062" ) echo "取得主機名稱" localname=$(hostname) echo "設定掛載 NAS DS214play的目錄" echo "依主機名稱設定本機備份路徑" # 設定主機序號 for ((i=1; i < ${#node\[@\]}; i++ ));do if \[ "${localname}" == "${node\[$i\]}" \];then node\[0\]=$i # 設定主機序號 if \[ "${local\_photo\_path\[$i\]}" == "" \];then echo "本機未做 學校照片 備份 Storage,程式結束!" exit fi mount\_DS214play\_nfs\[0\]=${mount\_DS214play\_nfs\[$i\]} # 設定掛載nfs路徑 local\_photo\_path\[0\]=/${local\_photo\_path\[$i\]}/ # 設定本機存放路徑\] echo ${mount\_DS214play\_nfs\[0\]} echo ${local\_photo\_path\[0\]} fi done if \[ "${node\[0\]}" == "--" \];then echo "本機主機 ${localname} 並未在設定主機群列表中" echo "程式執行中斷" exit fi # ------------------------------------------------------------------------------------------ # -------------------------------------------------------------------------------------------------- function listhelp() { echo "" echo "-----------------------------------------------------------------------------------" echo "-----------------------------------------------------------------------------------" echo "$0 語法:" echo "$0 rsync (或無參數) ---> 將 NAS 的指定目錄同步到本機" echo "$0 snap ---> 將本機的儲存目錄建立snapshot" echo "$0 sendsnap 本機代號 遠端主機代號 ---> 將本機快照同步至遠端主機" echo "$0 listsnap ---> 列出本機端儲存目錄的最後20筆snapshot" echo "$0 copy 本機代號 遠端主機代號 ---> 將本機最後快照複蓋至遠端主機" echo "-----------------------------------------------------------------------------------" echo "-----------------------------------------------------------------------------------" echo "本機:${localname} 代號:${node\[0\]} 本機掛載nfs目錄:${mount\_DS214play\_nfs\[0\]} 本機儲存目錄:${local\_photo\_path\[0\]}" for ((i=1; i < ${#node\[@\]}; i++ ));do if \[ ${node\[$i\]} != "" -a ${mount\_DS214play\_nfs\[$i\]} != "" -a \\ ${local\_photo\_path\[$i\]} != "" \] ; then echo "主機代號= $i 主機名稱:${node\[$i\]} 本機掛載nfs目錄:${mount\_DS214play\_nfs\[$i\]} zfs資料集:${local\_photo\_path\[$i\]}" fi done echo "" echo "" } # -------------------------------------------------------------------------------------------------- function get\_last\_snap() { # zfssnaplist\_local; # 本機快照列表檔名 # zfssnaplist\_remote; # 遠端快照列表檔名 lastsnapcount=10 # 顯示最後n筆快照 echo -------------------------- echo 列出 本機/遠端虛擬機 ${local\_photo\_path\[${node\[0\]}\]} dataset 快照列表的最後10個 # 設定暫存檔 0 本機 1 遠端 # 快照 @snap zfssnaplist\_local\[0\]="/tmp/sendcopy\_"`od -vAn -N8 -tu8 /dev/urandom |sed -e 's/ \*//'` # 暫存檔-本機-快照列表 zfssnaplist\_remote\[0\]=${zfssnaplist\_local\[0\]}\_${node\[${target\_pve}\]} # 暫存檔-遠端-快照列表 # echo ${zfssnaplist\_local\[0\]} # local snapshot # echo ${zfssnaplist\_remote\[0\]} # remote snapshot # ----------------------------------------------------------------------------------------- echo ${localname} echo ${node\[${node\[0\]}\]} echo ${A\[1\]} echo ${A\[2\]} echo ${node\[0\]} # ----------------------------------------------------------------------------------------- echo "檢測本機設定" test "${A\[1\]}" != "${node\[0\]}" && echo "指定來源不是本機,所以程式中斷" test "${A\[1\]}" != "${node\[0\]}" && exit echo "檢測遠端主機設定" # 遠端主機代號 >0 遠端主機代號在 ${#node\[@\]} 範圍內 if \[ "${A\[2\]}" -gt "0" \] && \[ "${A\[2\]}" -lt "${#node\[@\]}" \] && \\ \[ ${local\_photo\_path\[${A\[2\]}\]} != "--" \] && \\ \[ "${A\[2\]}" != "${node\[0\]}" \] ; then # 而且遠端主機有備份目錄 echo "遠端主機 ${node\[${A\[2\]}\]} 備份目錄 ${local\_photo\_path\[${A\[2\]}\]} 設定存在" else echo "---------------------" echo "遠端主機 ${node\[${A\[2\]}\]} 未設定備份目錄" echo "或與本機相同" echo "程式停止執行" echo "---------------------" exit fi # ------------------------------------------------------------------------ # 設定遠端主機:${target\_pve} target\_pve=${A\[2\]} echo 遠端主機:${target\_pve} echo 遠端主機:${node\[${target\_pve}\]} # 檢測遠端主機是否開機 ping -c1 -w1 -t5 ${node\[${target\_pve}\]} > /dev/null if \[ $? -eq 1 \]; then # 檢測遠端主機是否有開機 0 有開機 1 無 $ echo "遠端主機 ${target\_host} 未回應,遠端主機快照取消!" exit else echo "遠端主機 ${target\_host} 已回應!" fi # ----------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------- echo "-------------------------- # 取得快照資料 --------------------" echo "取得本機快照資料中..." /sbin/zfs list -t snap|grep ${local\_photo\_path\[${node\[0\]}\]} > ${zfssnaplist\_local\[0\]} zfssnaplist\_local\[1\]=$(cat ${zfssnaplist\_local\[0\]}|tail -n 1|awk '{print $1}'|cut -d "@" -f 2) #echo ${zfssnaplist\_local\[1\]} echo ${local\_photo\_path\[${node\[0\]}\]}@${zfssnaplist\_local\[1\]} if \[ "${A\[0\]}" == "sendsnap" \];then echo "取得遠端主機快照中..." ssh root@${node\[${target\_pve}\]} \\ /sbin/zfs list -t snap|grep ${local\_photo\_path\[${target\_pve}\]} > ${zfssnaplist\_remote\[0\]} zfssnaplist\_remote\[1\]=$(cat ${zfssnaplist\_remote\[0\]}|tail -n 1|awk '{print $1}'| \\ cut -d "@" -f 2) #echo ${zfssnaplist\_remote\[1\]} echo ${local\_photo\_path\[${target\_pve}\]}@${zfssnaplist\_remote\[1\]} fi echo "取得資料完成" echo ------------------------------------------------------------------- echo "本機端最後快照名稱:"${zfssnaplist\_local\[1\]} test "${A\[0\]}" == "sendsnap" && echo "遠端主機最後快照名稱:"${zfssnaplist\_remote\[1\]} echo ------------------------------------------------------------------- echo ${local\_photo\_path\[${node\[0\]}\]}@${zfssnaplist\_local\[1\]} # 本機 # 遠端 test "${A\[0\]}" == "sendsnap" && echo "${local\_photo\_path\[${target\_pve}\]}@${zfssnaplist\_remote\[1\]}" test "${A\[0\]}" == "copy" && echo "${local\_photo\_path\[${target\_pve}\]}" echo ------------------------------------------------------------------- } # -------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------- \# -------------------------- case ${A\[0\]} in "rsync") test "$1" = "" && listhelp if \[ "$1" = "" \] ; then # 未指定參數 echo "未指定參數 ---> 自動代入預設 rsync 同步指令" echo "" read -p "按 Enter 繼續 (取消同步請按 Ctrl-C) 等待1000秒自動執行:" -t 1000 choicekey test "$choicekey" != "" && echo "取消同步" test "$choicekey" != "" && exit fi if \[ -d /${mount\_DS214play\_nfs\[0\]}/ \] && \[ -d /${local\_photo\_path\[0\]}/ \]; then echo "----------------------------------------------------------------" echo "同步: NAS ${mount\_DS214play}${datasettxt\[$i\]}/ ---> " echo "本機 ${local\_photo\_path}${dataset\[$i\]}" echo "指令︰" echo ${localname}"#" rsync -avP -e ssh --delete echo " ${exclude}" echo " ${mount\_DS214play\_nfs\[0\]} ${local\_photo\_path\[0\]}" rsync -avP -e ssh --delete \\ ${exclude} \\ ${mount\_DS214play\_nfs\[0\]} ${local\_photo\_path\[0\]} echo "--------------------------------------------------------------------------" echo "同步: NAS ${mount\_DS214play\_nfs\[0\]} ---> " \\ "本機 ${local\_photo\_path\[0\]}"" 完成" echo "--------------------------------------------------------------------------" echo "----------------------------------------------------------------" else test ! -d ${mount\_DS214play\_nfs\[0\]} && echo "掛載遠端nfs目錄 ${mount\_DS214play\_nfs\[0\]} 目錄不存在" test ! -d ${local\_photo\_path\[0\]} && echo "本地端存放學校照片目錄 ${local\_path\[0\]} 不存在" exit fi ;; "snap") if \[ "${local\_photo\_path\[${node\[0\]}\]}" == \\ "$(/sbin/zfs list|grep ${local\_photo\_path\[${node\[0\]}\]}|awk '{print $1}')" \] ; then echo "本地端 zfs dataset ${local\_photo\_path\[${node\[0\]}\]} 存在" echo "開始建立快照" echo "/sbin/zfs snap ${local\_photo\_path\[0\]}@${datename}" /sbin/zfs snap ${local\_photo\_path\[${node\[0\]}\]}@${datename} if \[ $? == 0 \]; then echo "快照建立完成(最後20筆快照)" /sbin/zfs list -t snap|grep ${local\_photo\_path\[${node\[0\]}\]}|tail -n 20 else echo "快照建立失敗" fi fi ;; "listsnap") echo "--------------------------------------------------------------------------" if \[ "${local\_photo\_path\[${node\[0\]}\]}" == \\ "$(/sbin/zfs list|grep ${local\_photo\_path\[${node\[0\]}\]}|awk '{print $1}')" \] ; then echo "本地端 zfs dataset ${local\_photo\_path\[${node\[0\]}\]} 存在" echo "開始列出 ${local\_photo\_path\[${node\[0\]}\]} 最後20筆快照" echo "--------------------------------------------------------------------------" /sbin/zfs list -t snap|grep ${local\_photo\_path\[${node\[0\]}\]}|tail -n 20 fi echo "--------------------------------------------------------------------------" ;; "copy") get\_last\_snap # 呼叫函式取的本機/遠端最後的快照名稱 # 遠端 echo "/sbin/zfs send -v ${local\_photo\_path\[${node\[0\]}\]}@${zfssnaplist\_local\[1\]} | \\ " echo " ssh ${node\[${target\_pve}\]} /sbin/zfs receive ${local\_photo\_path\[${target\_pve}\]} -F" read /sbin/zfs send -v ${local\_photo\_path\[${node\[0\]}\]}@${zfssnaplist\_local\[1\]} \\ | ssh ${node\[${target\_pve}\]} /sbin/zfs receive ${local\_photo\_path\[${target\_pve}\]} -F ;; "sendsnap") get\_last\_snap # 呼叫函式取的本機/遠端最後的快照名稱 # -------------------------------------------------------------------------------------------------- echo -n "同步 ${local\_photo\_path\[${node\[0\]}\]}@${zfssnaplist\_local\[1\]} 到 " echo ${local\_photo\_path\[${target\_pve}\]}@${zfssnaplist\_remote\[1\]} if \[ ${zfssnaplist\_local\[1\]} == ${zfssnaplist\_remote\[1\]} \]; then echo "狀態:遠端主機已有相同快照" echo "同步:不須同步傳送" else echo "同步:開始同步傳送" echo "/sbin/zfs send -v -I ${local\_photo\_path\[${node\[0\]}\]}@${zfssnaplist\_remote\[1\]} \\ " echo " ${local\_photo\_path\[${node\[0\]}\]}@${zfssnaplist\_local\[1\]} | \\ " echo "ssh ${node\[${target\_pve}\]} /sbin/zfs receive ${local\_photo\_path\[${target\_pve}\]} -F " /sbin/zfs send -v -I ${local\_photo\_path\[${node\[0\]}\]}@${zfssnaplist\_remote\[1\]} \\ ${local\_photo\_path\[${node\[0\]}\]}@${zfssnaplist\_local\[1\]} | \\ ssh ${node\[${target\_pve}\]} /sbin/zfs receive ${local\_photo\_path\[${target\_pve}\]} -F fi echo --------------- if \[ "$?" == "0" \];then echo "同步完成!" else echo "--------------------" echo "--------------------" echo "同步錯誤!" echo "zfs send/receive 失敗!" echo "--------------------" echo "--------------------" fi echo ------------------------------------------------------------------- rm ${zfssnaplist\_local\[0\]}; # 刪除本機暫存檔 rm ${zfssnaplist\_remote\[0\]}; # 刪除遠端主機快照列表在本機的暫存檔 ;; "\*") ;; esac
:::
展開
|
闔起
文章類別
書籍目錄
展開
|
闔起
線上使用者
8
人線上 (
5
人在瀏覽
線上書籍
)
會員: 0
訪客: 8
更多…