系统备份概述##

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

Linux 中我该如何备份系统的更多相关文章

  1. 5 个在 Linux 中管理文件类型和系统时间的有用命令

    对于想学习 Linux 的初学者来说要适应使用命令行或者终端可能非常困难.由于终端比图形用户界面程序更能帮助用户控制 Linux 系统,我们必须习惯在终端中运行命令.因此为了有效记忆 Linux 不同 ...

  2. Linux中mongodb定时远程备份

    下载mongodb https://www.cnblogs.com/tartis/p/5291580.html mongodb定时备份文档 虚拟机报错要改BIOS 虚拟技术开启 进入root账户  s ...

  3. Arch Linux中禁用UTC解决双系统时间问题

    原因 Windows双系统时间不统一在于时间表示有两个标准:localtime 和 UTC(Coordinated Universal Time) .UTC 是与时区无关的全球时间标准.尽管概念上有差 ...

  4. linux中网络存储与考试系统搭建(实现多用户可以共享文件)

    上期内容回顾 1.数据备份的方式有哪些 全量和增量 2.数据备份的命令有哪些 都有哪些优点缺点 cp : 本地复制,全量复制 scp : 远程复制,全量复制 rsync : 远程复制,增量复制 3.r ...

  5. Linux中CentOS6.5 64位 系统下安装docker步骤

    CentOS6.5 64位    (docker目前仅支持64位)内核必须在3.10及以上 1. uname -r  查看内核版本 2. 升级内核到3.10版本(带aufs模块)    cd /etc ...

  6. linux 中,mysql数据库备份操作

    1.新建一个sh脚本(可以先建一个txt文本,然后改为sh文件). 代码如下: #!/bin/bash #设置mysql备份目录 folder=/**/** cd $folder day=`date ...

  7. Linux基础知识第九讲,linux中的解压缩,以及软件安装命令

    目录 Linux基础知识第九讲,linux中的解压缩,以及软件安装命令 一丶Linux Mac Windows下的压缩格式简介 2.压缩以及解压缩 3.linux中的软件安装以及卸载 1.apt进行安 ...

  8. Linux中用户及用户组

    Linux用户只有两个等级:root及非root.Linux中还有一部分用户,如:apache.mysql.nobody.ftp等,这些也都是非root用户,即普通用户.Linux的权限实际是上不同用 ...

  9. linux中FTP自动备份VPS脚本

    服务器多了,网站也越来越多,总觉得不整个备份心里放不下心,并且有好几次rm的操作失误,造成难以挽回的损失.并且大多数的VPS提供商是不提供自动备份功能或者此功能收费价格略高.所以自己还是有必要把这个工 ...

随机推荐

  1. Asp.Net Mvc 使用WebUploader 多图片上传

    来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...

  2. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来

    从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...

  3. mybatis_映射查询

    一.一对一映射查询: 第一种方式(手动映射):借助resultType属性,定义专门的pojo类作为输出类型,其中该po类中封装了查询结果集中所有的字段.此方法较为简单,企业中使用普遍. <!- ...

  4. html5 canvas常用api总结(二)--绘图API

    canvas可以绘制出很多奇妙的样式和美丽的效果,通过几个简单的api就可以在画布上呈现出千变万化的效果,还可以制作网页游戏,接下来就总结一下和绘图有关的API. 绘画的时候canvas相当于画布,而 ...

  5. canvas与html5实现视频截图功能

    这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~ 制作方法: 1.在页面中加载视频 在使用canvas制作这个截图功能时,首先必须保证页面上 ...

  6. pdo的使用

    PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口. PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据. PDO随 ...

  7. mount报错: you must specify the filesystem type

    在linux mount /dev/vdb 到 /home 分区时报错: # mount /dev/vdb /homemount: you must specify the filesystem ty ...

  8. Android开发案例 – 在AbsListView中使用倒计时

    在App中, 有多种多样的倒计时需求, 比如: 在单View上, 使用倒计时, 如(如图-1) 在ListView(或者GridView)的ItemView上, 使用倒计时(如图-2) 图-1 图-2 ...

  9. Spark-shell和Spark-Submit的使用

    Spark-shell有两种使用方式: 1:直接Spark-shell 会启动一个SparkSubmit进程来模拟Spark运行环境,是一个单机版的. 2:Spark-shell --master S ...

  10. 一点公益商城开发系统模式Ring Buffer+

    一个队列如果只生产不消费肯定不行的,那么如何及时消费Ring Buffer的数据呢?简单的方案就是当Ring Buffer"写满"的时候一次性将数据"消费"掉. ...