
私は8GBのスパースファイルを作成しました。
dd if=/dev/zero of=/sparse-file bs=1 count=0 seek=8G
そして私は
echo "test" >> /sparse-file
du -sh sparse-file
16K が表示され、8.1Gとdu -sh --apparent-size sparse-file
表示されます。
ファイルにデータを書き込むとスパース ファイルのゼロが上書きされると思っていましたが、実際には大きくなります。なぜそうなるのでしょうか。実際のデータを 8 GB 入力し始めると、見かけのサイズは 16 GB になるのでしょうか。
ここで「count」は具体的に何をするのでしょうか?
答え1
「スパース」ファイルは、ゼロで埋められていると想定される空のギャップがあるファイルですが、その想定だけで十分です。つまり、ファイルを読み取るとゼロが返されますが、ゼロであることがわかっているので、実際に 8 GB 分のゼロを書き出す必要はありません。「実際にスペースを割り当てなくても、ここに大きなファイルがあることに同意しましょう」と言うだけで十分です。
ファイルの空の内容を上書きすると、保存する内容に合わせてディスク上にブロックが割り当てられます(ゼロだけであるとは考えられなくなるため)。しかし、追加ファイルに何かを追加すると、何も上書きされません。末尾に追加されるだけです。つまり、追加するとディスク上にブロックが割り当てられますが、それらのブロックは代わりを務める既存の「架空の」ブロックの代わりに、作成したブロックが架空のブロックの後に末尾に追加されます。
さらに追加することもできますもっとファイルを作成するのと同じ操作で、仮想ブロックをdd -skip
作成できます。「仮想」ブロックは、すべて一緒にある必要はありません。実際、ファイル内の既存のブロックを上書きすると、上書きしたブロックのみが割り当てられますファイル内のどこにあっても、ブロックはゼロで埋められます。つまり、位置 101 にブロックを書き込むと、ブロック 1 から 99 までが自動的に割り当てられてゼロで埋められるわけではありません。
答え2
まず、count=0
では からゼロブロックしかコピーされません/dev/zero
。つまり、何も行われませんseek=8G
。8GB のブロックがスキップされました。 で同じことを行いたいのですcount=1
が、 を完全に省略できると思います。
残りは読んでくださいマンドゥこのapparent-size
オプションは、実際のディスク使用量ではなく、見かけのサイズを出力します。したがって、最初のコマンドでは、ファイルがディスク上で 16K を必要とすると報告されましたが、見かけのサイズは 8.1GB です。
16K未満のコンテンツを含むファイルでも、使用されているファイルシステムによっては、ディスク上に16Kのスペースが必要になる場合があります。GNU Coreutils の説明:
たとえば、改行のない「zoo」という単語を含むファイルは、当然ながら見かけのサイズは 3 になります。このような小さなファイルは、ファイルが存在するファイル システムの種類と構成に応じて、0 から 16 KiB 以上のディスク領域を必要とする場合があります。ただし、次のコマンドで作成されたスパース ファイルは次のようになります。
dd bs=1 seek=2GiB if=/dev/null of=big
見かけのサイズは 2 GiB ですが、ほとんどの最新システムでは、実際にはディスク領域をほとんど使用しません。