GNU/Linux:覆盖块设备/可堆叠块设备

Ole*_*nge 14 block-device loop-device snapshot

GNU/Linux 具有覆盖目录的联合挂载。因此,您可以在只读目录之上安装可写目录。当可写目录被卸载时,只读目录保持不变。

我正在为块设备寻找相同的功能 - 最好将可写部分存储在文件中。所以我想运行类似的东西:

device-setup /dev/newdevice /dev/read-only-device overlayfile
Run Code Online (Sandbox Code Playgroud)

如果我写入 /dev/newdevice 更改应该存储在覆盖文件中。如果我读取写入的扇区,我应该从覆盖文件中获取数据。如果我读取未写入的扇区,我应该从 /dev/read-only-device 获取数据。

有这样的工具吗?

Sté*_*las 22

您可以使用设备映射器及其snapshot目标来做到这一点。

基本上,当您创建可写快照时,您将执行与 LVM 相同的操作。

dev=/dev/read-only-device
ovl=/path/to/overlay.file
newdevname=newdevice
size=$(blockdev --getsz "$dev")

loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" |
  dmsetup create "$newdevname"
Run Code Online (Sandbox Code Playgroud)

然后您可以访问覆盖的设备/dev/mapper/newdevice

如果您还需要同时访问原始设备,您可以执行以下操作:

printf '%s\n' "0 $size snapshot-origin $dev" |
  dmsetup create originaldevice
Run Code Online (Sandbox Code Playgroud)

并访问它/dev/mapper/originaldevice

您可以写入该设备,然后除了写入快照设备的块之外,覆盖文件将包含写入快照源时已被覆盖的块的副本。

覆盖文件可以是稀疏文件。(例如,将其创建为truncate -s10G the-file),并且不必与原始设备一样大。你可以告诉它有多满dmsetup status "$newdevname"

注意:快照设备大小和内容要求