跳到主要內容

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操作不求人- 肆章之壹 - 伺服器架設(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 操作不求人系列 - 貳章之壹 - Shell Script 程式設計(I) - BASH

     本章開始進入Shell Scripts的程式設計,因為Linux Shell的種類相當多,故筆者僅挑選預設的Bash Shell 及 學術界常會使用的 C Shell (/bin/tcsh )來說明與對照,在此先說明。至於 Scripts 的概念,在前章就已經說明過,可視為前壹章的各項指令之組合,在令其在執行檔案裡,依序執行,如前章所看到的 /etc/profile 檔案,在其他軟體上,有點類似巨集(macro)的執行檔,或是MS Windows的批次檔(Batch)。先建立此概念後,我們可以先在Terminal的命令提示字元,使用 for 指令,如圖2-1,在 shell scripts 內為了重複做一件事,而僅修改某些變數值,我們會利用所謂的迴圈(loop)方式來完成,而 bash shell 內常用的是 for 或是 tcsh/csh shell 內的 foreach 。 (圖2-1)      圖 2-1第一個指令輸入 for 的宣告,後面接著 seq 為變數名稱,為了逐次接收  in 後面之陣列值(http://www.gnu.org/software/bash/manual/html_node/Arrays.html)(註:若加了  ; 則 do 便可寫在同一行),接著 > 的提示字元的等待輸入,便是還沒遇到 done 指令來結束 do 的動作,控制此提示字元的環境變數為 PS2 。,此例的 seq 值,依序為第一次讀入 first 字串並存入變數 seq 當其值,接著second、third,從 echo $seq 可以看出,接著設定一個變數 file 其值為 my開頭字串,緊接變數值 $seq(first、second、third),再接固定的 script.sh 字串,接著利用echo指令,印出變數值$file,檢查是不是我們預期的字串值(註:如果想要暫停,讓使用者可以看清楚再繼續,可以加上指令sleep 3,表示畫面停止三秒鐘),接著利用 touch 指令產生 $file 字串值的檔案,再將其利用 chmod 指令, u+x 參數為令僅創立此檔的使用者帳號可執行(若要改為同群組可執行,參數需改為 g+x )。故可看到第二個指令輸入 ls ,便列出自動批次

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