Oracle Cloudですでに作成済みのネットワークに対してIPv6を有効にする方法

Oracle CloudはこれまでIPv6が提供されてなかったのですが、4/15に「IPv6 on Oracle Cloud Infrastructure」でIPv6提供が全体に開始されたとのことなので試してみた。

既存のOracle CloudインスタンスをIPv6対応にするための設定を開始。

まずは「仮想クラウドネットワーク(VNC)」一覧を開く

画像

最初はIPv6 CIDRブロックが割り当てられていない。

画像

「IPv6 CIDRブロックの追加」を選択

画像

すると、IPv6アドレスが追加される

画像

次に、VNC配下にあるサブネットに対してIPv6アドレスを割り当て・・・

画像
画像
画像

「NotAuthorizedOrNotFound」というエラーになる。

最初にためしたのは4/28に、PhoenixリージョンとTokyoリージョンで、どちらも同じエラーになっていた。

で・・・5/12になって検索すると、コマンドでなら成功するらしい、という情報を発見した。

Oracle Cloud 甲骨文云启用原生 IPv6 地址详细教程 – 简单、通用、免费、双栈更香
Oracle Cloud 支持 IPv6 了

これをTokyoリージョンで試してうまくいったので、Phoenixリージョンでも実施しようとしてみたところ、こちらでは、そのそも↑で失敗していたはずの操作が成功・・・

どうやら修正されつつあるようです。

というわけで、両方の手順をまとめました。

GUI操作が成功する場合

サブネットの編集でIPv6 CIDRブロックを行ってみて、成功するのであれば問題ありません。

このあと、後半にある仮想マシンインスタンスに対する設定を行います。

サブネットへのIPv6アドレス設定が失敗する場合

GUI操作で失敗する場合は、コマンド操作を行います。

Oracle CloudのWeb UIにログインして、Cloud Shellを開いてコマンドを実行

まず、コンパートメントのIDを確認

username@cloudshell:~ (ap-tokyo-1)$ oci iam compartment list
{
  "data": [
    {
      "compartment-id": "ocid1.tenancy.oc1..<略>",
      "defined-tags": {},
      "description": "IPv6\u7528\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
      "freeform-tags": {},
      "id": "ocid1.compartment.oc1..<略>",
      "inactive-status": null,
      "is-accessible": null,
      "lifecycle-state": "ACTIVE",
      "name": "IPv6_network",
      "time-created": "2021-04-28T07:09:50.554000+00:00"
    },
    {
      "compartment-id": "ocid1.tenancy.oc1..<略>",
      "defined-tags": {},
      "description": "idcs-e97e3212f2c9483ca8b9d1f0efa22062|22560888|OSAKANA OSAKANA NET 504302",
      "freeform-tags": {},
      "id": "ocid1.compartment.oc1..<略>",
      "inactive-status": null,
      "is-accessible": null,
      "lifecycle-state": "ACTIVE",
      "name": "ManagedCompartmentForPaaS",
      "time-created": "2019-09-19T10:16:44.796000+00:00"
    }
  ]
}
username@cloudshell:~ (ap-tokyo-1)$ 

上記出力の「compartment-id」にある「ocid1.tenancy.oc1~」が必要な値です。

これで、サブネットにつけられているIDを確認します。

username@cloudshell:~ (ap-tokyo-1)$ oci network subnet list --compartment-id ocid1.tenancy.oc1..<略>
{
  "data": [
    {
      "availability-domain": null,
      "cidr-block": "10.0.1.0/24",
      "compartment-id": "ocid1.tenancy.oc1..<略>",
      "defined-tags": {},
      "dhcp-options-id": "ocid1.dhcpoptions.oc1.ap-tokyo-1.<略>",
      "display-name": "IPv6 \u30c6\u30b9\u30c8",
      "dns-label": null,
      "freeform-tags": {},
      "id": "ocid1.subnet.oc1.ap-tokyo-1.<略>",
      "ipv6-cidr-block": "xxxx:xxxx:8000:f501::/64",
      "ipv6-virtual-router-ip": "fe80::200:17ff:fec9:f071",
      "lifecycle-state": "AVAILABLE",
      "prohibit-internet-ingress": false,
      "prohibit-public-ip-on-vnic": false,
      "route-table-id": "ocid1.routetable.oc1.ap-tokyo-1.<略>",
      "security-list-ids": [
        "ocid1.securitylist.oc1.ap-tokyo-1.<略>"
      ],
      "subnet-domain-name": null,
      "time-created": "2021-04-28T04:44:55.872000+00:00",
      "vcn-id": "ocid1.vcn.oc1.ap-tokyo-1.<略>",
      "virtual-router-ip": "10.0.1.1",
      "virtual-router-mac": "00:00:17:C9:F0:71"
    },
    {
      "availability-domain": "xkXd:AP-TOKYO-1-AD-1",
      "cidr-block": "10.0.0.0/24",
      "compartment-id": "ocid1.tenancy.oc1..<略>",
      "defined-tags": {},
      "dhcp-options-id": "ocid1.dhcpoptions.oc1.ap-tokyo-1.<略>",
      "display-name": "\u30d1\u30d6\u30ea\u30c3\u30af\u30fb\u30b5\u30d6\u30cd\u30c3\u30c8xkXd:AP-TOKYO-1-AD-1",
      "dns-label": null,
      "freeform-tags": {},
      "id": "ocid1.subnet.oc1.ap-tokyo-1.<略>",
      "ipv6-cidr-block": null,
      "ipv6-virtual-router-ip": null,
      "lifecycle-state": "AVAILABLE",
      "prohibit-internet-ingress": false,
      "prohibit-public-ip-on-vnic": false,
      "route-table-id": "ocid1.routetable.oc1.ap-tokyo-1.<略>",
      "security-list-ids": [
        "ocid1.securitylist.oc1.ap-tokyo-1.<略>"
      ],
      "subnet-domain-name": null,
      "time-created": "2019-09-19T10:20:05.710000+00:00",
      "vcn-id": "ocid1.vcn.oc1.ap-tokyo-1.<略>",
      "virtual-router-ip": "10.0.0.1",
      "virtual-router-mac": "00:00:17:C9:F0:71"
    }
  ]
}
username@cloudshell:~ (ap-tokyo-1)$ 

最初のブロックは新規で作ったIPv6が有効になっているもので「IPv6 テスト」という名前になっています。コマンド出力上では日本語が有効になっていないようです。

後ろのブロックがデフォルトで作成された「パブリック・サブネットxkXd:AP-TOKYO-1-AD-1」です。これに対してIPv6アドレスを付与する設定を行います。

どんなIPv6アドレスがつけられるかは、サブネット/VNC設定画面の「IPv6 CIDRブロック」を参照します。

「xxxx:xxxx:8000:f500::/56」となっています。

Oracle Cloudでは各サブネットに対して「xxxx:xxxx:8000:f5??::/64」を割り当てることになっているため下記の様に実行します。

username@cloudshell:~ (ap-tokyo-1)$ oci network subnet update --subnet-id ocid1.subnet.oc1.ap-tokyo-1.<略> --ipv6-cidr-block xxxx:xxxx:8000:f502::/64
{
  "data": {
    "availability-domain": "xkXd:AP-TOKYO-1-AD-1",
    "cidr-block": "10.0.0.0/24",
    "compartment-id": "ocid1.tenancy.oc1..<略>",
    "defined-tags": {},
    "dhcp-options-id": "ocid1.dhcpoptions.oc1.ap-tokyo-1.<略>",
    "display-name": "\u30d1\u30d6\u30ea\u30c3\u30af\u30fb\u30b5\u30d6\u30cd\u30c3\u30c8xkXd:AP-TOKYO-1-AD-1",
    "dns-label": null,
    "freeform-tags": {},
    "id": "ocid1.subnet.oc1.ap-tokyo-1.<略>",
    "ipv6-cidr-block": "xxxx:xxxx:8000:f502::/64",
    "ipv6-virtual-router-ip": "fe80::200:17ff:fec9:f071",
    "lifecycle-state": "UPDATING",
    "prohibit-internet-ingress": false,
    "prohibit-public-ip-on-vnic": false,
    "route-table-id": "ocid1.routetable.oc1.ap-tokyo-1.<略>",
    "security-list-ids": [
      "ocid1.securitylist.oc1.ap-tokyo-1.<略>"
    ],
    "subnet-domain-name": null,
    "time-created": "2019-09-19T10:20:05.710000+00:00",
    "vcn-id": "ocid1.vcn.oc1.ap-tokyo-1.<略>",
    "virtual-router-ip": "10.0.0.1",
    "virtual-router-mac": "00:00:17:C9:F0:71"
  },
  "etag": "e457a894"
}
username@cloudshell:~ (ap-tokyo-1)$ 

設定が反映されたかを確認します。

username@cloudshell:~ (ap-tokyo-1)$ oci network subnet list --compartment-id ocid1.tenancy.oc1..<略>
{
  "data": [
    {
      "availability-domain": null,
      "cidr-block": "10.0.1.0/24",
      "compartment-id": "ocid1.tenancy.oc1..<略>",
      "defined-tags": {},
      "dhcp-options-id": "ocid1.dhcpoptions.oc1.ap-tokyo-1.<略>",
      "display-name": "IPv6 \u30c6\u30b9\u30c8",
      "dns-label": null,
      "freeform-tags": {},
      "id": "ocid1.subnet.oc1.ap-tokyo-1.<略>",
      "ipv6-cidr-block": "xxxx:xxxx:8000:f501::/64",
      "ipv6-virtual-router-ip": "fe80::200:17ff:fec9:f071",
      "lifecycle-state": "AVAILABLE",
      "prohibit-internet-ingress": false,
      "prohibit-public-ip-on-vnic": false,
      "route-table-id": "ocid1.routetable.oc1.ap-tokyo-1.<略>",
      "security-list-ids": [
        "ocid1.securitylist.oc1.ap-tokyo-1.<略>"
      ],
      "subnet-domain-name": null,
      "time-created": "2021-04-28T04:44:55.872000+00:00",
      "vcn-id": "ocid1.vcn.oc1.ap-tokyo-1.<略>",
      "virtual-router-ip": "10.0.1.1",
      "virtual-router-mac": "00:00:17:C9:F0:71"
    },
    {
      "availability-domain": "xkXd:AP-TOKYO-1-AD-1",
      "cidr-block": "10.0.0.0/24",
      "compartment-id": "ocid1.tenancy.oc1..<略>",
      "defined-tags": {},
      "dhcp-options-id": "ocid1.dhcpoptions.oc1.ap-tokyo-1.<略>",
      "display-name": "\u30d1\u30d6\u30ea\u30c3\u30af\u30fb\u30b5\u30d6\u30cd\u30c3\u30c8xkXd:AP-TOKYO-1-AD-1",
      "dns-label": null,
      "freeform-tags": {},
      "id": "ocid1.subnet.oc1.ap-tokyo-1.<略>",
      "ipv6-cidr-block": "xxxx:xxxx:8000:f502::/64",
      "ipv6-virtual-router-ip": "fe80::200:17ff:fec9:f071",
      "lifecycle-state": "AVAILABLE",
      "prohibit-internet-ingress": false,
      "prohibit-public-ip-on-vnic": false,
      "route-table-id": "ocid1.routetable.oc1.ap-tokyo-1.<略>",
      "security-list-ids": [
        "ocid1.securitylist.oc1.ap-tokyo-1.<略>"
      ],
      "subnet-domain-name": null,
      "time-created": "2019-09-19T10:20:05.710000+00:00",
      "vcn-id": "ocid1.vcn.oc1.ap-tokyo-1.<略>",
      "virtual-router-ip": "10.0.0.1",
      "virtual-router-mac": "00:00:17:C9:F0:71"
    }
  ]
}
username@cloudshell:~ (ap-tokyo-1)$ 

両方のサブネットにIPv6アドレスが入ったことがわかります。

仮想マシンインスタンスに対する設定(管理側)

Oracle Cloudの管理GUI側で、仮想マシンインスタンスに対してIPv6アドレスを割り振る必要があります。

[インスタンスの詳細]-[アタッチされたVNIC]-[VNICの詳細]にて下のほうにある「リソース」の「IPv6アドレス」を選択します。

最初は下記の様に割り当てられていません

「IPv6アドレスの割当て」をクリック

とくになにも数値入力する必要は無く、「割当て」をクリック

これで、IPv6アドレスが割り当てられました。

仮想マシン内のIPv6アドレス設定

Oracle Cloud上のインスタンスはcloud-initなどの影響化にあるため、一般的な設定手法でネットワーク設定を行っても再起動すると初期化されてしまいます。

今回の場合、IPv6未サポート時代に作られたインスタンスはIPv6が無効化されているため、有効にしなければならないのだが、正しいやりかたが不明。

公式ドキュメントの「IPv6 Addresses」には、コマンドで実行する場合のやり方が書かれていた。

しかし、これは仮想インスタンスの元となるイメージの作成時期によって動作が異なっている場合があった。

古いものではIPv6アドレス設定が無効化されており、ここ半年ぐらいのものはIPv6アドレスが有効化されていた。

有効化されている場合はドキュメント記載の「sudo dhclient -6」でIPv6アドレスが割り当てられた。

無効化されている場合は、下記の様に「sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0」実行してIPv6有効化を行った後に、「sudo dhclient -6」でDHCPv6によりIPv6アドレスが割り当てられ、通信が正常に行えることを確認できた。

[root@oraclelinux7 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.22/24 brd 10.0.0.255 scope global dynamic ens3
       valid_lft 86336sec preferred_lft 86336sec
[root@oraclelinux7 ~]#

[root@oraclelinux7 ~]# sysctl  -a|grep disable_ip
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens3.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.ens3.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
[root@oraclelinux7 ~]#

[root@oraclelinux7 ~]# sysctl  -w net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.all.disable_ipv6 = 0
[root@oraclelinux7 ~]#

[root@oraclelinux7 ~]# sysctl  -a|grep disable_ip
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens3.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.ens3.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
[root@oraclelinux7 ~]#

[root@oraclelinux7 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.22/24 brd 10.0.0.255 scope global dynamic ens3
       valid_lft 86257sec preferred_lft 86257sec
    inet6 fe80::17ff:fe00:a543/64 scope link
       valid_lft forever preferred_lft forever
[root@oraclelinux7 ~]#

[root@oraclelinux7 ~]# dhclient -6
[root@oraclelinux7 ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.22/24 brd 10.0.0.255 scope global dynamic ens3
       valid_lft 86240sec preferred_lft 86240sec
    inet6 xxxx:xxxx:8000:f502:7f3d:7046:6c88:13a1/128 scope global dynamic
       valid_lft 7495sec preferred_lft 7195sec
    inet6 fe80::17ff:fe00:a543/64 scope link
       valid_lft forever preferred_lft forever
[root@oraclelinux7 ~]#

問題は、これを起動時に自動的に行う設定である。

とりあえず公式ドキュメントは発見できなかった。

IPv6有効化設定の方法

まずIPv6無効化の「net.ipv6.conf.all.disable_ipv6=1」はどこで設定されているのかを調べたところ、/usr/lib/sysctl.d/disable-ipv6.conf で設定されていた。

このファイルはOSパッケージにより管理されているため書き換えてはいけない。ユーザが値を変更したい場合は /etc/sysctl.d/ ディレクトリに同じファイル名でファイルを置いて変更する必要がある。

今回の場合は /etc/sysctl.d/disable-ipv6.conf というファイルを作成して、以下の内容で配置した。

net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0

これにより、起動時にIPv6が有効化された状態とすることは可能になった。

DHCPv6によるIPアドレス取得の方法

/etc/sysconfig/network-scripts/ifcfg-ens3 に 「IPV6INIT=yes」とか追加してもIPv6アドレスを割り当ててくれない。それどころか、入れたIPV6INIT記述は削除されている。

動作を調べるとcloud-initにより、起動時に毎回 /etc/sysconfig/network-scripts/ifcfg-ens3 が生成されているので、このファイルを書きかえても意味がないことが分かった。

毎起動時に起動させる手法を探したところ、cloud-initの中でper-boot という設定があることがわかった。

「/var/lib/cloud/scripts/per-boot/01_ipv6」というファイルを作り、下記を書き、実行権限を与えたところ、とりあえず希望通りの動作にはなった。

#/bin/bash
dhclient -6

とりあえず、これでOracle Cloud上に作ったインスタンスをIPv6環境に対応させることができた。

ルーティングの設定

上記だけではOracle Cloud内でのIPv6通信しかできない。

仮想クラウドネットワーク(VNC)の設定内にある「ルート・ルール」に「宛先」を「::/0」、ターゲットタイプ「インターネット・ゲートウェイ」でルールを1個追加する。

また、「セキュリティ・リスト」の「イングレス・ルール」に、ソース「::/0」、プロトコルTCP、宛先ポート範囲で「22,80,443」を追加してssh,http,httpsアクセスが可能な設定を行う。

また、出ていくパケットについての「エグレス・ルール」の方に、宛先「::/0」で全てのプロトコルを設定。

これで、外部からのIPv6アクセスも可能になったはずである。

ESXiのみ環境でPowerCLIを使ってテンプレートもどきの動作をする手法

vCenterサーバがない、ESXiサーバのみ環境ではテンプレート機能が使用できない。

とはいえ、テンプレート化した仮想マシンの中身を見ると、ふつうと同じく仮想ハードディスクのvmdkファイルが存在しているので、vmdkファイルをコピーして、新規仮想マシンを作成するPowerCLIスクリプトをかけば、似たようなことができるな、と実験。

準備するもの

・PowerCLIをインストールした環境
Windows 10で実行したが、Linux環境にPowerShell+PowerCLIをセットアップしてもいけるはず。

・Windowsの場合、sysprepを実行してシャットダウンしたvmdkファイル
sysprepを実行して、次回起動時に初期セットアップが開始されるようにしたvmdkファイル。
VMware-toolsはインストール済みであることが望ましい。

・Linuxの場合、下記の情報などを削除
RHEL7の仮想化の導入および管理ガイド第4章 仮想マシンのクローン作成によれば
/etc/udev/rules.d/70-persistent-net.rules を削除
/etc/ssh/ssh_host_* を削除
/etc/sysconfig/network-scripts/ifcfg-eth* などから IPADDRESS,NETMASK,HWADDRなどの値削除

スクリプト本体

Import-Module VMware.VimAutomation.Core

#Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false

$vcenterserver="ESXiサーバ"
$vcenteruser="ユーザ名"
$vcenterpassword="パスワード"

$targetdatastore="仮想マシンをおくデータストア名"

# 仮想マシンの名前 / ランダムで作成して、あとから変更する手法
$vmnamebase="NewVM_"
$vmnametmp=Get-Random
$vmname=$vmnamebase+$vmnametmp

# 仮想マシンスペックと接続ネットワーク指定
$vcpu=2
$vmem=6
$network="VM Network"

# 指定できるGuestOSのIDを調べるには下記を実行すること
#   PowerCLIがサポートしている一覧 
#   [VMware.Vim.VirtualMachineGuestOsIdentifier].GetEnumValues()
# 代表的なもの
# windows8Server64Guest = Windows2012
# windows9Server64Guest = Windows2016
#$vmguestosid="windows9Server64Guest"

# 元ネタのWindowsが入ったvmdkファイルの指定
# 構築時にBIOS環境かEFI環境のどちらで作ったのか注意
$vmdkfilepath="[データストア名] windows2019/windows2019.vmdk"
$vmguestosid="windows9Server64Guest"
#$vmdkfilepath="[データストア名] win2016/win2016.vmdk"
#$vmguestosid="windows9Server64Guest"
#$vmdkfilepath="[データストア名] win2012/win2012.vmdk"
#$vmguestosid="windows8Server64Guest"
# 上記の元ネタが置いてあるデータストア名を下記でも指定する
$sourcedatastore ="データストア名"

# vCenterまたはESXiサーバに接続
Connect-VIServer -Server $vcenterserver -User $vcenteruser -Password $vcenterpassword -WarningAction 0
# パスワードを書きたくない場合は
# New-VICredentialStoreItem -Host $vcenterserver -User $vcenteruser -Password $vcenterpassword
# を実行すると、資格情報保存域に登録され、以降は下記だけで接続できるようになる
# Connect-VIServer -Server $vcenterserver

$virtualportgroup=Get-VirtualPortGroup -Name $network
$datastore=Get-Datastore -Name $targetdatastore
$vm=New-VM -Name $vmname -NumCpu $vcpu -MemoryGB $vmem -Portgroup $virtualportgroup -Datastore $datastore -DiskStorageFormat Thin -GuestID $vmguestosid -HardwareVersion vmx-14


$olddiskinfo=Get-Vm $vmname|Get-Harddisk # 一時的に作られたディスクの情報を保存
$sourcevmdk=Get-HardDisk -Datastore $sourcedatastore -DatastorePath $vmdkfilepath
# ディスクの削除
Remove-HardDisk -HardDisk $olddiskinfo -Confirm:$false


# コピー先データストアのパスを生成
$targetvmdktmp=$olddiskinfo.Filename
$ed=$targetvmdktmp.LastIndexOf("/")
$targetvmdk=$targetvmdktmp.Substring(0,$ed+1) # コピー先のパス

# OSが入ったvmdkのコピー
$adddiskinfo=Copy-HardDisk -Harddisk $sourcevmdk -DestinationPath $targetvmdk -DestinationStorageFormat Thin

#$vm = get-Vm $vmname
New-HardDisk -VM $vm -DiskPath $adddiskinfo.Filename

Get-ScsiController -VM $vm | Set-ScsiController -Type VirtualLsiLogicSAS

# 仮想マシン設定変更用オブジェクト定義
$newSpec = New-Object VMware.Vim.VirtualMachineConfigSpec

# USBコントローラの追加
# これがないとWindows環境でマウスが動かない
# https://communities.vmware.com/t5/VMware-PowerCLI-Discussions/Where-is-the-quot-Get-USBController-quot-cmdlet-Same-with-Remove/td-p/2155582
# 上記だとUSB 2.0コントローラ追加
$newSpec.deviceChange = New-Object VMware.Vim.VirtualDeviceConfigSpec[] (1)
$newSpec.deviceChange[0] = New-Object VMware.Vim.VirtualDeviceConfigSpec
$newSpec.deviceChange[0].operation = "add"
#$newSpec.deviceChange[0].device = New-Object VMware.Vim.VirtualUSBController # USB2.0コントローラ
$newSpec.deviceChange[0].device = New-Object VMware.Vim.VirtualUSBXHCIController # USB3.0コントローラ

# EFIかBIOSか
# https://docs.vmware.com/jp/VMware-Cloud-on-AWS/services/com.vmware.vsphere.vmc-aws-manage-vms.doc/GUID-898217D4-689D-4EB5-866C-888353FE241C.html
#https://github.com/vmware/PowerCLI-Example-Scripts/blob/master/Scripts/SecureBoot.ps1
# BIOSを設定する場合は、SecureBootをdisableにする必要がある
#$newSpec = New-Object VMware.Vim.VirtualMachineConfigSpec
# 仮想マシン起動オプション変更用オブジェクト定義
$bootOptions = New-Object VMware.Vim.VirtualMachineBootOptions
#$newSpec.Firmware = [VMware.Vim.GuestOsDescriptorFirmwareType]::efi
#$bootOptions.EfiSecureBootEnabled = $true
$newSpec.Firmware = [VMware.Vim.GuestOsDescriptorFirmwareType]::bios
$bootOptions.EfiSecureBootEnabled = $false
$newSpec.BootOptions=$bootOptions


# 仮想マシンへの設定反映
#(get-view $vm).ReconfigVM_Task($newSpec)
$vm.ExtensionData.ReconfigVM($newSpec)


# 接続切断
Disconnect-VIServer -Server $vcenterserver -Confirm:$false

解説

仮想マシンにハードディスクを追加する

仮想マシンに新しく空っぽのハードディスクを追加する場合は、「New-HardDisk -VM 仮想マシン ~」で指定するが、Copy-HardDiskでコピーしてきたハードディスクを登録する場合が分かりづらかった。

結果としては、新規と同じく「New-HardDisk -VM 仮想マシン ~」でよかった。

今回の場合は、CopyHardDiskを実行した結果を変数にいれて、それをNew-HardDIskで登録、という形にした。

$adddiskinfo=Copy-HardDisk -Harddisk $sourcevmdk -DestinationPath $targetvmdk -DestinationStorageFormat Thin

$vm = get-Vm $vmname
New-HardDisk -VM $vm -DiskPath $adddiskinfo.Filename

仮想マシンハードウェアにUSB 3.0コントローラを追加する

Host Clientから作成した場合は、USB 3.0コントローラが作成されていたが、New-VMコマンドでは作成されなかった。このため、Windowsが起動した後にUSBマウスが存在できず、マウス操作ができなかった。(キーボードはPS/2キーボード扱いとして使えたようだった)

このUSB 3.0コントローラを追加するための操作がわからず、いろいろ調べたところ「Where is the “Get-USBController” cmdlet? (Same with Remove- and New-)」の記述を見て、USB 2.0コントローラの追加手法が分かった。

その後、VirtualUSBController を起点に調べることで、 xHCIはVirtualUSBXHCIControllerという名前であることがわかり、解決した

$vm=Get-VM -Name 仮想マシン名
$newSpec = New-Object VMware.Vim.VirtualMachineConfigSpec
$newSpec.deviceChange = New-Object VMware.Vim.VirtualDeviceConfigSpec[] (1)
$newSpec.deviceChange[0] = New-Object VMware.Vim.VirtualDeviceConfigSpec
$newSpec.deviceChange[0].operation = "add"
#$newSpec.deviceChange[0].device = New-Object VMware.Vim.VirtualUSBController # USB2.0コントローラ
$newSpec.deviceChange[0].device = New-Object VMware.Vim.VirtualUSBXHCIController # USB3.0コントローラ

# 仮想マシンへの設定反映
#(get-view $vm).ReconfigVM_Task($newSpec)
$vm.ExtensionData.ReconfigVM($newSpec)

設定を反映する部分は、ネタ元では「Get-View」を使っていたが、後述のSecureBootについての結果ではGet-VM経由で実施しているスクリプトがあったので、それを使用している。

BIOS/EFI切り替え

仮想マシンをBIOS起動にするか、EFI起動にするかを設定する手法。

2021現在のPowerCLIでNew-VMした時のデフォルトはEFI起動でセキュアブート有効になっている。

これをBIOS起動に設定する場合は、セキュアブートを無効にしてからBIOSに切り替える必要があるので下記にようになる。

$vm=Get-VM -Name 仮想マシン名
$newSpec = New-Object VMware.Vim.VirtualMachineConfigSpec

$bootOptions = New-Object VMware.Vim.VirtualMachineBootOptions
$bootOptions.EfiSecureBootEnabled = $false
$newSpec.BootOptions=$bootOptions

$newSpec.Firmware = [VMware.Vim.GuestOsDescriptorFirmwareType]::bios

$vm.ExtensionData.ReconfigVM($newSpec)



AMD B450チップセット+Ryzen 3 2200G環境でWSL2が 0x80370102で使えない

AMD B450チップセットを使っているASUS TUF B450M-PLUS GAMING にRyzen 3 2200Gを載せている環境で、WSL2を試そうとした。

BIOSのCPU設定にて「SVM Mode」を「Enabled」に変更して、

画像

Windows 10 用 Windows Subsystem for Linux のインストール ガイドの手順に従ってWSL2をセットアップしていく・・・

画像

Ubuntu が0x80370102 のエラーで起動しない。

画像

冒頭に写真に出したように仮想化は有効にしている。

タスクマネージャのパフォーマンスのCPUでも「仮想化:有効」表示を確認

画像

msinfo32でも仮想化の有効を確認

画像

万策尽きたか・・・というところで、AMD Radeon Softwareパッケージを再インストールすることで解決するかも?という話を聞いて、AMD Ryzen™ 3 2200G Previous Drivers からRadeon Softwareをダウンロード/インストール/再起動してみたところ、今度はWSL2が正常に起動することが確認出来た。

次はWSLgだな・・・

Nutanix CE 5.18でFile Serverを有効にしようとしたけど1TBなかったので失敗?

Nutanix Community Edition 5.18では、Nutanix File Server機能が利用できるようになった。

まず[設定]-[ソフトウェアアップグレード]-[File Server]を開く

今回は、この時点での最新版 3.7.3を選択し、ダウンロード開始

ダウンロードが終わったら「Continue」

すでに「ファイルサーバー」が起動していました。

[+File Server]をクリックしてファイルサーバーを追加

ファイルサーバについての設定を入力

0.1TBはエラー

用意された物理ストレージサイズより大きい1TBは警告がでるけど通った。

「クライアントネットワーク」設定

「ストレージネットワーク」設定

「ディレクトリサービス」設定

NFSは「未管理」で設定

「サマリー」の確認

[Create]ボタンを押して作成

作成中…

失敗した・・・

ディスクを1TB以上用意しておかないと設定できないっぽいな

OVAファイルをOVFに変換する

NetAppシミュレータの古いバージョンは圧縮ありのOVAファイルで提供されている。

これをvSphere 7.0環境で使おうとすると、圧縮されているので使えない、と拒否される。

変換ツールを使ってもよいのだが、手動でも変換できる

OVAファイルは中にovfファイルとvmdkファイルが入っているだけのtarファイルなので、7zipなどのツールを使って展開できる。

vsphere 7.0ではvmdk.gzは使えないので、これも展開する

OVFファイルの中身はXMLファイルとなっていて、元の中身は、vmdk.gzのファイルを指定している。

これを展開後のファイル名とファイルサイズに置き換える

また「ovf:compression=”gzip”」という記述も削除する

こうやって出来たOVFファイルとVMDKファイルを複数指定してvSphereで読み込ませる。

読み込ませる下記の様な形で「5ファイル」という表示になる

記述に問題なければOVFテンプレートのデプロイが継続できる。