Linux 物理机实现快照功能
共计 5417 个字符,预计需要花费 14 分钟才能阅读完成。
简介
物理机装的系统随着时间的增加,东西肯定越来越多,磁盘占用也越来越大,想要清理这些内容变回一个干净的系统是一件不容易的事情,Linux 上也是如此。而虚拟机则可以为刚装好的系统创建一个快照,无论后面在系统内进行任何操作都可以通过快照进行快速复原系统。
经过一方摸索,最开始是准备使用 dd
命令进行镜像的备份和还原,这种方式可行,但是耗时实在过长。于是想着如果系统支持快照还原就好了,之前确实也有听说 zfs 和 btrfs 文件系统支持快照,遂了解了一番。
在使用的过程中,发现 zfs 的读写性能似乎非常差,这时候才恍然大悟为什么装系统的时候这么慢。除此之外,ubuntu 使用 zfs 安装系统,会默认创建非常多文件子系统,并且多次尝试合并为一个文件系统,但是没有成功,这让我感觉不利于我进行快照和还原。还有一点是,zfs 安装的系统就是会比其他系统更吃内存,然后又搜索了一番,发现 zfs 而且还需要 ecc 内存才更好。
鉴于前面的诸多原因,不得不尝试 btrfs 文件系统,这个系统有人在网上评论丢数据和不稳定的情况,也有人说很好用,所以自我感觉还是得用了才有发言权。而我其实装系统只是为了测试用,目前情况下并不在乎这些以外的情况,所以还是选择尝试一下。
然而由于刚接触这个文件系统,想要很快上手他的快照功能似乎有点难,于是乎在网上搜索的过程中发现了 timeshift 这个工具,只能说配合 btrfs 进行快照功能绝了,可以进行秒级快照。提到这个的原因是 timeshift 工具不止可以为 btrfs 文件系统创建快照,因为它可以使用 rsync 来创建快照,只有第一次的时候是全量备份,后面都是增量备份,当然创建快照的时间就会比较久。
实战
1. 安装系统
因为要使用 btrfs,所以在安装系统的时候就要选择 btrfs 作为文件系统,安装的时候进行如下配置即可:
/>
和之前的分区方式类似,给 boot
分区一小块空间,设置一下虚拟内存,其他的全部都分配给根目录 /
。需要注意的是,文件系统要选择 btrfs。
/>
其他安装过程略。
安装好系统以后,执行如下命令在 btrfs 文件系统中启用配额管理功能:
sudo btrfs quota enable /
2. 安装timeshift
sudo apt-get update && \
sudo apt-get install timeshift
这里需要了解下timeshift备份的两种方式,一种是btrfs,一种是rsync。
-
rsync 在第一次使用时会拷贝所有文件,以后每次备份都是增量备份,使用硬链接创建从上一次快照未修改的系统文件。快照文件可以保存到任何 Linux 文件系统的硬盘格式下,保存快照到非系统盘或者外部硬盘上,这样即使系统盘损坏或者被格式化也能够快速从外部硬盘恢复数据。rsync 支持排除文件和目录来节省硬盘空间,rsync也是默认的备份方式。
-
btrfs 需要安装 btrfs-tools,快照通过 btrfs文件系统创建,快照备份和恢复的速度要比 rsync 快,快照创建和恢复都是原子事务的,不能中断。快照通过替换系统 subvolumns 来恢复,因为文件没有拷贝,删除或者覆盖,不会有文件丢失的风险。恢复后的系统会作为一次新的快照。快照在备份时是完美地逐字节拷贝,不能排除任何文件。快照会存在系统相同的硬盘上,暂时还不支持备份到其他硬盘,如果系统盘损坏,那么快照也会丢失。初始 btrfs 备份是 0 字节,但是随着系统使用占用内容会逐日增多,快照中的文件依然还是会指向原始的文件 block. 系统必须安装在 btrfs 分区上,并使用 Ubuntu-type subvolumn layout(@ and @home subvolumns),其他的 layouts 不支持。
通过了解以上两种方式,可以知道rsync的快照可以保存到任何的非系统盘下,而btrfs是存储在系统盘上;本人建议使用rsync的方式,本次备份和恢复也是这种方式。
3. 首次配置
刚开始使用 timeshift 还是踩了不少坑,比如常见的用户家目录的文件不备份,后来稍微了解配置文件以后,直接选择在配置文件更改,而不要在命令行加参数的方式。
如果有图形化界面,也可以使用 timeshift-gtk 命令进行配置。
首先查看硬盘列表:
$ sudo timeshift --list-devices
/dev/sda3 is mounted at: /run/timeshift/backup, options: rw,relatime,space_cache,subvolid=5,subvol=/
Devices with Linux file systems:
Num Device Size Type Label
------------------------------------------------------------------------------
0 > /dev/sda1 1.0 GB btrfs
1 > /dev/sda3 31.3 GB btrfs
这里需要进行备份的明显就是 /dev/sda3
了,于是获取对应的 uuid:
$ blkid
/dev/sr0: UUID="2021-08-19-11-03-38-00" LABEL="Ubuntu 20.04.3 LTS amd64" TYPE="iso9660" PTUUID="2cf4ba3a" PTTYPE="dos"
/dev/sda1: UUID="56c163db-7188-4521-ade9-f679e9bf1530" UUID_SUB="c3fabcd1-6431-43c0-97f1-859a86348dd5" TYPE="btrfs" PARTUUID="11b419d5-01"
/dev/sda2: UUID="0b62cac4-24c4-4658-837d-e2bb8ff71ddc" TYPE="swap" PARTUUID="11b419d5-02"
/dev/sda3: UUID="d4c72b7b-0bd6-487b-898b-61805faaabfb" UUID_SUB="3df8f064-d7bf-4aaa-87d3-a978d25924f9" TYPE="btrfs" PARTUUID="11b419d5-03"
然后编辑 /etc/timeshift.json
或 /etc/timeshift/timeshift.json
文件,按如下文件进行配置,替换 uuid 即可:
{
"backup_device_uuid" : "d4c72b7b-0bd6-487b-898b-61805faaabfb",
"parent_device_uuid" : "",
"do_first_run" : "false",
"btrfs_mode" : "true",
"include_btrfs_home_for_backup" : "true",
"include_btrfs_home_for_restore" : "true",
"stop_cron_emails" : "true",
"btrfs_use_qgroup" : "true",
"schedule_monthly" : "false",
"schedule_weekly" : "false",
"schedule_daily" : "false",
"schedule_hourly" : "false",
"schedule_boot" : "false",
"count_monthly" : "2",
"count_weekly" : "3",
"count_daily" : "5",
"count_hourly" : "6",
"count_boot" : "5",
"snapshot_size" : "6401406592",
"snapshot_count" : "201066",
"date_format" : "%Y-%m-%d %H:%M:%S",
"exclude" : [
],
"exclude-apps" : [
]
}
- backup_device_uuid:快照备份设备的UUID。
- parent_device_uuid:父设备的UUID(如果有)。
- do_first_run:是否是第一次运行。
- btrfs_mode:是否启用Btrfs模式。
- include_btrfs_home_for_backup:是否将/home目录包含在Btrfs备份中。
- include_btrfs_home_for_restore:是否将/home目录包含在Btrfs恢复中。
- stop_cron_emails:是否停止cron作业发送的电子邮件。
- btrfs_use_qgroup:是否使用Btrfs的qgroup功能。
- schedule_monthly:是否启用每月计划快照。
- schedule_weekly:是否启用每周计划快照。
- schedule_daily:是否启用每天计划快照。
- schedule_hourly:是否启用每小时计划快照。
- schedule_boot:是否启用每次启动时的计划快照。
- count_monthly:保留的每月快照数。
- count_weekly:保留的每周快照数。
- count_daily:保留的每天快照数。
- count_hourly:保留的每小时快照数。
- count_boot:保留的每次启动时的快照数。
- snapshot_size:快照大小(0表示不设置特定大小)。
- snapshot_count:快照总数。
- date_format:日期格式。
- exclude:排除的目录或文件。
- exclude-apps:排除的应用程序。
4. 创建快照
配置好以后创建快照就非常简单了,使用如下命令即可:
sudo timeshift --create
输出如下内容,并没有报错,说明创建成功。
sudo timeshift --create
Using system disk as snapshot device for creating snapshots in BTRFS mode
/dev/sda3 is mounted at: /run/timeshift/backup, options: rw,relatime,space_cache,subvolid=5,subvol=/
Creating new backup...(BTRFS)
Saving to device: /dev/sda3, mounted at path: /run/timeshift/backup
Created directory: /run/timeshift/backup/timeshift-btrfs/snapshots/2024-07-19_15-57-10
Created subvolume snapshot: /run/timeshift/backup/timeshift-btrfs/snapshots/2024-07-19_15-57-10/@
Created subvolume snapshot: /run/timeshift/backup/timeshift-btrfs/snapshots/2024-07-19_15-57-10/@home
Created control file: /run/timeshift/backup/timeshift-btrfs/snapshots/2024-07-19_15-57-10/info.json
BTRFS Snapshot saved successfully (0s)
Tagged snapshot '2024-07-19_15-57-10': ondemand
------------------------------------------------------------------------------
使用如下命令可以查看快照:
sudo timeshift --list
如果需要定时快照,请先使用一次 crontab e
命令。
5. 恢复快照
想要恢复到哪个快照就指定对应的时间。
sudo timeshift --restore --snapshot '2024-07-19_15-57-10'
执行命令后会提示回车继续,回车即可,执行完以后进行重启。
sudo reboot
timeshift 会在恢复前自动创建一次快照,所以恢复后会多出一个快照。
6. 删除快照
删除单个:
sudo timeshift --delete --snapshot '2024-07-19_15-57-10'
删除全部:
sudo timeshift --delete-all
如果遇到删除失败,可以通过 /var/log/timeshift/
文件夹下的日志查看情况。这里猜测是由于没有启用过 crontab
导致的,运行了一次 crontab -e
就好了。
[16:29:47] E: Failed to remove snapshot: 2024-07-19_15-57-10
[16:29:47] ------------------------------------------------------------------------------
[16:29:47] exit_app()
[16:29:47] crontab -l
[16:29:47] Failed to read cron tab
[16:29:47] crontab -l
[16:29:47] Failed to read cron tab
[16:29:47] unmount_target_device()
[16:29:47] clean_logs()
[16:29:47] rm -rf '/tmp/FbNXFXQw'
Tips:清朝云网络工作室