Linux 中我该如何备份系统
系统备份概述##
在前面的一些文章中,我反复提到经常会把系统搞崩溃,所以备份系统就是一件不容忽视的事情。由于 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 中我该如何备份系统的更多相关文章
- 5 个在 Linux 中管理文件类型和系统时间的有用命令
对于想学习 Linux 的初学者来说要适应使用命令行或者终端可能非常困难.由于终端比图形用户界面程序更能帮助用户控制 Linux 系统,我们必须习惯在终端中运行命令.因此为了有效记忆 Linux 不同 ...
- Linux中mongodb定时远程备份
下载mongodb https://www.cnblogs.com/tartis/p/5291580.html mongodb定时备份文档 虚拟机报错要改BIOS 虚拟技术开启 进入root账户 s ...
- Arch Linux中禁用UTC解决双系统时间问题
原因 Windows双系统时间不统一在于时间表示有两个标准:localtime 和 UTC(Coordinated Universal Time) .UTC 是与时区无关的全球时间标准.尽管概念上有差 ...
- linux中网络存储与考试系统搭建(实现多用户可以共享文件)
上期内容回顾 1.数据备份的方式有哪些 全量和增量 2.数据备份的命令有哪些 都有哪些优点缺点 cp : 本地复制,全量复制 scp : 远程复制,全量复制 rsync : 远程复制,增量复制 3.r ...
- Linux中CentOS6.5 64位 系统下安装docker步骤
CentOS6.5 64位 (docker目前仅支持64位)内核必须在3.10及以上 1. uname -r 查看内核版本 2. 升级内核到3.10版本(带aufs模块) cd /etc ...
- linux 中,mysql数据库备份操作
1.新建一个sh脚本(可以先建一个txt文本,然后改为sh文件). 代码如下: #!/bin/bash #设置mysql备份目录 folder=/**/** cd $folder day=`date ...
- Linux基础知识第九讲,linux中的解压缩,以及软件安装命令
目录 Linux基础知识第九讲,linux中的解压缩,以及软件安装命令 一丶Linux Mac Windows下的压缩格式简介 2.压缩以及解压缩 3.linux中的软件安装以及卸载 1.apt进行安 ...
- Linux中用户及用户组
Linux用户只有两个等级:root及非root.Linux中还有一部分用户,如:apache.mysql.nobody.ftp等,这些也都是非root用户,即普通用户.Linux的权限实际是上不同用 ...
- linux中FTP自动备份VPS脚本
服务器多了,网站也越来越多,总觉得不整个备份心里放不下心,并且有好几次rm的操作失误,造成难以挽回的损失.并且大多数的VPS提供商是不提供自动备份功能或者此功能收费价格略高.所以自己还是有必要把这个工 ...
随机推荐
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Java MyBatis 插入数据库返回主键
最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...
- CSS3 3D立方体效果-transform也不过如此
CSS3系列已经学习了一段时间了,第一篇文章写了一些css3的奇技淫巧,原文戳这里,还获得了较多网友的支持,在此谢过各位,你们的支持是我写文章最大的动力^_^. 那么这一篇文章呢,主要是通过一个3D立 ...
- React的使用与JSX的转换
前置技能:Chrome浏览器 一.拿糖:React的使用 React v0.14 RC 发布,主要更新项目: 两个包: React 和 React DOM DOM node refs 无状态的功能 ...
- PHP以接口方式实现多重继承(完全模拟)--学习笔记
1.UML类图: 2.PHP代码: <?php /** * Created by PhpStorm. * User: andy * Date: 16-11-23 * Time: 下午7:57 ...
- Angular企业级开发(1)-AngularJS简介
AngularJS介绍 AngularJS是一个功能完善的JavaScript前端框架,同时是基于MVC(Model-View-Controller理念的框架,使用它能够高效的开发桌面web app和 ...
- Xamarin+Prism开发详解一:PCL跨平台类库与Profile的关系
在[Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用]中提到过以下错误,不知道大伙还记得不: 无法安装程序包"Microsoft.Identity.Client 1.0. ...
- jsp页面无法识别el表达式的解决方案
今天在写一个springmvc的小demo时,碰到一个问题,在jsp页面中书写为${user.username}的表达式语言,在浏览器页面中仍然显示为${user.username},说明jsp根本不 ...
- C#发送邮箱
之前自己从来没有做过发送邮箱的功能,前段时间项目需要,在找了很多帖子之后,终于实现了. 之后有整理了一下,写了一个类.直接给类传递信息,就可以发送了. 这里还需要说明的是,发送邮箱需要开通POP3/S ...