Виртуальный файл, содержащий конкатенацию других файлов

Как всегда, необходимо прочитать страницу справочника команды, чтобы узнать, как она интерпретирует свои аргументы.

-- является наиболее часто используемым для указания на конец опций команды. Это особенно полезно, если Вы хотите передать имя файла или другой аргумент, который начинается -. Это - также хорошая идея использовать его перед подстановочными знаками, которые могли бы расшириться до имени файла, начинающегося с дефиса. (Например, попробовать mkdir foo; cd foo; echo >-l; ls *; ls -- *.)

Но git diff также использование это, чтобы указать, является ли аргументом a <commit> (указание, что пересмотр разности) или a <path> (указание, который файл к разности). Это может обычно предполагать, но для значения возможно быть и допустимой фиксацией и допустимым путем. В этом случае можно использовать git diff foo -- указать на это foo фиксация, или git diff -- foo указать на это foo путь.

13
09.10.2013, 00:48
3 ответа

В основанных на Linux операционных системах, которые могут быть сделаны с сетевыми блочными устройствами или устройствами картопостроителя устройства. Файл, который Вы получаете, является блочным устройством.

С nbd:

ln -s /path/to/first-file file.0
...
ln -s /path/to/last-file file.19
nbd-server -C /dev/null -m 127.0.0.1:12345 file

sudo nbd-client localhost 12345 /dev/nbd0

(конкатенация /dev/nbd0).

С картопостроителем устройства (размеры файла должны быть несколькими из 512):

sudo losetup /dev/loop0 file1
sudo losetup /dev/loop1 file2
s0=$(sudo blockdev --getsize /dev/loop0)
s1=$(sudo blockdev --getsize /dev/loop1)
printf '%s\n' "0 $s0 linear /dev/loop0 0" "$s0 $s1 linear /dev/loop1 0" |
  sudo dmsetup create mybundle

(конкатенация /dev/mapper/mybundle).

18
27.01.2020, 19:52

Вы в основном ответили на это в первом предложении вопроса: да, это может быть сделано. Однако необходимо было бы записать пользовательский драйвер файловой системы. Если это, как предполагается, объект файловой системы, это должно быть обработано ядром на некотором уровне (который включает FUSE). Драйвер должен был бы обеспечить бэкенд для стандартной файловой системы syscalls API (stat(), open() и т.д., включая поиск). Вы не можете сделать этого полностью в пространстве пользователя (по крайней мере, не с монолитным ядром - но даже с микроядром необходимо было бы все еще обеспечить драйвер файловой системы, хотя работая как регулярный процесс пространства пользователя).

3
27.01.2020, 19:52
  • 1
    Довольно очевидно, что это может быть сделано. То, на предмет чего мне любопытно, - существует ли какой-либо быстрый взлом способ достигнуть этого использования стандарта un*x пакеты – предпочтительно через удар w/o потребность записать выделенный драйвер пространства ядра. –  Witiko 08.10.2013, 12:37
  • 2
    видит ответ Stephane - я полностью забыл картопостроитель устройства. –  peterph 08.10.2013, 13:38

Сегодня написал драйвер fuse, если кому-то интересно решение fuse. (маппер устройств, а также nbd-решение выше создадут блочные устройства, а не обычные файлы - что приведет к поломке, если вы захотите использовать полученный результат непосредственно с программами видеомонтажа или другими инструментами, которые не готовы читать из блочных устройств напрямую)

https://github.com/schlaile/concatfs

8
27.01.2020, 19:52

Теги

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