ddはデータのコピーに適していますか?(または、read()およびwrite()が部分的である場合)
短いバージョン:どのような状況でddデータのコピーに使用しても安全なのは、部分的な読み取りまたは書き込みによる破損のリスクがないことを意味しますか? ロングバージョン—プリアンブル: dd多くの場合、特にデバイスとの間でデータをコピーするために使用されます(例)。これは、(実際にはマジックをやっているデバイスファイルの場合)、時には他のツールよりも低いレベルでのデバイスにアクセスすることができるという神秘的な性質を起因だ-まだdd if=/dev/sda同じものですcat /dev/sda。ddより速いと考えられることもありますがcat、実際にはそれを打ち負かすことができます。それにもかかわらず、dd時にはそれを本当に便利にするユニークな特性があります。 問題: dd if=foo of=bar実際には、と同じではありませんcat <foo >bar。ほとんどのuni¹¹で、ddを1回呼び出しますread()。(。の「入力ブロックの読み取り」を構成するものでPOSIXがあいまいであることがわかりますdd。)read()部分的な結果を返す場合(POSIXおよび他の参照文書によると、実装ドキュメントに特に記載がない限り許可されます)、部分的なブロックがコピーされます。まったく同じ問題が存在しwrite()ます。 観察:実際には、ddブロックデバイスと通常のファイルに対処できることがわかりましたが、それはあまり練習していない可能性があります。パイプのことになると、過ちを犯すことは難しくありませんdd。たとえば、次のコードを試してください: yes | dd of=out bs=1024k count=10 outファイルのサイズを確認します(10MBを大きく下回る可能性があります)。 質問:どのような状況でddデータのコピーに使用しても安全ですか?言い換えると、ブロックサイズ、実装、ファイルタイプなどのどの条件が、ddすべてのデータをコピーすることを保証できますか? (GNU ddには、ブロック全体を転送するためfullblockに呼び出しread()またはwrite()ループするように指示するフラグdd iflag=fullblockがあります。常に安全です。私のフラグは、これらのフラグ(他の実装には存在しない)が使用されない場合に関するものです) ¹ 私は、OpenBSD、GNUのcoreutilsのとBusyBoxの上でチェックしました。