ESXi上のNutanix CE AHVをアップデートした

ESXi上にNutanix CE AHVをインストールした」でインストールしたNutanix CE環境をアップデートしてみた。

2021/03/17追記: CE 5.11からCE 5.18へのアップデートを行い、その時のキャプチャも追加した

トラブルポイントのまとめ

なんとなく手順を進めていったらいくつかキツイ問題が発生してアップデートプロセスが止まったりした。今回発生した問題は下記3点

・AHVのrootパーテーション容量が足らない
・AHV内の標準仮想マシン設定にあるPC Typeが初期値に戻るので既存の仮想マシンが起動しない
・AHV内のCVM仮想マシン設定にあるPC Typeがpc-i440fx-rhel7.3.0になり起動しない
・CVM仮想マシンのメモリが12GBだとサービスが起動しない

なお、調査の際に参考になったページ「Nutanix CE: Cannot Start VM」「Guest VM Running in Nested Nutanix CE on VMware vSphere Won’t Boot

CVM仮想マシン上のサービスが起動しないあたりは「PRISM SERVICES HAVE NOT STARTED YET. PLEASE TRY AGAIN LATER

実際に実施した手順はもっといろいろあったが、完了後に、たぶんこの順序で実施すれば大丈夫だったんだろう、というものを下記に手順として残す。

手順1 アップデータ入手

Download Community Edition (CE-2020.09.16/CE 5.18)」もしくは「Download Nutanix CE, Docs, and Guides (CE-2019.11.22/CE 5.11.1.2)」から下記のファイルをダウンロード。

・「Metadata for AOS, AHV upgrades and PC deployment」のce-2020.09.16-metadata.zip か ce-2019.11.22-metadata.zipを展開してjsonファイルを取りだしておく
・「AOS Upgrade」(ce-pc-upgrade-2020.09.16.tar.gz か ce-2019.11.22-upgrade.tar.gzのままで使う)
・「AHV Upgrade」(CE 5.18ではLCMからの操作に変更。CE5.11.1.2は host-bundle-el7.nutanix.20191030.415.tar.gz のままで使う)

手順2 CVM仮想マシンの自動起動を止める

この後、何回かNutanix CE仮想マシンを再起動する。その際にCVM仮想マシンの起動が完了するのを待っていると時間がかかるので、自動起動を止める。

「virsh list –all」でCVM仮想マシンのIDを確認して、「virsh autostart <ID> –disable」と実行すると自動起動が止まる。

手順3 Nutanix CE仮想マシンのディスク拡大

AHVのrootパーテーションの空き容量が足らない為アップデートが失敗することがある。

その場合はvSphere側でNutanix CE仮想マシンのディスクサイズを拡大する。

たぶん、ハードディスク1は10GB未満だと失敗するので12GB程度にする。

標準の「ハードディスク1」が約7GBとなっている。

これを、12GBに増やす。

変更後、Nutanix CE仮想マシンを再起動する。

再起動後、vSphereのコンソールを開き「root」ユーザでログインする。デフォルトパスワードは「nutanix/4u」

ログイン後、現在のディスク使用状況と、システムディスクである/dev/sdaのパーテーション構成を確認する。

「df -h」と「fdisk -l /dev/sda」を実行する。

パーテーション変更は「fdisk /dev/sda」を実行して行う。

既存のパーテーションを「d」で消して、新しいパーテーションを作成しなおす、という形になる。

bootフラグのセットも忘れずに

最後は「w」で書き込みを実行する。

再起動しないと新しいパーテーションで認識してくれないので、再度Nutanix CE仮想マシンを再起動する。

再起動後、再度「fdisk -l /dev/sda」と「df -h」を実行してみると、fdiskの方は新しいディスクサイズで認識しているが、rootパーテーションはまだ古い容量のままとなっている。

「resize2fs /dev/sda1」を実行してファイルシステムの拡張を行い、新しいディスク容量が反映される。

手順4 CVM仮想マシンの自動起動を戻す

AHV内のCVM仮想マシンの自動起動設定を戻し、自動起動するようにする。

「virsh list –all」でCVM仮想マシンのNameを確認して、「virsh autostart <Name>」を実行する。(起動していない場合はIdが割り当てられていないので、Nameで指定する必要がある)

自動自動設定ができたかどうかは「/etc/libvirt/qemu/autostart/」にXMLファイルがあるかで確認する。

「virsh start <Name>」でCVM仮想マシンを起動するか、rebootでNutanix CE仮想マシンを再起動する。

手順5 AOSアップデート

Nutanixにログインして「設定」の「ソフトウェアアップグレード」にある「AOS」を開く。

「AOS base softwareバイナリをアップロード」のリンクをクリック

AOS BASE SOFTWAREメタデータファイルは「ce-aos-upgrade-2020.09.16-metadata.json」か「ce-2019.11.22-upgrade-metadata.json」
AOS BASE SOFTWAREバイナリファイルは「ce-aos-upgrade-2020.09.16.tar」か「ce-2019.11.22-upgrade.tar.gz」
を指定する。

「今すぐアップロード」をクリックする。

上記の様になったらアップロード成功。

「Upgrade Now」を選択してアップデートを開始する。

アップグレードが進んでいきます。

ちなみに「Nothing To Do?」は下記の2048ゲームが表示されます。

途中、CVM仮想マシンの再起動などがあり、完了します。

手順6 Hypervisorのアップデート(CE 5.18の場合)

CE5.18では「LCM」にHypervisorのアップデートが移動している。

「LCM」の「Inventory」タブを開く

「Perform Inventory」を選択し、実行

Inventory終了後、「Updates」の「Software」に移動すると、アップデート可能なソフトウェア一覧が表示されている。

チェックをいれて「Update」ボタンを押す

適用確認で「Apply ? Updates」をクリック

アップデートが適用されるのを待つ

途中でhypervisorの再起動が2回実行されるので「Unable to reach server. Please check your network connection」という表示がしばらく出続けるが無視しておく

…とはいえ、30分以上経過しても表示上は↑の38%から変化しないのは不安なので、念のためログインしなおしてみても表示は変わらずでした。

45分ぐらい経過したところで、ようやく64%に進みました。

約1時間で終了

手順6 Hypervisorのアップデート(CE 5.11の場合)

CE 5.11ではNutanixの「設定」の「ソフトウェアアップグレード」にある「Hypervisor」を選択。

「upload a Hypervisor Binary」をクリックし、下記の選択をして「今すぐアップロード」する。

HYPERVISOR メタデータファイル「host-bundle-el7.nutanix.20191030.415-metadata.json」
HYPERVISOR バイナリファイル「host-bundle-el7.nutanix.20191030.415.tar.gz」

続いて、「Upgrade Now」を実施する。

で、アップグレードが進んでいきます。

たぶん、下記の様な「71%」から30分以上待っても進まないと思います。

いまの状態はHypervisorはアップデートできたものの、その上のCVM仮想マシンが起動していない状態となります。

手順7 AHV上の仮想マシンの標準設定の修正

vSphere上でNutanix CE 5.11を稼働させた場合、標準設定の状態ではNutanix上で作成した仮想マシンが起動しませんでした。

CE5.11で起動させるためには、「/var/cache/libvirt/qemu/capabilities/3c76bc41d59c0c7314b1ae8e63f4f765d2cf16abaeea081b3ca1f5d8732f7bb1.xml」 のalias=’pc’をpc-i440fx-rhel7.2.0の行に付け直します操作が必要でした。

該当ファイルは下記の様な形になっていて、「alias=’pc’」がpc-i440fx-rhel7.3.0の行についています。

これを「pc-i440fx-rhel7.2.0」の行に「alias=’pc’」設定を移動させます。

手順としては、pc-i440fx-rhel7.3.0の行をpc-i440fx-rhel7.2.0書き換えて、既存のpc-i440fx-rhel7.2.0設定を削除するのが簡単でしょう。

画像

CE5.18の場合は、pc-i440fx-rhel7.6.0 にalias=’pc’ がありました。CE 5.11を稼働させた時のESXiサーバとハードウェアが異なっているせいかどうかわかりませんでしたが、pc-i440fx-rhel7.6.0設定のままで動いたので、そのままにしています。

もし、動かない場合は、pc-i440fx-rhel7.2.0 に移動挿せてみてください。

手順8 AHV上のCVM仮想マシン設定の修正

CE5.11へのアップデート時は、CVM仮想マシンの仮想マシンタイプ設定が「pc-i440fx-rhel7.3.0」に設定されていました。(CE5.18へのアップデート時は、pc-i440fx-rhel7.2.0設定のままでした)

設定の確認は「virsh dumpxml <name>|less」で行います。
設定変更は「virsh edit <Name>」となります。

viコマンドでxmlファイルが開かれますので、「pc-i440fx-rhel7.3.0」を「pc-i440fx-rhel7.2.0」に書き換えて保存します。

また、「<memory unit=’KiB’>~</memory>」のメモリ容量を増加させます。Nutanix CE標準だと最低28GBとなっているようです。

参考としてGUIから設定できるCVMに割り当てられる容量は下記の様になっています。

これ以外の値に変更したい場合は、直接xmlを書き換えます。今回は約26GBで設定しています。

この後、CVM仮想マシンを再起動します

面倒ならNutanix CE仮想マシンごとrebootします。

手順9 終了

lvglのALIGN設定を確認した

TTGO T-Watch-2020で画面にいろいろ要素を足してみる時に設定するLV_ALIGN_IN_~とかLV_ALIGN_OUT_~の違いがよくわからないのでドキュメントサイトを検索してみたけど、資料が無かった…

2020/09/08 公式に追加された「Base object (lv_obj) Alignment

仕方が無いので実際に表示をして確認してみた。

縦方向: y もしくは height
横方向: x もしくは width

文字列が長くなるので「LV_ALIGN_IN_BOTTOM_RIGHT」だったら「IN_BOTTOM_RIGHT」というように「LV_ALIGN_」の部分を省略している。

LILYGO TTGO T-Watch-2020が届いたので開発環境を作って動かしてみた

LILYGO TTGOからT-Watch-2020が登場。

販売ページ「LILYGO® TTGO T-Watch-2020 ESP32 Main Chip 1.54 Inch Touch Display Programmable Wearable Environmental Interaction
資料「https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library

発売直後に注文入れたのですが、発送される前に値下がりしてたり、中継地点のシンガポールにつくまで1ヶ月以上音沙汰がなかったりと、約2ヶ月かかるとは思いませんでした。

画像
画像

中身は本体とmicroUSBケーブルだけでした。

初代T-WatchはType-Cコネクタでしたが、microUSBだとは・・・

画像

横についているボタンを押しても電源が入らなかったので、microUSBで電源供給してみたところテストプログラムが実行されました。

画像

とりあえずは問題ないようです。

では、開発環境を作って書き換えましょう。

ドキュメントとして「https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library」と「T-Watch Document」が書かれていますが、後者の記述は微妙なので無視ですね。

初期設定

(1) Arduino IDEをインストール

Arduino IDEをダウンロードしてインストール。うちの環境はWindows10なので Microsoft Storeからインストールしました。

(2) TTGO_TWatch_Library ライブラリをインストール

https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library の「Clone or download」から「Download Zip」を選択してzipファイルをダウンロード。

Arduino IDEの[スケッチ]-[ライブラリをインクルード]-[ZIP形式のライブラリをインストール]にてダウンロードしたzipファイルを指定してインストール。

追加が成功すると画面下部に以下が表示されます。

また「ドキュメント\Arduino\libraries」に「TTGO_TWatch_Library-master」が作成されます。

(3) Arduino IDE Boards Managerにespressif社のURLを登録

Arduino IDEの[ファイル]-[環境設定]の「追加ボードマネージャのURL」に「https://dl.espressif.com/dl/package_esp32_index.json」を追加する。

(3) T-Watchを選択する

Arduino IDEの[ツール]-[ボード]-[ESP32 Arduino]-[TTGO T-Watch]を選択する。(下の方に登録されている)

(4) スケッチ例からSimple Watchを呼び出す

Arduino IDEの[ファイル]-[スケッチ例]-[TTGO T-Watch]-[lvgl]-[Simple Watch]を選択する。

(5-1) Simple WatchをT-Watch-2020用に書き換える(2020/06/28以降のTWatch_Libraryの場合)

2020/06/28以降のlvgl 7.0.0対応のTWatch_Libraryの場合、SimpleWatchを選択した場合にタブで表示される「config.h」にて使用するT-Watchのバージョンを選択するようになった。
T-Watch-2020を使用する場合は、下記の様に「//define LILYGO_WATCH_2020_V1」のコメントを削除する。

// => Hardware select
// #define LILYGO_WATCH_2019_WITH_TOUCH     // To use T-Watch2019 with touchscreen, please uncomment this line
// #define LILYGO_WATCH_2019_NO_TOUCH          // To use T-Watch2019 Not touchscreen , please uncomment this line
#define LILYGO_WATCH_2020_V1             //To use T-Watch2020, please uncomment this line


// => Function select
#define LILYGO_WATCH_LVGL                   //To use LVGL, you need to enable the macro LVGL

#include &lt;LilyGoWatch.h>

(5-2) Simple WatchをT-Watch-2020用に書き換える(2020/06/28より前のTWatch_Libraryの場合)

2020/06/28より前のTWatch_Libraryの場合、「SimpleWatch」のファイル冒頭に「// #define LILYGO_TWATCH_2020_V1 // If you are using T-Watch-2020 version, please open this macro definition」とあるように、T-Watch-2020を使う場合はここのコメントを外す必要がある。

/*
Copyright (c) 2019 lewis he
This is just a demonstration. Most of the functions are not implemented.
The main implementation is low-power standby. 
The off-screen standby (not deep sleep) current is about 4mA.
Select standard motherboard and standard backplane for testing.
Created by Lewis he on October 10, 2019.
*/

#define LILYGO_TWATCH_2020_V1        // If you are using T-Watch-2020 version, please open this macro definition

#include &lt;TTGO.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/timers.h"
<以下略>

こんな感じに書き換える。

(6) Simple Watchを日本時間対応にする

SimpleWatchの「gui.cpp」というタブ内で、時刻表示が「CST-8」と設定されているので、それを「JST-9」に書き換えます。

<略>
#include "FS.h"
#include "SD.h"

#define RTC_TIME_ZONE   "JST-9"


LV_FONT_DECLARE(Geometr);
<略>

こんな感じです。

また、「gui.cpp」ではNTPサーバの接続先も設定されています。標準は「pool.ntp.org」ですが、日本国内の「ntp.jst.mfeed.ad.jp」(INTERNET MULTIFEED運営)や「ntp.nict.jp」(NICT運営)に書き換えてください。

(7) T-Watch-2020をパソコンにつなげます

microUSBケーブルを使ってT-Watch-2020をつなげます。

USBシリアルCP2104用のドライバがインストールされていない場合は https://t-watch-document-en.readthedocs.io/en/latest/download/index.htmlCP2104の公式ページなどからSilicon Labs Virtual COM Port (VCP) Universal Driverを入手してインストールします。

(8) T-Watch-2020が接続されたCOMポートを指定します。

Arduino IDEの[ツール]-[シリアルポート]にてCOMポートを指定します。

Arduino IDEの[ツール]-[Upload Speed]は「1152000」と指定しています。この速度はT-Watchのサンプルコードのシリアル入出力で見かける速度指定なので使っています。

それ以外の項目は特に変えていません。

ちなみに「PortPop」というアプリをインストールしておくと、デバイスをつなぎWindows上でCOMポートとして認識した時点で、何番として認識されたのかを教えてくれるので便利です。

(9) コンパイルと書き込み

Arduino IDEの[スケッチ]-[マイコンボードに書き込み]を選択して、コンパイルと書き込みを実行します。

(10) 完成

WiFiをスキャンしてSSID一覧を作り、そこから接続先を選択し、キーを入力することで、ネットワークに接続し、NTPサーバから時刻同期を行う、ということが可能となりました。

画像
画像
画像

Simple Watchの操作は「画面タッチ」です。横の丸ボタンは画面ON/OFFのみのようです。

また、WiFi以外に「Settings」「SDcard」「Camera」などのメニューがありますが、現状未実装です。押しても何も発生しません。

次に作るものは、と製品紹介ページに載っている下記画像を実現できるソースコードを探してみたところ・・・

画像

LilyGoGui」でした。

画像

が・・・時間が変わらないのでおかしいな、とソースを見てみると、画面表示のサンプルなだけで、全てが固定表示だったという・・・

そっか・・・時計実装は自前でやらなきゃならないのか・・・

GloDroidがninjaのエラーでビルドできない

PinePhoneやOrange Pi OneなどのAllwinner SoCで動くAOSPベースのandroidであるGloDroidというのがある。

これはGoogle Play StoreなどのGoogle関連(GMS)が入っていないので使いづらい。OpenGappsでも入れられないかなぁ?とパッケージをみてみたけど、こちらはTWRP用にカスタマイズされていてよく分からない・・・

GloDroidのgithubを見るとprebuilt_appsなんてレポジトリがありfdroidとkodiのインストールについての定義がある。ここらを応用すれば何かできないかなぁ、と思ってGloDroidを自分でビルドしてみることにした。

最初Ubuntu 18.04環境で作ってみたけど、うまくいかないのでGoogleのドキュメント上では推奨されているUbuntu 14.04環境作ってみたりしたけど、うまくいかなかった。

エラーの状況

Ubuntu 18.04でもUbuntu 14.04でもほぼ同じで下記のようなエラーが出力されます。

============================================
[100% 451/451] out/soong/.bootstrap/bin/soong_build out/soong/build.ninja
FAILED: out/soong/build.ninja
out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -globFile out/soong/.bootstrap/build-globs.ninja -o out/soong/build.ninja Android.bp
Killed
10:47:31 soong bootstrap failed with: exit status 1
ninja: build stopped: subcommand failed.build/make/core/main.mk:21: recipe for target 'run_soong_ui' failed
make: *** [run_soong_ui] Error 1
osakanataro@ubuntuserver:~/GloDroid$

out/soong.log の最後は下記のようなエラーです。

2020/06/12 10:47:31.168342 build/soong/ui/build/exec.go:95: soong bootstrap failed with: exit status 1

Ubuntu 14.04の場合

Javaのバージョンが古いので新しいOpenJDKを使える様にする。

$ sudo add-apt-repository ppa:openjdk-r/ppa
$ sudo apt install openjdk-13-jdk

Googleのドキュメント(Establishing a Build Environment)記載のパッケージをインストール。

$ sudo apt install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

また、上記のNoteに記載されている「python-networkx」と「libnss-sss:i386」も必要で、これが無いことでninjaのエラーがでていました。

$ sudo apt install python-networkx libnss-sss:i386

Repoのインストールを「Downloading the Source」記載の手順で行います。

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
 gpg --recv-key 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65
$ curl https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ~/bin/repo

repo内部ではgitコマンドを使用するためgitの初期設定も行います。

$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"

次にGloDroidで要求されているパッケージをインストール。(記述にはrepoが含まれてますがパッケージじゃないので抜く)

$ sudo apt install swig  python-dev python3-dev libssl-dev flex bison device-tree-compiler

で・・・この後、試行錯誤した結果、さらに以下のパッケージも必要でした。

$ sudo apt install python-pip gettext gdisk

Ubuntu 18.04の場合

Ubuntu 14.04の場合とだいたい一緒でした。

いまコンパイルして実証中です・・・(まだ結果が出ていない

2020/06/13 22:39 うーん・・・エラーだ

[100% 8/8] out/soong/.bootstrap/bin/soong_build out/soong/build.ninja
FAILED: out/soong/build.ninja
out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -globFile out/soong/.bootstrap/build-globs.ninja -o out/soong/build.ninja Android.bp
Killed
22:37:24 soong bootstrap failed with: exit status 1
ninja: build stopped: subcommand failed.
#### failed to build some targets (02:38:03 (hh:mm:ss)) ####

out/soong.log の最後のあたりはこんな感じ

2020/06/13 19:59:25.251629 build/soong/ui/build/dumpvars.go:109: PRODUCT_SOONG_NAMESPACES
2020/06/13 19:59:25.252084 build/soong/ui/build/exec.go:57: prebuilts/build-tools/linux-x86/bin/nsjail [-x build/blueprint/bootstrap.bash -H android-build --cwd /home/osakanataro/GloDroid -t 0 -e --proc_rw -u nobody -g nogroup --rlimit_as soft --rlimit_core soft --rlimit_cpu soft --rlimit_fsize soft --rlimit_nofile soft -B / --disable_clone_newcgroup -q -- -t]
2020/06/13 19:59:25.326955 build/soong/ui/build/exec.go:57: prebuilts/build-tools/linux-x86/bin/nsjail [-x out/soong/.bootstrap/bin/soong_env -H android-build --cwd /home/osakanataro/GloDroid -t 0 -e --proc_rw -u nobody -g nogroup --rlimit_as soft --rlimit_core soft --rlimit_cpu soft --rlimit_fsize soft --rlimit_nofile soft -B / --disable_clone_newcgroup -q -- out/soong/.soong.environment]
2020/06/13 19:59:25.761444 build/soong/ui/build/exec.go:57: prebuilts/build-tools/linux-x86/bin/nsjail [-x prebuilts/build-tools/linux-x86/bin/ninja -H android-build --cwd /home/osakanataro/GloDroid -t 0 -e --proc_rw -u nobody -g nogroup --rlimit_as soft --rlimit_core soft --rlimit_cpu soft --rlimit_fsize soft --rlimit_nofile soft -B / --disable_clone_newcgroup -q -- -d keepdepfile -w dupbuild=err -j 2 --frontend_file out/.ninja_fifo -f out/soong/.minibootstrap/build.ninja]
2020/06/13 19:59:27.066701 build/soong/ui/build/exec.go:57: prebuilts/build-tools/linux-x86/bin/nsjail [-x prebuilts/build-tools/linux-x86/bin/ninja -H android-build --cwd /home/osakanataro/GloDroid -t 0 -e --proc_rw -u nobody -g nogroup --rlimit_as soft --rlimit_core soft --rlimit_cpu soft --rlimit_fsize soft --rlimit_nofile soft -B / --disable_clone_newcgroup -q -- -d keepdepfile -w dupbuild=err -j 2 --frontend_file out/.ninja_fifo -f out/soong/.bootstrap/build.ninja]
2020/06/13 22:37:24.168572 build/soong/ui/build/exec.go:95: soong bootstrap failed with: exit status 1

ラズパイ4でWindows 10 on ARMを動かす

ラズパイ4でWindows 10 on ARMが動くようになった・・・とは聞いていたのですが、ラズパイ4を持っていないので試してはいませんでした。

しかし、ラズパイ4 8GBモデルを買ってしまったので、試してみました。

とりあえず感想ですが、動作自体はラズパイ3で使うより快適ですが、メモリが1GBに制限されます。また、オンボードのNICとUSB Aポート、WiFi/Bluetoothが使えないというのが難点で、全部Type-CポートにつなげたUSB Hubにつなげる必要があります。

デバイスのサポート状況については「Windows on ARM(64) device drivers for the Raspberry Pi platform」を参照のこと

また、今回はツールを使用してmicroSDを作成していますが、手動でやる場合については「How-to: installing windows 10 arm64 (17134) on your raspberry pi 3 and 4」を参照してください。

準備するもの

・ラズパイ4

2020/06/06時点ではメモリ認識が1GBまでなので、どのラズパイ4を買っても同じです。

・高速なmicroSD

低速なmicroSDを使うと起動にだいぶ時間がかかります。
「A1 V30」か「A2 V30」と書かれているやつを入手します。(次点はA1 V10)

(AやVの意味は「SDカードの種類」参考のこと)

・USB Type-Cのハブ

現状ラズパイ4のUSB Aポートが認識してくれないので、電源供給にも使うType-CポートにUSBハブを繋ぎ、そこに電源とキーボード、マウス、NICなどを繋ぐ必要があります。

2020/06/18追記 丁度いいUSBハブが無かったので、2つのUSBハブを組み合わせて使っていたのですが面倒になったので↓のやつを買いました。土曜に届くらしいので後で試します。

・USB NIC/WiFi

ラズパイ4のNIC/WiFiが使えないので、こちらもUSB Type-Cハブ経由で繋ぐ必要があります。
ただし、MicroSD上にNICドライバをコピーしておく必要があります。
最近のWindows 10だと自動認識するようなデバイスであっても認識してくれませんでした。

ドライバ入手に関する重大な注意点は「ARM64用が必須」ということ。
通常配布されているドライバはIntel/AMD系用の32bit/64bit環境専用で、ARM系は考慮されていません。なので、実はドライバ単品入手はかなり難しいです。

Windows 10で自動認識してくれるようなデバイスの場合、USB Bluetooth増設してBluetoothテザリング経由でWindows Updateからドライバを入手して認識させることができるようになります。

・USB Bluetooth

USB NICのドライバがうまく見つからない場合、Bluetoothテザリング経由でネットワークに繋ぐということでラズパイ4をネットワークに繋ぐことが可能になります。

手順1 Windows 10 on ARMのISOイメージ生成

まず、Windows 10 on ARMのISOイメージを作成します。

UUP Generation Project」や「UUP dump」からarm64用のバッチファイルを入手して、管理者権限で実行することで2~3時間ぐらいかかってISOファイルが生成されます。

手順2 Windows on Raspberry imagerの入手

Windows on Raspberry imager」の2.0.0がラズパイ4対応です。

手順3 microSDへの書き込み

Windows on Raspberry imagerを起動してmicroSDへ書き込みます

デバイス選択で「ラズパイ3(64bit)」「ラズパイ4(64bit)」「ラズパイ2/3 (32bit)」から「ラズパイ4」を選びます。

先ほど生成したISOイメージとインストールするWindows10のエディションを選択します。

ラズパイ3(64bit)とラズパイ4(64bit)はどちらも同じARM64用ISOを使用します。32bitの場合、使うISOはよくわかりません。

ドライバをダウンロードします。「Use the latest package available on the server」を選択すると現時点のラズパイ用最新ドライバーをダウンロードしてくれます。

Windows 10 on ARMはUEFI経由で起動するため、UEFIファームウェアを入手します。こちらも「Use the latest firmware available on the server」を選択します。

設定でBOOTパーテーションに置かれるconfig.txtファイルの内容や、microSDのパーテーション設定などを設定します。

「Advanced」タブを選択すると下記の警告ダイアログが表示されます。

2020/06/06時点だとラズパイ4では1GBまでしかメモリが使えないので「Memory limit: 1024MB」と設定されています。(ちなみにうちのは8GBなので8000MBでやってみるとUSB Type-C経由でもキーボード/マウスが使えないという何もできないWindowsが起動しました)

書き込み前の最終確認です。

手順4 NIC/WiFiドライバのコピー

microSD上には「BOOTドライブ」と「WINDOWSドライブ」が出来てます。
このうち「WINDOWSドライブ」の方にNIC/WiFiのドライバをコピーします。

手順5 ラズパイを起動

必要なデバイスをラズパイ4につなげて電源を入れます。

注:ここで書く時間はmicroSDが高速なA2 V30のものを使った場合の時間です。遅いmicroSDの場合、5倍以上の時間がかかったりします。(ラズパイ3の時の体験談)

最初、白黒のラズベリーパイロゴ画面が3分間ぐらい表示され続けますが、正常です。
(2020/06/10 追記: この時間がかかる件はメモリ8GBモデルでのバグでUEFI v1.14にて修正されました)


そのあと、画面下部にUEFIブート選択のバーが表示された後、真っ暗になり、30秒程度で青いWindowsロゴとなります。

青いWindowsロゴだけの時間が2分弱続いたあと、下側で丸いぐるぐるが始まります。
このぐるぐるは「デバイスを準備しています」などが15分ぐらい続いたあと、再起動します。

再起動するとやはり白黒ラズパイロゴがしばらく表示された後、5分ぐらいで全画面青表示で中央に「お待ちください…」ぐるぐるが5分ぐらい表示されます。

「お住まいの地域はこちらでよろしいですか?」が表示され、Windows 10のセットアップが開始されます。

ただ・・・私の場合、最初はキーボード/マウスを認識してくれなかったので、強制電源オフを1回しました。 (何回か再セットアップした結果、これは1回しか発生しませんでした)

また、パスワードは入力しないでエンターキー入力で進めると3つのヒント設定不要で、自動ログインにもなるので楽ちんです。

起動してみるとデバイスマネージャの認識状況はこんな感じです。

タスクマネージャーを開くとこんな感じでディスクI/Oが100%になっていたりします。
これは後述のOneDriveとかバックグラウンドアプリの影響です。オフにすると改善されます。

手順6 快適に使うための設定

Windows 10 on ラズパイ3の時(ラズパイ3のWindows 10 on ARMを使う場合の設定ポイント)と一緒です。

スタートアップ設定

One Drive用プログラムがスタートアップに組み込まれており、これが結構な負荷を与えています。

「タスクマネージャ-」を開き「スタートアップ」タブにある「Microsoft OneDriver Setup」を右クリックし「無効化」を選択します。

電源設定

コントロールパネルの電源オプション設定を「バランス」から「高パフォーマンス」に変更します。

最近のWindows10だとコントロールパネルをスタートメニューから開くのが面倒です。

スタートメニューから[設定]-[システム]-[電源とスリープ]から「電源の追加設定」をクリック

バックグラウンドアプリ設定

Windowsストア系のアプリが動いてしまうと結構圧迫してしまうので、バックグラウンドアプリの実行を停止します。

[設定]-[プライバシー]-[バックグラウンドアプリ]にて「アプリのバックグラウンド実行を許可する」を「オフ」に変更します。


現状、メモリが1GB制限なのは、ACPI DMA周りのバグで、ラズパイ4用のUEFIアップデートによって解消されることが期待されています。

もし解消された場合に、既存microSDの1GB制限を解除したい場合は「bcdedit /store T:\EFI\Microsoft\Boot\bcd /deletevalue {default} truncatememory」を実行すればいけるのでは?との見解。(ネタ元:「How-to: installing windows 10 arm64 (17134) on your raspberry pi 3 and 4」)