Linux에서 파일을 가상 파일로 연결 읽기 및 쓰기를 위해 일련의 파일을 하나의

Linux 시스템에서 실제로 다른 N 바이트의 디스크 공간을 차지하지 않으면 서 읽기 및 쓰기를 위해 일련의 파일을 하나의 노출 된 파일로 연결하는 방법이 있습니까? 이것을 달성하기 위해 루프백 / devmapper를 통해 이러한 파일을 마운트하는 것과 같은 것을 원했습니다.

꽤 큰 분할 이진 파일이있는 문제가 있습니다. 방대한 디스크 IO로 공간 요구 사항을 두 배로 늘리고 싶지 않기 때문에 이러한 파일의 내용을 cat모두 하나의 거대한 파일로 모아서 일시적으로 읽고 쓸 수 있습니다.

이 프로젝트를 여기 에서 찾았 지만 매우 구체적인 사용 사례가 있고 펄에 따라 다릅니다.



답변

“모든 것은 파일”덕분에 루프 장치와 장치 매퍼를 결합하여이를 수행 할 수 있습니다. 그러나 한 가지 제한 사항 : 파일 크기는 변경할 수 없습니다 (블록 장치에 쓰면 블록 장치를 늘릴 수 없으므로). 따라서 데이터를 추가하려면 더 큰 블록 장치를 만들고 추가 된 더미 데이터를 덮어 써야합니다.

# 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

파일을 확장하기 위해 큰 스파 스 파일을 만들어 추가 장치로 사용할 수 있습니다.


답변

이것은 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 파일입니다


답변

읽기 위해 less여러 파일을 사용한 다음 :n:p옵션을 사용하여 파일 을 살펴볼 수 있습니다.

쓰기 위해 파일에 직접 액세스하지 않으면 파일에 쓸 수 없습니다.

vim여러 파일도 가능 하며 파일 순서대로 진행됩니다 (예 : vim fileA fileB fileCfileA가 닫힌 후 fileB가 열리고 fileB가 닫힌 후 fileC가 열림).