linux快照是linux系统下用于记录存储卷或文件系统特定时间点完整状态的技术,它通过记录数据块的变更信息来实现,不需要复制全部原始数据,因此创建过程通常只需要几秒时间,且不会占用与原始数据等量的存储空间。

linux快照的核心原理
linux快照大多采用写时复制(Copy-On-Write, COW)机制实现。当创建快照时,系统会记录当前所有数据块的映射关系,不会立即复制数据。只有当原始数据发生修改时,系统才会先将被修改的原始数据块复制到快照预留的存储区域,再更新原始数据块的内容。这样快照始终保存着创建时刻的数据状态,而原始卷可以正常读写,互不影响。
常见的linux快照类型
1. LVM逻辑卷快照
LVM(逻辑卷管理)是linux下常用的存储管理方案,它原生支持快照功能。LVM快照是基于逻辑卷创建的临时只读或可写副本,适合对正在运行的系统进行备份,创建时不需要卸载逻辑卷。
创建LVM快照的基本步骤如下:
- 确认要创建快照的源逻辑卷存在,且卷组有剩余空间
- 执行快照创建命令,指定快照大小、名称和源逻辑卷
- 快照创建完成后可以挂载使用,用完后可删除释放空间
下面是创建和挂载LVM快照的示例代码:
# 查看现有逻辑卷,假设源逻辑卷为/dev/vg_data/lv_data,卷组vg_data剩余空间足够 lvdisplay # 创建大小为10G的快照,快照名称为lv_data_snap,源逻辑卷为/dev/vg_data/lv_data lvcreate --size 10G --snapshot --name lv_data_snap /dev/vg_data/lv_data # 查看创建的快照 lvdisplay /dev/vg_data/lv_data_snap # 创建挂载目录 mkdir /mnt/snap_data # 挂载快照(如果是xfs文件系统,需要添加-nouuid参数避免uuid冲突) mount /dev/vg_data/lv_data_snap /mnt/snap_data # 使用完成后卸载并删除快照 umount /mnt/snap_data lvremove /dev/vg_data/lv_data_snap
2. Btrfs文件系统快照
Btrfs是linux下支持写时复制特性的现代文件系统,原生支持快照功能,而且快照创建几乎瞬间完成,占用空间极少。Btrfs快照可以是只读的,也可以是可读写的,常用于系统回滚、多环境部署等场景。
下面是Btrfs创建和删除快照的示例代码:
# 假设btrfs文件系统挂载在/mnt/btrfs_root # 创建只读快照,快照名称为snap_20240101,源目录为/mnt/btrfs_root/data btrfs subvolume snapshot -r /mnt/btrfs_root/data /mnt/btrfs_root/snap_20240101 # 创建可读写快照 btrfs subvolume snapshot /mnt/btrfs_root/data /mnt/btrfs_root/snap_rw_20240101 # 查看所有btrfs子卷(包含快照) btrfs subvolume list /mnt/btrfs_root # 删除快照 btrfs subvolume delete /mnt/btrfs_root/snap_20240101
3. 其他快照实现
除了上述两种常见类型,ZFS on Linux也支持原生的快照功能,原理和Btrfs类似;部分云厂商的linux云服务器还支持基于云硬盘的快照,这类快照由云平台底层实现,操作更简单,适合云环境使用。
linux快照的适用场景
- 数据备份:在备份前创建快照,再对快照进行备份,避免备份过程中源数据变更导致备份不一致
- 系统恢复:系统升级或配置变更前创建快照,若出现问题可快速回滚到快照状态
- 测试环境搭建:基于生产环境快照创建测试环境,保证测试数据和生产环境某一时刻一致,且不影响生产运行
- 数据恢复:误删除文件后,可挂载快照找回快照创建时刻存在的文件
使用linux快照的注意事项
- 快照不是备份的替代品,快照依赖原始数据,如果原始存储设备损坏,快照也会失效,重要数据仍需定期做全量备份
- 快照会占用额外的存储空间,尤其是原始卷数据变更频繁时,快照占用的空间会不断增加,需要定期清理无用快照
- LVM快照的大小需要根据原始卷的数据变更量合理设置,如果快照空间用尽,快照会失效
- 部分快照是只读的,挂载后不能直接修改其中的内容,需要创建可读写快照才能进行写入操作