Macだけで、macOS(内蔵SSD)とWindows(外付けSSD)のデュアルブートを構築する

# おことわり
この記事は、書きかけで、未検証の部分もあります。
未来の自分向けに限定共有にしていたのですが、一時、極一部で需要があったようなので(ホント?)全体への公開に切り替えます。

# 課題
- PCのない環境で、macOS Catalina/Big Sur(内蔵SSD)とWindows 10(USB接続の外付けSSD)のデュアルブートを実現したい。

# 警告
- この記事で紹介する内容は、あなたのハードウェアやソフトウェアを損なう可能性があります。筆者は何らの責任も負えないので、ご自身の判断でご利用ください。
- Windowsを使う作業の際は、Type C (thunderbolt)ポート接続のディスプレイは取り外して、HDMIポート接続のディスプレイだけにしてください。Type Cポート接続のディスプレイがあると、何も映らなくなって詰む可能性があります。
    - macOSでの作業では問題ないのですが、Windowsと行き来していると忘れがちなので、最初から最後まで外しておくことをお勧めします。
    - HDMIに接続できるモニタがないときはTVに繋ぎましょう。
    - なお、BootCampアシスタントを使用したWindowsの導入でも問題は生じません。

# 使用環境
- [Apple Mac mini 2018 Core i7 RAM16GB SSD512GB](https://support.apple.com/kb/SP782?viewlocale=ja_JP&locale=ja_JP)
- USB 3.1 GEN2 - SATA IIIブリッジ(VL716)・ケース、Type A ケーブル、SATA SSD 512GB
    - 今時NVMEじゃなくてSATAなのは、別のPCから流用したためです。
- USB 4/3.2/3.1/3.0 / Thunderbolt 4/3 - Nvme M.2 ケース Type C ケーブル、PCIe Gen 3.0 ×4 NVMe M.2 (2280) SSD 1TB
- Windows 10 ライセンス ～ パッケージ版 (USBメモリー同梱)、またはダウンロード版

# 手法
- [手法A](#手法A)
    - BootCampアシスタントが構成するWindowsインストーラを改造します。
    - 別途、USBメモリー(または光学ディスクメディア)が必要です。
- [手法B](#手法B)
    - 独自にWindowsインストーラを構成します。
    - こちらの方が容易かもしれません。
- 共通点
    - SSDのパーティショニングやフォーマッティングは自前で行う必要があります。

# 手法A
- 「[Mac mini(2018)でWindows 10を外付けSSD(Thunderbolt 3)にインストール](https://ana.coppo.la/20190210-macmini-2018-windows10-on-tb3ssd/)」を参考にさせていただきました。
    - どうもありがとうございました。
    - 参考記事との主な相違点は、Windows PCが不要(Mac環境のみで実現する)ことくらいです。

## 作業手順
### BootCampアシスタントで内蔵ディスクにWindowsを導入する
- macOSでブラウザを開きます。
    - [Windows 10 のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10)ページへアクセスし、ISOファイルをダウンロードします。
        - "Win10_1909_Japanese_x64.iso"を得られたものと想定します。
        - なお、Windowsからアクセスするとツールのダウンロードになります。
- macOSでBootCampアシスタントを起動します。
    - 内蔵SSDにWindowsをインストールします。
        - デフォルトで提示される最小限のボリュームサイズで大丈夫です。
        - この環境を使って、外部起動用SSDをセットアップします。

### BootCampの構成したインストール環境を取得する
- BootCampでインストールした内蔵SSDのWindowsを起動します。
- USB Type AポートにSSDを接続します。Thunderbolt (Type C)ポートではダメです。
    -  ⇒ `<SSD disk>`
- 「ディスクの管理 (ハードディスク パーティションの作成とフォーマット)」を開きます。
    - 内蔵ドライブの`OSXRESERVED`というラベルの付いたボリュームにドライブ文字を割り当てます。
    - ディスクの管理を閉じてください。
- マウントされた`OSXRESERVED`のディスクから、以下のファイルとフォルダーを、Windows起動ディスク(C:)の何処か(例えばデスクトップ)へコピーします。フォルダー構造を保つように留意してください。
    - 対象のファイルとフォルダー
        - `\sources\boot.wim` (ファイルひとつ)
        - `\$WinPEDriver$` (フォルダーまるごと)
        - `\BootCamp` (フォルダーまるごと)
    - これらの格納されたフォルダを`<OSXR copy>`とします。
- `<OSXR copy>`に、空のフォルダー`boot_setup`を作ります。

### イメージファイルをマウントする
- 管理者権限のあるコマンドプロンプト(またはパワーシェル)で作業します。
    - `dism /mount-wim /wimfile:<OSXR copy>\boot.wim /index:2 /mountdir:<OSXR copy>\boot_setup`
    - コンソールはまだ使うので、閉じずに残します。

### 構成ファイルを編集する
- `<OSXR copy>\boot_setup\AutoUnattend.xml`を、何処かにコピーして、コピーしたファイルの方を編集します。
    - 面倒なことになるので、`<OSXR copy>\boot_setup\`内部を直接編集しないでください。
- 以下の部分を取り除いて保存し編集を終えます。

```XML:AutoUnattend.xml&nbsp;からの除去部分
            <ImageInstall>
              <OSImage>
                  <InstallToAvailablePartition>true</InstallToAvailablePartition>
              </OSImage>
            </ImageInstall>
            <DiskConfiguration>
              <WillShowUI>Never</WillShowUI>
            </DiskConfiguration>
```

- 編集を終えて閉じたファイルを、`<OSXR copy>\boot_setup\`へ戻して上書きします。

### イメージをコミットしてアンマウントする。
- 再びコンソールで作業します。
    - `dism /unmount-wim /mountdir:<OSXR copy>\boot_setup /commit`
- コンソールはまた後で使います。
- `<OSXR copy>\boot_setup`フォルダーを削除してください。

### インストールメディアを作成する
- Windowsから[Windows 10 のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10)ページへアクセスし、「ツールを今すぐダウンロード」します。
    - "MediaCreationTool1909.exe"を得たものと想定します。
- USBメモリーをセットし、ツールを実行し、インストールメディアを作成します。
    - USBメモリーの既存の内容は全て失われますので注意してください。

### インストールメディアを改造する
- `<OSXR copy>`フォルダーの内容を、その構造のままUSBメモリーへ上書きコピーします。

### SSDの初期化と構成
- 再び管理者コンソールで作業します。
    - 初期化
        - ディスクユーティリティを起動します。
            - `diskpart`
        - ディスクを一覧し、外付けSSDの番号を特定します。
            - `list disk`
        - ターゲットのディスクを定めます。
            - `select disk <SSD disk number>`
        - 全部消します。いきなり消えます。怖い。間違って内蔵SSDを消したら洒落になりません。
            - `clean`
    - 構成
        - GPTディスクにします。
            - `convert gpt`
        - ブート用のEFIシステムパーティションを作ります。
            - `create partition efi size=300`
        - パーティションをFAT32で初期化します。
            - `format fs=fat32 quick label="EFI"`
        - OS用のパーティションを作ります。残りの容量が全て割り当てられます。
            - `create partition primary`
        - パーティションをNTFSで初期化します。
            - `format fs=ntfs quick label="Windows HD"`
        - ユーティリティを終わります。
            - `exit`
- 以上で、コンソールの作業は終了です。

### Windowsのセットアップ
- 電源を落としたMacに、USBメモリーとSSDを取り付けます。
    - 念のため、Type C (thunderbolt)ポート接続のディスプレイは取り外して、HDMIポート接続のディスプレイだけにします。
    - 万が一のために、USB接続のキーボードを用意しておくと安心です。
- 電源投入時にAlt(Option)キーを押し続けてStartup Managerを起動します。
    - macOSが起動してしまう場合は、いったんシャットダウンして電源投入から再試行しましょう。
    - USBメモリーの"EFI Boot"を選択します。
- Windowsインストーラーが起動したら、通常の新規PCと同じようにセットアップします。
    - インストール先SSDの接続がUSBですと、インストーラに跳ねられる可能性があります。
        - ThunderboltならOKっぽいです。
    - インストール先パーティションを指定した際に、「新しいパーティションを作成できなかったか、既にあるパーティションが見つかりませんでした」と受け付けてくれない場合があります。
            - その場合、あらかじめパーティションを構成せずに初期化だけ行い、未使用のパーティションを指定して「次へ」を選ぶと、勝手にパーティショニングされました。ただし、EFIシステムパーティションは作られませんでした。
- BootCampのインストールまで終わって再起動が済んだら、Apple Software Updateを実行します。
- デバイスマネージャーを見ると、大容量記憶域コントローラーにエラーマークがあります。
    - ドライバーの更新で、Windowsサポートソフトウェア内の`WindowsSupport\$WinPEDriver$\AppleSSD64`を選択するとエラーが解消されます。
    - Windows側のBootCampを使う際に、「起動ディスク」で内蔵SSDが選択可能になり、「Macで再起動」が機能するようになります。
- スリープ関係の設定をします。
    - コントロールパネル>電源オプション>
        - プラン設定の編集>詳細な電源設定の変更>スリープ
            - ハイブリッドスリープの許可」を「オフ」にします。
        - 電源ボタンの動作を選択する
            - 休止状態を使えなくします。
            - 高速スタートアップは使わない方が安全です。
- ディスプレイドライバを[アップデート](https://downloadcenter.intel.com/ja/product/126790)します。
- 適当なメディアをUSB接続して、回復ドライブを作っておきましょう。
    - [回復メディア作成ツール](https://support.microsoft.com/ja-jp/help/4026852/windows-create-a-recovery-drive)を使用します。
    - 作ったメディアを使用する際には、Thunderbolt接続のディスプレイを取り外すことを忘れないでください。

### 作業環境の後始末
- 内蔵SSDのWindows環境を抹消するときは、macOSでBootCampアシスタントを使います。


# 手法B
- 「[MacBook Proで外付けSSDからWindows 10を起動する](https://blue1st.hateblo.jp/entry/2018/02/18/061620)」を参考にさせていただきました。
    - どうもありがとうございました。
    - 参考記事との主な相違点は、Windows PCが不要(Mac環境のみで実現する)ことくらいです。

## 作業手順
### BootCampサポートソフトの取得と作業環境の用意
- macOSでブラウザを開きます。
    - [Windows 10 のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10)ページへアクセスし、ISOファイルをダウンロードします。
        - "Win10_1909_Japanese_x64.iso"を得たものと想定します。
        - なお、Windowsからアクセスするとツールのダウンロードになります。
    - Windows 10 パッケージ版USBメモリーがない場合は、このISOファイルをWindowsでも使用するので、WindowsからアクセスできるネットワークドライブやMac/Win双方で読み書き可能なメディアに複製しておきます。
- macOSでBootCampアシスタントを起動します。
    - アクションメニューからサポートソフトをダウンロードして、WindowsからアクセスできるネットワークドライブやMac/Win双方で読み書き可能なメディアに移動しておきます。
        - Macハードウェアを使うためのドライバ群が含まれています。
    - 続けて、内蔵SSDにWindowsをインストールします。
        - デフォルトで提示される最小限のボリュームサイズで大丈夫です。
        - この環境を使って、外部起動用SSDをセットアップします。

### 作業コンソールを開く
- BootCampでインストールした内蔵SSDのWindowsを起動します。
- 退避しておいたBootCampのWindowsSupportを回収します。
- USB Type AポートにSSDを接続します。Thunderbolt (Type C)ポートではダメです。
    -  ⇒ `<SSD disk>`
- Windows 10パッケージ同梱のUSBメモリーを接続します。 ⇒ `<USB memory drive letter>:`
    - USBメモリーがない場合は、コピーしておいたインストールメディアのISOイメージファイルをマウントします。 ⇒ `<ISO mounted drive letter>:`
- 管理者権限のあるコマンドプロンプト(またはパワーシェル)を出します。

### SSDの初期化と構成
- 管理権限のあるコンソールで作業します。
    - ディスクユーティリティを起動します。
        - `diskpart`
    - ディスクを一覧し、外付けSSDの番号を特定します。
        - `list disk`
    - ターゲットのディスクを定めます。
        - `select disk <SSD disk number>`
    - 全部消します。いきなり消えます。怖い。間違って内蔵SSDを消したら洒落になりません。
        - `clean`
    - GPTディスクにします。
        - `convert gpt`
    - ブート用のEFIシステムパーティションを作ります。
        - `create partition efi size=200`
    - パーティションをFAT32で初期化します。
        - `format fs=fat32 quick label="EFI"`
    - パーティションにドライブ文字を割り当てます。
        - `assign letter=<EFI drive letter>`
    - OS用のパーティションを作ります。残りの容量が全て割り当てられます。
        - `create partition primary`
    - パーティションをNTFSで初期化します。
        - `format fs=ntfs quick label="Windows HD"`
    - パーティションにドライブ文字を割り当てます。
        - `assign letter=<OS drive letter>`
    - ユーティリティを終わります。
        - `exit`

### OSイメージの適用
- 引き続きコンソールで作業します。
    - Windows 10パッケージに入っていたUSBメモリー、または、マウントしたISOイメージ`<mounted drive letter>`を使用します。
    - インストールしたいWindowsのグレードに対応する「インデックス」を得ます。
        - `.wim`使用時 ('install.wim'がある場合)
            - `dism /get-wiminfo /wimfile:<mounted drive letter>:\x64\sources\install.wim`
        - `.swm`使用時 ('install.swm'、'install2.swm'がある場合)
            - `dism /get-wiminfo /wimfile:<mounted drive letter>:\x64\sources\install.swm`
        - `.esd`使用時 ('install.esd'がある場合)
            - `dism /get-imageinfo /imagefile:<mounted drive letter>:\sources\install.esd`
    - SSDのOS用パーティションに対象のWindowsイメージを導入します。
        - `.wim`使用時
            - `dism /apply-image /imagefile:<mounted drive letter>:\x64\sources\install.wim /index:<grade index> /applydir:<OS drive letter>:\`
        - `.swm`使用時
            - `dism /apply-image /imagefile:<mounted drive letter>:\x64\sources\install.wim /index:<grade index> /applydir:<OS drive letter>:\`
            - 拡張子に`．ｗｉｍ`を指定します。
            - 「エラー: 3 指定されたパスが見つかりません。」と出る場合は…
                - いったん、swmからwimを取り出します。
                    - `dism /export-image /sourceimagefile:<mounted drive letter>:\x64\sources\install.wim /sourceindex:<grade index> /destinationimagefile:<temporary folder path>\install.wim /compress:max /checkintegrity`
                - 取り出したwimからssdへ適用します。
                    - `dism /apply-image /imagefile:<temporary folder path>\install.wim /index:1 /applydir:<OS drive letter>:\`
        - `.esd`使用時
            - `dism /apply-image /imagefile:<mounted drive letter>:\sources\install.esd /index:<grade index> /applydir:<OS drive letter>:\`
            - 「エラー: 3 指定されたパスが見つかりません。」と出る場合は…
                - いったん、esdからwimを取り出します。
                    - `dism /export-image /sourceimagefile:<mounted drive letter>:\sources\install.esd /sourceindex:<grade index> /destinationimagefile:<temporary folder path>\install.wim /compress:max /checkintegrity`
                - 取り出したwimからssdへ適用します。
                    - `dism /apply-image /imagefile:<temporary folder path>\install.wim /index:1 /applydir:<OS drive letter>:\`
        - 進行度が表示されるまで少し時間がかかります。アクセスランプがないと、落ちていないか心配になりますが、気長に待ちましょう。

https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/dism-image-management-command-line-options-s14?view=windows-10

### ブートローダーの導入
- 引き続きコンソールで作業します。
    - EFIパーティションにブートローダーを導入します。
        - `bcdboot <OS drive letter>\Windows /l ja-jp /s <EFI drive letter>: /f UEFI /v`
        - EFIパーティションに既に何か入っていると、エラーする場合があります。
            - EFIパーティションにドライブ文字を割り当てて内容を確認し、重複するようなら削除してみてください。
        - ファイルが見つからないと言ってエラーする場合があります。
            - `<OS drive letter>:\Windows\Boot`と`<OS drive letter>\Windows\System32`を別のドライブに用意した`<temporary folder path>`にコピーして、`Boot`を`boot`に変えるなど、見つからないといっているファイル名に合わせることで成功する可能性があります。
            - `bcdboot <temporary folder path> /l ja-jp /s <EFI drive letter>: /f UEFI /v`

### BootCampドライバーのコピー
- 用意しておいたBootCampドライバー("WindowsSupport")を、`<OS drive letter>:\Apple\`辺りへコピーします。

以上で、SSD構築作業は終了です。

### Windowsのセットアップ
- 電源を落としたMacに、SSDとUSB接続のマウス・キーボードを取り付けます。
    - セットアップ中はドライバーがないのでBluetooth接続の機器は使えません。
    - WindowsパッケージのUSBメモリーは用済みなので外しておきます。
    - Type C (thunderbolt)ポート接続のディスプレイは取り外して、HDMIポート接続のディスプレイだけにします。
- 電源投入時にAlt(Option)キーを押し続けてStartup Managerを起動します。
    - macOSが起動してしまう場合は、いったんシャットダウンして電源投入から再試行しましょう。
- 外付けSSDの"EFI Boot"をコントロールキーを押しながら選択します。
    - macOSの「起動ディスク」ではこのSSDが選べないのですが、Startup ManagerでCtrlキーを押しながら選択すれば、デフォルトの起動ディスクに設定できます。
- SSDが起動したらWindowsをセットアップします。通常の新規PCのセットアップと同じです。
- セットアップが完了したら、用意しておいたBootCampのWindowsサポートソフトウェアを導入します。
    - 一度にインストールできない可能性がありますが、再起動を挟んで何度かに分けてインストールを繰り返すと、上手くいきました。
    - デバイスマネージャーを見ると、エラーマークがあるかもしれません。
        - 大容量記憶域コントローラーは、ドライバーの更新で、Windowsサポートソフトウェア内の`WindowsSupport\$WinPEDriver$\AppleSSD64`を選択するとエラーが解消されます。
            - Windows側のBootCampを使う際に、「起動ディスク」で内蔵SSDが選択可能になり、「Macで再起動」が機能するようになります。
        - デバイスをいったんアンインストールして、その状態で、再度`Setup.exe`を実行するとうまくいく可能性があります。
        - 接続別で「PCI Express ルート コンプレックス」下のデバイスでエラーが生じている場合は、「[チップセット INF ユーティリティー](https://www.intel.co.jp/content/www/jp/ja/download/19347/chipset-inf-utility.html)」を導入することで解消する可能性があります。
- さらに、Apple Software Updateを実行します。
- スリープ関係の設定をします。
    - コントロールパネル>電源オプション>
        - プラン設定の編集>詳細な電源設定の変更>スリープ
            - 「ハイブリッドスリープの許可」を「オフ」にします。
        - 電源ボタンの動作を選択する
            - 休止状態を使えなくします。
            - 高速スタートアップは使わない方が安全です。
- ディスプレイドライバを[アップデート](https://downloadcenter.intel.com/ja/product/126790)します。
- 適当なメディアをUSB接続して、回復ドライブを作っておきましょう。
    - [回復メディア作成ツール](https://support.microsoft.com/ja-jp/help/4026852/windows-create-a-recovery-drive)を使用します。
    - 作ったメディアを使用する際には、Thunderbolt接続のディスプレイを取り外すことを忘れないでください。

### 作業環境の後始末
- 内蔵SSDのWindows環境を抹消するときは、macOSでBootCampアシスタントを使います。

# 付記
- 今回、Windowsを導入したディスクは、元々PCで使用していたSATA接続のドライブを流用しました。SSDを入れたUSB-SATAブリッジ・ケースに付属のA2CケーブルでUSBポートに繋ぐと起動するのですが、C2Cケーブルでthunderboltポートに繋ぐと起動しません。(謎)
    - macOSからだと、USBでもthunderboltでも正常にアクセスできます。
    - Type C接続のディスクとType A接続のディスクの起動中の挙動には次のような違いがあります。
        - OSXを起動する際は特に違いがありません。
        - Windowsを起動する際には、起動中にType C接続だけ電源が一度落ちます。
    - 追記 2021/09/08
        - いくつかのドライバが不足していました。
        - Windows上でのやり方が解らなかったので、macOS用のBoot Campパーティションのバックアップツール「[Winclone 9 Standard](https://twocanoes.com/products/mac/winclone/)」で、`Driver Injection`機能を使ってドライバを導入しました。
        - 無事にUSB4接続で起動できました。敗北感…
- 「マウスが引っかかる、これがSSDのプチフリか?」ということがあったのですが、NVRAMをクリアしたら解決しました。
    - たとえWindowsを使っている場合でも、Macで調子が悪いときは、完全(Shift+)シャットダウンからの再起動の次くらいに、[NVRAMのクリア](https://support.apple.com/ja-jp/HT204063)と[SMCのリセット](https://support.apple.com/ja-jp/HT201295)試してみるのが良さそうです。
- ディスプレイをThunderbolt-Displayport接続にしたら妙なトラブルがありました。
    - スリープから復旧させようとすると、ディスプレイが落ちていて、電源ボタンすら反応しなくなっていました。
        - EIZO EV2736Wです。古いせいでしょうか?
            - メーカーに確認したところ、「DP HotPlug」を設定することで解消されました。
            - 「前面ボタンで電源を切った状態で、▲ボタンを押しながら電源ボタンを押して電源を入れる」ことで有効/無効が切り替わります。
            - 有効だと、画面右上に表示される入力ポート名称の背景部がグレイに変わります。
    - ドライバは最新にしておきましょう。⇒ [インテル® UHD グラフィックス 630 用のダウンロード](https://downloadcenter.intel.com/ja/product/126790)
- Windowsの高速スタートアップ(電源オプション>電源ボタンの動作)を使用していて、周辺機器をつなぎ替えたりすると、挙動がおかしくなることがあります。
    - Shiftキーを押しながらシャットダウン操作を行って完全にシャットダウンするか、一旦高速スタートアップを解除してキャッシュを消すと回復する可能性があります。
- パッケージ付属のUSBメモリーから起動する方法でもWindowsをインストールできます。
    - ただし、WindowsインストーラーはUSB接続のディスクの構成を管理できず、macOSでもNTFSのパーティションは作れないので、結局、いったん内蔵SSDへWindowsを導入する必要があります。
    - 内蔵SSDから起動したWindowsで[SSDの初期化と構成](#SSDの初期化と構成)までを実施し、USBメモリーから起動し直せばよいでしょう。
- これからMacを選ぶ方は、内蔵SSDの容量を想定の2倍にすることをご検討ください。BootCampアシスタントを使えばWindowsの導入は極めて簡単になりますが、内蔵ディスクしかサポートされません。
- 回復ドライブの代わりに回復パーティションを作ることもできます。
    - 参考 「[Windows 10の回復パーティションを新しく作る](https://decomo.info/wiki/pc/windows_create_recovery_partition)」

### Tipsまとめ
- HDMIポートが装備されたMac miniのThunderbold-Displayport接続は信用できません。画面が表示されないときは接続を解除して、HDMIポート出力だけにしてみましょう。
- USB周辺機器での不具合は、Type C(3.1 Gen 2)接続を疑って、Type A(3.0)接続に変えて見ましょう。
- スリープはS3を使います。S4(ハイブリッド、休止状態)は使えません。
- 高速スタートアップは、構成が変化した場合に不具合を生じます。使わないようにするか、完全シャットダウン(Shiftキーを押しながら)してキャッシュをクリアしましょう。
- ドライバは最新にしておきましょう。Windows Update、Apple Software Updateとは別に、Intelのアップデートを使いましょう。
- BootCampアシスタントは、内蔵ディスクしかサポートしません。また、macOSはNTFSを読むことしかできず、書き込みやフォーマットはできません。
- Windowsインストーラーは、USBディスクの管理(パーティショニングやフォーマット)を行えません。
- デバイスマネージャで「ドライバがない」と表示されるデバイスを、ドライバがないのだから使われていないのだろうなどと考えて無効にすると起動しなくなります。
- 接続されているディスクは、些細なミスで破壊的な操作が行われる可能性があります。その点、接続されていなければ安全です。