Dosyaları Linux'ta sanal bir dosyaya birleştirme


10

Bir Linux sisteminde, bir dizi dosyayı, aslında başka bir N bayt disk alanı kaplamasa da, okuma ve yazma için açıktaki bir dosyaya birleştirmenin bir yolu var mı? Bunu başarmak için geri döngü / devmapper aracılığıyla bu dosyaları montaj gibi bir şey umuyordum.

Oldukça büyük alabilirsiniz ikili dosyaları bölünmüş bir sorun var. Sadece catbir büyük dosyada bu dosyaları içeriğini geçici olarak okumak / yazmak için büyük disk IO ile alan gereksinimlerimi ikiye katlamak istemiyorum .

Bu projeyi burada buldum , ancak çok özel bir kullanım durumu var ve perl'e bağlı


Sanırım FUSE bu tür bir sorunu çözmek için icat edildi. Muhtemelen kendi modülünüzü yazmak zorundasınız ama bu çok zor olmamalı.
— Hauke ​​Laging

Yanıtlar:


14

Bunu, "her şey bir dosyadır" sayesinde döngü aygıtlarını ve aygıt eşleyiciyi birleştirerek yapabilirsiniz. Ancak bir sınırlama ile: Dosya boyutu değiştirilemez (çünkü blok cihazlarını yazarak artıramazsınız). Bu nedenle, veri eklemek istiyorsanız, daha büyük bir blok cihazı oluşturmanız ve eklenen kukla verilerin üzerine yazmanız gerekir.

# 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

Dosyayı genişletmek için büyük bir seyrek dosya oluşturabilir ve bunu ek cihaz olarak kullanabilirsiniz.


1

Bu Linux'ta adlandırılmış kanal kullanılarak yapılabilir.

Adında dosyalarınız olduğunu varsayın file0, file1, file2, file3, file4, file5

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

C'de programlı olarak şunları yapabilirsiniz:

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

Sonra normal dosyadan okuyacağımız gibi mynewfile kullanın.

mynewfile FIFO dosyasıdır


0

Okumak için, lessbirden fazla dosya oluşturabilir ve daha sonra dosyaları gözden geçirmek için :nve :pseçeneklerini kullanabilirsiniz.

Yazmak için, dosyalara doğrudan erişmeden dosyalara yazamazsınız.

Aynı zamanda vimbirden fazla dosya da vim fileA fileB fileCyazabilirsiniz ve sadece çağrıldıkları sırayla geçer (örn. - fileB kapatıldıktan sonra fileB açıldı, fileB kapatıldıktan sonra fileC açıldı).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.