Eine virtuelle Datei, die die Verkettung anderer Dateien enthält

13

Gibt es eine Möglichkeit, ein Dateisystemobjekt wie folgt zu erstellen:

mknod files p
cat file1 file2 ... fileN > files

aber so, dass es gesucht werden kann, als ob es eine reguläre Datei wäre?

Witiko
quelle

Antworten:

18

Auf Linux-basierten Betriebssystemen kann dies mit Netzwerkblock- oder Gerätezuordnungsgeräten erfolgen. Die Datei, die Sie erhalten, ist ein Blockgerät.

Mit 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

(Die Verkettung ist /dev/nbd0).

Mit Device Mapper (Dateigröße muss ein Vielfaches von 512 sein):

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

(Die Verkettung ist /dev/mapper/mybundle).

Stéphane Chazelas
quelle
8

habe heute einen Sicherungstreiber geschrieben, wenn sich jemand für die Sicherungslösung interessiert (der Geräte-Mapper sowie die obige nbd-Lösung erzeugen keine regulären Dateien für Blockgeräte - die kaputt gehen, wenn Sie die resultierende Ausgabe direkt für die Videobearbeitung verwenden wollen Software oder andere Tools, die nicht bereit sind, direkt von einem Blockgerät zu lesen)

https://github.com/schlaile/concatfs

Peter
quelle
Sehr lehrreich und einfach zu verwendender Quellcode! Danke, dass du es geschafft und geteilt hast!
Grzegorz Wierzowiecki
3

Grundsätzlich haben Sie im ersten Satz der Frage geantwortet: Ja, das geht. Sie müssen jedoch einen benutzerdefinierten Dateisystemtreiber schreiben. Wenn es sich um ein Dateisystemobjekt handeln soll, muss es auf einer bestimmten Ebene (einschließlich FUSE ) vom Kernel verarbeitet werden . Der Fahrer müßte bieten Backend für das Standard - Dateisystem syscalls API ( stat(), open()usw., einschließlich der Suche nach). Sie können dies nicht vollständig im Benutzerbereich tun (zumindest nicht mit einem monolithischen Kernel - aber selbst mit einem Mikrokernel müssten Sie immer noch einen Dateisystemtreiber bereitstellen, obwohl dieser als regulärer Benutzerbereichsprozess ausgeführt wird).

peterph
quelle
Es ist ziemlich offensichtlich, dass es getan werden kann. Ich bin gespannt, ob es einen schnellen Hack gibt, um dies mit den Standard-un * x-Paketen zu erreichen - vorzugsweise über bash ohne die Notwendigkeit, einen dedizierten Kernel-Space-Treiber zu schreiben.
Witiko
1
Siehe Stephanes Antwort - Ich habe den Device Mapper komplett vergessen.
Peterph