本資料は、サイズは大きいが、実際にはディスクを消費していないファイル(スパースファイル)を作る操作手順を記しています。
以下の操作によりディスクを消費していないのに大きなファイルを作る(スパースファイル)の作成することができます。
Linuxのファイルシステムには、スパースファイルというファイルサイズと実際のディスク消費量が異なるファイルを作成する機能があります。
ファイルの中で、まだ実際にデータが存在していない部分はディスクを使わず、データが書き込まれた時点で初めてディスク上に領域を確保します。
実際に作成したスパースファイルと通常のファイルを比較します。
名前の通りfile_spaseはスパースファイル
file_no_sparseが通常ファイルです。
ls -l を実行すると2つのファイルは同じサイズと報告されます。
% ls -l 合計 1048580 -rw-rw-r-- 1 user01 user01 1073741824 8月 22 23:41 file_no_sparse -rw-rw-r-- 1 user01 user01 1073741824 8月 22 23:44 file_sparse t%
しかし、ls に -sオプションを付けて、ディスク上の割り当てられているブロック数を表示すると、
% ls -l --size
合計 1048580
1048580 -rw-rw-r-- 1 user01 user01 1073741824 8月 22 23:41 file_no_sparse
0 -rw-rw-r-- 1 user01 user01 1073741824 8月 22 23:44 file_sparse
%
file_sparseはディスク上のブロックを何も使っていません。
以下にスパースファイルの使用用途について記述します。
スパースファイルは、コアダンプファイルなどで利用されています。
メモリダンプのデータが存在していない部分はスパースとして扱えば無駄なディスク領域を消費しません。
また、kvmやxenなどの仮想マシンのマシンイメージにも利用されることがあります。
ユーザが自分でスパースファイルを作るのは、
ループバックファイル(ファイルをディスクのパーティションのように扱い、そのファイルの中にファイルシステムを作りマウントする)を作成する場合です。
数十、数百GBのサイズのループバックも一瞬で作成でき、しかも実際にデータを書き込むときまではディスク領域を必要としません。
また、ネットワークのスループットやサーバ性能を計測するときの送受信のファイルを作るのにも使えます。
ローカルのマシン上では実際のディスク消費はほとんどありませんが、
ネットワーク上では実際のデータ(スパースな部分は0が書き込まれている)として扱われるからです。
スパースファイルを作成するには、ddコマンドを利用します。
% dd if=/dev/zero of=file_sparse bs=1M seek=1024 count=0 0+0 レコード入力 0+0 レコード出力 0 バイト (0 B) コピーされました、 1.788e-05 秒、 0.0 kB/秒 % ls -l --size 合計 0 0 -rw-rw-r-- 1 user01 user01 1073741824 8月 23 00:09 file_sparse %
ifの指定で/dev/zeroを読み込み元とします。
ofが作成するスパースファイル名。bsで一度に読み込むデータサイズを指定。
seekでスキップ数、この場合はbs指定の何倍かという意味になります。
そしてcountの読み書き実行の回数を0とします。
この組合せでddの作成するファイルがスパースファイルになります。
なお、スパースファイルは実際のディスク容量を越えたサイズも作成できます。
% df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/ubuntu-root 7.3G 3.8G 3.1G 55% / udev 489M 4.0K 489M 1% /dev tmpfs 200M 512K 199M 1% /run none 5.0M 0 5.0M 0% /run/lock none 498M 0 498M 0% /run/shm cgroup 498M 0 498M 0% /sys/fs/cgroup % ls -lh 合計 0 -rw-rw-r-- 1 user01 user01 9.8T 8月 22 23:59 file_sparse %
もちろん、実際のディスク容量を越えて、これだけのデータを書き込むことはできません。
以上、サイズは大きいが、実際にはディスクを消費していないファイル(スパースファイル)を作る方法についてでした。