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

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

Gibt es eine Möglichkeit, ein Dateisystemobjekt ähnlich diesem zu erstellen:

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

sondern so, dass darin gesucht werden kann, als wäre es eine normale Datei?

Antwort1

Auf Linux-basierten Betriebssystemen kann dies mit Netzwerkblockgeräten oder Gerätemappergerä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 Gerätemapper (Dateigrößen müssen 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).

Antwort2

habe heute einen Fuse-Treiber geschrieben, falls jemand an der Fuse-Lösung interessiert ist (sowohl der Device-Mapper als auch die obige NBD-Lösung erstellen Blockgeräte, keine normalen Dateien – was nicht funktioniert, wenn Sie die resultierende Ausgabe direkt mit Videobearbeitungssoftware oder anderen Tools verwenden möchten, die nicht darauf vorbereitet sind, direkt von einem Blockgerät zu lesen)

https://github.com/schlaile/concatfs

Antwort3

Sie haben es im Grunde schon im ersten Satz der Frage beantwortet: ja, das ist möglich. Allerdings müssten Sie dafür einen benutzerdefinierten Dateisystemtreiber schreiben. Wenn es ein Dateisystemobjekt sein soll, muss es auf einer bestimmten Ebene vom Kernel verarbeitet werden (das schließt ein:SICHERUNG). Der Treiber müsste ein Backend für die API der Standard-Dateisystem-Syscalls ( usw., einschließlich Suchen) bereitstellen stat(). open()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, auch wenn dieser als normaler Benutzerbereichsprozess ausgeführt wird).

verwandte Informationen