LinuxのLVMスナップショットでオンラインバックアップを取る方法|lvcreate -sで稼働中データを複製してrsyncで転送する手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, ディスク操作 > LinuxのLVMスナップショットでオンラインバックアップを取る方法|lvcreate -sで稼働中データを複製してrsyncで転送する手順
「本番サービスを停止せずにバックアップを取りたいが、コンシステントなスナップを確保する方法がわからない」
「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)になる——事前にサイズを余裕を持って設定する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

この例では、`vg_data` というVGに `lv_data`(100G)が存在し、VFreeが100GBの空き領域があります。この空き領域からスナップショット用の容量を確保します。

スナップショットを作成する(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

XFSファイルシステムの場合は要注意:XFSはUUIDでボリュームを識別するため、元ボリュームとスナップショットのUUIDが同一になり、通常のmountが失敗することがあります。その場合は 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

この時点でスナップを参照しているのは「lvcreate -s を実行した瞬間のデータ」です。元ボリューム側がその後どれだけ書き換わっていても、スナップの中身は変わりません。

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

LVMのスナップショットとrsyncを組み合わせたこのパターンは、現場のLinuxサーバー管理で広く使われている実務設計です。Linuxサーバーの運用スキルを体系的に学びたい方は、Linux Master Pro Seminar(2日間ハンズオン)でも同様の構築・運用手順を扱っています。

スナップショットを削除する(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

`lv_data_snap` が消え、`lv_data` のみが残っていることを確認できます。スナップが消えた分、VGの空き領域が15GB回復しています。

【重要】スクリプト化する場合は `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

`Data%` が80%を超えたらアラートを出す監視スクリプトを組み込むことを推奨します。

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

`Attr` 列の `I`(大文字)はinvalid状態を意味します。この状態では復旧できないため、スナップを削除して最初からやり直します。再実施時はスナップサイズを増やしてください。

本記事のまとめ

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
スナップショットバックアップを自動化する場合は、上記の手順をシェルスクリプトに落とし込み、cronまたはsystemd timerで定期実行するのが定番です。スクリプト化する際の鉄則は「スナップ作成・転送・削除を1スクリプトに収め、途中でエラーが出たらスナップが残り続けないよう trap でクリーンアップを仕込む」ことです。

LVMの仕組みを「実務の型」として身につけませんか?

lvcreateのオプションは調べれば分かります。でも「COWが溢れたらどうなるか」「XFSのUUID問題をなぜ避けるのか」を説明できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。