京山游侠

专注技术 拒绝扯淡
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux 中我该如何备份系统

Posted on 2014-12-18 10:39  京山游侠  阅读(32228)  评论(9编辑  收藏  举报

系统备份概述##

在前面的一些文章中,我反复提到经常会把系统搞崩溃,所以备份系统就是一件不容忽视的事情。由于 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更新于博客园,转载请注明出处。)