- ベストアンサー
1Gのddがなぜ一瞬で終わる?
- 1Gのddが一瞬で終わる理由について
- コマンド実行が一瞬で終わる理由と生成されるイメージファイルの大きさについて
- 1Gのddコマンドが一瞬で終了する仕組みとイメージファイルの内容について
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
いわゆる穴開きファイルですね。dd でシークした1G先に1バイト書き込みましたが、その途中は OS としてはファイルサイズだけはマークして、実際に何か書き込まれるまでファイルシステム中に領域は確保しません。ですからこういうファイルを sparse file とか hole のある file とかいったりします。ただしファイルシステム依存です。 > ちゃんと全領域にゼロが書き込まれているようで、不思議です。 そういう領域に関して read() すると zero fill されたイメージを返しますのでそうなります。
その他の回答 (3)
MS-DOSでいう、VERYFY=ON 見たいのがあるんですかね。 穴あき、っていうと、キャッシュで折り返してると思うんですよ。 なので、検証したいならコマンド発行後、ACを抜いてみる。(までも無いけど) 折を見て、00000000 をディスクに書き込んでると思いますよ。(どうでもいいけど) 昔は印刷もCPUで行っていたので、終わるまでキーボードが効かなかった。 HDDも保存が終わるまで待たされたんですが、今はマルチタスクの時代ですからね。一瞬で終わります。 以前のHDDフォーマットは1日待たされましたが、今はセクターそのまま、一瞬で終わります。 昔はOSインストールは時間が掛かったのですがね。 ただし、最近でもNTFSをLinuxのEXT4に変えたら半日待たされましたよ。
お礼
ありがとうございます。 > 折を見て、00000000 をディスクに書き込んでると思いますよ。 HDDのアクセスランプをじっと見てみましたが、 コマンド実行後に HDD に書き込んでいる様子は全くないですね。 回答No.3 の方が書かれていることが正しいのでは?
- wormhole
- ベストアンサー率28% (1626/5665)
#2で既に書かれていますが穴あきファイルやスパースファイルというもので書き込まれているのは0バイト目からの1Gバイト分にはデータがないという情報と1Gバイト目の1バイトです。 ファイルシステム上でファイルが実際に使用しているサイズはlsに-sオプションを付けてみるかduで確認してみてください。
お礼
ありがとうございます。 たった 12キロバイトで 1GB のファイルを表現できてしまっているようです。 $ ls -s 1G.img 12 1G.img $ ls -s 1Grandom.img 12 1Grandom.img $ ls -s 1Gfullzero.img 1049604 1Gfullzero.img
パーティションとゼロフィルが瞬時に終わる・・・ということなんですが、1GBであれば瞬時に終わりますよね。20GBとか容量を上げ試験できますか?
お礼
ありがとうございます。 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
お礼
ありがとうございます。 そういう便利な仕組みがあるのですね。 おかげさまでよく理解できました。 $ hexdump -n 1073741825 1Grandom.img 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 40000000 00f5 40000001 /dev/urandomもゼロが書き込まれているようです。