cp --reflinkオプションの使い方|COW(コピーオンライト)で高速・省スペースなコピーを実現
生徒
「Linuxで大きなファイルをコピーしたら、すごく時間がかかってディスクもすぐいっぱいになりました……。もっと効率のいいコピー方法ってないんですか?」
先生
「それならcpコマンドの--reflinkオプションを使ってみましょう。コピーオンライトという仕組みで、実際にはデータを複製せずにコピーしたように見せてくれます。」
生徒
「えっ!?コピーしてないのにコピーしたように見えるんですか?」
先生
「そうなんです。必要なときにだけ実際のデータを書き込むしくみです。詳しく説明していきましょう!」
1. コピーオンライト(COW)とは?
コピーオンライト(Copy-On-Write)とは、ファイルをコピーしたときに、実際のデータは複製せず、「同じ内容を共有した状態」にしておき、どちらかが書き換えられたときに初めて本当に分離するしくみです。
これにより、時間とディスク容量を大きく節約できます。
この機能は、BtrfsやXFS(RHEL8以降)などの一部のファイルシステムで対応しています。
2. cp --reflinkの基本的な使い方
--reflinkオプションを付けてcpコマンドを実行すると、コピーオンライトでのコピーが行われます。
cp --reflink=auto original.img copy.img
この例では、original.imgの内容は実際にはコピーされず、copy.imgという別名で参照されるようになります。
ファイルサイズが大きいときほど、効果を実感できます。
3. --reflinkの指定方法と違い
--reflinkには、次の3つの指定方法があります。
--reflink=auto:できる環境ならCOWコピー。できなければ普通のコピー。--reflink=always:必ずCOWコピー。できない場合はエラー。--reflink=never:通常コピー(COWを使わない)。
基本的にはautoを使っておけば、安全に使えます。
4. 実際に試してみよう(COW対応ファイルシステムの場合)
以下のように大きなファイルを作っておきます。
fallocate -l 1G test.img
次に、--reflink付きでコピーします。
cp --reflink=auto test.img copy.img
通常のコピーでは数秒かかるところが、瞬時に完了します。そして、ディスク使用量も増えません。
du -h test.img copy.img
1.0G test.img
1.0G copy.img
見かけ上は1GBずつですが、dfコマンドでディスクの空き容量を確認すると、ほとんど減っていないはずです。
5. 通常コピーとの違いを理解しよう
普通のcpでは、実際のデータを1バイトずつ読み書きします。時間もかかるし、容量も2倍必要になります。
一方、--reflinkを使えば、中身はコピーせず「リンクのように」別名で存在させるだけなので、スピードも容量効率も非常に高いです。
6. COWの注意点と挙動
注意点として、copy.imgを書き換えた瞬間に、その部分だけ本当にディスクに書き込まれます。これが「オンライト」です。
つまり、「コピーしたあと書き換えなければ、実体は1つだけ」ですが、「どちらかを編集すれば、それ以降は別物になる」ということです。
まるで「コピーしたふりをしておいて、必要になるまで本気を出さない」ようなイメージですね。
7. --reflinkが使えるか確認する方法
この機能はすべてのLinux環境で使えるわけではありません。対応しているのは以下のような環境です。
Btrfs(最もCOW向け)XFS(Red Hat Enterprise Linux 8以降)
ext4などでは対応していないため、--reflinkを使っても普通のコピーになります。
対応しているか確認するには、stat -f .でファイルシステムの種類を調べてみましょう。
stat -f .
また、--reflink=alwaysにしておけば、「使えない環境ではエラーになる」ので、対応状況を確認しやすくなります。
まとめ
今回はLinuxのcpコマンドにおけるreflinkオプションの使い方について、コピーオンライトという仕組みを中心に詳しく学びました。大容量ファイルのコピーは時間とディスク容量の両方に大きな負担をかける処理ですが、reflinkを活用することでその課題を大きく改善できることが理解できたはずです。
従来のファイルコピーでは、ファイルの中身を一からすべて複製する必要があり、処理時間が長くなるだけでなく、ディスク容量もコピー元と同じだけ消費してしまいます。しかしコピーオンライトを利用したcpコマンドのreflinkオプションを使うと、実際にはデータを複製せず、同じデータを共有する形でコピーを実現できます。これにより高速な処理と省ディスク容量を同時に実現できるのが大きな特徴です。
特にBtrfsやXFSといったコピーオンライトに対応したファイルシステムでは、その効果を最大限に発揮します。大規模なログファイルや仮想ディスクイメージ、バックアップ用途のファイルコピーなどでは、reflinkの有無によってパフォーマンスが大きく変わるため、実務でも非常に重要な知識です。
またreflinkオプションにはauto、always、neverという三つの指定方法があり、それぞれの挙動を理解して使い分けることも重要です。一般的にはautoを利用することで安全にコピーオンライトを活用できますが、確実にCOWを使いたい場合にはalwaysを使うことで、対応していない環境を検知することも可能です。
さらに実際の運用では、コピー後のファイルを編集した場合にのみデータが分離されるという挙動も重要なポイントです。これはオンライトの仕組みによるもので、書き込みが発生した部分だけが新たにディスクへ書き込まれるため、効率的なストレージ利用が可能になります。この動作を理解しておくことで、意図しないディスク消費の増加を防ぐことができます。
以下はreflinkオプションを利用した基本的なコピー例です。大容量ファイルのコピーでも瞬時に処理が完了することが確認できます。
cp --reflink=auto largefile.img copy.img
またディスク使用量の確認も重要です。見かけ上のサイズと実際の使用量が異なる点にも注意しましょう。
du -h largefile.img copy.img
1.0G largefile.img
1.0G copy.img
このようにLinuxのcpコマンドとreflinkオプションを組み合わせることで、高速コピー、省容量コピー、効率的なストレージ運用を実現できます。サーバー運用やクラウド環境、開発環境の効率化にも直結するため、日常的に活用できるようにしておくことが重要です。
生徒
cpコマンドのreflinkオプションを使うと、実際にはコピーしないでコピーしたように見せる仕組みがあるっていうのが一番驚きでした。
先生
そうですね。それがコピーオンライトという考え方です。必要になるまで実際のデータを複製しないので、効率がとても良いのが特徴です。
生徒
しかもコピーがすごく速いですよね。大きなファイルでも一瞬で終わるのはかなり便利だと思いました。
先生
はい。特にバックアップや仮想マシンのイメージファイルなど、大容量データを扱う場面では大きな効果があります。
生徒
ただ、ファイルシステムが対応していないと使えない点は注意ですね。
先生
その通りです。BtrfsやXFSなどの対応環境で使うことで、初めてreflinkの恩恵を受けられます。
生徒
あと、編集したときに初めてデータがコピーされるという動きも重要ですね。
先生
それがオンライトの部分です。この動きを理解しておくと、ストレージの使い方がより効率的になります。
生徒
Linuxのファイルコピーって奥が深いですね。これからは普通のcpと使い分けていきたいです。
先生
とても良い理解です。実務でも役立つ知識なので、ぜひ積極的に活用していきましょう。