[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[port139:01441] Re: ddコマンドオプション



根津です。

Tanaka Souji wrote:
> FreeBSD の man では noerror を指定した場合の解説して、
> sync が指定されている場合には NULL を、sync が指定され
> ていなければ入力ブロックは削除されるとあります。
> 
> Linux と FreeBSD では dd の実装に違いがあるのやもしれ
> ませぬが...インシデントレスポンス(ISBN-4798102954)で
> は以下のように記述されております。
> 
> 5章 137ページより引用
>   noerrorを指定した場合に回復不能なエラーが発生すると、
>   dd は強制的にすべて0(もしくはNull)で埋められたセクタ
>   ーを出力ストリームに書き出します。
> 
> これは、sync が指定された場合の動作と考えてよいので
> しょうか?

syncが何を"同期"しようとしているか考えていただくとよいかと・・・。
元々、UNIXの世界ではファイルシステムを無視したデバイスレベルでの
I/Oにddが利用されていますので、「ブロック番号」を「同期」(=ずれが
生じさせない)ようにしないとファイルシステムそのものが破壊されてしまう
からではないかと思うのですが・・・。
i-nodeから基本ブロック−エクステント・・・とブロック番号でファイルの
実体が指定されるので、これが崩れるとfsは崩壊します。

> 読み取りエラーが発生した際に、noerror が指定されてい
> る場合、ブロックが削除されるのか 0 でパディングされる
> のかが知りたいのですが...

素直にUNIX的に考えると、0で埋めておいてからbsサイズ分のread()システムコール
を発行して、その結果をそのまま出力しそうな気がします。
つまり、I/Oエラーが発生した場合でも、そのチェックだけnoerror扱いにして、
そのまま出力するのが素直な実装に見えます。

#化けたまま読み込んでいたらそのまま出力する・・・ということです。

わざわざ0で埋め直してから出力したのでは、ddの意味がありません。
(ddはデータの中身を基本的に加工しちゃいけないと思う)

#もちろん、データとして読み込めるものが一切なくて、装置から1バイトも
#データが送られてこなかったり、ドライバが「ゴミ」と判断して捨てる実装
#だったりした場合は、当然、オール0になるでしょうが・・・。(^^ゞ

-- 
------
根津 研介 日本Sambaユーザ会 / セキュリティ・スタジアム実行委員会 / (株)ファム
日本Sambaユーザ会      : http://www.samba.gr.jp
セキュリティスタジアム : http://www.security-stadium.org  <2002年もやります!>
ファムオープンソースセミナー : http://www.famm.jp
 ※日経ネットワークセキュリティ VOL.2 好評発売中
   http://nikkeibyte.com/Books/#NikkeiNetworkSecurity2