dm-cryptスキームを合理的に拒否して餌データを更新する方法は?

dm-cryptスキームを合理的に拒否して餌データを更新する方法は?

私は今読んだ。この議論Linus Torvaldsと他の人の間でミラン・ブローズ、dm-cryptの管理者の一人です。

私は議論の次の部分に興味があります。

リヌス・トバルズ:隠された(「拒否できる」)ものを使う人は実際には絶対に使わないようです。使用完全に外部ファイルシステムなので、実際に暗号化された内容をそこに入れることができるので心配する必要はありません。

Milan Broz:まあ、データが「最新」に見えるように、外部を「使用」する必要があり、「隠されたOS」全体については、要求に応じて外部の餌OSから起動することもできます。 、何かがまさにそこで働くことを示すためのものです。

理論的には、餌データを使用することは信頼性を高めるのに良いことであるというMilanの意見に同意します。しかし、これは実際にどのように達成されますか?たとえば、内部ボリュームを上書きする危険なしに外部ボリュームに書き込む方法は何ですか?

私は、分離可能なヘッダーとデータオフセットを組み合わせた隠されたLUKSボリュームを長年使用してきました。通常、小さなLUKS暗号化外部ボリューム(20 GBなど)を作成し、EXT4でフォーマットし、餌データでいっぱいにし、その外部ボリュームのサイズ(500 GBなど)を増やし、内部ボリュームを作成します。 25GBです。

その後、私はLinusが言ったようにして、内部ボリュームのデータが破損するのを見て、外部ボリュームの餌データに触れるのを宗教的に避けました。

内部ボリュームのデータが破損する危険なしに外部ボリュームのデータを更新する方法はありますか?たとえば、ロールアウトの最初の20のショーに具体的に記録して、次の480のショーがめちゃくちゃにならないようにするツールはありますか?

私はHDDとSSDの両方を使用しているので、この質問は両方に当てはまります。

ベストアンサー1

これを安全に実行するにはいくつかの方法があります。新しい外部ボリュームまたは既存の外部ボリュームから開始する場合、アプローチも異なる場合があります。

おそらく最善の方法は、debugfs setb外部ファイルシステムをマウントし、その中のファイルを更新する前に、アンマウントされた外部ファイルシステムデバイスでコマンドを使用して内部ボリュームに属するブロック範囲を表示することです。

debugfs -c -R "setb <inner_start_blk> <inner_count>" /dev/<outer>

setb block [count]
    Mark the block number block as allocated.  If the optional argument
    "count" is present, then "count" blocks starting at block number 
    "block" will be marked as allocated.

ファイルに区切られた範囲がある場合は、次のようにブロック範囲を使用してファイルをパイピングして複数のsetbコマンドをスクリプトできます。

setb <range1> <count1>
setb <range2> <count2>
:

debugfsファイルを読むにはdebugfs -c -f <file> /dev/<outer>

外部ファイルシステムの最後に内部ボリュームを圧縮するだけでなく、よりスマートになりたい場合は、最初にfallocate -s 32M mydir/inner外部ファイルシステムに内部ボリュームを作成した後、次のブロック範囲を作成できますdebugfs

# debugfs -c -R "stat mydir/inner" /dev/vg_root/lvhome
Inode: 263236   Type: regular    Mode:  0664   Flags: 0x80000
Generation: 2399864846    Version: 0x00000000:00000001
User:  1000   Group:  1000   Project:     0   Size: 32499577
File ACL: 0
Links: 1   Blockcount: 63480
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x63c98fc0:62bb0a38 -- Thu Jan 19 11:45:20 2023
 atime: 0x63cee835:5e019630 -- Mon Jan 23 13:04:05 2023
 mtime: 0x63c98fc0:559e2928 -- Thu Jan 19 11:45:20 2023
crtime: 0x63c98fc0:41974a6c -- Thu Jan 19 11:45:20 2023
Size of extra inode fields: 32
Extended attributes:
  security.selinux (37) = "unconfined_u:object_r:user_home_t:s0\000"
EXTENTS:
(0-7934):966656-974590

この例では、〜32MB(7935x4KiBブロック)ファイルはブロック966656-974590にあり、そのsetb 966656 7935ブロックを使用済みとしてマークするために使用されます。clri <inum>割り当てられたブロック範囲が後で表示されないようにするには、inodeをクリアする必要があります。

外部ファイルシステムに割り当てられたブロックは、debugfs setb次に外部ファイルシステムでe2fsckが実行されるまで割り当てられたままです。誰かがこれを行うと、使用中のブロックが「露出」する可能性があります。本物したがって、外部ファイルシステムをアンマウントした後、 `debugfs -c -R "clrb <inner_start> <inner_count>" /dev/"を使用して外部ファイルシステムを再度クリアするか、割り当てを保存して可能な破損を防ぐオプションがあります。 .内部ファイルシステム。

おすすめ記事