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

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

次のようなファイルシステム オブジェクトを作成する方法はありますか:

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

通常のファイルであるかのように検索できるようなファイルですか?

答え1

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) です。

答え2

今日はヒューズ ドライバーを書きました。ヒューズ ソリューションに興味がある方がいたら教えてください (デバイス マッパーと上記の nbd ソリューションは、通常のファイルではなくブロック デバイスを作成します。結果の出力をビデオ編集ソフトウェアやブロック デバイスから直接読み取る準備ができていない他のツールで直接使用する場合、破損します)

https://github.com/schlaile/concatfs

答え3

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

関連情報