การต่อไฟล์เข้ากับไฟล์เสมือนบน Linux


9

บนระบบ Linux มีวิธีใดที่จะต่อเชื่อมไฟล์หลาย ๆ ไฟล์เข้ากับไฟล์ที่ถูกเปิดเผยเพื่อการอ่านและการเขียนในขณะที่ไม่ได้เพิ่มเนื้อที่ว่างบนดิสก์อีก N ไบต์? ฉันหวังว่าจะมีบางอย่างเช่นการติดตั้งไฟล์เหล่านี้ผ่านลูปแบ็ค / devmapper เพื่อทำสิ่งนี้ให้สำเร็จ

ฉันมีปัญหาที่มีไฟล์ไบนารีแยกที่สามารถรับได้ค่อนข้างใหญ่ ฉันไม่ต้องการเพิ่มความต้องการเนื้อที่ของฉันเป็นสองเท่าด้วยดิสก์ IO ขนาดใหญ่เพียงเพื่ออ่าน / เขียนเนื้อหาชั่วคราวจากไฟล์เหล่านี้โดยcatรวมเข้าด้วยกันเป็นไฟล์ขนาดมหึมา

ฉันพบโครงการนี้ที่นี่แต่ดูเหมือนว่าจะมีกรณีการใช้งานที่เฉพาะเจาะจงมากและยังขึ้นอยู่กับ Perl


ฉันเดาว่า FUSE ถูกประดิษฐ์ขึ้นเพื่อแก้ปัญหาแบบนี้ อาจเป็นไปได้ว่าคุณต้องเขียนโมดูลของคุณเอง แต่ไม่ควรยากเกินไป
Hauke ​​Laging

คำตอบ:


13

คุณสามารถทำได้โดยการรวมอุปกรณ์วนลูปและผู้ทำแผนที่อุปกรณ์ด้วย "ทุกอย่างคือไฟล์" แต่มีข้อ จำกัด เพียงข้อเดียว: ขนาดไฟล์ไม่สามารถเปลี่ยนแปลงได้ (เนื่องจากคุณไม่สามารถเพิ่มอุปกรณ์บล็อกได้โดยการเขียนลงไป) ดังนั้นหากคุณต้องการผนวกข้อมูลคุณต้องสร้างอุปกรณ์บล็อกที่ใหญ่กว่าและเขียนทับข้อมูลจำลองที่ต่อท้าย

# 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

สำหรับการขยายไฟล์คุณอาจสร้างไฟล์ขนาดใหญ่และใช้เป็นอุปกรณ์เพิ่มเติม


1

สิ่งนี้สามารถทำได้โดยใช้ไปป์ที่มีชื่อใน Linux

สมมติว่าคุณมีไฟล์ชื่อ file0, file1, file2, file3, file4, file5

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

ใน C โดยทางโปรแกรมคุณสามารถทำได้

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

จากนั้นใช้ไฟล์ mynewfile ตามที่คุณต้องการจากไฟล์ปกติ

mynewfile เป็นไฟล์ FIFO


0

สำหรับการอ่านคุณสามารถlessหลายไฟล์แล้วใช้:nและ:pตัวเลือกเพื่อผ่านไฟล์เหล่านั้น

สำหรับการเขียนโดยไม่ต้องเข้าถึงไฟล์โดยตรงคุณจะไม่สามารถเขียนไฟล์เหล่านั้นได้

คุณสามารถvimหลายไฟล์เช่นกันและมันก็จะผ่านไปเพื่อที่พวกเขาถูกเรียกว่า (เช่น. vim fileA fileB fileC- fileB เปิดหลังจาก fileA ปิด fileC เปิดหลังจาก fileB ปิด)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.