Linux 物理机实现快照功能


共计 5417 个字符,预计需要花费 14 分钟才能阅读完成。

简介

物理机装的系统随着时间的增加,东西肯定越来越多,磁盘占用也越来越大,想要清理这些内容变回一个干净的系统是一件不容易的事情,Linux 上也是如此。而虚拟机则可以为刚装好的系统创建一个快照,无论后面在系统内进行任何操作都可以通过快照进行快速复原系统。

经过一方摸索,最开始是准备使用 dd 命令进行镜像的备份和还原,这种方式可行,但是耗时实在过长。于是想着如果系统支持快照还原就好了,之前确实也有听说 zfsbtrfs 文件系统支持快照,遂了解了一番。

在使用的过程中,发现 zfs 的读写性能似乎非常差,这时候才恍然大悟为什么装系统的时候这么慢。除此之外,ubuntu 使用 zfs 安装系统,会默认创建非常多文件子系统,并且多次尝试合并为一个文件系统,但是没有成功,这让我感觉不利于我进行快照和还原。还有一点是,zfs 安装的系统就是会比其他系统更吃内存,然后又搜索了一番,发现 zfs 而且还需要 ecc 内存才更好。

鉴于前面的诸多原因,不得不尝试 btrfs 文件系统,这个系统有人在网上评论丢数据不稳定的情况,也有人说很好用,所以自我感觉还是得用了才有发言权。而我其实装系统只是为了测试用,目前情况下并不在乎这些以外的情况,所以还是选择尝试一下。

然而由于刚接触这个文件系统,想要很快上手他的快照功能似乎有点难,于是乎在网上搜索的过程中发现了 timeshift 这个工具,只能说配合 btrfs 进行快照功能绝了,可以进行秒级快照。提到这个的原因是 timeshift 工具不止可以为 btrfs 文件系统创建快照,因为它可以使用 rsync 来创建快照,只有第一次的时候是全量备份,后面都是增量备份,当然创建快照的时间就会比较久。

实战

1. 安装系统

因为要使用 btrfs,所以在安装系统的时候就要选择 btrfs 作为文件系统,安装的时候进行如下配置即可:

669a1837bdb50

/>

和之前的分区方式类似,给 boot 分区一小块空间,设置一下虚拟内存,其他的全部都分配给根目录 /。需要注意的是,文件系统要选择 btrfs。

669a188cb253d

/>

其他安装过程略。

安装好系统以后,执行如下命令在 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:清朝云网络工作室

阅读剩余
THE END