我需要做一个在记忆中正在运行的已挂载根文件系统的快照。
文件系统本身位于 lvm 设备上,但 VG 中没有可用空间,无法扩展它。但是我有足够的 RAM,我只需要快照来制作备份,并且可能回滚到它。我不在乎服务器是否重新启动并“回滚”到快照。我使用的是设备映射器而不是 lvm2,因为我没有找到使用 lvm 制作它的方法。所以在 DM 术语中,我需要制作一个快照原点并在其上制作一个快照。
我为奶牛数据创建了一个内存块设备(在 tmpfs 上的文件循环顶部线性)并且它可以工作。
我的问题是我的 root fs 设备是两个线性设备,而不是一个:
root: 0 57000000 linear 8:48 2048
root: 57000000 160000000 linear 8:48 73869312
cow: 0 20971520 linear 7:2 0
(root不是这个vg中唯一的LV,cow是我的内存设备)
我在网上找到了很多关于这样做的文章,例如: https://wiki.gentoo.org/wiki/Device-mapper#Snapshot 但是,我没有找到正确的语法来在两个或多个线性设备之上创建快照源。
当我这样做时:
dmsetup table root| sed 's~linear.*~snapshot-origin /dev/mapper/root~g'| dmsetup create snapshot-origin
我在 dmesg 中收到“命令失败”:
[ 2957.073592] device-mapper: table: 254:1: snapshot-origin: Cannot get target device
[ 2957.073595] device-mapper: ioctl: error adding target to table
当我对单个线性设备使用相同的方法时,一切都很好。
更新:
我在相同的配置上做了一个 lvm 快照,但在 vg 中有一些空间来看看 lvm 如何处理这个问题。确实如此,但我仍然不明白我如何手动执行此操作(使用我自己的牛设备)。
初始设置:
Root: 0 57090048 linear 8:48 2048
Root: 57090048 160571392 linear 8:48 73869312
这就是 lvm 在 上所做的事情lvcreate -s -L10G
。所以这就是我想手动创建的:
Root--snap: 0 217661440 snapshot 254:1 254:4 P 8
Root-real: 0 57090048 linear 8:0 2048
Root-real: 57090048 160571392 linear 8:0 73869312
Root: 0 217661440 snapshot-origin 254:1
Root--snap-cow: 0 8388608 linear 8:0 57092096
据我从 dm 文档和各种文章中了解到,应该首先将原始设备标记为快照源:
dmsetup -vvv create so --table '0 217661440 snapshot-origin /dev/mapper/Root'
dm version OF [16384] (*1)
Udev cookie 0xd4d3634 (semid 12746752) created
Udev cookie 0xd4d3634 (semid 12746752) incremented to 1
Udev cookie 0xd4d3634 (semid 12746752) incremented to 2
Udev cookie 0xd4d3634 (semid 12746752) assigned to CREATE task(0) with flags DISABLE_LIBRARY_FALLBACK (0x20)
dm create so OF [16384] (*1)
dm reload so OF [16384] (*1)
<backtrace>
Udev cookie 0xd4d3634 (semid 12746752) decremented to 1
Udev cookie 0xd4d3634 (semid 12746752) incremented to 2
Udev cookie 0xd4d3634 (semid 12746752) assigned to REMOVE task(2) with flags DISABLE_LIBRARY_FALLBACK (0x20)
dm remove so OF [16384] (*1)
Udev cookie 0xd4d3634 (semid 12746752) decremented to 1
Udev cookie 0xd4d3634 (semid 12746752) waiting for zero
Udev cookie 0xd4d3634 (semid 12746752) destroyed
Command failed
更新2:
open("/dev/mapper/control", O_RDWR) = 3
/...cut.../
write(1, "dm create ECS-LVRoot OF [1638"..., 40dm create ECS-LVRoot OF [16384] (*1)
) = 40
ioctl(3, DM_DEV_CREATE, 0x7f66e826f350) = -1 EBUSY (Device or resource busy)
write(1, "<backtrace>\n", 12<backtrace>
) = 12
write(2, "Command failed\n", 15Command failed
) = 15