お家で作るMSCS クラスタの構築手順です。無料でできますがHyper Vサーバが故に通常のWindows Serverでは不要な苦労があります。
検証中、変なところでハマったりしたときにHyperV ServerというかWindows serverのCoreでの操作が苦行過ぎて114514回ゲロを吐きキーボードがゲロまみれになりましたが、おかげで吐くものがなくなり悟りを開けそうです。もう一回やれと言ったら多分忘れてるので覚えているうちに書き残します。

Microsoft Clustering Serviceを利用するにはADが必要なので、Linux上でのSamba4の構築を含みます。

また、Clustering Shared Volume(CSV)を利用するのにiSCSIボリュームがいるので、targetもインストールします。使い慣れているだけなので、他にiSCSI TargetがあればそちらでOKです。

 

設定手順

必要な物のダウンロード

HyperV Serverのダウンロード

https://www.microsoft.com/ja-jp/evalcenter/evaluate-hyper-v-server-2016

MSアカウントでよしなに登録してダウンロードします。

Microsoft Remote Server Administration Tools (RSAT)のダウンロード

HyperV manager、Failover Cluster Manager、AD Managerなど、諸々の管理にGUIが使いたい人向けです。このツールをインストールするマシンは、このあとにSamba4で作成するMSCSと同じドメインに所属している必要があります。Windows serverがあれば、機能の追加から追加可能です。

参考:https://wiki.samba.org/index.php/Installing_RSAT

Samba4のセットアップ

まずはドメインが必要なので、Sambaをセットアップします。今回はただの好みでDebian8をベースに行います。検証環境は下記で行いました。

root@debian:~# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.6 (jessie)
Release:        8.6
Codename:       jessie

apt-getでSamba4と取り巻きをインストール

以下のコマンドでインストールしていきます。

root@debian:~# apt-get install samba winbind krb5-user

 

samba-tool domain provision でドメインを作っていく

https://wiki.samba.org/index.php/Setting_up_Samba_as_an_Active_Directory_Domain_Controller#Provisioning_a_Samba_Active_Directory

を参照してsamba-tool domain provision を行い、よしなに内容を入力します

root@debian:~# rm /etc/samba/smb.conf
root@debian:~# samba-tool domain provision --server-role=dc --use-rfc2307 --dns-backend=SAMBA_INTERNAL --realm=dev.lan --domain=dev --adminpass=Passw0rd
Looking up IPv4 addresses
Looking up IPv6 addresses
No IPv6 address will be assigned
Setting up secrets.ldb
Setting up the registry
Setting up the privileges database
Setting up idmap db
Setting up SAM db
Setting up sam.ldb partitions and settings
Setting up sam.ldb rootDSE
Pre-loading the Samba 4 and AD schema
Adding DomainDN: DC=dev,DC=deb
Adding configuration container
Setting up sam.ldb schema
Setting up sam.ldb configuration data
Setting up display specifiers
Modifying display specifiers
Adding users container
Modifying users container
Adding computers container
Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=dev,DC=lan
Creating DomainDnsZones and ForestDnsZones partitions
Populating DomainDnsZones and ForestDnsZones partitions
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba 4 has been generated at /var/lib/samba/private/krb5.conf
Setting up fake yp server settings
Once the above files are installed, your Samba4 server will be ready to use
Server Role:           active directory domain controller
Hostname:              debian
NetBIOS Domain:        DEV
DNS Domain:            dev.lan
DOMAIN SID:            S-1-5-21-3978880503-891640854-1088594067

出来上がった内容がこちら

root@debian:~# cat /etc/samba/smb.conf
# Global parameters
[global]
        workgroup = DEV
        realm = DEV.LAN
        netbios name = DEBIAN
        server role = active directory domain controller
        dns forwarder = 8.8.8.8
        idmap_ldb:use rfc2307 = yes
[netlogon]
        path = /var/lib/samba/sysvol/dev.lan/scripts
        read only = No
[sysvol]
        path = /var/lib/samba/sysvol
        read only = No

hostsとresolv.confの編集

root@debian:~# vi /etc/resolv.conf
domain dev.lan ※今回作成したRealm名を追記
nameserver 8.8.8.8
nameserver 8.8.4.4

root@debian:~# vi /etc/hosts
127.0.0.1       localhost
127.0.1.1       debian
192.168.1.111 dev.lan dev ※自分のローカルアドレスとロングホスト、ショートホストを追記

 

SAMBA_INTERNALなDNSが動いているか確認

自分に対してnslookupなどを行い、DNSが動いているか確認します。

※53番でリッスンしているか確認
root@debian:~# netstat -nap|grep :53
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      924/samba
tcp6       0      0 :::53                   :::*                    LISTEN      924/samba
udp        0      0 0.0.0.0:53              0.0.0.0:*                           924/samba
udp6       0      0 :::53                   :::*                                924/samba

※自分に対してクエリを投げる
root@debian:~# nslookup debian.dev.lan localhost
Server:         localhost
Address:        ::1#53
Name:   debian.dev.lan
Address: 192.168.1.111 ←帰ってくればOK

 

クライアントPCをADに参加させてみる

HyperV Serverをドメインに参加させる前に、GUIからRSATを使ってADの設定をするため、設定用クライアントPCをドメインに参加させます。

DNSをSambaに向ける

DNSサーバに今回作成したADを指定します

その後、Windows8以降であればWin+X→Yでシステムを表示させ、システムの詳細設定→システムのプロパティ→コンピュータ名→変更 から、PC名の変更(任意)とドメインに今回作成したドメインを指定します。

その後、ようこそと表示されたらOKです。再起動後、今回作成したドメイン\Administratorでログインできるか確認します。パスワードはsamba-tool domain provisionで入力した「--adminpass=」の部分です。

ADのユーザなどが取得できるか確認してみる

RSATをインストールしたら、「Active Directoryユーザとコンピュータ」を起動します。紛らわしいですが、「Active Directory管理センター」の方ではないので注意してください。

その後、Computersあたりを開き、今回接続したマシンが追加されていることを確認してください。(下記スクショは構築したあとになって貼り付けたので参考です。)

HyperV Serverの初期セットアップ

まずはインストールします。特に迷うことはないと思います。

Optional:USBにvhdxファイルを置いてそこから起動する

http://terrytlslau.tls1.cc/2014/01/installing-hyper-v-server-2012-r2-to.html

↑非常にわかりやすく、かつ2016でも使えました。

インストールが完了後、下記を実行します。

 

  1. sconfig(青い画面の窓) で9を選択し、日付を合わせる
    ※サーバ、クライアント、仮想ホストで日付と時間があっていないと色々こける
  2. 2を選択しPC名を変更する
  3. 再起動
  4. 8を選択し、DNSにADを向ける。必要に応じてIPも固定する。
  5. 1を選択し、ADに参加する。セットアップ用のアカウントをきかれたらdomain\administratorを入力し、Samba4のセットアップの時に入れたパスワードを入れる
  6. 再起動
  7. 7を選択し、リモデを有効にする
  8. sconfigの後ろにあるコマンドプロンプトにpowershellとうちこみ、Powershellを立ち上げる
  9. Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False をPowershellから実行し、FWを無効化
    ※netshからやる場合、 netsh advfirewall set allprofiles state off でも同様

OSインストール→ドメイン参加を必要台数分実行します。

Hyper-V Managerで接続してみる

ここまで来ると、取りあえず単体のHyper-V Managerから接続できるようになるはずです。

RSATを入れたマシンに、「ドメインのユーザ」でログイン

RSATを入れたマシンに、RDP等からログインします。この際に、ログインするアカウントはAdministratorsにいるdomain\userを指定してください。

特に作っていなければdomain\administratorでログインします。

Hyper-V Managerを起動

ADマネージャのあるフォルダにHyper-V Managerがあるので、それを起動します。

起動後、右ペインからサーバに接続をクリックし、「別のコンピュータ」から上記でセットアップしたマシンのホスト名を入れます。

正しく設定されていれば、ログインしているアカウントの認証情報を利用して接続できるはずです。

 

クラスタのセットアップ

まずは、クラスタの作成までを行います。

クラスタ機能の追加

Powershellの機能追加コマンドレットより追加します。クラスタ参加するマシン全てで実行します。

PS C:\Users\administrator.DEV> Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools
Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             Success        {フェールオーバー クラスタリング, リモート...

 

VMSwitchを作成する

VMSwitchのセットアップを行います。クラスタノード全てで同じスイッチ名にしてください。

上記Hyper-V Managerが接続されていれば、そこから仮想スイッチマネージャを通して作成することも出来ます。

Get-NetAdapterコマンドレットで利用可能なNICを確認します。利用したいNICのnameを確認してください。

PS C:\Users\administrator.DEV> Get-NetAdapter
Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
イーサネット 4            Intel(R) Ethernet Connection I218-V           7 Up           C0-3F-D5-6D-49-84         1 Gbps

この場合はNameがイーサネット 4 なので、VMSwitch作成時にはイーサネット 4 を指定します。そのVMSwitchでホストOSの通信も行いたい場合(NICが1つしかない場合)、-AllowManagementOS に$Trueをつけます。指定後、リモデが一瞬切れます。

PS C:\Users\administrator.DEV> New-VMSwitch "VMS1" -NetAdapterName "イーサネット 4" -AllowManagementOS $True
Name SwitchType NetAdapterInterfaceDescription
---- ---------- ------------------------------
VMS1 External   Intel(R) Ethernet Connection I218-V

これをクラスタ台数分実行します。

テストを実行する

Powershellからtest-clusterコマンドレットを実行し、動くかどうか確認します。

クラスタに属す予定のマシンのいずれかで実行します。今回セットアップしたのがhv03とhv04というホスト名です。

PS C:\Users\administrator.DEV> Test-Cluster -Node hv03,hv04
警告: 記憶域 - ディスクを一覧表示: テストの失敗が報告されました。。
警告: インベントリ - ソフトウェア更新プログラムの一覧表示: テストの失敗が報告されました。。
警告: システムの構成 - すべてのドライバーの署名の検証: テストでいくつかの警告が報告されました。。
警告: システムの構成 - ソフトウェア更新プログラム レベルの検証: テストの失敗が報告されました。。
警告: ネットワーク - IP 構成の検証: テストの失敗が報告されました。。
警告: ネットワーク - クラスター ネットワーク構成の検証: テストの失敗が報告されました。。
警告:
テスト結果:
HadUnselectedTests, HadFailures, ClusterConditionallyApproved
選択されたテストは完了しました。1
つ以上のテストで、構成がクラスタリングに適さないことが示されています。すべてのクラスター検証テストが実行され、すべての
テストが成功した場合にのみ (警告の有無は問いません)、Microsoft はクラスター ソリューションをサポートします。
テスト レポート ファイルのパス: C:\Users\administrator.DEV\AppData\Local\Temp\2\検証レポート 2017.05.05 (23.09.43).htm
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2017/05/05     23:10         533111 検証レポート 2017.05.05 (23.09.43).htm

Coreなマシンでhtmlを見る術はないので、レポート の確認にはネットワークドライブにコピーするなどしてください(Notepad.exeとかtypeコマンドで生データを見ることは可能)。警告レベルであれば作成できるようです。上記エラーは、Intel I218VというNICをWIndowsServerに認識させるためにINFファイルを変更し、署名なしドライバをインストールした関係で信頼できないドライバのエラーが出ています。

RSATを入れたマシンがあれば、RSATに含まれるフェールオーバークラスターマネージャの「構成の検証」からも実行できます。

クラスタを作成する

まずは、HyperV Serverにリモートデスクトップ等からドメインのユーザでログインします。Administratorがローカルとドメインにいるので注意です。また、このコマンドだけはPowershellから実行する必要があります。Samba4をバックエンドとして使う場合、クラスタ用のComputerはADに作成されるのですが、IPの更新がされません。そのため、静的アドレスを指定する必要があります。普通のADなら動的でOKです。

PS C:\Users\administrator.DEV.000> New-Cluster -name HVC2 -Node hv03,hv04 -StaticAddress 192.168.1.114
警告:
クラスター化された役割の作成中に問題があったため、役割を開始できない可能性があります。詳細については、以下のレポート
ファイルを参照してください。
警告: レポート ファイルの場所: C:\windows\cluster\Reports\クラスターの作成ウィザード HVC2 on 2017.05.07 At 06.37.24.htm
Name
----
HVC2

警告は出ますが、動くようです。

色々検証していたら、クラスタを作成しようとしても「クラスターを作成しているときにエラーが発生し、ノードがクリーンアップされます。しばらくお待ちください...」となり作成出来なくなった事があったので、もしうまく動かなくなったらSambaを初期化してみてください。と言っても、1日悩んだ結果、結局ADをOSレベルから作り直してしまったので、どのようにクリーンアップすればいいかというのは不明ですが…。また、作れなくなった原因も何が起因だったのかは不明です。

フェールオーバークラスターマネージャから接続する

クラスタが作成できたら、フェールオーバークラスターマネージャから接続してみます。

この際に、Samba4がバックエンドの場合、クラスタ名を指定しても接続できないので、上記でStaticAddress に指定したIPを指定します。

正しく接続できれば、ノードの一覧に指定したホストがいるはずです。

Clustering Shared Volumeのセットアップ

ここまででかなりお腹いっぱいになって胃もたれしてきた感がありますが、Clustering Shared Volume(CSV)を作成します。ターゲットにはiSCSIを利用します。

Linux上で、iSCSIターゲットを作成する

targetcliを利用し作成します。apt-get install targetcliでインストールできますが、バージョンが古いためSCSI-3 に対応しておらず、ディスクをオンラインに出来ません。

そのため、targetcliでSRPターゲットを作るを参考にtargetcliをgitから落とし、ビルドしてください。(これで3時間くらいはハマった)

#ディスクの置き場を作る
root@debian:~# mkdir /vmdk
#targetcliを起動する
root@debian:~# targetcli
targetcli 3.0.pre4.3~g0fba804 (rtslib 3.0.pre4.9~g6fd0bbf)
Copyright (c) 2011-2014 by Datera, Inc.
All rights reserved.
#ディスクイメージを作成する
/> /backstores/fileio create name=vdisk1 file_or_dev=/vmdk/vdisk1.img size=10G
Created fileio vdisk1 with size 10737418240
#iscsiのWWNを作る。createだけすればよしなにランダムに作ってくれる
/> iscsi/ create
Created target iqn.2003-01.org.linux-iscsi.debian.x8664:sn.8d895396ee6f.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
#作成したWWNのtpg1まで下りる
/> iscsi/iqn.2003-01.org.linux-iscsi.debian.x8664:sn.8d895396ee6f/tpg1/
#LUNにディスクイメージを割り当てる
/iscsi/iqn.20...5396ee6f/tpg1> luns/ create /backstores/fileio/vdisk1
Created LUN 0.
#portalを作成する。
/iscsi/iqn.20...5396ee6f/tpg1>portals/ create
Using default IP port 3260
Automatically selected IP address 192.168.1.111.
Created network portal 192.168.1.111:3260.
#内容の確認
/iscsi/iqn.20...5396ee6f/tpg1> ls
o- tpg1 ..................................................................................................... [no-gen-acls, no-auth]
  o- acls ................................................................................................................ [ACLs: 0]
  o- luns ................................................................................................................ [LUNs: 1]
  | o- lun0 ..................................................................................... [fileio/vdisk1 (/vmdk/vdisk1.img)]
  o- portals .......................................................................................................... [Portals: 1]
    o- 192.168.1.111:3260 ....................................................................................... [OK, iser disabled]
#CHAP等を使わない誰でも接続できるLUNを作成する。
/iscsi/iqn.20...5396ee6f/tpg1> set attribute demo_mode_write_protect=0 demo_mode_discovery=1 generate_node_acls=1 cache_dynamic_acls=1 authentication=0
Parameter demo_mode_discovery is now '1'.
Parameter generate_node_acls is now '1'.
Parameter authentication is now '0'.
Parameter demo_mode_write_protect is now '0'.
Parameter cache_dynamic_acls is now '1'.
#保存する
/iscsi/iqn.20...5396ee6f/tpg1> / saveconfig
Last 10 configs saved in /etc/rtslib-fb-target/backup.
Configuration saved to /etc/rtslib-fb-target/saveconfig.json
#終了する
/iscsi/iqn.20...5396ee6f/tpg1> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/rtslib-fb-target/backup.
Configuration saved to /etc/rtslib-fb-target/saveconfig.json

HyperV ServerからiSCSIに接続する

例によってPowershellからです。まずはStart-Service MSiSCSIでサービスを起動し、New-IscsiTargetPortalコマンドレットで前述で作成したターゲットに接続します。

PS C:\Users\administrator.DEV.000> Start-Service MSiSCSI
PS C:\Users\administrator.DEV.000> Set-Service MSiSCSI -StartupType auto
PS C:\Users\administrator.DEV.000> New-IscsiTargetPortal -TargetPortalAddress debian
InitiatorInstanceName  :
InitiatorPortalAddress :
IsDataDigest           : False
IsHeaderDigest         : False
TargetPortalAddress    : debian
TargetPortalPortNumber : 3260
PSComputerName         :

ポータルに接続後、このままではディスクはマウントされないのでLUNに接続します。正しくポータルにログインできていれば、get-iscsiTargetで利用可能なノードが見えます。

ノード確認後、 Connect-IscsiTargetでノードに接続し、LUNをマウントします。

PS C:\Users\administrator.DEV.000> Get-IscsiTarget

IsConnected NodeAddress                                                     PSComputerName
----------- -----------                                                     --------------
      False iqn.2003-01.org.linux-iscsi.debian.x8664:sn.8d895396ee6f

PS C:\Users\administrator.DEV.000> Connect-IscsiTarget -NodeAddress iqn.2003-01.org.linux-iscsi.debian.x8664:sn.8d895396ee6f


AuthenticationType      : NONE
InitiatorInstanceName   : ROOT\ISCSIPRT\0000_0
InitiatorNodeAddress    : iqn.1991-05.com.microsoft:hv03.dev.lan
InitiatorPortalAddress  : 0.0.0.0
InitiatorSideIdentifier : 400001370000
IsConnected             : True
IsDataDigest            : False
IsDiscovered            : True
IsHeaderDigest          : False
IsPersistent            : False
NumberOfConnections     : 1
SessionIdentifier       : ffff810ea953f010-4000013700000002
TargetNodeAddress       : iqn.2003-01.org.linux-iscsi.debian.x8664:sn.8d895396ee6f
TargetSideIdentifier    : 0100
PSComputerName

これをクラスタノード全てで行います。Invoke-Commandを利用して一括設定しても可能です。

ディスクのフォーマット

iSCSIボリュームのマウントが完了したら、今度はディスクフォーマットします。diskpartでも可能です。

Powershell編

PS C:\> Get-Disk
Number Friendly Name Serial Number                    HealthStatus         OperationalStatus      Total Size Partition
                                                                                                             Style
------ ------------- -------------                    ------------         -----------------      ---------- ----------
1      Msft Virtu...                                  Healthy              Online                      12 GB MBR
0      SanDisk Ul... 4C530001141015116300             Healthy              Online                   14.32 GB MBR
2      LIO-ORG FI... 9680ec2f-0340-47c1-9cbb-20114... Healthy              Offline                      10 GB RAW
#今回は2番が対象
#ディスクをオンラインにする
PS C:\> Set-Disk -IsOffline $False -Number 2
#ディスクのリードオンリーを消す
PS C:\> Set-Disk -IsReadOnly $false -Number 2
#フォーマット(MBRでもOK)
PS C:\> Initialize-Disk -Number 2 -PartitionStyle GPT -PassThru | New-Partition -DriveLetter X -UseMaximumSize | Format-Volume -FileSystem ntfs
DriveLetter FileSystemLabel FileSystem DriveType HealthStatus OperationalStatus SizeRemaining    Size
----------- --------------- ---------- --------- ------------ ----------------- -------------    ----
X                           NTFS       Fixed     Healthy      OK                      9.92 GB 9.97 GB

 

diskpart編

#diskpart起動
PS C:\Users\administrator.DEV.000> diskpart
Microsoft DiskPart バージョン 10.0.14393.0
Copyright (C) 1999-2013 Microsoft Corporation.
コンピューター: HV04
#disk一覧を取得。今回は2番がiscsiボリューム
DISKPART> list disk
  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン            14 GB      0 B
  ディスク 1    オンライン            12 GB      0 B
  ディスク 2    オフライン            10 GB    10 GB
#操作対象にディスク2を選択
DISKPART> select disk 2
ディスク 2 が選択されました。
#iscsiボリュームは最初オフラインなのでオンラインにする
DISKPART> online disk
DiskPart は選択されたディスクをオンラインにしました。
#iscsiボリュームは最初リードオンリーなので書き込めるようにする
DISKPART> attributes disk clear readonly
ディスクの属性が正しく消去されました。
#ここから先は最初のノードで1回のみ実行
#パーティション作成
DISKPART> create partition primary
DiskPart は指定したパーティションの作成に成功しました。
#パーティションのフォーマット対象選択
DISKPART> select partition 1
パーティション 1 が選択されました。
#フォーマット
DISKPART> format fs=ntfs quick
  100% 完了しました
DiskPart は、ボリュームのフォーマットを完了しました。
DISKPART> exit

この動作は、最初のノードだけで実行すればOKです。

 

CSVマウント

セットアップが完了したら、フェールオーバークラスターマネージャからCSVを作成します。

記憶域→ディスク→ディスクの追加 を選択し、セットアップが起動したら、今回作成したiSCSIディスクが出てくるはずです。

OKを押せば、ディスクがマウントされるはずです。

このままでは通常のドライブと同じくFなどのレターが振られてマウントされてしまうので、追加したiSCSIボリュームをクラスターの共有ボリュームとして定義し、各マシンへマウントします。

クリック後、ボリュームがC:\ClusterStorage\VolumeXにマウントされたことを確認してください。

下記スクリーンショットはそれを忘れて問題が起き、トラブルシューティングであれこれしたせいでVolume2になっていますが、普通はVolume1になるはずです。

 

 

動作確認

最後に、VMを作成し、動作確認を行います。フェールオーバークラスターマネージャの役割から仮想マシンを選択し、仮想マシンの新規作成を行います。

どちらで作成するか選択します。

名前と場所の指定の際に、ディスクの保存先をCSVに指定します。C:\ClusterStorage\VolumeXがそうです。

あとはいつも通りに作成すれば、VMが作成できると思います。

VMが作成できたら、移動→クイックマイグレーション→ノードの選択 を選択し、移動するホストを選択します。

ライブマイグレーションを選択すると失敗するのですが、何が原因か探る前に力尽きました。

2台しかないので空きの1台が出てきます。

実行後、所有者ノードが移動すれば完了です。

 

以上です。

 

 

 

必要なことを見つけるまでの道のりが過酷でつらかった(動かすのに約5日かかった)

HyperV Serverがおかしくなった場合、

C:\system32\sysprep\sysprep.exe

を実行すると初期化できるかもしれません。

また、今回利用したNUCに使われていたI218VをWindows serverに認識させるのに苦労しましたが、

http://open.mixi.jp/user/2992925/diary/1939109423

を参考にNDIS65フォルダのINFを変更しました。

Related articles

Related articles appear here based on the labels you select. Click to edit the macro and add or change labels.


Related issues