Verketten von Dateien zu einer virtuellen Datei unter Linux

10

Gibt es auf einem Linux-System eine Möglichkeit, eine Reihe von Dateien zum Lesen und Schreiben in eine exponierte Datei zu verketten, ohne tatsächlich weitere N Byte Speicherplatz zu belegen? Ich hatte gehofft, dass diese Dateien über Loopback / Devmapper gemountet werden, um dies zu erreichen.

Ich habe ein Problem, wenn es geteilte Binärdateien gibt, die ziemlich groß werden können. Ich möchte meinen Speicherplatzbedarf nicht mit massiven Festplatten-E / A-Vorgängen verdoppeln, nur um vorübergehend Inhalte aus diesen Dateien zu lesen / schreiben, indem catich sie alle zu einer riesigen Datei zusammenfasse.

Ich habe dieses Projekt hier gefunden , aber es scheint einen sehr spezifischen Anwendungsfall zu haben und hängt auch von Perl ab

Ryan
quelle
Ich denke, FUSE wurde erfunden, um diese Art von Problem zu lösen. Wahrscheinlich müssen Sie Ihr eigenes Modul schreiben, aber das sollte nicht zu schwierig sein.
Hauke ​​Laging

Antworten:

14

Sie können dies tun, indem Sie Loop-Geräte und Device Mapper kombinieren, dank "Alles ist eine Datei". Aber mit einer Einschränkung: Die Dateigröße kann nicht geändert werden (da Sie Blockgeräte nicht erhöhen können, indem Sie darauf schreiben). Wenn Sie also Daten anhängen möchten, müssen Sie ein größeres Blockgerät erstellen und die angehängten Dummy-Daten überschreiben.

# for testing, Create 4 files
echo foo | dd of=block0 cbs=512 conv=block
echo bar | dd of=block1 cbs=512 conv=block
echo bat | dd of=block2 cbs=512 conv=block
echo baz | dd of=block3 cbs=512 conv=block
# Create a loop device for each of the 4 files
losetup /dev/loop0 block0
losetup /dev/loop1 block1
losetup /dev/loop2 block2
losetup /dev/loop3 block3
# Create a device map named "test" using those loop devices
(
    echo "0 1 linear /dev/loop0 0"
    echo "1 1 linear /dev/loop1 0"
    echo "2 1 linear /dev/loop2 0"
    echo "3 1 linear /dev/loop3 0"
) | dmsetup create test
$EDITOR /dev/mapper/test # use overwrite mode only

Zum Erweitern der Datei können Sie eine große, spärliche Datei erstellen und diese als zusätzliches Gerät verwenden.

Hauke ​​Laging
quelle
1

Dies könnte unter Verwendung von Named Pipe unter Linux erfolgen.

Angenommen, Sie haben Dateien mit dem Namen file0, file1, file2, file3, file4, file5

# create a name pipe
$ mkfifo mynewfile
# cat to named file
$ cat file{0..5} > mynewfile &

In C können Sie programmgesteuert tun

mkfifo(mynewfile , 0777);
system("cat file{0..5} > mynewfile");

Verwenden Sie dann mynewfile wie wir, die Sie aus einer normalen Datei lesen würden.

mynewfile ist eine FIFO-Datei

katta
quelle
0

Zum Lesen können Sie lessmehrere Dateien verwenden und dann die Optionen :nund verwenden :p, um sie durchzugehen.

Zum Schreiben können Sie ohne direkten Zugriff auf die Dateien nicht darauf schreiben.

Sie können auch vimmehrere Dateien verwenden, und es wird nur die Reihenfolge durchlaufen, in der sie aufgerufen wurden (dh vim fileA fileB fileC- Datei B wird nach dem Schließen von Datei A geöffnet, Datei C wird nach dem Schließen von Datei B geöffnet).

BriGuy
quelle