Nintendo SwitchでUbuntuとAndroidをデュアルブートする

Nintendoが発売しているNvidia Tegra搭載のタブレットPC「NintendoSwitch」にUbuntuとAndroidをインストールして動かします。

# Nintendo Switchとは
- 花札やトランプ、百人一首などでおなじみの任天堂が発売しているタブレットPC。~~ゲーム機ではない。~~
- CPU/GPUに[謎のAI半導体メーカー](https://business.nikkei.com/atcl/report/17/ai/051700001/)Nvidia製のTegra X1を搭載。
    - 要するにArm+CUDAが動く、**Jetson Nanoと同じチップ**。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/e20d00f4-2d14-5783-b01a-2ea135703762.png" width=50%>

- RAMは3.4GiB、ストレージは(基本的に)microSDを使う。


# 前提
- 本記事はUbuntuに触れたことのある人を前提にします。未経験者はAndroidだけ使えればいいでしょうし。
- この方法はNintendo公式のものではないです。未対策機なら壊れることはよっぽど無いだろうけどあくまで**自己責任**で。


# 必要なもの

- Nintendo Switch本体 (**未対策機**)
    - 対策機かどうかは自分で調べて
    - 自分はアキバのWorldMobileで買った

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/d66ea45c-99a9-9d0f-fb85-c72b572822ac.png" width=50%>

- microSD
    - 2つOS入れるなら128GBはあったほうがいい。どうせみんなAndroidゲームに容量使うし。
- RCMジグ
    - Joy-conの特定のピンをショートさせる器具、治具。
- Windows PC
    - Payload送信に使う
    - Macでもできるらしいけど未検証
- PC→USB-Cの通信ケーブル

#### 必要ないもの
- Joy-Con
    - Nintendo Switchを普通に起動するとセットアップにJoy-Conの接続を求められるけど、電源ボタン12秒長押しで強制終了できる。

# ①準備
- PCでmicroSDを、**FAT32で**初期化する。たぶんOS標準ではできないのでIO-DATAの[ハードディスクフォーマッタ](https://www.iodata.jp/support/qanda/answer/s16470.htm)などを利用。

ｰ PCに[TegraRCM](https://github.com/eliboa/TegraRcmGUI/releases/tag/2.6)をインストール

# ②RCMモードでhekate起動
- [hekate_ctcaer](https://github.com/CTCaer/hekate/releases)のZIPを落とし、bootloader/とbinをSD直下に入れる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/3e4a7079-329c-6d37-b8cb-fce77cab9876.png" width=50%>
- Switchの右Joy-Conスロットにジグをセットし、音量+を押しながら電源ボタンを押して起動。
    - この時点では画面は真っ黒。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/2b83ec41-b6bc-6b38-8654-5d597a0d2b16.png" width=50%>

- SwitchとPCをUSBで繋いで、TegraRCMを起動。
    - 必要に応じてドライバーを入れる
    - ダウンロードしたhekateのbinファイルを開いて、Inject payloadを実行


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/86087fad-7345-8f27-18a7-791a0e46eaed.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/e20d00f4-2d14-5783-b01a-2ea135703762.png" width=50%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/0ced14fe-2135-c8bd-3940-6b0c7ea7b92f.png" width=50%>


    
    
# ③SDカードにパーテーションを設定
- hekate内のToolsからPartition SD Cardを開く
- スライダーで適当にLinuxとAndroidに容量を割り振る
    - このとき、FAT32の領域を十分に残す(16GBぐらいあったほうがいい)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/a007696d-b1ca-499e-53fe-7204246092cb.png" width=50%>


# ④Android10のインストール

### 注意
**先にAndroidを入れたほうがいい。** Ubuntuを入れたあとでAndroidを入れようとしたら、後述のteamwinのメニューにUbuntu環境をパーティションごと飛ばされたので。

- Partition ManagerのSD UMSを起動する
    - [Switchroot](https://download.switchroot.org/android-10/)から `icosa-tablet-YYYYMMDD-rel.zip` を落として解凍しSDに入れる　
    **解凍は1回だけ**
    - おなじく`extras/alarm-disable.zip` `extras/joycon-xbox.zip`をダウンロードしSDに入れる
        - スリープ中にAndroidのアラームが作動するとバグるらしく、それを妨害するためのツール
        - Joy-ConがAndroidで使えるようになるらしい(未検証)
    - [opengapps](https://opengapps.org/)からARM64、10.0、PICOを選んでダウンロードしSDに入れる
        - このOSイメージにはGooglePlayが入っていないので。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/13b68028-3838-6578-fa62-a94b441f66a4.png" width=50%>


安全な取り外し→USBを抜く
    - 下のボタンから`Flash Android`を実行
- teamwinのメニューが出てくる
    - installを選択し、`../external-sd/linege-hogehoge.zip`を選択してインストール。
    - 戻って、`alarm-disable` `joycon-xbox` `open-gapps-hogehoge`をそれぞれイントール
    - 再起動
- hekateのhomeから`More Configs`を選択してAndroidを起動
    - いつも通りのセットアップを済ませる
- 注意; 初期値で**音量がMAX**なので気をつけて
- 注意; 5GHzのWi-Fiは不安定かもしれない
    
参考までにデレステを動かしてみたら[こんな感じ](https://twitter.com/H_KzSFC/status/1366807100362432513)
(お願いシンデレラ 5人 3Dリッチ MV)

# ⑤Ubuntuをインストール



- Partition ManagerのSD UMSを起動する
    - [Switchroot](https://download.switchroot.org/ubuntu/)から `switchroot-ubuntu-VERSION-YYYY-MM-DD.7z` を落として解凍
    - `bootloader/` `switchroot/`をSDのFAT32領域の直下に入れる
    - ②の`hekate_ctcaer_VERSION_Nyx_VERSION/bootloader/`で`bootloader/`を上書きする
    - 安全な取り外し→USBを抜く
    - `Flash Linux`を実行
- hekateのhomeから`More Configs`を選択してUbuntuを起動
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/5263be06-b489-577b-7f34-cb53382d1195.png" width=50%>
- 個人的に推奨; 初期設定ではUnityのデスクトップが起動するので、ログイン画面の歯車⚙アイコンからUbuntuを選んで起動する
    - いつも通りのセットアップを済ませる
    - aptが死んでいるので修正する
    
```
sudo sed -E -i 's/turul.canonical/ports.ubuntu/g' /etc/apt/sources.list
```

- 個人的に推奨; jetson-fan-ctlのインストール
    - これはなに？→Jetson用のファンコンソフト。デフォでファンコントロールされてはいるけど強すぎる気がしたので。
    - [Git](https://github.com/Pyrestone/jetson-fan-ctl)を見ながらpip3でインストール
    
    ```
    sudo apt update
    sudo apt install python3-dev python3-pip python-dev python-pip git -y
    git clone https://github.com/Pyrestone/jetson-fan-ctl
    cd jetson-fan-ctl
    sudo ./install.sh

    ```
    - よしなにconfig.jsonを書き換える
    - ※自分の環境では動いてますが公式にサポートはされてなさそう
- 注意; 初期値で画面の明るさがMAXなので気をつけて

## 追記
SwitchrootのAPTリポジトリ追加したほうが良さそう
https://newrepo.switchroot.org/


# デュアルブート確認

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/417ccd66-b12a-1c59-4ef7-79257d6929c6.png" width=50%>

- hekateのhomeから`More Configs`を選択したところでAndroidとUbuntuが並んでて両方起動できたらOK





## 参考
https://mitanyan98.hatenablog.com/entry/2020/12/22/071447

https://mitanyan98.hatenablog.com/entry/2021/01/12/004536#%E5%BF%85%E8%A6%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB

https://yyoossk.blogspot.com/2019/04/ubuntu.html

https://smartasw.com/archives/nintendo-switch%E3%81%A7%E3%80%8Candroid-8-1%E3%80%8D%EF%BC%88lineage-os%EF%BC%89%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E3%81%AE%E6%89%8B%E9%A0%86.html