du および ls コマンドを使用しているときに、一部のファイルのディスク使用量の違いを観察したことがありますか。例:
$ du -sh /u02/ticoprd/redo/* 515M redo1a.rdo 524M redo3b.rdo 518M redo4a.rdo
$ ls -ltrh /u02/ticoprd/redo/* -rw-r----- 1 oticoprd dba 1.1G Aug 4 01:09 redo1a.rdo -rw-r----- 1 oticoprd dba 1.1G Aug 4 02:32 redo3b.rdo -rw-r----- 1 oticoprd dba 1.1G Aug 4 03:51 redo4a.rdo
「ls」コマンドではファイル サイズが 1.1GB と表示されるのに対し、「du」コマンドではファイル サイズが 515MB しか表示されないことがわかります。これらのファイルはスパース ファイルです。 「ls」はファイルの見かけのサイズを表示しており、「du」はディスク上に存在するファイルの実際のサイズを表示しています。
スパース ファイルは、ファイルに割り当てられたブロックがほとんど空である場合に、ファイル システム領域をより効率的に使用しようとするコンピュータ ファイルの一種です。これは、ブロックを構成する実際の「空の」スペースの代わりに、空のブロックを表す簡単な情報 (メタデータ) をディスクに書き込むことによって実現されます。ディスクに割り当てられた領域)。完全なブロック サイズは、ブロックに「実際の」(空でない) データが含まれている場合にのみ、実際のサイズとしてディスクに書き込まれます。
スパース ファイルを読み取る場合、ファイル システムは実行時に、空のブロックを表すメタデータをゼロ バイトで満たされた「実際の」ブロックに透過的に変換します。アプリケーションはこの変換を認識しません。スパース ファイルは、ディスク イメージ、データベース スナップショット、ログ ファイルなどによく使用されます。
スパース ファイルの利点は、実際に必要な場合にのみストレージが割り当てられることです。ディスク容量が節約され、ファイル システムに十分な空き容量がない場合でも大きなファイルを作成できます。
欠点は、スパース ファイルが断片化される可能性があることです。ファイル システムの空き容量レポートは誤解を招く可能性があり、それらを明示的にサポートしていないプログラムでスパース ファイルをコピーすると、ディスク上にないほとんどゼロのスパース セクションを含むファイルの圧縮されていないサイズ全体がコピーされる可能性があります — メリットが失われますファイル内のスパース プロパティの。
この動作は /var/log/lastlog ファイルで確認できます。
# ls -lh /var/log/lastlog -rw-r--r--. 1 root root 144K Sep 8 22:45 /var/log/lastlog
# du -sh /var/log/lastlog 40K /var/log/lastlog
スパース ファイルの作成
dd コマンドを使用してスパース ファイルを作成できます:
# dd if=/dev/zero of=sparse_file bs=1 count=0 seek=512M 0+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000381714 s, 0.0 kB/s
# ls -hl sparse_file -rw-r--r--. 1 root root 512M Sep 9 00:13 sparse_file
# du -sh sparse_file 0 sparse_file
「ls」コマンドでファイルのディスク使用量を確認するには、「-s」オプションを使用できます。
# ls -lhs sparse_file 0 -rw-r--r--. 1 root root 512M Sep 9 00:13 sparse_file
「du」を使用してファイルの見かけのサイズを表示するには、–apparent-size オプションを使用できます。
# du -h --apparent-size sparse_file 512M sparse_file
「cp」コマンドでスパース ファイルをコピー
「cp」はスパース ファイルをサポートし、それを検出するのに適しているため、「cp」を実行するだけで十分です。ただし、cp には –sparse=WHEN オプションがあります。
# cp --sparse=always sparse_file sparse_file.2