Linuxでファイルを仮想ファイルに連結する


10

Linuxシステムで、実際に別のNバイトのディスク領域を占有せずに、一連のファイルを1つの公開されたファイルに連結して読み書きできるようにする方法はありますか?これを実現するために、loopback / devmapperを介してこれらのファイルをマウントするようなものを望んでいました。

非常に大きくなる可能性がある分割バイナリファイルが存在するという問題があります。これらのファイルをcatすべて1つの巨大なファイルにまとめることにより、これらのファイルからコンテンツを一時的に読み書きするだけのために、大容量ディスクIOでスペース要件を2倍にしたくありません。

ここでこのプロジェクトを見つけましたが、非常に特殊なユースケースがあるようで、perlにも依存しています


FUSEはこの種の問題を解決するために発明されたと思います。おそらくあなたはあなた自身のモジュールを書かなければなりませんが、それはそれほど難しくないはずです。
Hauke Laging 2013年

回答:


14

「すべてがファイルです」のおかげで、ループデバイスとデバイスマッパーを組み合わせることでそれを実現できます。ただし、1つの制限があります。ファイルサイズを変更することはできません(ブロックデバイスに書き込むことでデバイスを増やすことができないため)。したがって、データを追加する場合は、より大きなブロックデバイスを作成し、追加されたダミーデータを上書きする必要があります。

# 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.