プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

VirtualBox の WIndows 10 を 11 にアップグレードする

仕事が一段落ついたのと、ちょっと VM の環境で検証したいことが出てきたので、まんま、下記の記事をやってみました。

VirtualboxのWindows10仮想マシンをデータを引き継いでWindows11にアップグレードする | gatsby-starter-blog++

最初は順調にいっていたので、わざわざ自分でブログの記事を書くまでもないだろうと思っていたら、 Windows 11 のインストール直前で躓いてしまったので、一応、メモっておきます。

試した環境はこんな感じでした。

  • VirtualBox 7.0.8 (作業途中で 7.0.18 にアップデート)
  • ホスト WIndows 11, 23H2
  • ゲスト Windows 10 22H2, 2024/7/8 時点で WIndows Update を適用済み

VirtualBox 7.x で Windows 11 にアップデートするための準備

この手の作業の鉄則として、まずはバックアップを取っておきます。仮想マシンのフォルダごとコピーしておけばOKですね。

実際の作業は前述の記事の通りにすすめれば OK です。なので、詳細は割愛しますが、主に下記の3点です。

  • ストレージを MBR から GPT に変更
  • EFI を有効
  • TPM 2.0 およびセキュアブートを有効

で、これで WIndows 11 へのアップグレードができるようになると思い、 WIndows 10 ゲストを起動して、『設定』->『更新とセキュリティ』->『Windows Update』を開くと、『Windows 11 を実行するための最小システム要件を満たしていません』と表示されたままです。

あれれ?さて、困ったぞ。

やったこと

前述の記事では、この時点でシステム要件が満たされているとなっているのですが、どうも満たされたと判定されていないようです。仕方ないので、 WIndows 11 のシステム要件を改めてチェックします。

Windows 11 の仕様とシステム要件 | Microsoft

CPU は 2 コア以上、メモリは 4GB 以上あることを確認します。

TPM の確認は、『設定』->『更新とセキュリティ』->『デバイスセキュリティ』->『セキュリティプロセッサ』の『セキュリティプロセッサの詳細』を表示させます。

セキュアブートの確認は、『設定』->『更新とセキュリティ』->『デバイスセキュリティ』の『セキュアブート』を表示させます。

このあたりは問題なかったのですが、ストレージ容量として 64GB 必要とありますが、現在のドライブは 62GB ちょっとしかありません。

これ怪しいですね。

ディスク容量の拡張

ということで、 VirtualBox 側の仮想ディスク容量を 80GB に増やしてみます。最初は、 VirtualBox 側での操作になります。メニューの『ファイル』->『ツール』->『仮想メディアマネージャ』より、仮想メディアマネージャを表示します。

複数の仮想ディスクが表示されますが、対象となるゲストが使っているディスクを選択します。画面下部の『属性』タブのサイズに拡張後のサイズを入力して、『適用』ボタンを押します。

ただ、スナップショットがある場合は、これだけでは反映されませんでした。スナップショットを削除してから作業するというのも一つの方法だと思うのですが、今回は、現在実行中のスナップショットおよびその先祖について、仮想的なサイズがすべて拡張後のサイズになるように修正しました。最終的にはこんな感じですね。

これで、起動したら、ゲスト側で拡張したサイズを認識してくれました。

次は、ゲスト側のパーティションサイズも増やします。なお、今回は C ドライブのパーティションの後ろに、回復パーティションがあったので、ちょっと乱暴ですが、ゲスト OS ということもあるし、作業を簡単にするためそこは削除してしまいます。

パーティションの削除は、diskpart を管理者権限で実行して行います。

diskpart の使い方は、下記などを参考にしてください。

Windows 10回復パーティションを削除してもいい?

GPT の場合、エラーがでることがあるそうで、この場合もエラー対応を行ってから削除しました。

Cドライブがあるパーティションの直後に空パーティションが存在するようになれば、

『ボリュームの拡張』を選択して、実行すればOKです。

これでシステム要件を満たしたかな?と思いきや、やはり判定結果は変わりません。前述の記事のところには、

ここで「このPCでWindows11を実行できます」ではなく、ハードウェア要件を確認する旨のメッセージが出るかもしれませんが、それでも大丈夫です。Windows11アップグレードに進んでください。

とあるので、ダメもとでと思って、 Windows 11 のインストーラを動かしてみたのですが、やはりシステム要件のチェックでひっかかり、先に進めません。

致し方ないので、 VirtualBox そのものを 7.0.8 から 7.0.18 にアップデートしたりもしましたが、同様です。

困った、困った。

解決!

困ったなと思って、ググっていると、

Upgrade from Windows 10 to Windows 11 on VBox7 - virtualbox.org

という記事を見つけました。手順としては、前述の記事とほぼ一緒なのですが、 WIndows 11 のインストールの際に Windows 11 ディスク イメージ (ISO)を使う、とあります。そういや、上記で WIndows 11 のインストールを試したときは、『Windows 11 インストール アシスタント』を使ってましたね。

ということで、藁にもすがる思いで、これを試してみます。

ホスト側で WIndows 11 の ISO イメージをダウンロードして、ゲストの Windows 10 を起動して、光学ドライブに Windows 11 の ISO イメージを割り当てます。で、このドライブ内の setup.exe を動かしてみると、一瞬システムをチェックしますの画面が表示されたのですが、なんと、無事要件のチェックが通りました!

あとは、画面の指示に従ってインストール作業を行ったら、アップグレードできました。いやー、こんなことあるんですね。

余談

なお、最初に Windows 11 のインストーラを起動したときは、下記のような空き容量が不足しているとのメッセージが出てきて、Cドライブでなくてもいいので 10GB程度のストレージをつなげと言われました。

残念ながら、当初の環境では空き容量が無くて、このまま作業を進めることができなかったので、一旦、ゲストをシャットダウンして、 VirtualBox で一時的な仮想ディスクを割り当てて、再度インストール作業を行う、という方法で対応しました(本体の仮想ディスクはなるべく容量を抑えたかったためです)。

もちろん、追加した仮想ディスクはアップデート後に消してます。

まとめ

若干イレギュラーな点もありましたが、無事に VirtualBox で Windows 11 を動かすことができました。たまにしか使いませんが、これで検証環境に困らなくてすみそうです。

2024/8/9 追記1

基本的に、上記で終わりなんですが、仮想マシンの設定を見ていたら、『一般』の『基本』にある『バージョン』が Windows 10 のままになってました。なので、これを Windows 11 に変更します。

あと、仮想マシンの名前と、仮想マシンがあるフォルダの名前、仮想ディスクのファイル名も変更しておきました。

仮想ディスクの名前の変更は、仮想マシンが停止している状態で、 VritualBox の仮想メディアマネージャから、仮想ディスクの『解放』を行い、次に『除去』を行い、 VirtualBox の管理対象外にします。その後、エクスプローラ等でファイル名を変更してから、仮想マシンのストレージに再度アタッチするという作業が必要になります。その点だけ注意が必要です。

これですっきりしますね。

2024/8/9 追記2

あと、別件で気になることがあり、この仮想マシンのパーティションを改めて確認したところ、

のように、Cドライブのパーティションの後ろに、回復パーティションが作られていることに気が付きました。

Windows 11 のアップグレードからしばらく時間が経っているので定かではないのですが、自分で回復パーティションを再作成するようなことなんてやってないので、ひょっとしたら Windiws 11 のインストール時に回復パーティションが作られたのかもしれません。

identy_switch の設定内容について

Roundcube 1.6.7 にアップデートした際に、メールアカウントを切り替えるプラグインを ident_switch から identy_switch へ移行しました。

両者は若干設定内容が異なっているので、改めて、設定内容を確認したので、その他気が付いた相違点と併せてメモっておきます。

設定できる内容

identy_switch で設定できる、アカウント関連以外のものとしては、『設定』->『識別情報』の各追加したアカウントを選択すると

のように、新着メッセージに関するオプションを設定することが可能になります。なお、設定部分を拡大するとこんな感じです。

このうち、『Check all folders for new messages』および『再表示(新しいメッセージの確認等)』は、 ident_switch (というか、素の Roundcube )ではデフォルトのアカウントに対してのみ設定可能だったものですが、これがアカウント毎に設定をすることが可能になったようです。

その他の設定内容は、主に通知関係のものになります。

デフォルトのアカウントに対する設定場所

追加アカウントではない場合は、左端のメニューから『設定』->『設定』->『ユーザーインターフェース』と進むと、

『再表示(新しいメッセージの確認)』があります。

また、『設定』->『設定』->『受信箱』と進むと、『新しいメッセージ』に

のように設定内容が追加されています。

Roundcube 1.6.7 の場合

ちなみに、 identy_switch をインストールしていない素の Roundcube の場合は、『設定』->『設定』->『受信箱』と進むと、『新しいメッセージ』には

のように、『すべてのフォルダーで新着メールを表示』があります(英語だと『Check all folders for new messages』)。

設定内容

で、今回の設定内容ですが、基本的にデフォルトのままとすることにしました。

というのも、 Roundcube を使い始めたときは、こちらの記事に書いたように、新着メールのチェックを有効にしていたのですが、これだとチェックに時間がかかってしまい使い勝手が今一つだったので、無効に戻したという経緯があったためです。

表示内容の相違

identy_switch になってアカウントの選択部分が、

のように最大4件分の表示になりました。以前の ident_switch は設定したアカウント数分すべて表示されていました。

個人的には、以前のスタイルのほうが切り替えやすくて好みです。特にスマホだと、スクロールして表示したいアカウントを選ぶのがちょっと手間取ってしまいます。

アカウントの順番

このアカウント切り替え時のアカウントの並びも変わってます。

ident_switch の時は意識していなかったのですが、思い起こすと、 Label が未設定の場合は、識別情報にアカウントを追加した順に並んでいたようです(Label 設定時の挙動までは確認してないです)。

一方、 identy_switch は Label の辞書順になっているようです。まあ、 Label で制御できるのでいいといえばいいんですが、微妙に違ってますね。

(Windows) Flutter SDK のアップグレード, 3.7.12 -> 3.22.2

Flutter のプロジェクトを更新するにあたり、 Flutter SDK も更新しました。以前もやってるんですが、まとめたことがなかったので、一応、その時の作業手順をメモっておきます。

更新したい SDK のダウンロード

まずは更新したいバージョンの SDK をダウンロードしてきてから、そちらを使うように設定を変更するという方法を取っています。特に大きな理由もないんですが、アップグレード後にもし問題があったときに確実に戻したいので、 flutter upgrade コマンドを使わないという感じです。

もっとも、素直に fvm (Flutter version manager) を入れてもいいんでしょうが、今のところ Flutter のバージョンを切り替えて作業を行う必要性がないので、こんな風にしています。

というわけで、現時点の最新版をダウンロードしてきます。

ダウンロード後は解凍して、 SDK を保存したいディレクトリに置いておきます。

環境変数の更新

Windows の『設定』->『システム』->『バージョン情報』を開き、『システムの詳細設定』をクリックし、環境変数(ユーザーごとの環境変数)の Path にある Flutter SDK へのパスを、ダウンロードしてきたものに修正します(公式の手順はこちらを参照してください)。

パス設定が正しいことを、コマンドラインでも確認しておきます。

C:\Users\mor>flutter --version
Flutter 3.22.2 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 761747bfc5 (3 weeks ago) • 2024-06-05 22:15:13 +0200
Engine • revision edd8546116
Tools • Dart 3.4.3 • DevTools 2.34.3
The Flutter CLI developer tool uses Google Analytics to report usage and diagnostic
data along with package dependencies, and crash reporting to send basic crash
reports. This data is used to help improve the Dart platform, Flutter framework,
and related tools.

Telemetry is not sent on the very first run. To disable reporting of telemetry,
run this terminal command:

    flutter --disable-analytics

If you opt out of telemetry, an opt-out event will be sent, and then no further
information will be sent. This data is collected in accordance with the Google
Privacy Policy (https://policies.google.com/privacy).


C:\Users\mor>

問題ないですね。

Flutter プロジェクトの設定変更

さて、 Android Studio で既存の Flutter プロジェクトを開くと、 Flutter SDK が古いままになっています。なので、これを更新してやる必要があります。

『File』->『Settings』->『Languages & Frameworks 』->『Flutter』 を開くと、 SDK を指定する箇所があります。

これを新しいバージョンの SDK を指すように変更します。

なお、ここでは、

(SDK インストールディレクトリ)/flutter

を指定します(先ほどの Path は flutter/bin だったので間違えないように気をつけます)。

設定を確実にするため、一度、 Android Studio を終了させて、再度プロジェクトを開きます。

SDK 変更による影響のチェック

プロジェクトを開きなおしたら、 build ディレクトリをいったん削除してから、再度ビルドします(実機で実行させます)。 これで問題なく動作できれば完了だったんですが、今回は一部 Breaking Changes があったようで、エラーとなりました。

なお、 Flutter SDK 3.7.12 は Dart 2.19.6 になります。一方、 3.22.2 は Dart 3.4.3 になります。 Flutter SDK 3.7.12 の時点で null safety には対応していたので、こんなアップグレードのやり方をしています。

さて、問題があったところを地道に修正してもいいんですが、 dart fix コマンドを利用すると、ある程度自動的に修正してくれるそうです。Android Studio でも下記のように dart fix の存在を教えてくれています。

早速やってみます。最初は一気に修正するのではなく --dry-run をつけて、様子をみるのが無難そうです。

D:\work\sample_project>dart fix --dry-run
The Dart CLI developer tool uses Google Analytics to report usage and diagnostic
data along with package dependencies, and crash reporting to send basic crash
reports. This data is used to help improve the Dart platform, Flutter framework,
and related tools.

Telemetry is not sent on the very first run. To disable reporting of telemetry,
run this terminal command:

    dart --disable-analytics

If you opt out of telemetry, an opt-out event will be sent, and then no further
information will be sent. This data is collected in accordance with the Google
Privacy Policy (https://policies.google.com/privacy).

Computing fixes in sample_project (dry run)...

36 proposed fixes in 17 files.

lib\feature\common.dart
  unnecessary_cast • 2 fixes
(中略)
To fix an individual diagnostic, run one of:
  dart fix --apply --code=invalid_null_aware_operator
  dart fix --apply --code=undefined_getter
  dart fix --apply --code=unnecessary_cast
  dart fix --apply --code=unnecessary_null_comparison
  dart fix --apply --code=unused_catch_clause
  dart fix --apply --code=unused_element
  dart fix --apply --code=unused_import

To fix all diagnostics, run:
  dart fix --apply

D:\work\sample_project>

指摘されたもののうち、特定のもののみを修正できるようです。

D:\work\sample_project>dart fix --apply --code=undefined_getter
Computing fixes in sample_project...
Applying fixes...

lib\feature2\common2.dart
  undefined_getter • 2 fixes
(略)
10 fixes made in 5 files.

D:\work\sample_project>

これを使えば、少しずつ修正内容を確認しながら手直しできるので、いいですね。

パッケージのアップグレード

自分のアプリ側の修正だけで終わればよかったのですが、依存しているライブラリで問題があるものがありました。

なので、これらも新しいものに替えておきます。

で、最終的にビルドが通るようになれば、完了です。

おまけ

ちなみに、最初は Flutter SDK をダウンロードするというやり方だったのを忘れていて、いきなり flutter upgrade やってしまいました。このとき、

C:\Users\mor>flutter upgrade
Your flutter checkout has local changes that would be erased by upgrading. If you want to keep these changes, it is
recommended that you stash them via "git stash" or else commit the changes to a local branch. If it is okay to remove
local changes, then re-run this command with "--force".

C:\Users\mor>

のように警告が出てきて、 upgrade に失敗しました。似たようなことで困っている人は結構いるようで、ネットにもいろいろと落ちてました。

実際に、 SDK のディレクトリに移動して、 git status を見ると

C:\Users\mor\bin\flutter_windows_3.7.12-stable\flutter>git status
On branch stable
Your branch and 'origin/stable' have diverged,
and have 53 and 7731 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .pub-preload-cache/

nothing added to commit but untracked files present (use "git add" to track)

C:\Users\mor\bin\flutter_windows_3.7.12-stable\flutter>

.pub-preload-cache 以下が未登録になってます。なるほど、これでアップグレードできなかったようですね。

ご参考までに。

まとめ

若干手間取りましたが、無事に Flutter SDK を更新できました。まあ、Flutter 3.7.12 (Dart 2.19.6) の時に Dart 3 の null safety への対応を一通りやっておいたため、比較的簡単だったんでしょうね。

とりあえず、これで(ほぼ)最新の環境で開発を進められます。