cp --sparseオプションの使い方|スパースファイルを効率よくコピーする方法を初心者向けに解説!
生徒
「Linuxで大きなファイルをコピーしたら、すごく時間がかかってディスクの容量もいっぱいになりました……。もっと効率的にコピーできる方法ってありますか?」
先生
「それはスパースファイルかもしれませんね。cpコマンドの--sparseオプションを使うと、空白部分をムダにコピーせず効率化できますよ。」
生徒
「スパースファイルって何ですか? 普通のファイルとどう違うんですか?」
先生
「スパースファイルとは、巨大だけど中身がスカスカのファイルのことです。ファイルサイズをムダに増やさない工夫がされています。詳しく見てみましょう!」
1. スパースファイルとは?
スパースファイル(sparse file)とは、中身の大部分が「ゼロ(空)」で埋められている特殊なファイルです。
たとえば、サイズは1GBあるように見えても、実際に保存されているデータはほんの少しということがあります。Linuxでは、このようなファイルを効率よく扱える仕組みがあります。
こうしたファイルを普通にコピーすると、ゼロの部分も全部コピーしてしまい、時間もディスク容量もムダに使ってしまいます。
2. --sparseオプションの基本
--sparseオプションを使うと、コピー時に空白部分を再現しながらムダな書き込みを省略できます。
つまり、スパースファイルの特性を活かして、コピー先でも「実際に必要な部分」だけをコピーすることができます。
基本的な使い方は以下のとおりです。
cp --sparse=always source.img destination.img
3. 実際にスパースファイルを作って試そう
Linuxではddコマンドを使って、スパースファイルを作ることができます。以下のコマンドを使って、ゼロで埋められた空のファイルを作成してみましょう。
dd if=/dev/zero of=sparse_file.img bs=1 count=0 seek=1G
このファイルは1GBと表示されますが、実際のディスク使用量はほとんどありません。
ls -lh sparse_file.img
-rw-r--r-- 1 user user 1.0G ... sparse_file.img
du -h sparse_file.img
0 sparse_file.img
ここで普通にコピーすると、空白も含めてコピーされ、実際のディスク使用量が増えることがあります。
cp sparse_file.img full_copy.img
du -h full_copy.img
1.0G full_copy.img
しかし、--sparse=alwaysを使えば、スパース性が維持され、コピー先も効率的になります。
cp --sparse=always sparse_file.img sparse_copy.img
du -h sparse_copy.img
0 sparse_copy.img
4. --sparseオプションの指定方法
--sparseには、以下のような指定方法があります。
auto(デフォルト):元のファイルがスパースなら自動的にスパースとしてコピーalways:必ずスパースとしてコピーnever:スパースとしてコピーせず、すべての領域をコピー
明確にスパース性を保ちたいときは、--sparse=alwaysをおすすめします。
5. rsyncとの違いに注意
rsyncもスパースファイルをコピーできますが、--sparseオプションを明示的に指定する必要があります。
rsync --sparse sparse_file.img destination/
しかし、rsyncは設定が複雑で、初学者には少しハードルが高いことも。cp --sparseの方が扱いやすく、ファイルの性質を知る練習にもなります。
6. スパースファイルが使われる場面
スパースファイルは、次のような場面で使われます。
- 仮想マシンのディスクイメージ(.imgファイル)
- データベースの一時ファイル
- ログファイルやバックアップ用の一時ファイル
こうしたファイルを頻繁に扱う開発者やシステム管理者にとって、スパースファイルの正しい取り扱いは重要なスキルとなります。
7. statコマンドで確認してみよう
スパースファイルの実態を調べるにはstatコマンドが便利です。
stat sparse_file.img
ここで「Size(見かけ上のサイズ)」と「Blocks(実際に使用しているブロック数)」を比較すると、スパースファイルかどうかが分かります。
Sizeが大きいのに、Blocksが少なければスパースファイルです。