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


14

GNU / Linux具有覆盖目录的联合安装。因此,您可以在只读目录的顶部安装可写目录。卸载可写目录时,未触及只读目录。

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

device-setup /dev/newdevice /dev/read-only-device overlayfile

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

是否存在这样的工具?


Answers:


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"

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

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

printf '%s\n' "0 $size snapshot-origin $dev" |
  dmsetup create originaldevice

并访问它/dev/mapper/originaldevice

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

覆盖文件可以是稀疏文件。(例如,将其创建为truncate -s10G the-file),并且不必与原始设备一样大。您可以知道的程度dmsetup status "$newdevname"

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


1
随后有趣的问题是,是否acc.umulated变化以后可以合并到原始设备
伊万Zakharyaschev - IMZ

1
随后的回答:是的。“设备映射器允许您…*)将块设备的快照合并回快照的原始设备。” kernel.org/doc/Documentation/device-mapper/snapshot.txt
imz-Ivan Zakharyaschev 2014年

快照目标的chunksize参数(在您的情况下为8)是什么意思?如何选择呢?
imz –伊万·扎哈拉里谢夫(Ivan Zakharyaschev)2014年

1
@Tom DM表中的数字始终以512字节为单位,而不是基础块设备的物理扇区大小。因此,在具有4K扇区的设备顶部使用不是8的倍数的快照将是一个坏主意。
斯特凡Chazelas

1
@ Tom,chunksize确定快照的粒度。这与覆盖文件的FS的块大小无关,而与在块设备上进行的I / O操作的多样性有关。因此回滚。感谢getsz vs getsize。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.