系統備份概述##
在前面的一些文章中,我反復提到經常會把系統搞崩潰,所以備份系統就是一件不容忽視的事情。由於 Linux 系統本身的優越性,系統的備份和還原還是比較容易的。主要表現在以下方面:
- Linux 系統所有的數據都以文件的形式存在,所以備份就是直接拷貝文件;硬盤分區也被當成文件,所以可以直接克隆硬盤數據。
- Linux 系統自帶很多實用工具,比如 tar、dd、rsync 等,備份還原系統不需要購買或下載第三方軟件。
- Linux 系統在運行時其硬盤上的文件可以直接被覆蓋,所以還原系統的時候不需要另外的引導盤。(當然,系統完全掛掉到無法啟動這種情況還是需要另外的引導盤的。)
備份 Linux 系統的策略有很多,比如使用 dd 命令直接克隆硬盤分區:
sudo dd if=/dev/sda1 of=/dev/sdb1
或者,使用 tar 將硬盤上的文件打包:
cd /
sudo tar cvpzf backup.tgz --exclude=/proc --exclude=/mnt --exclude=/sys --exclude=/backup.tgz /
還原系統的命令是:
sudo dd if=/dev/sdb1 of=/dev/sda1
或
tar xvpfz backup.tgz -C /
但是我最終選擇的是 rsync 命令。rsync 是一個非常優秀的文件同步工具,從它的名字可以看出,它支持遠程同步。當然,在備份我的桌面系統時,只需要用到它的本地同步功能就行了。之所以選擇 rsync,是因為它具有如下優點:
- 在備份還原過程中,可以保存文件原有的時間、權限、軟硬鏈接等信息;
- 首次備份時,需要復制所有文件,但是再次備份或還原系統時,只需要復制修改過的文件。
關於 rsync 的使用方法,其主要參考文檔是man rsync,另外,rsync 也可以作為守護進程運行用來建立文件備份服務器,可以參考文檔man rsyncd.conf。
桌面系統備份實戰##
對於我的桌面系統,我選擇的備份策略是使用 rsync 命令將硬盤上的所有文件(當然要排除 /proc 和 /sys 目錄下的內容)復制到 U 盤上。首先使用df -lh命令查看一下我電腦的系統占多大空間,如下圖:

從上圖可以看出,根目錄所在的分區占用了 14G,而 /boot 目錄所在的分區才占用 100 多 M。其實 Linux 系統本來不用這么臃腫,只是因為我安裝了太多的軟件包,比如一整套的 texlive 啊什么的,才占用了這么多的空間。不過這都不是事兒,反正現在 U 盤也便宜,所以找個 32G 的 USB 3.0 的 U 盤來備份我這個系統,肯定是很輕松愉快的。
新 U 盤插到電腦上會被自動識別,使用不帶參數的mount命令可以查看 U 盤的設備文件和掛載路徑,使用fdisk命令了解 U 盤的大小和分區情況。如下圖:

整個 U 盤分成一個區我沒什么意見,不過我不喜歡它的 vfat 文件系統,萬一碰到超過 4G 的巨型文件怎么辦?so,先umount它,然后使用mkfs.ext3為它重新建立一個文件系統,如下圖:

再把 U 盤mount起來,掛載的路徑為/media/youxia/usb。如下圖:

然后,可以開始備份了,我備份的命令是:
sudo rsync -Pa / /media/youxia/usb/backup_20141216 --exclude=/media/* --exclude=/sys/* --exclude=/proc/* --exclude=/mnt/* --exclude=/tmp/*
如下圖:

下圖是備份完成后的效果,可以看到整個備份過程花了 59 分多鍾,U 盤被占用 15G,如下圖:

如果哪天系統再崩潰了的話,只需要使用sudo rsync -Pa /media/youxia/usb/backup_20141216/ /即可恢復系統。
(京山游俠於2014-12-18發布於博客園,轉載請注明出處。)
另:該文章使用 Markdown 寫作,寫起來挺舒服的。而且我的博客開啟了數學公式支持,所以各位評論的朋友們注意了,如果評論中用到$字符,請使用\$這種形式。
最新進展##
從 Ubuntu 15.04 開始,init 系統使用了和 Fedora 一樣的 systemd,於是備份命令變得和前面寫的不一樣了,主要是--exclude=?的區別。先看圖:

在上圖中,我使用不帶參數的mount命令查看文件系統,發現有四大虛擬的掛載點,它們分別是/sys、/proc、/dev、/run。這四個虛擬的掛載點是和硬盤沒有關聯的,所以在備份的時候需要排除掉,再加上我們掛載 U 盤的/media,所以備份命令應該這樣寫:
sudo time rsync -Pa / /media/youxia/usb/backup_20160816 --exclude=/media/* --exclude=/sys/* --exclude=/proc/* --exclude=/dev/* --exclude=/run/*
命令中加入time是為了統計備份一次系統花費多少時間,如下圖:

從下圖可以看出,我的 Dell XPS 15 上的 Ubuntu 系統備份一次花費大約 37 分鍾,占用了 U 盤的 8G 空間。如下圖:

上圖大家需要仔細看看,從圖中可以看出,硬盤的設備名不再是 /dev/sda,而是 /dev/nvme0n1p,反倒是 U 盤的設備名是 /dev/sda1。原因應該有兩點,一是我的 Dell XPS 15 使用的是 M.2 接口的固態硬盤,不同於 SATA 接口的硬盤,另外一個原因恐怕就是 systemd 的功勞了,使用 systemd 后系統初始化時能夠非常准確地識別硬件的型號,所以它就給我的硬盤起了一個非常詳細的設備名。從上圖還可以看出,我的硬盤被分成了兩個區/dev/nvme0n1p1和/dev/nvme0n1p2,而其中的第一個分區是 EFI 專用的分區。了解上面的細節對后面系統的恢復很重要。
關於系統恢復的注意事項##
恢復系統,可不僅僅是運行 sudo time rsync -Pa /media/youxia/usb/backup_20160816/ /這么簡單,還是有一些注意事項的。
1.要記得恢復 Grub 的啟動菜單。Ubuntu 系統在安裝玩后,Grub 的啟動菜單會自動隱藏,這給需要選擇多系統的用戶帶來了困難,對於需要啟動進入 rescue 模式的朋友來說就更加是一個障礙了。所以我們要恢復 Grub 的啟動菜單。刪除 /etc/default/grub 文件中的如下兩行:

然后調用 sudo update-grub 命令更新 Grub 的配置,如下圖:

如果沒有辦法進入 rescue 模式,那就只有從 Ubuntu 的安裝盤啟動了。
2.盡量不要在不同質的電腦之間備份和恢復系統。什么意思呢?比如說,我曾經把這台 Dell XPS 15 上的系統搞崩潰了,然后我拿另一台 Acer 的備份文件來恢復系統,本以為可以像 Ghost 安裝 WinXP 一樣方便,哪知恢復完成后連 Grub 都進不去,更別提啟動系統了。后來仔細想想,這就是在不同質的電腦之間備份和恢復系統惹的禍。前面提過,我的 Dell XPS 15 的硬盤設備名是 /dev/nvme0n1p,而 Acer 的 SATA 硬盤的設備名是 /dev/sda,而且我的 Dell XPS 15 使用的是 EFI 方式安裝的 Ubuntu,而 Acer 是用 Legacy BIOS 方式安裝的 Ubuntu。這就是兩台電腦不同質。后來想了一下,即使是同質的電腦,直接使用 sudo time rsync -Pa /media/youxia/usb/backup_20160816/ /命令進行恢復,應該也是進不了系統,原因有二:
- Grub在啟動 Linux 內核的時候,是使用硬盤分區的 UUID 來尋找 Linux 內核的,即使是同質的電腦,其硬盤分區的 UUID 應該也不同;
- 系統啟動后,掛載文件系統的時候,也是使用硬盤分區的 UUID 來尋找硬盤分區的,具體內容可以查看
/etc/fstab文件。所以兩台電腦的硬盤分區的 UUID 不同,自然系統不能順利運行。
所以我們在恢復系統的時候,不能簡單的使用sudo time rsync -Pa /media/youxia/usb/backup_20160816/ /命令就完了,而是應該具體問題具體分析。如果能夠定位到具體的目錄,只恢復相應的目錄應該是最好的,精准恢復,既節約時間,又避免副作用。如果真的想全盤恢復的話,先想想 /boot 分區有無破壞,或 /boot/grub2/grub.cfg 這個配置文件有無受損,以及/etc/fstab文件是否有變動,如果沒有的話,可以使用 --exclude=/boot/* 和 --exclude=/etc/fstab 選項來避免覆蓋這些內容,應該是可以做到在不同的電腦之間互相備份和恢復。
但是最佳的做法,應該還是針對每一台電腦做一個單獨的備份,而且是定期備份。有備無患。
(京山游俠於2016-08-30更新於博客園,轉載請注明出處。)
