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にしておけば、「使えない環境ではエラーになる」ので、対応状況を確認しやすくなります。