系统备份是应对系统损坏或者一些其它不确定性风险的有效手段。对于Linux系统来说,备份和还原其实是比较简单的事情,且无需依赖任何第三方工具就能够完成。
1,前置基本知识
要实现Linux系统的备份和灵活管理,需要对Linux系统结构和部分机制有一定的了解。如果你对Linux操作系统非常熟悉,则可以跳过该部分,否则建议先通过这一部分学习一下。
(1) Linux系统的基本构成
一个Linux操作系统由几个关键的目录构成,我们可以先查看一下根目录:
我们来分别了解一下:
/bin
存放系统命令二进制可执行文件,我们平时所使用的命令程序大多数位于此例如ls
、cp
、mv
等,该目录实际上是一个软链接,指向/usr/bin
/sbin
存放系统管理员用的二进制可执行文件如fsck
、reboot
等,这些命令通常只有管理员权限才可以执行/boot
存放系统启动所需的文件,包括Linux内核vmlinuz
和初始RAM磁盘镜像initrd
,以及GRUB引导加载程序配置/etc
系统和大多数应用程序的配置文件的目录,如用户账户信息、网络配置、系统服务的配置文件等/lib
存放系统启动和运行时需要的共享库文件,绝大多数系统程序以及应用程序都会从该目录中寻找并调用对应动态链接库,/lib64
也同理,只不过存放的是64
位的链接库,这两个目录也是软链接,实际指向/usr/lib
和/usr/lib64
/usr
存放共享、只读的数据,大部分的用户程序和库文件都在这里/var
存放可变数据文件,主要是系统运行过程中会变化的文件,如日志文件、缓存文件等,大多数情况下/var/log
存放系统日志文件/home
存放用户的个人目录,每个用户的主目录通常位于/home
下,例如/home/user
是user
用户的个人文件夹/root
系统管理员root
用户的主目录,这个目录的作用和/home
类似,但它是专门给root
用户使用的/tmp
存放临时文件的目录,许多应用程序在运行时会在这里创建临时文件,系统会定期清理这个目录的内容/srv
存放服务数据的目录,根据服务的不同,这里可能存放HTTP服务器的网页文件、FTP服务器的共享文件等/opt
存放可选的第三方软件包,不同于/usr
目录,这里通常包含的是一些不属于操作系统核心部分的额外应用程序,刚安装的操作系统可能没有该目录,可以手动创建/mnt
一般是用于临时挂载的文件系统,可以在这里挂载外部设备如U盘、光盘等,默认情况下该目录可能不存在或者为空/media
与/mnt
类似,也是用于挂载其它设备的,只不过通常是应用程序自动挂载设备到这里/lost+found
存放未正常关闭或者保存的文件内容的目录,正常情况下是空的
此外,还有一些虚拟文件系统,它们并不是实际的文件,只是系统运行时以文件形式显现:
-
/dev
存放设备文件的虚拟文件系统,在Linux中所有设备会被抽象并表示成文件形式存放在/dev
目录下,通过某种方式操作这些文件就可以实现与硬件交互了,/dev/sda
表示一个硬盘,/dev/tty
代表终端设备 -
/proc
存放关于系统进程和内核信息的虚拟文件系统,例如/proc/cpuinfo
存放关于CPU的信息,而/proc/meminfo
显示内存使用情况 -
/sys
一个存放内核和硬件等信息的虚拟文件系统,与/proc
类似,可以用来与内核交互
可见我们看见的文件有的甚至并不是真实的文件,以及一些文件可能并不是系统运行所必要的,这些在我们备份系统时可以进行排除。
(2) Linux的硬盘及分区表示
在Windows操作系统中,我们常常见到C
盘、D
盘这类对多个磁盘或者分区的表示。然而在Linux操作系统中,是没有分区的概念的,而是在/dev
下面通过文件形式表示我们的多个磁盘以及磁盘分区。
一个物理储存设备例如硬盘,通常表示为/dev/sdX
这种形式,例如一个电脑安装了两个硬盘,则这两个硬盘分别会被表示为:
/dev/sda
/dev/sdb
进一步,硬盘/dev/sda
可能有多个分区,分区则会表示为/dev/sdaX
这种形式,假设/dev/sda
有三个分区,那么这三个分区分别表示为:
/dev/sda1
/dev/sda2
/dev/sda3
其它硬盘的分区表示也同理。
对于NVMe硬盘其表示方式可能有所不同,不过思路是一样的,例如有两个NVMe硬盘,则分别表示为:
/dev/nvme0n1
/dev/nvme1n1
假设/dev/nvme0n1
有三个分区,那么它们分别表示为:
/dev/nvme0n1p1
/dev/nvme0n1p2
/dev/nvme0n1p3
可见这些磁盘和分区都以文件形式表示在了/dev
目录下,知道了它们是什么,我们在备份系统的时候就能够轻易地找到对应的磁盘与分区进行操作。
(3) Linux的挂载
在Linux下并没有Windows那样使用盘符表示一个分区,我们也不能直接通过/dev/sdaX
进入一个磁盘,那么我们应当怎么访问磁盘上的文件呢?
这就涉及到挂载的操作了!挂载指的是将外部存储设备(如硬盘、U盘、网络共享、光盘等)或虚拟文件系统(如ISO文件、网络驱动器)集成到当前的文件系统层级中的过程,使得我们可以访问它。简单来说,当我们把一个硬盘挂载到某个文件夹后,访问该文件夹,就相当于在访问该硬盘了!这个挂载到的文件夹就被称之为挂载点。
比如我们给电脑插入了一个U盘,此时该U盘会被自动识别并被表示为/dev/sdc
,那么要想访问该U盘内文件内容,我们可以把这个U盘挂载到/mnt
文件夹,挂载后我们进入/mnt
文件夹就能够查看或者修改U盘中的文件了!
使用mount
命令就可以挂载一个设备,取消挂载则是umount
,例如:
# 将设备/dev/sdc挂载至目录/mnt
mount /dev/sdc /mnt
# 取消挂载/dev/sdc
umount /dev/sdc
通过lsblk
命令,我们可以看到当前系统挂载了哪些设备到哪些挂载点:
可见,通过挂载的方式,看起来我们好像只是在一个空间内操作文件和文件夹,但事实上可能不同的文件夹实际指向不同的物理设备。
通常对于系统分区和启动分区,会在系统启动时自动挂载,我们可以通过修改/etc/fstab
文件配置自动挂载的设备,这一点在后面我们会接触到。
在大多数情况下,Linux操作系统本身(即系统根目录/
)会挂载到一个硬盘分区,然后存放UEFI启动文件的启动分区会挂载到/boot/efi
。
现在的电脑或者服务器设备,主板都是遵循UEFI规范的,启动时是通过EFI(或者叫做ESP)分区启动,EFI分区通常是FAT32格式的小分区,其中只存放用于引导系统的启动文件,无论是安装Windows还是Linux操作系统,通常都会自动创建EFI分区并安装引导文件进去,通过加载引导文件,机器才知道从哪个磁盘启动操作系统。若对UEFI启动机制不太熟悉可以自行上网查阅。
不过在一些特殊情况下,系统内不同目录也可以挂载到多个分区,例如将/
挂载到/dev/sda1
,而将用户目录/home
单独挂载到/dev/sda2
,这样将系统和用户数据分开存放,可以在系统损坏时仍然保证用户数据。
此外有的服务器可能会使用一个大的分区存放数据,例如上图中将/data
目录挂载到单独分区/dev/sda7
,这样即使重装系统,也只是重置了/dev/sda3
,数据能够完好无损。
总的来说,挂载是Linux中访问物理设备的关键手段,通过挂载设备到目录,我们就可以通过该目录访问到该设备。
2,系统备份
了解了一些基本知识,下面我们就开始系统备份操作。
(1) 准备LiveCD镜像
LiveCD是一种可以通过光盘、USB闪存或其他可移动介质启动的Linux操作系统。这种类型的系统通常不需要安装到硬盘上,就能在计算机上直接运行,适合于临时使用、故障排除或系统恢复等场景,和我们的Windows PE系统是很类似的。
大多数的系统安装镜像例如Ubuntu、LinuxMint的ISO,在我们进入安装界面时,其实就是进入了它们的LiveCD系统,然后在其中完成系统安装工作。
Debian也提供了专门的LiveCD供我们下载,我们这里就使用Debian的LiveCD,进入官网下载页面的现场版部分下载即可:
下载LiveCD之后,可以使用Rufus将其写入到U盘,或者使用Ventoy工具将U盘制作成启动盘并把镜像放进去,这个步骤很简单,就不再赘述了。
(2) 备份系统
关机后,从我们U盘的LiveCD启动,进入U盘中的系统,就可以对我们电脑上的系统进行操作了!在LiveCD系统中我们打开终端,先使用lsblk
命令查看分区,例如我这里:
可见/dev/sda
是我的移动硬盘,用于存放备份的系统压缩文件,而/dev/sdb
则是电脑的系统盘,其中/dev/sdb1
是EFI启动分区,而/dev/sdb2
则是系统分区,大家自己的电脑上显示的可能是不一样的,因此要自行理清楚对应关系。
备份系统也很简单,只需使用tar
命令将整个系统打包为一个压缩包即可,一般来说EFI分区无需备份,首先挂载要备份的系统分区到/mnt
目录下,同时挂载移动硬盘到当前目录下的disk
目录下用于存放备份系统的压缩包:
# 挂载系统
sudo mount /dev/sdb2 /mnt
# 挂载移动硬盘
mkdir disk
sudo mount /dev/sda1 disk
挂载完成后如图:
然后执行打包命令即可:
# 打包系统
sudo tar -czpvf ./disk/backup.tar.gz \
--exclude=./proc --exclude=./sys --exclude=./dev \
--exclude=./tmp --exclude=./lost+found \
--exclude=./cdrom --exclude=./mnt --exclude=./media \
--exclude=./var/log --exclude=./var/cache/apt/archives \
-C /mnt .
在上述tar
命令中,参数意义如下:
c
表示添加文件到归档z
压缩为gz
格式p
保留所有文件的所属用户和权限信息v
显示打包过程f
后面紧接着压缩包的保存位置--exclude
排除部分虚拟文件系统和不必要的文件等-C
指定tar
命令的工作路径- 最后的
.
表示打包-C
指定的工作路径下的全部文件
此外,大家还可以替换上述的z
参数为其它表示打包为其它压缩包格式,例如:
# 打包为xz格式,压缩率最高但速度较慢
sudo tar -cJpvf ./disk/backup.tar.xz ...
# 打包为bzip2格式,压缩率介于gz和xz之间,平衡压缩率和速度
sudo tar -cjpvf ./disk/backup.tar.bz2 ...
# 也可以不压缩只打包,速度最快
sudo tar -cpvf ./disk/backup.tar ...
等待压缩完成,系统就备份完成了!
3,系统还原
将我们备份的压缩包解压回系统盘,并修复引导,就完成了系统还原,同样地大家需要先进入LiveCD以完成后续还原操作。
(1) 格式化原本分区
建议还原系统前,格式化原有分区,以得到一个干净的系统,我的原本系统分区是/dev/sdb2
,则使用下列命令格式化:
sudo mkfs.ext4 /dev/sdb2
此外,Debian的KDE环境LiveCD提供了可视化的分区工具KDE Partition Manager
,大家也可以使用该工具格式化分区:
(2) 挂载分区
挂载机器的原有系统分区,我这里仍然是挂载系统分区到LiveCD的/mnt
目录下,此外挂载存放系统备份压缩包的移动硬盘到./disk
下,这里就不赘述挂载过程了。
挂载完成后如图:
(3) 还原系统
解压系统压缩包到系统分区挂载点目录即可:
sudo tar -xpvf ./disk/backup.tar.gz -C /mnt --numeric-owner
上述参数中:
x
表示解压文件--numeric-owner
表示使用GID和UID确定文件所属用户,保证解压后文件权限与原本的一致性
然后,创建相关系统的文件夹:
# 恢复相关系统文件夹
sudo mkdir -p /mnt/proc /mnt/sys /mnt/dev /mnt/mnt /mnt/media
(4) 重建引导
虽然系统文件恢复了,但是启动分区EFI中的引导文件需要重新建立,否则可能导致无法正常启动。
首先挂载启动分区:
# 挂载EFI启动分区
sudo mkdir -p /mnt/boot/efi
sudo mount /dev/sdb1 /mnt/boot/efi
挂载虚拟文件系统:
# 挂载虚拟文件系统
for fs in dev sys proc; do
sudo mount --bind /$fs /mnt/$fs
done
然后改变根路径为还原的系统根目录下:
# 改变根路径
sudo -s
chroot /mnt
通过sudo -s
可以进入一个具有root
权限的终端会话,而chroot
用于改变当前运行进程的根目录,通过上述命令就能够临时改变系统运行根路径到恢复的系统中,此时我们调用的命令是恢复的系统中的命令,以及此时做出的改变能够应用到恢复的系统中。
再执行下列命令即可重建GRUB引导:
# 重建GRUB引导
grub‐install
update-grub
# 退出chroot
exit
(5) 修改自动挂载配置
格式化分区后,分区的UUID通常会发生改变,原本系统的自动挂载配置会和新的分区UUID不一致,导致系统不能启动,因此还需要修改EFI分区和系统分区的自动挂载配置使其和现有的一致。
首先使用下列命令查看每个分区的UUID:
sudo blkid
如下图:
然后修改恢复系统目录下的/etc/fstab
文件:
sudo nano /mnt/etc/fstab
该文件内容如下图,可见每一行就是一个分区的自动挂载配置,一行中不同字段之间使用一个或者多个空格(或者Tab
)隔开。第一个字段就是对应分区UUID,第二个则是挂载点,我们可以通过挂载点判断哪个是系统分区,哪个是EFI分区如下图:
修改第一个字段UUID后面的值使其和blkid
输出的一致即可,这里使用nano
编辑器修改,打开文件后,就直接是编辑模式,键盘上下左右键可以移动光标,可以直接输入,编辑完成按下Ctrl + O
进行保存,这将显示一个提示询问你要保存文件,此时按下 Enter
键以确认保存,再按下Ctrl + X
即可退出编辑器回到命令行。
修改完成后如下:
到此,整个系统还原步骤完成!重启电脑即可。
参考:
- Ubuntu社区-备份还原系统:传送门