32bitUEFIのウルトラノートブックにubuntuをインストール

この記事は[ニフティグループ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nifty)の15日目の記事です。
昨日は@spicy_laichiさんの[PythonでProtocolsを使って静的ダック・タイピング](https://qiita.com/spicy_laichi/items/29ef79eac29d61fcb503)でした。pythonの型安全などは保つのが難しいと感じている次第なので、こういった記事からも学べれば、と思います。

今回はウルトラノートブックにubuntuをインストールします。
単語の説明はすごくアバウト(勉強中)で間違い交じりなので、不明な単語はご自身でお調べいただければと思います。

#使うPC
今回使うPCはASUSのX205TAです。

>CPU:       Intel Atom Z3735F
>メモリ:     2GB
>ストレージ: 32GB(eMMC)

当時文系大学生で、GoogleDriveでレポートを書く持ち運び用PCを探していた私にはちょうど良い代物でした。しかし、ストレージが少なすぎてWindows10のメジャーアップデートをかけられなくなってしまい、毎回クリーンインストールをかけるのも面倒になって放置していました。
今回このPCをWindows10からLinuxマシンに変えて蘇らせ、どこにでも持ち出せる学習用PCに切り替えます。

#Live起動まで
まず[ubuntu18.04.3 LTSのISOファイル](http://releases.ubuntu.com/18.04/)を公式からダウンロードします。
インストールするためのブータブルUSBを[Rufas](https://rufus.ie/ja_JP.html)で作成し、ブータブルUSBでのLive起動を試みます。しかし、何度BIOS画面を確認してもUSBがブータブルUSBだと認識してもらえません。
検索すると、原因と解決策の先例がありました。

##32bitUEFIという特殊な環境
UEFIとは、BIOSの後継者として、64bit対応やマウスを用いたGUIなどに対応したBIOSのことです。正確にはOSとBIOSのソフトウェアインターフェースの定義なのですが、丸め込んで定義するとそうなります。

しかし、このX205TAは32bitUEFIというファームウェアで動いています。
64bitに対応しているのが基本的なUEFIの仕様なのですが、このPCに関してはそうではないようです。確かにAtomを積んでメモリ2GB、ストレージ32GBでは、64bitに対応させても無駄ではあります。ウルトラノートブックではままある仕様のようです。

しかし、私が用意したubuntu18.04.3では32bitUEFIという仕様は考慮されていません。
つまり、UEFIが要求するOSの仕様が、OSの仕様とそもそも一致していない状態でした。そのため、USBをブータブルだと認識してもらえなかったのです。

##解決策
32bitUEFI用の起動モジュールを用意します。
すでにコンパイル済みの32bitUEFI用モジュール([bootia32.efi](https://github.com/jfwells/linux-asus-t100ta/blob/master/boot/bootia32.efi))がGitHub上で公開されていました。こちらをダウンロードして、先ほど作成したUSBファイル内にある`/BOOT/EFI`にコピーします。これにより、USBがブータブルとして認識されるようになり、Live起動するようになりました。

参考サイト:https://qiita.com/rapidliner00/items/1e1868e75b2e5e5ad481
参考サイト:https://qiita.com/furipon308/items/ab89d022e35d40284682

#grubのエラーが発生
さて、Live起動してからPC本体へのインストールを試みましたが、途中でフリーズしてしまいました。
いったん電源ボタン長押しで強制終了し、インストール途中でフリーズしたubuntuを起動してみますが、ここでgrub rescueという見慣れない画面とともにエラーが出てしまいます。
`error: file '/boot/grub/i386-efi/normal.mod' not found`

###GRUBとは？
>GNU GRUB (GRand Unified Bootloader) はGNUプロジェクトにて開発されている高機能なブートローダである。([Wikipedia](https://ja.wikipedia.org/wiki/GNU_GRUB)より)

読み砕くと、BIOSが起動した後に起動し、ディスク上にインストールされたLinuxを起動させるために使われる、BIOSとOSの中継役のようなシステムです。これが丸々インストールされていないために、起動できないぞ、と怒られていました。

参考サイト: http://hibitche.hatenablog.jp/entry/2015/07/17/012051

##解決策
順序としては、最初にubuntuをインストールした際、GRUB2パッケージのインストールを行う前の部分でフリーズしてしまったことで、GRUB2のインストールが走りませんでした。
しかしカーネル等のインストールは終わっていたために、BIOSはubuntuを認識できてしまい、無理矢理ubuntuを起動しようとし、GRUB2が存在しないことでエラーが出ていた…という順序だと思われます。

そのため、もう一度ubuntuをLive起動して、クリーンインストールします。
エラーが出たということで、本来インストール後に書き換えて適用する予定だった無線LANの設定などを、Live起動の段階で先に書き換えておきます。

以下コマンドを叩き、内蔵無線LANを有効化します。細かい数値は適時タブを打つなどで置き換えてください。

```
sudo cp /sys/firmware/efi/efivars/nvram-74b00bd9-805a-4d61-b51f-43268123d113 /lib/firmware/brcm/brcmfmac43340-sdio.txt
sudo modprobe -v -r brcmfmac
sudo modprobe -v brcmfmac
```

カーネルモジュールの読み込みのconfigファイルに、以下のように設定を加えます。

```/etc/modprobe.d/blacklist.conf

blacklist btsdio
```


GRUBの設定ファイル"/etc/default/grub"を編集して, GRUB_CMDLINE_LINUXの定義を以下のように設定します。

```

GRUB_CMDLINE_LINUX="intel_idle.max_cstate=1"
```

この状態でクリーンインストールすると、無事終了。再起動も無事実行できました。
USBの物理的な部分の調子が良くなかったのも原因の一つだったので、この書き換えが本当にうまくいった要因かは分かりませんが、参考になりましたら幸いです。

参考サイト:http://whoraibo.hatenablog.com/entry/2018/09/02/130215

#おわりに
起動したubuntuを触っていますが、なお重いです。より軽量なパッケージをインストールし直したいところです。
ただこういったチャレンジをすることで、OSやUEFI、カーネルまわりの知識を少しですが学ぶことが出来たので、当初の学習という目的は少しは達成できたのではないかと思います。やはり手を動かさなければ学ぶことが出来ないことがあると改めて感じました。
先輩からは「GentooLinuxインストールバトルやってみれば？」と言われていましたが、ubuntuすら素直に入らないPCだし、スペックが低すぎてコンパイルにどれだけ時間がかかるのか……ということで見送りました。もう少し学習してからバトルしたいと思います。

ありがとうございました。