Ghép các tệp thành một tệp ảo trên Linux


10

Trên hệ thống Linux, có cách nào để ghép một loạt các tệp thành một tệp được hiển thị để đọc và ghi trong khi không thực sự chiếm N byte không gian đĩa khác không? Tôi đã hy vọng một cái gì đó như gắn các tệp này thông qua loopback / devmapper để thực hiện điều này.

Tôi có một vấn đề trong đó có các tệp nhị phân phân chia có thể nhận được khá lớn. Tôi không muốn tăng gấp đôi yêu cầu không gian của mình với IO đĩa lớn chỉ để tạm thời đọc / ghi nội dung từ các tệp này bằng cách catkết hợp tất cả chúng lại thành một tệp lớn.

Tôi tìm thấy dự án này ở đây , nhưng nó dường như có một trường hợp sử dụng rất cụ thể và cũng phụ thuộc vào perl


Tôi đoán FUSE đã được phát minh để giải quyết loại vấn đề này. Có lẽ bạn phải viết mô-đun của riêng bạn nhưng điều đó không quá khó.
Hauke ​​Laging

Câu trả lời:


14

Bạn có thể làm điều đó bằng cách kết hợp các thiết bị lặp và trình ánh xạ thiết bị, nhờ "mọi thứ là một tệp". Nhưng với một hạn chế: Không thể thay đổi kích thước tệp (vì bạn không thể tăng các thiết bị khối bằng cách ghi vào chúng). Vì vậy, nếu bạn muốn nối thêm dữ liệu thì bạn phải tạo một thiết bị khối lớn hơn và ghi đè lên dữ liệu giả được nối thêm.

# 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

Để mở rộng tệp, bạn có thể tạo một tệp thưa thớt lớn và sử dụng tệp đó làm thiết bị bổ sung.


1

Điều này có thể được thực hiện bằng cách sử dụng ống có tên trong Linux.

Giả sử bạn có tệp có tên file0, file1, file2, file3, file4, file5

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

Trong C lập trình bạn có thể làm

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

Sau đó sử dụng rồi sử dụng mynewfile như chúng tôi bạn sẽ đọc từ tệp bình thường.

mynewfile là tập tin FIFO


0

Để đọc, bạn có thể lessnhiều tệp và sau đó sử dụng :n:pcác tùy chọn để đi qua chúng.

Để viết, không truy cập trực tiếp vào các tệp, bạn sẽ không thể ghi vào chúng.

Bạn cũng có thể vimnhiều tệp và nó sẽ đi theo thứ tự chúng được gọi (ví dụ vim fileA fileB fileC: - tệpB được mở sau khi tệpA đóng, tệp C được mở sau khi tệpB đóng).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.