• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:1Gのddがなぜ一瞬で終わる?)

1Gのddがなぜ一瞬で終わる?

このQ&Aのポイント
  • 1Gのddが一瞬で終わる理由について
  • コマンド実行が一瞬で終わる理由と生成されるイメージファイルの大きさについて
  • 1Gのddコマンドが一瞬で終了する仕組みとイメージファイルの内容について

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

いわゆる穴開きファイルですね。dd でシークした1G先に1バイト書き込みましたが、その途中は OS としてはファイルサイズだけはマークして、実際に何か書き込まれるまでファイルシステム中に領域は確保しません。ですからこういうファイルを sparse file とか hole のある file とかいったりします。ただしファイルシステム依存です。 > ちゃんと全領域にゼロが書き込まれているようで、不思議です。 そういう領域に関して read() すると zero fill されたイメージを返しますのでそうなります。

noname#214079
質問者

お礼

ありがとうございます。 そういう便利な仕組みがあるのですね。 おかげさまでよく理解できました。 $ hexdump -n 1073741825 1Grandom.img 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 40000000 00f5 40000001 /dev/urandomもゼロが書き込まれているようです。

その他の回答 (3)

noname#206655
noname#206655
回答No.4

MS-DOSでいう、VERYFY=ON 見たいのがあるんですかね。 穴あき、っていうと、キャッシュで折り返してると思うんですよ。 なので、検証したいならコマンド発行後、ACを抜いてみる。(までも無いけど) 折を見て、00000000 をディスクに書き込んでると思いますよ。(どうでもいいけど) 昔は印刷もCPUで行っていたので、終わるまでキーボードが効かなかった。 HDDも保存が終わるまで待たされたんですが、今はマルチタスクの時代ですからね。一瞬で終わります。 以前のHDDフォーマットは1日待たされましたが、今はセクターそのまま、一瞬で終わります。 昔はOSインストールは時間が掛かったのですがね。 ただし、最近でもNTFSをLinuxのEXT4に変えたら半日待たされましたよ。

noname#214079
質問者

お礼

ありがとうございます。 > 折を見て、00000000 をディスクに書き込んでると思いますよ。 HDDのアクセスランプをじっと見てみましたが、 コマンド実行後に HDD に書き込んでいる様子は全くないですね。 回答No.3 の方が書かれていることが正しいのでは?

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

#2で既に書かれていますが穴あきファイルやスパースファイルというもので書き込まれているのは0バイト目からの1Gバイト分にはデータがないという情報と1Gバイト目の1バイトです。 ファイルシステム上でファイルが実際に使用しているサイズはlsに-sオプションを付けてみるかduで確認してみてください。

noname#214079
質問者

お礼

ありがとうございます。 たった 12キロバイトで 1GB のファイルを表現できてしまっているようです。 $ ls -s 1G.img 12 1G.img $ ls -s 1Grandom.img 12 1Grandom.img $ ls -s 1Gfullzero.img 1049604 1Gfullzero.img

noname#206655
noname#206655
回答No.1

パーティションとゼロフィルが瞬時に終わる・・・ということなんですが、1GBであれば瞬時に終わりますよね。20GBとか容量を上げ試験できますか?

noname#214079
質問者

お礼

ありがとうございます。 20GB でもやはり一瞬で終わりますね。 /dev/urandom も一瞬で終わります。 $ time dd if=/dev/zero of=20G.img seek=20G bs=1 count=1 1+0 レコード入力 1+0 レコード出力 1 バイト (1 B) コピーされました、 0.000141045 秒、 7.1 kB/秒 real 0m0.004s user 0m0.000s sys 0m0.000s $ time dd if=/dev/urandom of=1Grandom.img seek=1G bs=1 count=1 1+0 レコード入力 1+0 レコード出力 1 バイト (1 B) コピーされました、 0.00019157 秒、 5.2 kB/秒 real 0m0.015s user 0m0.000s sys 0m0.000s ちなみに、seek を使わずにちゃんと書き込もうとすると 1GB では10秒以上かかります。 $ time dd if=/dev/zero of=1Gfullzero.img bs=1G count=1 1+0 レコード入力 1+0 レコード出力 1073741824 バイト (1.1 GB) コピーされました、 16.7921 秒、 63.9 MB/秒 real 0m16.858s user 0m0.004s sys 0m2.660s

関連するQ&A