私は自分の学習のためにファイル穴を持つファイルを作成しようとしてきました。私はstdinから読み込んでファイルに書き込むユーティリティを作成しましたが、ファイルに書き込む前にファイルの終わりを超えてlseekの複数バイトを使用します。
fh -b 20000 testfile
hello
there
プロセスを開始した後、入力( "hello")を入力してテストファイルに書き込むことができますが、その前にファイルの最後に20000バイトを探します。その後、書き込む前に「そこに」書き込む前に、ファイルの終わりに別の20000バイトをもう一度見つけます。
私にとって明確ではないのは、新しく作成されたファイルに割り当てられたブロックの数です。もし私がするなら
ls -ls testfile
割り当てられたブロックは8個、ファイルサイズは40013(予想)です。
13バイト(ファイルホールなし)の新しいファイルが4ブロックに割り当てられますls -ls
。これは実際には1ブロック(2048バイトのブロック)を意味することがわかりましたが、報告されたブロックは512バイトに均等に分けることができます。したがって、これが真であると仮定すると、計算はファイルの脆弱性を持つファイルを計算しません。物理ファイルサイズが(論理サイズ40013ではない)13バイトに過ぎず、8つのブロックが割り当てられるのはなぜですか?それでも4バイトでなければなりませんか?
ブロックサイズを正しく読んでいるかどうかはわかりません。第二に、ファイル穴がない同様のサイズのファイルは4つしかないことを考慮すると、ブロックサイズがなぜ8なのか理解できません。
私はext4ファイルシステムでUbuntu 11.10を実行しています。
答え1
Ext4はブロックサイズとして1kB、2kB、または4kBを使用できます。私が知っている限り、Ubuntuのデフォルト値は4kBです。ここで、ブロックは特定のファイルシステムに対して一定のファイルブロックサイズである。説明するファイルには、ゼロ以外の2つのブロックがあります。 1 つは埋め込みhello
(前に 3616、後に 474 のゼロで囲まれています)、もう 1 つはhere
(前に 3148 バイトのみを含み、474 が後に続く 0 の束) を含みます.ファイルの終わり)。合計2つの4kBブロックがあります。
出力では、ls
ブロックはコマンドで選択された単位であり、ls
デフォルトは1kBです。ファイルデータを含めるために2つの4kBブロックが割り当てられているため、ファイルに割り当てられるサイズは8kBです。
あなたの混乱は2つのことによって引き起こされる可能性があります。まず、ブロックあたり2048バイトが可能ですが、これはUbuntu(またはほとんどの最新のディストリビューション)ではデフォルトではなく、システムの値でもありません。tune2fs -l /dev/sdz42
(ファイルシステムデバイスの物理パスを使用して)実行してブロックサイズを確認できます。
第二に、スパースファイルは完全にゼロで構成されたブロックを保存しません。ブロック(最小ext4を含むほとんどのファイルシステムでは、ブロックサイズの境界に合わせてソートする必要があります)にゼロやその他の内容が含まれている場合、ブロック全体がディスクに保存されます。したがって、対応する40012バイトファイル(どのようにして40013バイトを取得しましたか?)には、すべてゼロの4つの非保存ブロックがあり、その後にゼロで囲まれたストレージブロックがあり、hello
次にすべて0の別の4つの非保存ブロックがあります。ブロックがあります。ブロック。ブロック、そして霊合を含む最後の部分ブロックですthere
。
標準シェルコマンドを使用してユーティリティを作成できます。
n=20000
while IFS= read -r line; do
dd bs=1 seek=$n </dev/null
echo "$line"
done >testfile