「cp -r ではコピー中にファイルが変わってしまって整合性が不安」——
Linuxのバックアップで悩みがちなのが、稼働中のボリュームを安全に複製できないという問題です。ファイルサーバーやDBのデータディレクトリを単純にcpやrsyncでコピーすると、コピー中に書き換えられたファイルが混在し、整合性のないバックアップができてしまうことがあります。
この問題を解決するのがLVMスナップショットです。
lvcreate -sコマンドで作成したスナップショットは、「スナップ作成時点の静止画」を提供します。その後rsyncでバックアップ先に転送すれば、サービスを止めずに整合性のとれたバックアップが完成します。この記事では、Rocky Linux 9 / RHEL 9を実行環境として、LVMスナップショットのCOW方式の仕組みからスナップ作成・マウント・rsync転送・削除・COW溢れ防止まで、現場で使える完全手順を解説します。
この記事のポイント
・lvcreate -s でサービスを止めずに「スナップ作成時点」のデータを複製できる
・スナップショットは通常のブロックデバイスとして mount でマウントして確認できる
・rsync 転送が終わったら lvremove で必ずスナップを削除すること(放置するとVGを食い潰す)
・Data% が100%に達するとスナップが無効(invalid)になる——事前にサイズを余裕を持って設定する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
LVMスナップショットとは何か——COW方式で稼働中データを複製する仕組み
LVMスナップショットはCOW(Copy-on-Write)方式で動作します。誤解しがちなのですが、スナップショット作成時に元データを全コピーするわけではありません。動作の流れはこうです:
・スナップショット作成直後:スナップ領域は空(メタデータのみ)
・元ボリュームへの書き込みが発生したとき:「変更前のブロック」をスナップ領域にコピーしてから新しいデータを書く
・スナップショットを読むとき:スナップ領域にコピーされたブロックと、書き込みのなかった元ブロックを組み合わせて「作成時点のデータ」を返す
この仕組みにより、スナップショットは「作成時点の静止画」を維持できます。一方、元ボリュームへの書き込みが多いほどスナップ領域の消費が増えます。
スナップショット機能を使うにはLVMがすでに構築済みであることが前提です。確認コマンドを実行して、対象ボリュームグループ(VG)と論理ボリューム(LV)の状態を把握してから作業に入ります。
# 論理ボリュームの一覧(サイズ・VG名・LVパスを確認) sudo lvs # ボリュームグループの空き領域を確認 sudo vgs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_data vg_data -wi-ao---- 100.00g VG #PV #LV #SN Attr VSize VFree vg_data 1 1 0 wz--n- <200.00g <100.00g
スナップショットを作成する(lvcreate -s)
1. スナップショットのサイズを決める
スナップショットサイズの目安は「バックアップ作業中に元ボリュームへ書き込まれるデータ量の2倍程度」です。書き込みが少ない深夜帯に実施するなら元ボリュームの10~15%、日中の高トラフィック環境では20~30%を確保するのが安全です。・書き込み少(深夜・静的データ)→ 元ボリュームの10~15%
・書き込み多(業務時間帯・DBログ)→ 元ボリュームの20~30%
2. lvcreate -s でスナップショットを作成する
# create snapshot: -s snapshot mode, -L size, -n name, origin = lv_data sudo lvcreate -L 15G -s -n lv_data_snap /dev/vg_data/lv_data
Logical volume "lv_data_snap" created.
・
-L 15G:スナップショット専用領域のサイズ(元ボリュームのサイズではない)・
-s:スナップショットとして作成・
-n lv_data_snap:スナップショットLVの名前・
/dev/vg_data/lv_data:スナップ元の論理ボリューム(Originと呼ぶ)3. スナップショットが作成されたか確認する
# -a オプションで内部ボリュームも含めて全表示 sudo lvs -a
LV VG Attr LSize Pool Origin Data% Meta% lv_data vg_data owi-aos--- 100.00g lv_data_snap vg_data swi-a-s--- 15.00g lv_data 0.01
Attr 列の `s` がスナップショット、`w` が書き込み可能を示します。Data% が 0.01% と低い状態——スナップ作成直後はCOW領域がほとんど消費されていないことが確認できます。
スナップショットをマウントして内容を確認する
スナップショットは通常のブロックデバイスとして扱えます。mountコマンドでマウントポイントに接続すれば、スナップ作成時点のデータをそのまま参照できます。mount コマンドの使い方の基本は既存の解説に譲り、ここではスナップショット特有の注意点を中心に説明します。
1. マウントポイントを作成してマウントする
# マウントポイントを作成 sudo mkdir -p /mnt/lv_data_snap # 読み取り専用でマウント(バックアップ中に元データを変更しないための安全策) sudo mount -o ro /dev/vg_data/lv_data_snap /mnt/lv_data_snap
nouuid オプションを追加します。# XFS(Rocky Linux 9 / RHEL 9のデフォルト)では nouuid が必要 sudo mount -o ro,nouuid /dev/vg_data/lv_data_snap /mnt/lv_data_snap
2. スナップの内容を確認する
# ファイル一覧で内容を確認 ls -la /mnt/lv_data_snap/ # 容量を確認 df -h /mnt/lv_data_snap
Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_data-lv_data_snap 100G 68G 33G 68% /mnt/lv_data_snap
rsyncでバックアップ先サーバーへデータを転送する
マウントしたスナップショットをrsyncで転送します。スナップ作成からマウント、rsync転送まで一気に実施するのがポイントです。スナップは長時間放置するとCOW領域が溢れるリスクがあるため、バックアップが完了したら速やかに削除します。# スナップからバックアップ先へ転送 sudo rsync -avz --delete /mnt/lv_data_snap/ backup@192.168.1.100:/backup/lv_data/ # ローカルへのバックアップ(別ディスクへ)の場合 sudo rsync -av --delete /mnt/lv_data_snap/ /mnt/backup/lv_data/
・
-a:アーカイブモード(パーミッション・タイムスタンプ・シンボリックリンクをそのまま保持)・
-v:詳細な転送ログを表示・
-z:ネットワーク越しの転送時に圧縮(ローカルでは不要)・
--delete:バックアップ先から削除済みファイルを同期(差分バックアップの精度が上がる)転送完了後はスナップをアンマウントします。アンマウントが完了してから削除に進みます。
sudo umount /mnt/lv_data_snap
スナップショットを削除する(lvremove)
バックアップが完了したら、スナップショットを必ず削除します。削除しないとVGの空き容量を消費し続け、他の操作に影響が出ます。sudo lvremove /dev/vg_data/lv_data_snap
Do you really want to remove active logical volume vg_data/lv_data_snap? [y/n]: y Logical volume "lv_data_snap" successfully removed.
sudo lvs
LV VG Attr LSize Pool Origin Data% Meta% lv_data vg_data -wi-ao---- 100.00g
【重要】スクリプト化する場合は `lvremove -f` で確認プロンプトをスキップできますが、誤って元ボリュームを消すリスクがあるため、
-n オプションで渡すパスに必ずスナップ名(`_snap` など識別しやすい命名)を含めるのを鉄則にしてください。
スナップが invalid になる場合の対処法——COW使用率の監視と溢れ防止
スナップショット運用でもっとも注意が必要なのがCOW領域の枯渇です。`Data%` が100%に達すると、スナップショットは自動的に「invalid(無効)」状態になります。この状態になるとスナップをマウントしても中身が参照できず、バックアップが失敗します。1. COW使用率をリアルタイムで監視する
# バックアップ実行中の使用率を定期確認(5秒ごと) watch -n 5 "sudo lvs -a 2>/dev/null | grep snap"
lv_data_snap vg_data swi-a-s--- 15.00g lv_data 23.45
2. スナップ領域が足りない場合はオンラインで拡張する
バックアップ完了前にCOWが80%を超えてしまった場合は、lvextendでサイズを拡張できます(スナップショットをマウントしたままでも可能)。# スナップ領域を追加で5GB拡張する sudo lvextend -L +5G /dev/vg_data/lv_data_snap
3. スナップが invalid になった時の確認と対処
sudo lvs -a
lv_data_snap vg_data swi-I-s--- 15.00g lv_data 100.00
本記事のまとめ
LVMスナップショットを使ったオンラインバックアップの手順をまとめます。| やりたいこと | コマンド |
|---|---|
| スナップショットを作成する | lvcreate -L 15G -s -n lv_data_snap /dev/vg_data/lv_data |
| スナップの状態とCOW使用率を確認する | lvs -a |
| スナップをマウントする(XFSの場合) | mount -o ro,nouuid /dev/vg_data/lv_data_snap /mnt/lv_data_snap |
| rsyncでバックアップ先に転送する | rsync -avz --delete /mnt/lv_data_snap/ backup@192.168.1.100:/backup/lv_data/ |
| スナップをアンマウントする | umount /mnt/lv_data_snap |
| スナップを削除する | lvremove /dev/vg_data/lv_data_snap |
| スナップ領域を拡張する(COW溢れ対策) | lvextend -L +5G /dev/vg_data/lv_data_snap |
LVMの仕組みを「実務の型」として身につけませんか?
lvcreateのオプションは調べれば分かります。でも「COWが溢れたらどうなるか」「XFSのUUID問題をなぜ避けるのか」を説明できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:LinuxのPAM設定入門|/etc/pam.d/の仕組みとpam_pwquality・pam_faillockでセキュリティを設計する方法
- この記事の属するカテゴリ:Linuxtips・ディスク操作へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます