Proxmox上にubuntu RAID1 NASを構築

Linux

Proxmox上にRAID1 Sambaファイルサーバーを組む場合の備忘録メモです。

HDD障害時の復旧手順についても記載します。

構築環境について

昨今のCPUはマルチコアが進み、LinuxOSを単体で動かしても性能を使い切ることができないことから、Proxmox上に仮想OSを立ててSambaファイルサーバーを構築することにします。

Proxmoxを使った自宅サーバーの構築方法はこちらを参照してください。

  • ハイパーバイザ:ProxmoxVE8
  • Samba用仮想OS:Ubuntu24.04LTS(CPU 2コア、MEM:4Gを割り当て)
  • Samba用HDD:WD製6TB x 2台
  • RAIDレベル:RAID1(ミラーリング)

事前準備

RAID1システムを組む場合は、HDD故障に備えて予備HDDの同時購入を推奨します。

同一メーカドライブでも型式が異なると、容量が微妙に異なってくるため、故障時の復旧が複雑になります。

ファイルサーバーが故障すると素早い復旧が求められるため、構築と同じ操作で復旧できるように同一メーカー同一型番で常備しておくのが良いです。

また作業前にHDDのシリアル番号が外から見てもわかるようにテプラ等で張り付けておくのをおすすめします。

HDD故障時に壊れたドライブをシリアル番号で判別するしかないため、面倒でも作業しておくことを推奨します。

構築作業

(手順1)Proxmox上にUbuntu Sambaを構築

aptをアップデートします。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install samba

smb.confのバックアップをとります。

$ cd /etc/samba/
$ sudo cp -a smb.conf smb.conf.org

/mntにSamba共有フォルダ(/mnt/share)を作成し、ドライブのマウントポイントを作成します。

$ cd /mnt
$ sudo mkdir share
$ sudo chmod -R 777 share

smb.confの設定を編集します。

今回はネットワーク内のPCに対して、フォルダアクセスをフル許可をする設定例を記載します。

$ sudo nano smb.conf

最下行に以下を追記
[share]
        path = /mnt/share
        writeable = true
        browseable = yes
        guest ok = yes
        guest only = yes
        force create mode = 0777
        force directory mode = 0777

/mnt/shareにはRAIDドライブをマウントする場所ですので、いまは接続できません。

次のRAIDドライブ構築に進みます。

(手順2)ProxmoxサーバーにHDDを接続し、Ubuntuへ直結する

次はProxmoxサーバーのシェルで操作します。

Samba NASに使うHDDのデバイス名とUUIDを確認します。(以下のマシンは4TBx3基、6TBx2基が搭載されています。)

# ls -l /dev/disk/by-id/
total 0
lrwxrwxrwx 1 root root  9 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A209FXBG -> ../../sdb
lrwxrwxrwx 1 root root 10 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A209FXBG-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A209FXBG-part2 -> ../../sdb2
lrwxrwxrwx 1 root root 10 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A209FXBG-part3 -> ../../sdb3
lrwxrwxrwx 1 root root  9 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A20AFXBG -> ../../sda
lrwxrwxrwx 1 root root 10 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A20AFXBG-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A20AFXBG-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A20AFXBG-part3 -> ../../sda3
lrwxrwxrwx 1 root root  9 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A212FXBG -> ../../sdc
lrwxrwxrwx 1 root root 10 Dec  3 09:20 ata-TOSHIBA_MG08ADA400E_X2B0A212FXBG-part1 -> ../../sdc1
lrwxrwxrwx 1 root root  9 Dec  3 09:20 ata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HV0PX -> ../../sde
lrwxrwxrwx 1 root root 10 Dec  3 09:20 ata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HV0PX-part1 -> ../../sde1
lrwxrwxrwx 1 root root  9 Dec  3 09:20 ata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HVK73 -> ../../sdd
lrwxrwxrwx 1 root root 10 Dec  3 09:20 ata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HVK73-part1 -> ../../sdd1
lrwxrwxrwx 1 root root 12 Dec 12 12:26 lvm-pv-uuid-iT1RYf-YfNw-YWvi-SvRs-Fxxq-BNK6-tsg1Ib -> ../../zd32p2
lrwxrwxrwx 1 root root 12 Dec 13 13:43 lvm-pv-uuid-NpATWR-w3T4-BFdE-mwk4-1f6c-WFaT-BDOecy -> ../../zd64p2
lrwxrwxrwx 1 root root 12 Dec 11 14:45 lvm-pv-uuid-yqWEGg-62WB-j12x-tV17-qkVV-sxD7-5yzjvV -> ../../zd48p2
~以下は省略~

qmコマンドで構築した仮想サーバーVM番号(例:VM101)へsataドライブをパススルーでアタッチします。

UUIDはby-idで表示された値をそれぞれ入力します。

-sata#の#は仮想ホスト側のドライブ番号です。複数台繋ぐ場合は別番号(1,2,...5)にします。

# 書式
# qm set <Guest Machine ID> -sata0(接続方式にsata選択した場合) /dev/disk/by-id/ata-hogehoge

# 実際の入力例
# ドライブ1
# qm set 101 -sata0 /dev/disk/by-id/ata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HV0PX
update VM 101: -sata0 /dev/disk/by-id/ata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HV0PX

# ドライブ2 
# qm set 101 -sata1 /dev/disk/by-id/ata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HVK73 
update VM 101: -sata1 /dev/disk/by-id/ata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HVK73

正常に接続できると、VM101のハードウェア構成で2台のHDD追加ができるようになっています。

仮想マシンにHDDを2基追加した後、VM101マシンを起動するとubuntu側でHDDが直接扱えるようになります。

(手順3)Ubuntu側でRAID1ドライブを構築

ubuntuでRAID1を構築し、/dev/sdb /dev/sdcの2ドライブを/dev/md0のRAID1を構築する例で解説します。

最初にdfで現在のマウント状況を確認します。

# df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              796M  1.1M  795M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   77G  8.2G   65G  12% /
tmpfs                              3.9G     0  3.9G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/vda2                          2.0G  126M  1.7G   7% /boot
tmpfs                              796M  4.0K  796M   1% /run/user/0

lsblkで仮想マシンに接続されているドライブ名称を調べます。

(注記)以下はsdbとsdcが既にmd0(RAID1ドライブ)が構築された状態です。

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
~loopは省略~
sda       8:0    0   120G  0 disk
tqsda1    8:1    0     1M  0 part
tqsda2    8:2    0   513M  0 part  /boot/efi
mqsda3    8:3    0 119.5G  0 part  /var/snap/firefox/common/host-hunspell
                                   /
sdb       8:16   0   5.5T  0 disk
|-sdb1    8:17   0   5.5T  0 part
  |-md0   9:0    0   5.5T  0 raid1 /mnt/share
sdc       8:32   0   5.5T  0 disk
|-sdc1    8:33   0   5.5T  0 part
  |-md0   9:0    0   5.5T  0 raid1 /mnt/share

増設した 2 台のハードディスクにパーティションを作成し、RAID フラグをセットしておきます。

パーティション作成はスクリプト形式で一気に入力する方が間違いなく構築できると思います。

# apt install parted
# parted --script /dev/sdb "mklabel gpt"
# parted --script /dev/sdc "mklabel gpt"
# parted --script /dev/sdb "mkpart primary 0% 100%"
# parted --script /dev/sdc "mkpart primary 0% 100%"
# parted --script /dev/sdb "set 1 raid on"
# parted --script /dev/sdc "set 1 raid on"

mdadmでRAID 1 を構成します。

# mdadmインストール
# apt install mdadm

# raid1を構築
# mdadm --create /dev/md0 --level=raid1 --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

/dev/md0をext4でフォーマットし、/mnt/shareにマウントします。

# ext4 でフォーマットして /mnt/share にマウント
# mkfs.ext4 /dev/md0
# mount /dev/md0 /mnt/share --types=ext4
$ df -hT
Filesystem     Type     Size  Used Avail Use% Mounted on
tmpfs          tmpfs    794M   21M  773M   3% /run
/dev/sda3      ext4     118G   12G  100G  11% /
tmpfs          tmpfs    3.9G     0  3.9G   0% /dev/shm
tmpfs          tmpfs    5.0M     0  5.0M   0% /run/lock
/dev/sda2      vfat     512M  6.1M  506M   2% /boot/efi
/dev/md0       ext4     5.5T  2.2T  3.0T  42% /mnt/share
tmpfs          tmpfs    794M  140K  794M   1% /run/user/1000

# マウント後に再度権限を変更
$ sudo chmod -R 777 share

起動時にマウントするよう/etc/fstabにも記載します。

ドライブ名をmd*** にするとハードウェア構成の変更等により変わるため UUID で記載します

# UUIDを調べる
$ blkid |grep md
/dev/md0: UUID="89004062-796d-4158-8b30-2c8ff16db475" BLOCK_SIZE="4096" TYPE="ext4"

# nano /etc/fstab
# 調べた UUID で最下行に記述
# コメントに取り付けた日を書いておくとあとあと便利
# /dev/md0 mount 2024/07/30
UUID=89004062-796d-4158-8b30-2c8ff16db475       /mnt/share      ext4    defaults 0 0

# fatabの記述により md*** の名前が変わった場合も正常にマウントされます
# 再起動するとmd127になることがあるがマウントポイントでの動作には問題はない
$ df -hT /mnt/share
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/md0       ext4  5.5T  2.2T  3.0T  42% /mnt/share

以上でSamba3 NAS構築は完了です。

保守作業

RAID1ステータス確認

sambaの動作確認は/proc/mdstatに記載されていて、動作フラグが[UU]であれば正常です。

# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc1[1] sdb1[0]
      5860335232 blocks super 1.2 [2/2] [UU]
      bitmap: 0/44 pages [0KB], 65536KB chunk

unused devices: <none>

[_U], [U_]の場合は、ディスク障害が発生後、システムから切り離し済みの状態になります。

障害時刻などの詳細をカーネルログなどを確認して、障害状況と対象ドライブを特定してから、すみやかにドライブ交換作業を行います。

アクセス状態確認

smbstatus -uでユーザーのアクセス状態を確認できます。

# smbstatus -u

Samba version 4.15.13-Ubuntu
PID     Username     Group        Machine                                   Protocol Version  Encryption           Signing
----------------------------------------------------------------------------------------------------------------------------------------
1007127 nobody       nogroup      192.168.100.133 (ipv4:192.168.100.133:53289) SMB3_11           -                    -
1007048 nobody       nogroup      192.168.100.160 (ipv4:192.168.100.160:52922) SMB3_11           -                    -
1007355 nobody       nogroup      192.168.100.147 (ipv4:192.168.100.147:52480) SMB3_11           -                    -
1008356 nobody       nogroup      10.1.9.18 (ipv4:10.1.9.18:50035)          SMB3_11           -                    -
1007769 nobody       nogroup      192.168.100.124 (ipv4:192.168.100.124:52475) SMB3_11           -                    -
1008346 nobody       nogroup      10.1.9.69 (ipv4:10.1.9.69:57454)          SMB3_11           -                    -
1007162 nobody       nogroup      192.168.100.141 (ipv4:192.168.100.141:52826) SMB3_11           -                    -
1007069 nobody       nogroup      192.168.100.135 (ipv4:192.168.100.135:49977) SMB3_11           -                    -
1007461 nobody       nogroup      192.168.100.143 (ipv4:192.168.100.143:62422) SMB3_11           -                    -
1007048 nobody       nogroup      192.168.100.160 (ipv4:192.168.100.160:52922) SMB3_11           -                    -
1008345 nobody       nogroup      192.168.100.173 (ipv4:192.168.100.173:57453) SMB3_11           -                    -
1007140 nobody       nogroup      192.168.100.170 (ipv4:192.168.100.170:52269) SMB3_11           -                    -
1007047 nobody       nogroup      10.1.9.10 (ipv4:10.1.9.10:49688)          SMB3_11           -                    -
1007191 nobody       nogroup      192.168.100.138 (ipv4:192.168.100.138:49961) SMB3_11           -                    -
1007110 nobody       nogroup      192.168.100.142 (ipv4:192.168.100.142:49981) SMB3_11           -                    -
1007090 nobody       nogroup      10.1.9.224 (ipv4:10.1.9.224:64196)        SMB3_11           -                    -
1007191 nobody       nogroup      192.168.100.229 (ipv4:192.168.100.229:52521) SMB3_11           -                    -

Service      pid     Machine       Connected at                     Encryption   Signing
---------------------------------------------------------------------------------------------
share        1008356 10.1.9.18     月 12月 16 09時47分40秒 2024 JST -            -
share        1007110 192.168.100.142 月 12月 16 08時27分33秒 2024 JST -            -
share        1008346 10.1.9.69     月 12月 16 09時46分33秒 2024 JST -            -
share        1007048 192.168.100.160 月 12月 16 08時18分14秒 2024 JST -            -
share        1007191 192.168.100.138 月 12月 16 08時39分27秒 2024 JST -            -
share        1007047 10.1.9.10     月 12月 16 08時17分36秒 2024 JST -            -
share        1007162 192.168.100.141 月 12月 16 08時35分40秒 2024 JST -            -
share        1008345 192.168.100.173 月 12月 16 09時46分33秒 2024 JST -            -
share        1007769 192.168.100.124 月 12月 16 09時03分00秒 2024 JST -            -
share        1007127 192.168.100.133 月 12月 16 08時31分15秒 2024 JST -            -
IPC$         1007191 192.168.100.138 月 12月 16 08時39分38秒 2024 JST -            -
share        1007048 192.168.100.160 月 12月 16 10時11分12秒 2024 JST -            -
share        1007355 192.168.100.147 月 12月 16 08時43分26秒 2024 JST -            -
share        1007069 192.168.100.135 月 12月 16 08時20分49秒 2024 JST -            -
share        1007461 192.168.100.143 月 12月 16 08時50分50秒 2024 JST -            -
share        1007191 192.168.100.229 月 12月 16 10時05分03秒 2024 JST -            -
share        1007090 10.1.9.224    月 12月 16 08時24分27秒 2024 JST -            -
share        1007140 192.168.100.170 月 12月 16 08時32分42秒 2024 JST -            -

Locked files:
Pid          User(ID)   DenyMode   Access      R/W        Oplock           SharePath   Name   Time
--------------------------------------------------------------------------------------------------
1007048      65534      DENY_NONE  0x100081    RDONLY     NONE             /mnt/share

ドライブ障害時の復旧手順

不運にもドライブ障害が発生した場合、正常ドライブが悪化する前にできるだけ早急に交換処置を行います。

ドライブ脱着は全システム停止となるリスクがあるため、以下には特に注意します。

  • qmコマンドは、y/nがないため、実行前に再度チェックすること!
  • 物理ディスク取外し時は、対象ドライブを間違えないこと!
  • UUID(Linux上でのドライブID値)とシリアル番号の紐づけ確認も行うこと!

構築時の操作ログを確認しながら作業するほうがよいでしょう。

障害ドライブの特定と切り離し

まずは正常なドライブの状態を確認します。

# mdadm --detail /dev/md0 (md***はdfで調べます)
/dev/md0:
           Version : 1.2
     Creation Time : Tue Jul 30 11:57:56 2024
        Raid Level : raid1
        Array Size : 5860335232 (5.46 TiB 6.00 TB)
     Used Dev Size : 5860335232 (5.46 TiB 6.00 TB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Wed Aug 14 13:23:37 2024
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : ubuntu-samba:0  (local to host ubuntu-samba)
              UUID : a70408a0:9e2239e7:510639cf:3738a7af
            Events : 36033

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1

故障時は以下のように変化します。

ご注意:実際は故障を発生させていませんのでネット情報からの想定ログとなります。

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdb1[1]
      8382400 blocks super 1.2 [2/1] [_U]

unused devices: <none>

# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Wed May 20 10:54:43 2015
     Raid Level : raid1
     Array Size : 8382400 (7.99 GiB 8.58 GB)
  Used Dev Size : 8382400 (7.99 GiB 8.58 GB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Wed May 20 12:35:54 2015
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           Name : raidtest:0  (local to host ****)
           UUID : 72de48ed:e3235c0d:5605621c:a94999e7
         Events : 109

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       17        1      active sync   /dev/sdb1

障害ドライブをシステムから切り離し

障害が発生したHDDをRAIDから外します。自動でRAIDから切り離されている場合は、すでに片肺運転になっているため、コマンド操作は不要です。(操作してもエラーになります)

$ sudo mdadm --remove /dev/md0 /dev/sdb1

ubuntuでRAIDから外せたら、次はProxmox側の切り離しを行います。

(注記)くれぐれも正常側HDDを外さないように注意してください。

ディスクラベルの確認
# ls -l /dev/disk/by-id

ディスクの仮想ホストへのアタッチを解除
# qm set 101 -delete /dev/disk/by-id/aata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HV0PX

交換ディスクの接続とフォーマット

交換ディスクはRAID1構築時と同じ操作で接続とフォーマットします。

1.仮想システムへ交換HDDを接続する

2.proxmox側操作
UUIDを調べる
# ls -l /dev/disk/by-id/
HDDをubuntuにアタッチ
# qm set 101 -sata0 /dev/disk/by-id/ata-WDC_WD60EZAX-00C8VB0_WD-WX32D34HV0PX

3.ubuntu側操作
/dev/sdcをフォーマット
# parted --script /dev/sdc "mklabel gpt"
# parted --script /dev/sdc "mkpart primary 0% 100%"
# parted --script /dev/sdc "set 1 raid on"

RAID1再構築

mdadmで交換ドライブを追加し、RAIDを再構築します。

# sudo mdadm --add /dev/md0 /dev/sdc1
mdadm: added /dev/sdc1

再構築にかかる所要時間は容量にもよりますが6Tの場合12時間程度かかります。

再構築状況は/etc/mdstatで状況が確認できます。

# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sda1[2] sdb1[1]
      8382400 blocks super 1.2 [2/1] [_U]
      [==>..................]  recovery = 11.0% (928960/8382400) finish=7.3min speed=16926K/sec

以上で復旧作業は完了です。

同じドライブを常備していれば復旧はとても簡単です。

予備ドライブはぜひとも購入しておいたほうがいいでしょう。