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
以上で復旧作業は完了です。
同じドライブを常備していれば復旧はとても簡単です。
予備ドライブはぜひとも購入しておいたほうがいいでしょう。