このエントリーをはてなブックマークに追加


実際にはディスクを消費していないファイル(スパースファイル)を作る方法

本資料は、サイズは大きいが、実際にはディスクを消費していないファイル(スパースファイル)を作る操作手順を記しています。
以下の操作によりディスクを消費していないのに大きなファイルを作る(スパースファイル)の作成することができます。


スパースファイルとは

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
%

もちろん、実際のディスク容量を越えて、これだけのデータを書き込むことはできません。

以上、サイズは大きいが、実際にはディスクを消費していないファイル(スパースファイル)を作る方法についてでした。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:29:48