跳到主要內容

Linux 操作不求人系列- 參章之捌 - 系統管理(VIII) - 系統備份與資料救援

     一般來說,系統與資料備份是防範資料遺失最好的方法,無論儲存體是否有做磁碟陣列的RAID 方法(RAID,https://en.wikipedia.org/wiki/RAID,https://en.wikipedia.org/wiki/Standard_RAID_levels)。而備份的儲存地點,又可分為近端(或本地端)與遠端(異地端),近端可能備份於同一個機器內,如 /dev/sda1 掛載到 /media/sda1 的資料,備份到 /dev/sdb1 掛載的 /media/sdb1,為不同硬碟間的備份。或是同一個機房間的,但同儲存環境間的備份,如備份到同電腦主機外接的 Thuderbolt、USB、光纖儲存裝置、或是同機房內的 NAS。遠端則透過網路、網際網路,可以備分到其他機房,不同區域或國家的方法。備份的複製方法,可分為鏡像備份、增量備份、差異備份,可依需求、備份總量與時間來做複製策略的調整。通常備份最方便的方法為利用指令 cp ,假設您已插上USB外接硬碟,其掛載為 /media/sdc1 ,且可讓一般使用者備份,則可使用指令如以下:
@cp
$cp  -ru  ~/bin  /media/sdc1/backup/ 
/* 將您放在~/bin 資料夾下,自己寫的執行檔,連同 ~/bin 資料夾,備份到 /media/sdc1/backup/ 資料夾下,則會在 /media/sdc1/backup 產生一個資料夾名為 bin, 若路徑無 backup 資料夾,可先用 mkdir /media/sdc1/backup。參數 -r (recursive) 為複製資料夾與以下所有子資料夾與子檔案,參數 -u (update)為若目的位置內已經有相同檔名的檔案,若來源的檔案較新,則使用覆蓋原本檔案,否則便不需複製。  */
CentOS 7.X若不想一直詢問已經存在之檔案,則使用以下,使用參數v顯示複製狀態
$cp  -runv  ~/bin  /media/sdc1/backup/

$ cp  -rudpv  /etc  /home/backup/  | tee ~/backup.log
/* 記得要備分 /etc 或 /var 等 root 權限擁有者的資料夾,請先 su - 轉為 root。參數 -r 為複製資料夾,參數 -d ,為複製後依然保持為連結,而非連結的檔案或資料夾。參數 -p ,為所複製的檔案與資料夾,要維持相同的擁有者與擁有群組,並且讀取、執行與寫入權限皆不變,若無加此參數,則複製後的檔案或資料夾,會同於下指令的帳號與其所屬群組。 如用 root 複製後,目的檔案與資料夾的擁有者就變為 root  -v 為列出所有複製的過程,筆者再利用指令 tee,除螢幕輸出外,多存一份到 ~/backup.log 檔 */

如要用 tee 備份過程的錯誤訊息(standerr),可利用以下
$ cp -rudp  /etc /home/backup/  |& tee ~/backup.log

$ cp -rudp  /etc/home/backup/  2>&1  |  ~/backup.log

讀者或也可使用 tar 來壓縮並備份至 /home/backup,如圖3-104,因參數 -v 會逐一列出複製狀況,筆者為了截圖,先不使用:
$  tar  jcf  /home/backup/etc.tar.bz2  /etc

若要用較佳的壓縮率格式 xz 來壓縮,則可以使用以下指令
$ tar  Jcf  /home/backup/etc.tar.xz  /etc  # 參數給為大寫 J

解開 xz 格式則參數換成以下( c 意指compress壓縮,x意指 extract 解壓縮,在 tar 下各種壓縮格式皆同 )
$ tar Jxf  /home/backup/etc.tar.xz








































(圖3-104)
除 tar 可壓縮之外,亦有些跟Windows交換檔案的使用者,習慣使用 rar 壓縮,故我們需先去rarlab( http://www.rarlab.com/download.htm )下載 ,解開後利用 make 跟 make install,就可以使用 unrar 與 rar 指令。或可利用 yum 方式安裝 rpmfusion 的 Free and Nonfree Repositories(其中一包含有 exfat 與其他有用工具套件),如下(https://rpmfusion.org/Configuration,參章之參亦有介紹 rpmfusion repository的安裝方式):
$ yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-6.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-6.noarch.rpm

$ yum install unrar
如此一來,就可以使用 unrar 來解 .rar 壓縮檔,或使用 rar 來壓縮成 .rar檔案了。


@rsync
除此之外,亦可以利用指令 rsync 來完整的複製:
$  rsync -av /etc/ /home/backup/
/* 參數 -a 代表 archive,-v 代表 verbose,備份方式為新增至 /home/backup,故為增量備份。 */

$  rynsc  -av  --delete  /etc  /home/backup/
/*  加上參數 --delete 後,則來源若有檔案被移除,則目的資料夾亦移除一樣的檔案,此為鏡像備份。  */

     rsync 亦有遠端備份的功能,但筆者通常會先利用 mount 掛載遠端的機器磁碟,如 NFS 或SAMBA 網路磁碟,掛載後,再從此電腦主機下 cp 或是 rsync 來備份,備份後再 umount 該網路磁碟,或是可利用 autofs (https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/s2-nfs-config-autofs.html) 令其自動掛載與卸載。其他詳細參數,有興趣的讀者可 man rsync,如 sync 亦可利用參數 -e ssh 來進行 ssh 的加密式連線複製,但自動化時,還是需要再設定檔預先輸入 ssh 密碼,筆者認為這是很不好的作法,故須先配合 ssh 金鑰對認證的無須輸入密碼之登入方式,這筆者要會於下篇介紹。

@ dd
     除此之外,若要備份整個硬碟資料變成映象檔,則使用指令 dd
$  dd if=/dev/sda1  | bzip2  > /home/mysda1.img.bz2
/* 備份 /dev/sda1 分割 ,並利用 bzip2 壓縮成 mysda1.img.bz2 檔(亦可使用 gzip 壓縮),存在 /home 下,通常 /sda1 掛載的是 /root,回復則為 bunzip2 mysda1.img.bz2 | dd of=/dev/sda1 ,of= 後方所接的磁碟內容,皆會被 if= 的磁碟內容所覆蓋 ,如圖3-105*/

$  dd  if=/dev/sda  of=/dev/sdb conv=noerror, sync status=progress
/* conv=noerror 代表愈錯誤依然繼續讀取,sync 代表 synchronized I/O ,同步的輸出輸入備份方式,此方式通常用於兩顆硬碟對拷,status 參數可顯示進度,對於較長時間的複製很實用。  */


$  dd  if=/dev/sda1  of=/dev/sdb1  bs=4096 conv=noerror, sync status=progress
/* 利用每次讀寫 4096 Bytes 磁區來映射複製,/dev/sda1 磁碟分割至 /dev/sdb1 磁碟分割, /dev/sdb1 需大於或等於 /dev/sda1 之磁碟容量。 status 參數可顯示進度,對於較長時間的複製很實用。 */

若要僅備份開機啟動磁區,可利用以下:
$  dd  if=/dev/sda  of=/home/mymbr.img bs=512 count=1
/* 備份磁碟分割第一塊 512 Bytes 之區域。 如圖3-105 */










(圖3-105)

除此之外,用dd 也可以搞破壞,拿來當低階格式化工具,指令如下:
$  dd if=/dev/zero of=/dev/sdb conv=sync
 /*  將每個小磁區塊,都寫入0 */

@ cpio
倘若要將資料備份到光碟機或磁帶機,可以使用指令 cpio,如下:
$ find ~/mydata | cpio -ov > /dev/sr0
/* 利用 find 指令定義備份資料夾為家目錄下的 mydata 資料夾的資料,在利用 cpio 備份輸出至 /dev/sr0 ,參數 o 為複製資料出去光碟機,參數 v 為列出詳細資料。 */

find指令的用法也可結合參數 -exec,若要先刪除.tmp副檔名檔案,如下,若要僅搜尋資料夾,則-type c 改為 -type d不分大小寫則把 -name 改為 -iname
$ find / -type f -name ".tmp" -exec rm -f {} \;
or
$ find / -name ".tmp" -print0 | xargs -0 rm
(https://unix.stackexchange.com/questions/167823/find-exec-rm-vs-delete)


要將 /dev/sr0 資料複製出來的方式如下
$ cd ~/mydata && cpio -div < /dev/sr0 
/* 參數 d 為創立新資料夾,參數 i 為複製光碟機資料進來,參數 v 為列出詳細資料。 */

     遠端備份的方式,可以利用前面說過的先掛網路磁碟,再 cp 或 sync 的方式,或利用 ssh 之scp 或 sftp。還有 FTPS ( ftp with ssl,因一般 FTP 為無加密之文字傳輸帳號密碼與傳輸資料,故筆者不建議使用。筆者常用的 filezilla ftp client ,有支援 ftp with ssl 連線,可從 http://rpm.pbone.net/index.php3/stat/4/idpl/31687357/dir/redhat_el_6/com/filezilla-3.7.3-3.el6.x86_64.rpm.html,來下載 rpm,但安裝時會出現如圖3-106,少 libwx 的錯誤,故利用 yum install libwx*來安裝,yum完成後 filezilla-3.7.3-3.el6.x86_64,就可以安裝完成,接著鍵入指令 filezilla,就會出現圖形介面的 ftp client,可以選擇連線目的IP了,port 選擇 22,通常就是直接使用 sftp 方式連線)






































(圖3-106)

@scp

一般主機皆預設會開啟 ssh 服務與防火牆允許此連線,故可利用 scp 的方式遠端備份,就可不須先掛上遠端硬碟,如以下:

$  scp  -r -2 -P 22  /etc  newuser@192.168.100.100:~/backup
/* 參數 -r ,代表複製整個資料夾,-2 代表指定使用 ssh protocol 2,也可以不用加,讓ssh server來決定。參數 -P,為指定欲連線的 port,有些 ssh server 非預設的 port 22,故須加上此參數更改 ssh server 指定的 port。若無需逐條列出複製過程,可以加上參數 -q (quiet)。此scp輩分方式為備份從來源主機的 /etc 資料夾與內含之資料夾與檔案內容,至目的主機IP 192.168.100.100,登入帳號 newuser,放置於其 $HOME目錄下的 backup 資料夾,若無此資料夾,請先如 ssh newuser@192.168.100.100 'mkdir ~/backup'ssh newuser@192.168.100.100 ! mkdir ~/backup ,連入來直接新增資料夾,此利用 ssh 遠端下指令的方式,在多主機管理或cluster 操作時,相當好用。

@rsync
另一個備份的指令為 rsync,rsync 的好處為可以做完整鏡像備份,從遠端主機與本機端鏡像備份如下:
$  rsync -avz --delete  -e ssh   newuser@192.168.100.100:~/backup   ${HOME}/*
/*  參數 -a 代表 -rlptgoD,請見 rynsc --help,參數 -v 為 verbose mode,參數 -z 代表壓縮模式,--delete 為不新增檔案,參數 -e 為使用 ssh 的加密 shell 模式傳輸  */


@ Data Recovery
     在CentOS6_x64下,若磁碟格式如 ext4,出現了軟體的壞軌,我們可以利用 fsck -y 來自動修復,但若是磁碟分割表消失,或磁碟內的檔案或照片忽然讀不到怎麼辦呢?我們這時就可以利用 Open Source 軟體 testdisk 與 photorec (http://www.cgsecurity.org/wiki/TestDisk) 。下載可從 http://www.cgsecurity.org/wiki/TestDisk_Download ,或是利用 yum install testdisk,如圖3-107
,詳細過程於之前安裝軟體篇介紹過,這裡不再贅述。



































(圖3-107)


    首先,假設我們有一個隨身硬碟,內有一些個人資料與圖片,如圖3-108,然後突然有一天發現不能掛載,指令 fdisk -l 後,變成沒有磁碟分割,如圖3-109。這時怎麼辦呢?先怪別人亂拿去用,中毒?先怪自己眼睛業障重,假的?還是怪隨身硬碟都是被其他的硬碟朋友帶壞,我的隨身硬碟平常都很乖的?不,應該要怪自己怎沒有備份。有備份就直接重建檔案分割表,然後複製貼上就復原好,不是嗎?那真的沒備份怎麼辦?















(圖3-108)













(圖3-109)

     還好我們剛剛下載了 testdisk,就趕快執行他吧。如以下指令:
$  testdisk  /dev/sdb   # testdisk 後方空格後接上要還原的磁碟

會出現如圖3-110,進入 testdisk 環境下後,若要跳出,則按鍵盤 q 鍵,若要確定執行,則按鍵盤 Enter鍵。在選擇時,請注意圖3-110黃色箭頭指向的反光處為選擇的項目,真的確定再按下Enter鍵





































(圖3-110)

圖3-110按下Enter鍵後 Proceed,進入圖3-111,此為選擇磁碟的格式為,入果不知道就直接按Enter鍵,用預設的Intel/PC partition。若是GPT格式( 一般是windows 8 以上,或是大於2T以上的磁碟分割 ),則利用鍵盤上下鍵,選 EFI GPT,其他作業系統格式,如 Mac、Sun、XBox 都有支援。按下Enter鍵後,進入圖3-112畫面。





































(圖3-111)





































(圖3-112)

在圖3-112畫面下,我們直接按下Enter鍵,做Analyse,並進入如圖3-113,會先辨認是否有留存磁碟分割表,因我們的事件是由於磁碟分割表的遺失,故在快速磁碟掃描前,可看到磁碟顯示無含任何分割表。接著按下Enter鍵,進入要進入Quick Search的程序。





































(圖3-113)

圖3-113按下Enter後,會快速掃描到我們之前遺失的磁碟分割,看到標籤確實為TRANS16G的原磁碟。這時候還可以依圖3-114下方指示,按下鍵盤 p,來列出裡面的檔案與資料夾。





































(圖3-114)

     列出磁碟分割所含的檔案與資料夾後,可以看到如圖3-115,紅色的檔案與資料夾為已經移至垃圾桶或刪除過的,白色的檔案與資料夾為原本磁碟內的有用資料。此時利用鍵盤上下鍵,移動至要復原的檔案,再按下鍵盤 c 鍵,然後選擇要還原檔案至另存的路徑,如圖3-116






































(圖3-115)

     筆者將還原的檔案,另存於圖3-116黃框位置,再按下鍵盤 c 鍵,即可還原,最後可以在terminal 下利用 ls /root/recover/* 看到檔案,如圖3-117。是不是鬆了一個氣了呢?因為我們將檔案與資料夾跟資料夾內的檔案,全部都救回來了。





































(圖3-116)















(圖3-117)


testdisk掃描前的的其他選項如圖3-118至圖3-120,圖3-118主要因我們的事件已失去 partition table,故亦無 partition 可調整。圖3-119,則為暫時調整磁碟的 Cylinders、Heads、Sectors、Sectors Size,來修正可能 testdisk 偵測的磁碟參數錯誤,或磁碟 firmware的錯誤引起的損毀。圖3-120為開啟專家模式,與對齊磁碟和打包磁碟資料。
































(圖3-118)
































(圖3-119)
    硬碟CHS參數說明,可參考wikipedia(https://en.wikipedia.org/wiki/Cylinder-head-sector),與 http://home.impress.co.jp/magazine/dosvpr/q-a/0007/qa0007_1.htm,此模式亦可以將原本 4k 格式化硬碟,因用 dd 指令複製成 block size 為 512bytes 磁碟,所造成的 Logical / Physical Volume 參數錯誤,修正回 4k 的 sector size。








































(圖3-120)

另一個復原軟體 photorec (可復原的檔案格式如,http://www.cgsecurity.org/wiki/File_Formats_Recovered_By_PhotoRec),使用以下指令進入介面:
$ photorec /dev/sdb

如圖3-121,操作介面與 testdisk 大同小異,且多了 file options 可供僅需要回復的檔案格式,如圖3-122。photorec 的操作,再留個讀者們自行玩玩(http://www.cgsecurity.org/wiki/PhotoRec_Step_By_Step)。





































(圖3-121)






































(圖3-121)

   筆者在這幾年來,已經看過太多因沒有好好備份,當機器發生突然的軟體或硬體錯誤時,所失去重要資料的使用者痛哭流涕的場景;或是雖然備份,但又將備份分享給 MS Windows 環境下當可寫入的網路磁碟操作,或是備份完還插在電腦主機上,結果被中毒的電腦主機,感染了最新的 Ransomware (https://www.microsoft.com/en-us/security/portal/mmpc/shared/ransomware.aspx) ,連備份資料都被加密。所以除了硬體的RAID-1、RAID-5、RAID-6 的保護資料能力外,以及考慮分享的資料讀寫權限問題外,最重要的還是要做多份的異地備份,以防同機房的硬體設施毀損,或同網域病毒感染造成的資料損失問題。
    管理所需的工具與知識就介紹到此。接下來,筆者要進入介紹架設伺服器軟體的階段,讓讀者除了可以使用現在很流行的網路主機代管與雲端主機外,也讓對架站有興趣的讀者,可以透過自行架設來學習伺服器軟體的基本運作。


If you have any feedback or question, please go to my forum to discuss.

這個網誌中的熱門文章

Linux 操作不求人系列 - 貳章之貳 - Shell Script 程式設計(II) - BASH 與 TCSH / CSH

     在上章,我們介紹很多bash shell指令的應用方式,並讓它們變成 script,在這章此節,我們要承襲上節,繼續討論 bash shell script 的其它程式設計概念,與讓程式可重複使用的方法,就是利用函式(function)。      首先,我們來創作一個判斷是否為閏年的函數,script的名稱就取為 check_year.sh ,請自行將其設為可執行。程式碼如圖2-6,為了解說方便,筆者利用指令 nl check_year.sh 將程式碼包含行數印出(圖2-7),其他除顏色外,都與圖2-6同。以下 export 宣告環境變數,自訂變數無需加宣告保留字。(2021.10.07更正export說明,以下自訂變數宣告請直接去除export開頭) (圖2-6) (圖2-7)        圖2-7第2-6行,與之前的範例相似,皆有防堵參數個數輸入錯誤的判斷。第7-11行為接著判斷輸入的年分,是否為真的正整數,也就是大於零的數字。其中第7行可解釋為,利用正規表示式搜尋 $2 字串值得頭至尾部的字元,皆由 0-9 組成,若有,則為真(True)會進入 if 內的陳述執行, 但我們想要的,應該是僅要字串其中一字元為非正整數,便進入if 內的警告並跳出 。故,筆者在判斷式前多加一個 ! ,代表著當字元完全是正整數時,就不要執行  if  內陳述,而直接往第12行執行,但若其中有一個字元為非正整數,則會進入 if 內印出錯誤訊息並跳出 Script 。在此例使用者輸入非正整數等字串(如:12ab、cde、1a1b),便會出現錯誤訊息"Error Value",並跳出 Script 。而第8行的判斷式,效果跟第7行相同,但只能在BASH 3.0才能支援,故筆者故意保留,讓讀者可以學到另一種表示方式。         第12-28行,為宣告一個函式 leapyr () ,在 BASH Script內若要使用含式,必須在使用之前先建立函式的功能,如函式建立在第12-28行,則若要呼叫使用(Call)函式,則必須在第29行之後才能呼叫,並且可重複呼叫。第13行為定義函式呼叫時,一定會有一個外部參數, 此外部參數非該 Script 的外部參數 ,而是由程式撰寫者給入,故在此無設定防呆判斷。第14-

Linux操作不求人- 肆章之壹 - 伺服器架設(I) - SSH(SFTP、SCP)、FTP伺服器與遠端連線

@ ssh, sftp      通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋: $   rpm  -qa  |   grep  openssh     #  ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。 或使用以下 $   rpm  -qa  |   grep  ssh         #  比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。      如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。 (圖4-1) 再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2 $ chkconfig | grep ssh   # 查詢 sshd 是否有於 開機 runlevel 啟動 再利用以下指令,來查詢是否防火牆有允許連線 $ iptables  -L  |  grep ssh   # 出現如圖4-2 允許通過之條件 (圖4-2)      接下來,我們要先來調整 sshd 的設定檔,利用 vim  /etc/sshd/sshd_conf ,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。 (圖4-3-1)

Linux操作不求人 - 伍章之陸 - Intel PXE 與利用 tftp + anaconda kickstart來自動部署系統

     現代的個人電腦與筆電爲了節能省碳,往往皆省略了光碟機的設置。雖然說 USB隨身碟亦可應用於安裝作業系統,但若遇到機房的大量機器需安裝之問題,亦不適合此種用光碟片或隨身碟逐臺安裝的方式,或是需準備多片光碟或隨身碟。故爲了大量安裝與部屬 Linux作業系統的機器,我們便可透過具有PXE功能之網路卡(https://en.wikipedia.org/wiki/Preboot_Execution_Environment),其所具備的網路開機的能力,來作透過網路方式來安裝與大量部署 CentOS Linux作業系統。其原理 wikipedia  的PXE說明,都解釋得很清楚,筆者不需要再 " 掉書包 ",在開發者大神面前班門弄斧,我們就直接來做做看。      首先,我們一樣透過 yum來安裝所需的 tftp伺服器軟體(http://www.jounin.net/tftpd32.html),利用PXE支援 tftp 透過 udp 埠號 69連線,來提供檔案的能力,給利用 PXE開機後安裝作業系統的機器,圖5-60   (圖5-60) 接著修改 tftp 設定檔 /etc/xinetd.d/tftp,如圖5-61,請記得 disable  要改為 no (圖5-61)      若要修改 server_args 參數為自訂的 tftp root 路徑,記得要變更 SELinux 的權限設定,如要改為/tftpboot,則使用指令 chcon  來調整,如以下: $ mkdir /tftpboot $ chcon  --reference /var/lib/tftpboot  /tftpboot 接著將 xinetd 與 tftp 加入開機啟動,並重啟動 xinetd,如下: $ chkconfig  --level  235  xinetd on $ chkconfig  --level  235  tftp  on $ service xinetd restart 開放防火牆通行 $ iptables -A INPUT -p udp --dport 69 -j ACCEPT $ service iptables re