vSphereでRDM(Raw Device Mapping)を使用した共有ディスクの設定方法を説明します。RDMは、VMFSの上にファイルを作成するのではなく、RAWデバイスを直接指定する方式です。これを動作確認するには物理的な共有ストレージが望ましいですが、TrueNASなどを用いたiSCSIでも動作確認が可能です。このページではTrueNASを用いたRDMの設定方法を紹介します。
メリット・デメリットの把握
RDM(Raw Device Mapping)は共有ディスクを作成する唯一の方法ではありません。前述の「vSphereの共有ディスク設定方法(VMDKファイル編)」でも共有ディスクは作成できます。RDMを使用するか否かはメリット・デメリットがあり、公式ドキュメントでは「Raw デバイス マッピングのメリット」にまとめられています。
事前準備
LUNの作成
「TrueNAS(旧FreeNAS) iSCSIによる共有手順」などを参照しつつ、複数のLUNを作成します。
ソフトウェアiSCSIの設定
ESXiにソフトウェアiSCSIの設定をして、TrueNASのLUNが見えるようにします。ソフトウェアiSCSIの設定は「VMware HAの設定手順 (iSCSIを使用する場合)」などを参照ください。
ESXiの「デバイス」の画面から、確かにLUNが見えている事を確認します。
VMFSフォーマット
RDMは文字通り、ESXiからRawデバイス(フォーマット前のデバイス)として見せるようする必要があります。しかし、共有ディスクをどのLUNに格納したかの紐付けの設定はVMFS上に格納する必要があります。
従って、VMFSでフォーマットしたディスクとRAWデバイスのディスクの2つが必要になります。
「ストレージ」「データストア」の順に押下し、画面遷移します。NFSではなくVMFSでフォーマットしたデータストアを1つ作成しましょう。「新しいデータストア」を押下します。
VMFSでフォーマットしたディスクを1つ作成します。(いくつかはRawデバイスのまま残して下さい)
仮想マシンの設定
以下スクリーンショットのような構成で、centos50とcentos51の間で共有ディスクを作成する方法を考えます。
1台目の設定
「1台目の仮想マシン」の右クリックメニューで、「設定の編集」を選びます。
「新規デバイスの追加」で「SCSIコントローラー」を選びます。
SCSIパスの共有は「物理」を選びます。
SCSIパスの共有の設定の意味は「SCSI コントローラ設定の変更」を参照ください。
「新規デバイスの追加」で「RDMディスク」を選びます。
ターゲットLUNを指定し、「OK」を押下します。
「共有」を「マルチライター」に変更します。これを変更しないと、クラスタを組む2台の仮想マシンを同時に起動できません。
「仮想デバイスノード」は前述の操作で作成したSCSIコントローラーを指定します。
仮想マシンの設定変更後、ESXiにログインし、実際に作成されるファイルを見てみましょう。vmdkファイルをcatコマンドなどで閲覧すると、ディスクが作成されるのではなく、実態はLUNへのポインタである事が分かります。
[root@esxi142:~] ls -l /vmfs/volumes/vmfs141/centos50/ total 2370560 -rw-r--r-- 1 root root 395 Apr 21 08:47 centos50-2adf0bbc.hlog -rw------- 1 root root 53687091200 Apr 22 14:34 centos50-flat.vmdk -rw------- 1 root root 270840 Apr 22 14:33 centos50.nvram -rw------- 1 root root 498 Apr 22 14:33 centos50.vmdk -rw-r--r-- 1 root root 0 Apr 21 08:47 centos50.vmsd -rwxr-xr-x 1 root root 3278 Apr 23 10:49 centos50.vmx -rw------- 1 root root 10737434624 Apr 23 10:49 centos50_1-rdmp.vmdk -rw------- 1 root root 476 Apr 23 10:49 centos50_1.vmdk -rw-r--r-- 1 root root 133548 Apr 22 13:47 vmware-19.log -rw-r--r-- 1 root root 133489 Apr 22 13:53 vmware-20.log -rw-r--r-- 1 root root 133396 Apr 22 14:03 vmware-21.log -rw-r--r-- 1 root root 133469 Apr 22 14:08 vmware-22.log -rw-r--r-- 1 root root 133489 Apr 22 14:13 vmware-23.log -rw-r--r-- 1 root root 133498 Apr 22 14:27 vmware-24.log -rw-r--r-- 1 root root 133580 Apr 22 14:34 vmware.log -rw------- 1 root root 84934656 Apr 21 10:27 vmx-centos50-d51f4c0e5fab914c765a70e13c334e0a2ed7dfe3-1.vswp [root@esxi142:~] [root@esxi142:~] [root@esxi142:~] cat /vmfs/volumes/vmfs141/centos50/centos50_1.vmdk # Disk DescriptorFile version=1 encoding="UTF-8" CID=fffffffe parentCID=ffffffff createType="vmfsPassthroughRawDeviceMap" # Extent description RW 20971552 VMFSRDM "centos50_1-rdmp.vmdk" # The Disk Data Base #DDB ddb.adapterType = "lsilogic" ddb.geometry.cylinders = "1305" ddb.geometry.heads = "255" ddb.geometry.sectors = "63" ddb.longContentID = "0745cc83db514cbb0224934bfffffffe" ddb.uuid = "60 00 C2 9f 4e 6d 4f f7-79 b2 62 2c e8 25 73 06" ddb.virtualHWVersion = "14"
2台目の設定
「2台目の仮想マシン」の右クリックメニューで、「設定の編集」を選びます。
「新規デバイスの追加」で「SCSIコントローラー」を選びます。
SCSIパスの共有は「物理」を選びます。
SCSIパスの共有の設定の意味は「SCSI コントローラ設定の変更」を参照ください。
「新規デバイスの追加」で「既存のハードディスク」を選びます。
1台目で追加したディスクのVMDKファイルを選びます。
「共有」を「マルチライター」に変更します。「仮想デバイスノード」は前述の操作で作成したSCSIコントローラーを指定します。
動作確認
仮想マシンの起動
前述の手順で設定したcentos50, centos51を起動します。「マルチライター」などの設定に誤りがあると、ここでの起動操作に失敗します。
1台目ディスクのマウント操作
1台目の仮想マシンにてディスクを認識している事を確認します。
[root@centos50 ~]# fdisk -l ディスク /dev/sda: 50 GiB, 53687091200 バイト, 104857600 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスクラベルのタイプ: gpt ディスク識別子: 83F90A99-041C-415E-8DBA-595D6C1E0B2A デバイス 開始位置 終了位置 セクタ サイズ タイプ /dev/sda1 2048 1230847 1228800 600M EFI システム /dev/sda2 1230848 3327999 2097152 1G Linux ファイルシステム /dev/sda3 3328000 4376575 1048576 512M Linux スワップ /dev/sda4 4376576 104855551 100478976 47.9G Linux ファイルシステム ディスク /dev/sdb: 10 GiB, 10737434624 バイト, 20971552 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 16384 バイト I/O サイズ (最小 / 推奨): 16384 バイト / 1048576 バイト
ディスクを何らかのファイルシステムでフォーマットし、これを適当なディレクトリにマウントします。
ext4やxfsは複数のOSから同時にアクセスされる事を想定したファイルシステムではありません。説明を簡易にするためにext4やxfsを紹介しましたが、もっともらしい検証シナリオをするならばMSFCやOracle RACに挑戦するのが良いでしょう。
[root@centos50 ~]# mkfs -t ext4 /dev/sdb mke2fs 1.45.4 (23-Sep-2019) Discarding device blocks: done Creating filesystem with 2621440 4k blocks and 656640 inodes Filesystem UUID: 8e64aa75-c198-4f65-beae-cc971f0f5d77 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done [root@centos50 ~]# mkdir /share [root@centos50 ~]# mount /dev/sdb /share [root@centos50 ~]#
何か適当なファイルを作成します。
[root@centos50 ~]# echo "centos50 : this is test" >> /share/test50.txt [root@centos50 ~]# cat /share/test50.txt centos50 : this is test [root@centos50 ~]# [root@centos50 ~]# ls -l /share/ 合計 20 drwx------ 2 root root 16384 4月 23 20:55 lost+found -rw-r--r-- 1 root root 24 4月 23 20:55 test50.txt [root@centos50 ~]#
ここで電源断障害を再現するために、centosのパワーオフをします。
2台目ディスクのマウント操作
2台目の仮想マシンにてディスクを認識している事を確認します。
[root@centos51 ~]# fdisk -l ディスク /dev/sda: 50 GiB, 53687091200 バイト, 104857600 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスクラベルのタイプ: gpt ディスク識別子: 83F90A99-041C-415E-8DBA-595D6C1E0B2A デバイス 開始位置 終了位置 セクタ サイズ タイプ /dev/sda1 2048 1230847 1228800 600M EFI システム /dev/sda2 1230848 3327999 2097152 1G Linux ファイルシステム /dev/sda3 3328000 4376575 1048576 512M Linux スワップ /dev/sda4 4376576 104855551 100478976 47.9G Linux ファイルシステム ディスク /dev/sdb: 10 GiB, 10737434624 バイト, 20971552 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 16384 バイト I/O サイズ (最小 / 推奨): 16384 バイト / 1048576 バイト
これを適当なディレクトリにマウントします。
1台目でフォーマット操作済みのため、2台目ではフォーマットしない。
[root@centos51 ~]# mkdir /share [root@centos51 ~]# mount /dev/sdb /share [root@centos51 ~]#
centos50で作成したファイルが見える事を確認します。
[root@centos51 ~]# ls -l /share/ 合計 20 drwx------ 2 root root 16384 4月 23 20:55 lost+found -rw-r--r-- 1 root root 24 4月 23 20:55 test50.txt [root@centos51 ~]# cat /share/test50.txt centos50 : this is test [root@centos51 ~]#