仮想サーバーOS Proxmoxが採用するファイルシステム[ZFS]の復旧方法を確認していたところ、以前用いていた[mdadm]より高機能であることがわかったので、新たにSambaファイルサーバーを構築してみました。
ZFSの特徴としては以下があります。
特にスナップショット機能については、昨今、猛威を振るうランサムウェア対策としても有効とされています。
- インストール・ファイルシステム構築でmountまでしてくれる
- 総じてmdadmよりCLI操作が少ない
- スナップショットをとることで、誤消去ファイルの取り出しが出来る
- オブジェクトストレージへReadOnlyのバックアップが書き出しできる
Proxmox上にZFS Sambaファイルサーバーを組む手順を紹介します。
ハード環境
SambaサーバーはProxmoxVE上に構築しました。
Proxmoxが稼働するマシンにはファイルサーバー用にHDDを3基追加しています。
2台がmirrorドライブ(RAID1)、1台がバックアップドライブの構成です。
- サーバー本体:自作PC
- 物理ハード:Core i7-10700(8C16T), MEM 32G
- 物理ストレージ:SSDx1(SATA),HDDx3(SATA)
- OS:ProxmoxVE9
- 仮想OS(Samba稼働用):Ubuntu26.04LTS
具体的なイメージは下図のとおりです

仮想OSにProxmoxが介在しているとデバイスのつながりが分かりにくくなります。
このような図で整理しておくことで自分以外が保守するときにも混乱せず時短になると思います。
OS構築
ファイルサーバーはSambaを使いますが、現時点でSambaを動かすOSとしてはUbuntu LTSが最適と考えているので、今回はリリースされたばかりのUbuntu26.04LTSを採用してみました。
ストレージ管理にZFSを使うのでメモリは推奨といわれる8GBに設定します。
ファイルサーバーの保存先は複数の外部ディスクを使いますので、Ubuntu側のOS領域ははデフォルトの32GBで必要十分です。
- OS: Ubuntu26.04LTS
- Core数:2
- MEM: 8GB(8192MB)
- HDD: 32GB
Proxmox上に構築した結果は下図の通りです。
Proxmox~ubuntuの構築方法についてはこちらの記事も参照してください。

ファイルシステム構築
次にUbuntuからHDDを制御するため、ファイルシステムを構築します。
HDDフォーマット
HDDフォーマットはProxmoxで行えます。
「ノード」→「ディスク」で対象ディスクを選択し、「GPTでディスクを初期化」で初期化します。
これまでコマンドでfdiskやgpartdを使っていましたが、その必要はなくなりました。素晴らしい!

HDD接続設定
HDDはProxmox上に接続されている状態ですので、まずはUbuntu側に接続設定します。
Proxmoxシェルを起動します。

lsblkでディスクの接続状態を確認します。
root@falconblog:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 1007K 0 part
├─sda2 8:2 0 1G 0 part
└─sda3 8:3 0 930.5G 0 part
├─pve-swap 252:0 0 8G 0 lvm [SWAP]
├─pve-root 252:1 0 96G 0 lvm /
├─pve-data_tmeta 252:2 0 8.1G 0 lvm
│ └─pve-data-tpool 252:4 0 794.3G 0 lvm
│ ├─pve-data 252:5 0 794.3G 1 lvm
│ ├─pve-vm--106--disk--0 252:6 0 64G 0 lvm
│ ├─pve-vm--107--disk--0 252:7 0 100G 0 lvm
│ ├─pve-vm--108--disk--0 252:8 0 90G 0 lvm
│ ├─pve-vm--139--disk--0 252:9 0 64G 0 lvm
│ ├─pve-vm--121--disk--0 252:10 0 100G 0 lvm
│ └─pve-vm--125--disk--0 252:11 0 32G 0 lvm
└─pve-data_tdata 252:3 0 794.3G 0 lvm
└─pve-data-tpool 252:4 0 794.3G 0 lvm
├─pve-data 252:5 0 794.3G 1 lvm
├─pve-vm--106--disk--0 252:6 0 64G 0 lvm
├─pve-vm--107--disk--0 252:7 0 100G 0 lvm
├─pve-vm--108--disk--0 252:8 0 90G 0 lvm
├─pve-vm--139--disk--0 252:9 0 64G 0 lvm
├─pve-vm--121--disk--0 252:10 0 100G 0 lvm
└─pve-vm--125--disk--0 252:11 0 32G 0 lvm
sdb 8:16 0 298.1G 0 disk
sdc 8:32 0 298.1G 0 disk
/dev/sdbと/dev/sdcが増設ディスクであることが判ります。
次にsdbとsdcのDISH IDを調べます。
# ls -al /dev/disk/by-id total 0 drwxr-xr-x 2 root root 620 May 6 15:43 . drwxr-xr-x 7 root root 140 May 6 15:05 .. lrwxrwxrwx 1 root root 9 May 6 15:05 ata-HGST_HTE545032A7E680_RBE40GMQ02Y4SR -> ../../sdb lrwxrwxrwx 1 root root 9 May 6 15:05 ata-HGST_HTE545032A7E680_RBE40GMQ03464R -> ../../sdc lrwxrwxrwx 1 root root 9 May 6 15:05 ata-WD_Blue_SA510_2.5_1000GB_23164C443412 -> ../../sda lrwxrwxrwx 1 root root 10 May 6 15:05 ata-WD_Blue_SA510_2.5_1000GB_23164C443412-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 May 6 15:05 ata-WD_Blue_SA510_2.5_1000GB_23164C443412-part2 -> ../../sda2 lrwxrwxrwx 1 root root 10 May 6 15:05 ata-WD_Blue_SA510_2.5_1000GB_23164C443412-part3 -> ../../sda3 ~~以下省略~~
増設ディスクのIDを確認し、テキストエディタ等でコピペしておきます。
- ata-HGST_HTE545032A7E680_RBE40GMQ02Y4SR → sdb
- ata-HGST_HTE545032A7E680_RBE40GMQ03464R → sdc
増設ディスクをProxmoxからUbuntuOS(VM125)へアタッチ(接続)します。
接続前に起動しているUbuntu26.04LTSをシャットダウンします。
ubuntu26ではシャットダウンコマンドが変わっていました。
# systemctl poweroff -t
HDDのアタッチにはProxmox専用コマンドの[qm]を使います。
root@falconblog:~# qm set 125 -sata1 /dev/disk/by-id/ata-HGST_HTE545032A7E680_RBE40GMQ02Y4SR update VM 125: -sata1 /dev/disk/by-id/ata-HGST_HTE545032A7E680_RBE40GMQ02Y4SR root@falconblog:~# qm set 125 -sata2 /dev/disk/by-id/ata-HGST_HTE545032A7E680_RBE40GMQ03464R update VM 125: -sata2 /dev/disk/by-id/ata-HGST_HTE545032A7E680_RBE40GMQ03464R
Proxmoxのコンソールから[VM125]→[ハードウェア]を選択し、HDDが接続(増設)されていることを確認します。

ゲストOS(ubuntu26.04LTS)を起動し、ターミナルから増設ディスクのby-idを調べます。
# ls -al /dev/disk/by-id total 0 drwxr-xr-x 2 root root 160 May 7 14:08 . drwxr-xr-x 10 root root 200 May 7 14:08 .. lrwxrwxrwx+ 1 root root 9 May 7 14:08 ata-QEMU_DVD-ROM_QM00003 -> ../../sr0 lrwxrwxrwx 1 root root 9 May 7 14:08 ata-QEMU_HARDDISK_QM00007 -> ../../sdb lrwxrwxrwx 1 root root 9 May 7 14:08 ata-QEMU_HARDDISK_QM00009 -> ../../sdc lrwxrwxrwx 1 root root 9 May 7 14:08 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0 -> ../../sda lrwxrwxrwx 1 root root 10 May 7 14:08 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part1 -> ../../sda1 lrwxrwxrwx 1 root root 10 May 7 14:08 scsi-0QEMU_QEMU_HARDDISK_drive-scsi0-part2 -> ../../sda2
Proxmox上のゲストOSではata-QEMU-****という名称に変わっています。
- ata-QEMU_HARDDISK_QM00007 →sdb
- ata-QEMU_HARDDISK_QM00009 →sdc
ZFSファイルシステムの構築
ZFSファイルシステムをインストールします。
# apt update # apt upgrade # apt install zfsutils-linux バージョンチェック # zfs --version zfs-2.4.1-1ubuntu5 zfs-kmod-2.4.1-1ubuntu4
zpoolでファイルシステムを構築します。
zfsはファイルシステムをpoolと呼びます。
プールの呼び名は伝統的に[tank]とするそうなので、今回は/tankにプールをマウントします。
- プール名称:tank
- 冗長方式:mirror(RAID1相当)
- ドライブ1:ata-QEMU_HARDDISK_QM00007
- ドライブ2:ata-QEMU_HARDDISK_QM00009
# zpool create -f \ -o ashift=12 \ -o autotrim=off \ -O atime=off \ -O compression=zstd-1 \ -O xattr=sa \ tank mirror ata-QEMU_HARDDISK_QM00007 ata-QEMU_HARDDISK_QM00009
オプションの説明
- ashift=12:pool作成時のみ設定可能で後から変更ができません。4Kn/512e HDD,SSDのどちらでも12(=2^12=4096バイト)が標準になります。デフォルトはデバイス申告値に従うようですが、512のドライブに当たると性能が出せないため指定推奨です。
- autotrim=off: TRIMはSSD用機能のため、HDDプールでは無効にします。SSDプールを作る場合はonにします。
- atime=off: 読み取り操作でアクセス時刻を更新しない設定です。メタデータの書き込み量が減り、多ファイルアクセス時の応答速度が上がることが期待できます。
- compression=zstd-1: 圧縮レベル1がzstd の中で最速です。テキスト・ログ・小さい画像等には有効のようです。圧縮率優先ならzstd(=level 3、デフォルト)またはzstd-6となりますが動作は遅くなります。
- xattr=sa:拡張属性をSystem Attribute領域に格納します。デフォルトonだと非効率なためNAS 用途ではsa推奨です。
/tankというファイルシステムが出来ていることを確認します。
# ls / bin cdrom etc lib lost+found mnt proc run sda sda2 sdc sr0 swap.img tank usr boot dev home lib64 media opt root sbin sda1 sdb snap srv sys tmp var
zpool statusでファイルシステムの動作状況も確認します。
# zpool status
pool: tank
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-QEMU_HARDDISK_QM00007 ONLINE 0 0 0
ata-QEMU_HARDDISK_QM00009 ONLINE 0 0 0
errors: No known data errors
dfで全体ファイルシステムの状況も確認
# df Filesystem 1K-blocks Used Available Use% Mounted on tmpfs 1520588 5144 1515444 1% /run /dev/sda2 32844560 11656308 19494300 38% / tmpfs 3801468 0 3801468 0% /dev/shm none 1024 0 1024 0% /run/credentials/systemd-journald.service none 1024 0 1024 0% /run/credentials/systemd-resolved.service tmpfs 3801472 8 3801464 1% /tmp tmpfs 760292 80 760212 1% /run/user/1000 /dev/sr0 6366186 6366186 0 100% /run/media/ace/Ubuntu 26.04 amd64 tank 302775936 128 302775808 1% /tank
これでZFSファイルシステムの構築は完了です。
ZFSはmdadmと違い、fatabへマウントする必要はありません。
とても楽ですね。
Sambaファイルサーバーの構築
公開フォルダ作成
フォルダ作成は/tankプールの下にmkdirでも良いのですが、データセットごとに容量制限、圧縮設定、バックアップ範囲(スナップショット)などを細かく設定できるようにするため、zfsで管理単位を分けておきます。
/tankプールの下に公開するフォルダ(zfsデータセットと呼ぶ)を作成し、ZFSの管理単位に分けます。
ファイルサーバーとして使うため、権限変更も忘れずに行います。
# zfs create tank/my_folder # chmod 777 /tank/my_folder # zfs create tank/work_folder # chmod 777 /tank/work_folder
zfsでフォルダが構築できていることを確認します。
# ls -al /tank total 4 drwxr-xr-x 4 root root 4 May 8 08:50 . drwxr-xr-x 21 root root 4096 May 7 14:13 .. drwxrwxrwx 2 root root 2 May 8 08:50 my_folder drwxrwxrwx 2 root root 2 May 8 08:50 work_folder # zfs list NAME USED AVAIL REFER MOUNTPOINT tank 644K 289G 104K /tank tank/my_folder 96K 289G 96K /tank/my_folder tank/work_folder 96K 289G 96K /tank/work_folder
WebminによるSamba構築
sambaはapt install sambaでも良いのですがCLI設定は大変なので、webminを用いたフルGUI設定がおすすめです。
Ubuntu上にWebminをインストールします。Webminの最新インストール方法はこちら
# apt install curl # curl -o webmin-setup-repo.sh \ https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh # sh webmin-setup-repo.sh # apt-get install webmin --install-recommends
外部のWindows端末などから、Webminのコンソールにアクセスします。
ポート番号が10000ですのでつけ忘れないように。
http://[サーバーIPアドレス]:10000
ログイン画面がでたらubuntu管理者権限でログインします。

Webminの「未設定のモジュール」から「Samba Windowsファイル共有」を選択し、インストールします。



「モジュールをリフレッシュする」をクリックすると、「Samba Windowsファイル共有」が「サーバー」に移動します。
Sambaの共有設定をします。
「新規のファイル共有を作成」をクリックします。

ファイル共有するフォルダをしていします。
ディレクトリ(=フォルダと同意)はzfsで作成済みですので「いいえ」をチェック
所有者はゲストアカウントで使うこととして[nobody]に設定します。
※注意:フォルダ権限管理する場合はubuntu内にユーザーを作る必要があります。ファイルサーバーがAD環境の場合はubuntuをドメイン配下にバインドする必要があります。
設定が出来たら下部の「作成」をクリックします。

作成が完了したらアクセス権限の設定をします。

書き込み可否設定、ゲストアクセス設定、ゲストUnixユーザーの設定を変更します。
work_folderも同様に設定すると、以下画面になります。

設定を変えた後は、「Sambaサーバーを再起動」をクリックします。
再起動は忘れがちですので注意しましょう。

これでSambaサーバーの設定は完了です。
Windows端末からファイルサーバーにアクセスします。
エクスプローラーの検索バーに[\\192.168.10.125]といったフォーマットでアクセスできることを確認します。

初回アクセスはIDとパスワードが求められることがあるので、ubuntuにあるアカウントを入力するとアクセスできます。

以上でファイルサーバーの構築は完了です。
ZFSスナップショットの使い方
スナップショットとは?
ZFSはスナップショットという以前のファイルをバックアップする仕組みがあります。
ZFSスナップショットは、ファイルシステム全体(データセット)の特定時点の状態を、Copy-on-Write(書き込み時コピー)技術を用いて保存する読み取り専用の軽量コピーです。
データが変更されるまで実データ領域を占有せず、変更されたブロックの差分のみを管理するため、作成が速く、容量も節約できます。
- 不変性: スナップショットは作成された瞬間から読み取り専用(Read-Only)として固定されます。
- 容量: データが変更された分だけ追加で消費されます。
- 即時性: 作成および削除はほぼ一瞬で完了します。
ZFSの仕組み上、ファイルの削除や変更を行っても古いデータはすぐには上書きされません。
すなわち定期的にスナップショットを取っておけば消去されたファイルも復旧できることになります。
スナップショットの作成
スナップショットの作成やリカバリはすべてCLI設定となります。
zfs snapshot [データセット名]@[スナップショットファイル名] で指定します。
スナップショットを撮った時刻が分かるようにファイル名は時刻データを埋め込むと直感的に整理が出来て便利です。
# zfs snapshot tank/my_folder@$(date +%Y%m%d_%H%M%S)_backup
スナップショットの一覧はzfs listで行えます。
# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT tank/my_folder@20260508_094120_backup 36.0M - 36.0M - tank/my_folder@20260508_110726_backup 0B - 120K -
スナップショットからのファイル復元方法
スナップショットは以下の隠しフォルダに保存さています。
[マウントポイント]/.zfs/snapshot/[スナップショット名]
最初にスナップショットの隠しフォルダにアクセスします。
# ls -al /tank/my_folder/.zfs/snapshot/ total 48 drwxrwxrwx 4 root root 2 May 8 11:07 . drwxrwxrwx 1 root root 0 May 8 08:50 .. drwxrwxrwx 3 root root 3 May 8 09:13 20260508_094120_backup drwxrwxrwx 2 root root 3 May 8 11:06 20260508_110726_backup
復旧したいファイルが存在していたフォルダに移動します。
# cd /tank/my_folder/
スナップショット内のフォルダを確認し、復旧したいファイルを探します。
# ls -al /tank/my_folder/.zfs/snapshot/20260508_110726_backup total 24 drwxrwxrwx 2 root root 3 May 8 11:06 . drwxrwxrwx 4 root root 2 May 8 11:07 .. -rwxr--r--+1 nobody nogroup 0 May 8 11:06 test-data.txt
今回は誤って消去した[test-data.dat]というファイルを復元してみます。
カレントフォルダにファイルのコピーをします。
# cp .zfs/snapshot/20260508_110726_backup/test-data.txt .
ファイルが復元されていることを確認します。
# ls test-data.txt
スナップショットを別ディスクに保存する場合
スナップショットはzfs sendとzfs recvコマンドにより、別ディスクや別ホストにも保存することができます。
バックアップストレージが準備できる場合はそちらに保存しておくことで、ランサムウェアの対策としても有効です。
別ディスク(ata-QEMU_HARDDISK_QM00011)にバックアップ用プール(/tank2)を作成
# zpool create -f \ -o ashift=12 \ -o autotrim=off \ -O atime=off \ -O compression=zstd-1 \ -O xattr=sa \ tank2 ata-QEMU_HARDDISK_QM00011
zfs sendで別プールへバックアップ
zfs snapshot tank/data@snap1 # スナップショット作成 zfs send tank/data@snap1 | zfs recv tank2/backup/data # 別プールへ送信
別サーバーにバックアップすることもできます。
zfs send tank/data@snapshot1 | ssh user@remote_host "zfs recv pool2/backup/data" ※リモート側のパスワードを入力する必要があります
更に差分転送(増分のみバックアップ)も出来ます。
zfs send -i tank/data@snap1 tank/data@snap2 | zfs recv pool2/backup/data
今後の予定
zfsは素晴らしいストレージシステムです。
mdadmで構築していたファイルサーバーも順次移行していく予定です。
以後予定記事です。
- zfs状態のzabbix監視方法
- zfsストレージ(HDD)故障復旧方法

