Буферизация (названная) каналом в GNU ОС

Можно сделать это с картопостроителем устройства и 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 на устройстве снимка.

9
26.10.2014, 18:02
2 ответа

Именованная труба (FIFO) может делать то, что вы хотите до точки, но с парой предостережений:

  1. Если вы хотите иметь возможность писать в трубу до того, как читатель существует, ваш писатель должен открыть ФИФО как чтение - запись или звонок на открыть . В оболочке это может выглядеть так:

     EXEC 3 <> / Путь / к / трубу
    echo "foo"> & 3
    кот <& 3
     

    Как вы можете видеть там, я могу написать в трубу до того, как читатель будет рядом. Как только я прочитаю из трубы, сообщения, которые я написал уже там.

  2. Пишены на трубу, в конечном итоге блокируют, как только труба заполнит. Согласно трубу (7) на Linux:

труба имеет ограниченную емкость. Если труба заполнена, то запись (2) заблокирует или не удается, в зависимости от того, установлен ли флаг O_NONBLOCK (см. Ниже). Различные реализации имеют разные ограничения для емкости трубы. Приложения не должны полагаться на определенную емкость: приложение должно быть спроектировано так, чтобы процесс чтения потребляет данные, как только он доступен, так что процесс написания не остается заблокированным.

В версиях Linux до 2.6.11 емкость трубы была такой же, как размер страницы системы (например, 4096 байтов на i386). Поскольку Linux 2.6.11 емкость трубы составляет 65536 байтов.

В зависимости от случая использования вы также можете рассмотреть возможность использования очереди сообщений. Ядро предоставляет очередь сообщений. В Linux см. MQ_OVERVIEW (7) для хорошего обзора. В качестве альтернативы, такие услуги, как Rabbitmq, предоставляют очереди сообщений с различными множествами функций, включая использование в использовании в сети.

5
27.01.2020, 20:07

Вы имеете в виду http://en.wikipedia.org/wiki/named_pipe ? Работает, как вы просили.

-2
27.01.2020, 20:07

Теги

Похожие вопросы