web-dev-qa-db-ja.com

他のファイルの連結を含む仮想ファイル

これに似たファイルシステムオブジェクトを作成する方法はありますか?

mknod files p
cat file1 file2 ... fileN > files

しかし、それが通常のファイルであるかのように、それを探すことができるように?

13
Witiko

Linuxベースのオペレーティングシステムでは、ネットワークブロックデバイスまたはデバイスマッパーデバイスを使用して実行できます。取得するファイルはブロックデバイスです。

nbdの場合:

ln -s /path/to/first-file file.0
...
ln -s /path/to/last-file file.19
nbd-server -C /dev/null -m 127.0.0.1:12345 file

Sudo nbd-client localhost 12345 /dev/nbd0

(連結は/dev/nbd0)。

デバイスマッパーを使用する場合(ファイルサイズは512の倍数である必要があります):

Sudo losetup /dev/loop0 file1
Sudo losetup /dev/loop1 file2
s0=$(Sudo blockdev --getsize /dev/loop0)
s1=$(Sudo blockdev --getsize /dev/loop1)
printf '%s\n' "0 $s0 linear /dev/loop0 0" "$s0 $s1 linear /dev/loop1 0" |
  Sudo dmsetup create mybundle

(連結は/dev/mapper/mybundle)。

18

誰かがFuseソリューションに興味がある場合は、今日Fuseドライバーを作成しました(デバイスマッパーと上記のnbdソリューションは通常のファイルではなくブロックデバイスを作成します-結果の出力をビデオ編集で直接使用したい場合は壊れますブロックデバイスから直接読み取る準備が整っていないソフトウェアまたはその他のツール)

https://github.com/schlaile/concatfs

8
Peter

あなたは基本的に質問の最初の文で答えました:はい、それはできます。ただし、カスタムファイルシステムドライバーを作成する必要があります。それがファイルシステムオブジェクトであると想定されている場合は、カーネルによって何らかのレベルで処理される必要があります( Fuse を含む)。ドライバーは、標準のファイルシステムシステムコールAPI(stat()open()など、シークを含む)のバックエンドを提供する必要があります。ユーザースペースで完全にそれを行うことはできません(少なくともモノリシックカーネルではありませんが、マイクロカーネルでも、通常のユーザースペースプロセスとして実行されている場合でも、ファイルシステムドライバーを提供する必要があります)。

3
peterph