【Proxmox】ZFSドライブを使ったフルGUI管理のSambaファイルサーバー構築

Linux

仮想サーバー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)故障復旧方法
タイトルとURLをコピーしました