GNU / Linux:オーバーレイブロックデバイス/スタッカブルブロックデバイス


14

GNU / Linuxには、dirsをオーバーレイするユニオンマウントがあります。したがって、読み取り専用ディレクトリの上に書き込み可能なディレクトリをマウントできます。書き込み可能なディレクトリがマウント解除されると、読み取り専用ディレクトリは変更されません。

ブロックデバイスにも同じ機能を探しています-できれば書き込み可能な部分をファイルに保存してください。だから私は次のようなものを実行したいと思います:

device-setup /dev/newdevice /dev/read-only-device overlayfile

/ dev / newdeviceに書き込むと、変更はoverlayfileに保存されます。書き込まれたセクターを読み取る場合、overlayfileからデータを取得する必要があります。書き込まれていないセクターを読み取る場合、/ dev / read-only-deviceからデータを取得する必要があります。

そのようなツールは存在しますか?


回答:


22

これは、デバイスマッパーとそのsnapshotターゲットを使用して実行できます。

基本的に、書き込み可能なスナップショットを作成するときにLVMが行うことと同じことをします。

dev=/dev/read-only-device
ovl=/path/to/overlay.file
newdevname=newdevice
size=$(blockdev --getsz "$dev")

loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" |
  dmsetup create "$newdevname"

次に、オーバーレイされたデバイスにとしてアクセスできます/dev/mapper/newdevice

元のデバイスにも同時にアクセスする必要がある場合は、次の操作を実行できます。

printf '%s\n' "0 $size snapshot-origin $dev" |
  dmsetup create originaldevice

そしてアクセスし/dev/mapper/originaldeviceます。

そのデバイスに書き込むことができます。その後、スナップショットデバイスに書き込まれるチャンクに加えて、オーバーレイファイルには、スナップショットオリジンへの書き込み時に上書きされたチャンクのコピーが含まれます。

オーバーレイファイルはスパースファイルにすることができます。(たとえば、として作成しますtruncate -s10G the-file)、元のデバイスほど大きくする必要はありません。あなたはそれでどれくらいいっぱいかを知ることができますdmsetup status "$newdevname"

注:スナップショットデバイスにサイズとコンテンツの要件があります


1
その後の興味深い質問はacc.umulated変更は後で元のデバイスにマージすることができるかどうかである
IMZ -イワンZakharyaschev

1
その後の答え:はい。「デバイスマッパーを使用すると…*)ブロックデバイスのスナップショットをスナップショットのオリジンデバイスにマージして戻すことができます。」kernel.org/doc/Documentation/device-mapper/snapshot.txt
imz-Ivan Zakharyaschev 14

スナップショットターゲット(この場合は8)のchunksizeパラメーターはどういう意味ですか?選び方は?
imz-イヴァンザカリヤシェフ14

1
@Tom DMテーブル内のこれらの数値は、基礎となるブロックデバイスの物理セクターサイズではなく、常に512バイト単位を指します。そのため、8の倍数ではないものを使用して、4Kセクターのデバイスの上部にスナップショットを作成することは、悪い考えです。
ステファンシャゼラス

1
@Tom、チャンクサイズはスナップショットの粒度を決定します。オーバーレイファイルのFSのブロックサイズではなく、ブロックデバイス上にあるもので実行されるI / O操作の規則性です。したがって、ロールバック。getsz対getsizeをありがとう。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.