Можно сделать это с картопостроителем устройства и 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"
Затем можно получить доступ к overlayed устройству как /dev/mapper/newdevice
.
Если Вам также нужен доступ к исходному устройству одновременно, можно сделать:
printf '%s\n' "0 $size snapshot-origin $dev" |
dmsetup create originaldevice
И доступ это /dev/mapper/originaldevice
.
Можно записать в то устройство, затем в дополнение к блокам, записанным в устройство снимка, файл наложения будет содержать копию блоков, которые были перезаписаны при записи в источник снимка.
Файл наложения может быть редким файлом. (например, создайте его как truncate -s10G the-file
), и не должно быть столь же большим как исходное устройство. Можно сказать, насколько полный это с dmsetup status "$newdevname"
.
Примечание: Существует размер и содержание reqirements на устройстве снимка.
Именованная труба (FIFO) может делать то, что вы хотите до точки, но с парой предостережений:
Если вы хотите иметь возможность писать в трубу до того, как читатель существует, ваш писатель должен открыть ФИФО как чтение - запись или звонок на открыть
. В оболочке это может выглядеть так:
EXEC 3 <> / Путь / к / трубу
echo "foo"> & 3
кот <& 3
Как вы можете видеть там, я могу написать в трубу до того, как читатель будет рядом. Как только я прочитаю из трубы, сообщения, которые я написал уже там.
Пишены на трубу, в конечном итоге блокируют, как только труба заполнит. Согласно трубу (7) на Linux:
труба имеет ограниченную емкость. Если труба заполнена, то запись (2) заблокирует или не удается, в зависимости от того, установлен ли флаг O_NONBLOCK (см. Ниже). Различные реализации имеют разные ограничения для емкости трубы. Приложения не должны полагаться на определенную емкость: приложение должно быть спроектировано так, чтобы процесс чтения потребляет данные, как только он доступен, так что процесс написания не остается заблокированным.
В версиях Linux до 2.6.11 емкость трубы была такой же, как размер страницы системы (например, 4096 байтов на i386). Поскольку Linux 2.6.11 емкость трубы составляет 65536 байтов.
В зависимости от случая использования вы также можете рассмотреть возможность использования очереди сообщений. Ядро предоставляет очередь сообщений. В Linux см. MQ_OVERVIEW (7) для хорошего обзора. В качестве альтернативы, такие услуги, как Rabbitmq, предоставляют очереди сообщений с различными множествами функций, включая использование в использовании в сети.
Вы имеете в виду http://en.wikipedia.org/wiki/named_pipe ? Работает, как вы просили.