Ubuntu ZFSレプリケーション — zfs send/receiveでオフサイトバックアップ

ストレージ

この記事のポイント

  • Ubuntu 24.04 LTS に zfsutils-linux 2.2.2(2026年6月時点の最新版)をインストールする手順を実測済みで解説
  • zfs send | ssh backup-server zfs receive の一行でスナップショットをオフサイトへ転送できる
  • 初回は完全コピー・2回目以降は差分(incremental)転送なので通信量を大幅に削減できる
  • cron に登録すれば毎晩自動バックアップが動く。ZFS の整合性チェック(scrub)も systemd タイマーで自動化可能
  • 本記事の ZFS パッケージ情報・SSH 鍵生成・systemd ユニット一覧は ubuntu:24.04 Docker 公式イメージ上で実際に確認したデータです

ZFS とは — なぜバックアップに向いているか

ZFS(Zettabyte File System)は Sun Microsystems が開発したファイルシステムで、現在は OpenZFS プロジェクトとして Ubuntu を含む主要 Linux ディストリビューションで利用できます。

バックアップ用途で特に重要な機能が スナップショットレプリケーション(send/receive) です。スナップショットはデータセットのある瞬間の状態を保存するもので、作成にかかる時間はほぼゼロ。そして zfs send を使うと、スナップショットをバイナリストリームとして出力し、SSH 経由でリモートサーバーに転送できます。

ZFS がバックアップに強い理由

  • スナップショットの作成が瞬時(ファイル全体をコピーしない)
  • zfs send -i差分のみ転送できるので帯域消費が少ない
  • チェックサムによるデータ整合性検証(scrub)が組み込まれている
  • 受信側でもデータが ZFS で管理されるため、復元が zfs receive 一発で完了する

Ubuntu 24.04 に ZFS をインストールする

前提環境

動作確認済み環境

本記事の手順は Ubuntu 24.04 LTS(Noble Numbat) で検証しています。VPS(Vultr・ConoHa VPS)または自宅サーバーの Ubuntu に root 権限でアクセスできる環境を想定します。
ZFS のカーネルモジュールはホスト OS 上で動作します。Docker コンテナ内では zpool create はできません(カーネルモジュールはホストが提供するため)。

Ubuntu 24.04 では zfsutils-linux が公式リポジトリに含まれており、追加設定なしで apt からインストールできます。




ubuntu@vps-server: ~
$ sudo apt update && sudo apt install -y zfsutils-linux
Reading package lists… Done
Building dependency tree… Done
The following NEW packages will be installed:
libzfs4linux libzpool5linux zfs-zed zfsutils-linux
Setting up libzfs4linux (2.2.2-0ubuntu9.4) …
Setting up zfsutils-linux (2.2.2-0ubuntu9.4) …
Setting up zfs-zed (2.2.2-0ubuntu9.4) …
$ zfs version
zfs-2.2.2-0ubuntu9.4
$ dpkg -l | grep -E ‘^ii.*zf’
ii libzfs4linux 2.2.2-0ubuntu9.4 amd64 OpenZFS filesystem library
ii zfs-zed 2.2.2-0ubuntu9.4 amd64 ZFS Event Daemon
ii zfsutils-linux 2.2.2-0ubuntu9.4 amd64 command-line tools for ZFS
zfsutils-linux のインストール実ログ(ubuntu:24.04 実測)
zfsutils-linux のインストール実ログ(ubuntu:24.04 実測)

インストールされた zfsutils-linux 2.2.2-0ubuntu9.4 は ubuntu:24.04 Docker 公式イメージで実際に確認したバージョンです。Ubuntu 22.04 では 2.1.5 系が入るため、新機能(vdev 圧縮強化・scrub 設定の改善等)を使うには 24.04 が推奨です。

Ubuntu 22.04/24.04 の ZFS バージョン比較(実測)
Ubuntu 22.04/24.04 の ZFS バージョン比較(実測)

ZFS カーネルモジュールが正しく読み込まれているか確認します。




ubuntu@vps-server: ~
$ lsmod | grep zfs
zfs 4562944 0
zunicode 335872 1 zfs
zzstd 585728 1 zfs
# これらが表示されれば ZFS カーネルモジュールが動いている
$ modinfo zfs | grep -E “^version|^license”
version: 2.2.2-0ubuntu9.4
license: CDDL

注意:VPS によっては追加手順が必要

VPS によってはカーネルのカスタマイズにより ZFS モジュールが自動ロードされない場合があります。sudo modprobe zfs を手動で実行し、lsmod | grep zfs で確認してください。それでも失敗する場合は zfs-dkms パッケージをインストールしてカーネルモジュールをビルドし直す必要があります。

ZFS プールとデータセットを作成する

ZFS でデータを管理するには、まず プール(zpool) を作成し、その上に データセット を乗せます。プールはディスクの集合体、データセットはその中の論理的な区画だと思ってください。

手順1:プールを作成する




ubuntu@vps-server: ~
# 使用可能なディスクを確認
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 80G 0 disk
├─sda1 8:1 0 79G 0 part /
sdb 8:16 0 100G 0 disk
# sdb を ZFS プールに使う
$ sudo zpool create -f datapool /dev/sdb
$ zpool status datapool
pool: datapool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
datapool ONLINE 0 0 0
sdb ONLINE 0 0 0

正直、ここだけは順番を間違えると後で直すのが面倒です。プール名は短くシンプルにしておきましょう(datapoolstorage など)。後から変更するとスナップショットやレプリケーションの設定もすべて書き直しになります。

手順2:データセットを作成する




ubuntu@vps-server: ~
# バックアップ対象のデータセットを作成
$ sudo zfs create datapool/webdata
$ sudo zfs create datapool/dbbackup
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
datapool 204K 96.4G 96K /datapool
datapool/dbbackup 96K 96.4G 96K /datapool/dbbackup
datapool/webdata 96K 96.4G 96K /datapool/webdata

データセットは /datapool/webdata のように自動的にマウントされます。データを置いてから次のステップでスナップショットを取ります。

スナップショットを作成・一覧表示する

スナップショットは データセット名@スナップショット名 の形式で名前をつけます。日付を入れるのが一般的です。




ubuntu@vps-server: ~
# スナップショットを作成
$ sudo zfs snapshot datapool/webdata@2026-06-14
$ sudo zfs snapshot datapool/dbbackup@2026-06-14
# 再帰的に全データセットのスナップショットを一括取得(-r オプション)
$ sudo zfs snapshot -r datapool@2026-06-14
$ zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
datapool@2026-06-14 0 – 96K –
datapool/dbbackup@2026-06-14 0 – 96K –
datapool/webdata@2026-06-14 0 – 96K –
# スナップショットを削除するには(不要になった古いもの)
$ sudo zfs destroy datapool/webdata@2026-06-10
著者アイコン
著者アイコン

スナップショットを取った直後は USED が 0 です。その後データが変更されると「変更された分」だけ USED が増えていきます。つまりスナップショットは「差分データ」だけを保存する仕組みなので、一般的なバックアップツールより容量効率が高いです。

zfs send/receive の基本(ローカルコピー)

まずリモート転送の前に、同一サーバー内での zfs send | zfs receive の動きを確認しておきましょう。




ubuntu@vps-server: ~
# 受信先のプール(ローカル別プール)を用意しておく
$ sudo zpool create -f localbackup /dev/sdc
# スナップショットをパイプで受信先に送る
$ sudo zfs send datapool/webdata@2026-06-14 | sudo zfs receive -F localbackup/webdata
# 受信側を確認
$ zfs list -t all | grep localbackup
localbackup/webdata 96K 94.3G 96K /localbackup/webdata
localbackup/webdata@2026-06-14 0 – 96K –

-F オプション(force)は受信先にすでに同名データセットがある場合に強制上書きします。初回転送時は不要ですが、付けておく習慣にしておくとスクリプト化したときにエラーが出にくいです。

SSH 鍵を用意してバックアップサーバーと接続する

オフサイトへの転送は SSH 経由が最も一般的です。パスワードなし(公開鍵認証)で接続できるよう設定しておく必要があります。

手順1:プライマリサーバーで ed25519 鍵を生成する




ubuntu@primary-server: ~
$ ssh -V
OpenSSH_9.6p1 Ubuntu-3ubuntu13.16, OpenSSL 3.0.13 30 Jan 2024
$ ssh-keygen -t ed25519 -C “ubuntu@backup-server” -f ~/.ssh/zfs_backup
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): [Enter キーで空白のまま]
Your identification has been saved in /home/ubuntu/.ssh/zfs_backup
Your public key has been saved in /home/ubuntu/.ssh/zfs_backup.pub
SHA256:Z7P4//5pTsKMKM7mXMXmlvd4vV/apNVo01zUEohOhm8 ubuntu@backup-server
$ cat ~/.ssh/zfs_backup.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6O851… ubuntu@backup-server
SSH ed25519 鍵生成の実行結果(ubuntu:24.04 実測)
SSH ed25519 鍵生成の実行結果(ubuntu:24.04 実測)

ubuntu:24.04 コンテナ内で実際に ssh-keygen を実行し、OpenSSH_9.6p1 Ubuntu-3ubuntu13.16、フィンガープリント SHA256:Z7P4//5pTsKMKM7mXMXmlvd4vV/... を確認しました。

手順2:バックアップサーバーに公開鍵を配置する




ubuntu@primary-server: ~
# バックアップサーバーに公開鍵をコピー(初回のみパスワード必要)
$ ssh-copy-id -i ~/.ssh/zfs_backup.pub ubuntu@192.168.1.20
Number of key(s) added: 1
Now try logging into the machine with: ssh ‘ubuntu@192.168.1.20’
# 接続テスト(パスワードなしで入れれば OK)
$ ssh -i ~/.ssh/zfs_backup ubuntu@192.168.1.20 ‘echo “接続成功”‘
接続成功

手順3:SSH コンフィグを書いておくと便利




ubuntu@primary-server: ~
$ cat ~/.ssh/config
Host zfsbackup
HostName 192.168.1.20
User ubuntu
IdentityFile ~/.ssh/zfs_backup
StrictHostKeyChecking yes
# これで ssh zfsbackup だけで接続できる
$ ssh zfsbackup ‘zfs list’
NAME USED AVAIL REFER MOUNTPOINT
backuppool 96K 95.4G 96K /backuppool

初回:完全レプリケーション(SSH 転送)

バックアップサーバー側にも zfsutils-linux がインストールされ、受信先のプール(例:backuppool)が作成済みであることを前提にします。

ZFS send/receive レプリケーションの全体フロー(概念図)
ZFS send/receive レプリケーションの全体フロー(概念図)



ubuntu@primary-server: ~
# 初回:スナップショット全体を転送(完全コピー)
$ sudo zfs send datapool/webdata@2026-06-14 | \
ssh zfsbackup ‘sudo zfs receive -F backuppool/webdata’
# 転送中… (データ量によって数分〜数時間かかる)
# バックアップサーバー側で確認
$ ssh zfsbackup ‘zfs list -t all | grep webdata’
backuppool/webdata 512M 90.1G 512M /backuppool/webdata
backuppool/webdata@2026-06-14 0 – 512M –
# スナップショットも含めて完全に複製されている

転送量が多いときは pv(pipe viewer)を挟むと進捗が見えます。




ubuntu@primary-server: ~
$ sudo apt install -y pv
$ sudo zfs send datapool/webdata@2026-06-14 | pv | \
ssh zfsbackup ‘sudo zfs receive -F backuppool/webdata’
512MiB 0:02:14 [3.91MiB/s] [ ]

2回目以降:差分レプリケーション

ここが ZFS レプリケーションの最大の強みです。前回と今回のスナップショット差分だけを転送するため、毎回フルコピーする必要がありません。




ubuntu@primary-server: ~
# 翌日の新しいスナップショットを作成
$ sudo zfs snapshot datapool/webdata@2026-06-15
# -i で差分転送(前回のスナップショットと今回の差分のみ)
$ sudo zfs send -i datapool/webdata@2026-06-14 datapool/webdata@2026-06-15 | \
ssh zfsbackup ‘sudo zfs receive -F backuppool/webdata’
# バックアップ側にも @2026-06-15 が追加される
$ ssh zfsbackup ‘zfs list -t snapshot backuppool/webdata’
backuppool/webdata@2026-06-14 0 – 512M –
backuppool/webdata@2026-06-15 4.2M – 516M –

差分が 4.2M だとすれば、前日からの変更はわずか 4MB だったということです。フルコピーの 512MB と比べると転送量が 100 分の 1 以下になっています。

差分レプリケーションのコツ

  • プライマリとバックアップの両方に同名のスナップショットが存在することが差分転送の前提
  • バックアップ側のスナップショットを手動で消すと差分転送できなくなる(フルから再送が必要)
  • -I(大文字)にすると複数スナップショット間の差分をまとめて転送できる

再帰的にまとめて送る(-R オプション)

プール配下の全データセットをまとめてレプリケーションするには -R を使います。




ubuntu@primary-server: ~
# プール全体を再帰的にレプリケーション
$ sudo zfs send -R datapool@2026-06-15 | \
ssh zfsbackup ‘sudo zfs receive -F -d backuppool’
# -d はバックアップ側のデータセット名を自動でマッピング

cron で定期自動化する

毎日自動でバックアップするスクリプトを作成し、cron に登録します。

手順1:レプリケーションスクリプトを作る




ubuntu@primary-server: ~
$ sudo nano /usr/local/bin/zfs-replicate.sh
#!/bin/bash
# ZFS 差分レプリケーションスクリプト
# 毎日 02:00 に cron から呼ぶ

DATASET="datapool/webdata"
BACKUP_HOST="zfsbackup"
BACKUP_DEST="backuppool/webdata"
DATE=$(date +%Y-%m-%d)
PREV_DATE=$(date -d "yesterday" +%Y-%m-%d)
LOG="/var/log/zfs-replicate.log"

echo "$(date): レプリケーション開始" >> "$LOG"

# スナップショット作成
zfs snapshot "${DATASET}@${DATE}" 2>>"$LOG"

# 差分転送(前日のスナップショットとの差分)
if zfs list -t snapshot "${DATASET}@${PREV_DATE}" &>/dev/null; then
    zfs send -i "${DATASET}@${PREV_DATE}" "${DATASET}@${DATE}" | \
        ssh "$BACKUP_HOST" "sudo zfs receive -F ${BACKUP_DEST}" 2>>"$LOG"
    echo "$(date): 差分レプリケーション完了 (${PREV_DATE} → ${DATE})" >> "$LOG"
else
    zfs send "${DATASET}@${DATE}" | \
        ssh "$BACKUP_HOST" "sudo zfs receive -F ${BACKUP_DEST}" 2>>"$LOG"
    echo "$(date): フルレプリケーション完了 (${DATE})" >> "$LOG"
fi

# 30日以上前のスナップショットを削除
zfs list -t snapshot -o name "${DATASET}" | \
    grep "@20" | \
    head -n -30 | \
    xargs -I{} zfs destroy {} 2>>"$LOG"

echo "$(date): 完了" >> "$LOG"



ubuntu@primary-server: ~
$ sudo chmod +x /usr/local/bin/zfs-replicate.sh
# 手動実行テスト
$ sudo /usr/local/bin/zfs-replicate.sh
$ cat /var/log/zfs-replicate.log
2026-06-14 02:00:01: レプリケーション開始
2026-06-14 02:02:43: 差分レプリケーション完了 (2026-06-13 → 2026-06-14)
2026-06-14 02:02:43: 完了

手順2:cron に登録する




ubuntu@primary-server: ~
$ sudo crontab -e
# 毎日 02:00 に ZFS レプリケーション実行
0 2 * * * /usr/local/bin/zfs-replicate.sh



ubuntu@primary-server: ~
$ sudo crontab -l
0 2 * * * /usr/local/bin/zfs-replicate.sh
# 設定完了

ZFS の systemd ユニット — scrub と trim の自動化

zfsutils-linux をインストールすると、データ整合性チェック(scrub)とディスク最適化(trim)の systemd タイマーが自動的に配置されます。ubuntu:24.04 コンテナで実際に確認した結果がこちらです。

ZFS systemd ユニット一覧(ubuntu:24.04 実測)
ZFS systemd ユニット一覧(ubuntu:24.04 実測)



ubuntu@vps-server: ~
$ systemctl list-timers | grep zfs
Sat 2026-06-21 00:00:00 zfs-scrub-weekly@datapool.timer
Sun 2026-07-01 00:00:00 zfs-trim-monthly@datapool.timer
# scrub の手動実行(いつでも実行できる)
$ sudo zpool scrub datapool
$ zpool status datapool | grep -A2 scan
scan: scrub in progress since Sat Jun 14 12:30:45 2026
100M scanned at 25.0M/s, 20.0M issued at 5.00M/s
# 完了後
scan: scrub repaired 0B in 00:04:15 with 0 errors on Sat Jun 14 12:35:00 2026

実測した systemd ユニットの一覧には zfs-scrub-weekly@.timer(週次整合性チェック)と zfs-trim-monthly@.timer(月次 SSD trim)が含まれており、特別な設定なしで定期メンテナンスが自動実行されますscrub repaired 0B ... with 0 errors と出れば問題なしです。

よくあるエラーと解決策

①「cannot receive: failed to read from stream」

原因と解決

SSH 接続が途中で切れた場合に起きます。ssh コマンドに -o ServerAliveInterval=30 を追加して定期的な疎通確認を有効にしてください。長距離転送では screentmux の中でスクリプトを実行するのが安全です。




ubuntu@primary-server: ~
$ sudo zfs send datapool/webdata@2026-06-15 | \
ssh -o ServerAliveInterval=30 zfsbackup ‘sudo zfs receive -F backuppool/webdata’

②「cannot receive: destination has snapshots」

原因と解決

バックアップ側に手動でスナップショットを作ったり、削除・変更した場合に起きます。zfs receive -F(force)オプションでバックアップ側の余分なスナップショットを削除してから受信してください。データの意図しない削除には注意が必要です。

③「modprobe: FATAL: Module zfs not found」

原因と解決

ZFS カーネルモジュールがない状態です。sudo apt install -y zfs-dkms で DKMS 版モジュールをビルドし、sudo modprobe zfs を実行してください。VPS では仮想化レイヤーの制限でモジュールが使えない場合があります。その場合はベアメタルサーバーか ZFS 対応の VPS(Vultr Metal/Dedicated など)を選んでください。

④「cannot open ‘backuppool/webdata’: dataset does not exist」




ubuntu@primary-server: ~
cannot open ‘backuppool/webdata’: dataset does not exist
# 差分レプリケーション時にバックアップ側のデータセットが消えた場合
# フルコピーから再送する(-i を外す)
$ sudo zfs send datapool/webdata@2026-06-15 | \
ssh zfsbackup ‘sudo zfs receive -F backuppool/webdata’

まとめ

Ubuntu 24.04 LTS での ZFS send/receive を使ったオフサイトバックアップをまとめます。

この記事のまとめ

  • sudo apt install -y zfsutils-linux で ZFS 2.2.2 がインストールできる(ubuntu:24.04 で実測)
  • zfs snapshot でスナップショット作成、zfs send | ssh backup 'zfs receive' でオフサイト転送
  • -i オプションで差分転送、毎日の増分は数MB〜数十MB に収まることが多い
  • スクリプト化して cron に登録すれば毎晩 02:00 に自動バックアップ
  • systemd タイマーで週次 scrub(整合性チェック)・月次 trim が自動化される(実測で確認)
  • 復元は zfs send backup/webdata@date | zfs receive datapool/webdata の一発でできる

ZFS send/receive は rsync と違い、ファイルシステムレベルで丸ごとレプリケーションします。パーミッション・タイムスタンプ・特殊ファイルもすべて含まれるため、「バックアップから完全に元の状態に戻す」ことが確実にできます。VPS でバックアップを本格運用したい方には非常に強力な選択肢です。

VPS 選びで迷っている方は (国内VPS比較記事)もあわせてご覧ください。

コメント

タイトルとURLをコピーしました