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提供商是不提供自动备份功能或者此功能收费价格略高.所以自己还是有必要把这个工 ...
随机推荐
- js中参数不对应问题
因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...
- solr_架构案例【京东站内搜索】(附程序源代码)
注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的. 一:solr服务的端口号.我这里的sol ...
- JavaScript中fn()和return fn()
看博客时,注意到return的重要性 参考:http://www.cnblogs.com/raoyunxiao/p/5644032.html 看似反常的例子: var i = 0; function ...
- Laravel Composer and ServiceProvider
Composer and: 创建自定义类库时,按命名空间把文件夹结构组织好 composer.json>autoload>classmap>psr-4 composer dump-a ...
- 使用技术手段限制DBA的危险操作—Oracle Database Vault
概述 众所周知,在业务高峰期,某些针对Oracle数据库的操作具有很高的风险,比如修改表结构.修改实例参数等等,如果没有充分评估和了解这些操作所带来的影响,这些操作很可能会导致故障,轻则导致应用错误, ...
- 主成分分析(PCA)原理总结
主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结
篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- CommandPattern
/** * 命令模式 * @author TMAC-J * 将调用者和接受者分离 * 可以将一组命令组合在一起,适合很多命令的时候 */ public class CommandPattern { i ...
- 微信小程序开发—快速掌握组件及API的方法
微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支 ...