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.