opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

UEFIでArchLinuxをインストールする

UEFI環境でArchLinuxをインストールする。UEFI環境はVMware Fusionの仮想環境を使う。
また、基本的なArchLinuxのインストールの流れは大体わかるということでMBR形式と大差ないものは詳しくは書かない。
そちらの方法についてはArch Wikiを参照

インストールガイド - ArchWiki

Fusion5の設定

Fusion5でUEFIを有効にするには、vmxファイルの中に

firmware = "efi" 

を追記する。
ここは以下の記事を参考にさせて頂いたので詳しくはそちらを...
http://d.hatena.ne.jp/syuu1228/20130101/1357054251

ESPについて

パーティション設定をする...が、その前にUEFIでよく使われる用語の一つ「ESP」についてメモしておく。
ESPというのはEFI System Partitionの略でUEFIベースのシステムの場合こいつを必ず(1つ)持っている。
おそらくwindows8などとデュアルブートしようと考えた場合、すでにこいつは存在しているはず。
今回はvmwareで新規に1から環境を構築するため初期では当然存在しない。
なので、このESPと呼ばれる特別なパーティションも作らないといけない。
このESPにはUEFIファームウェアから 呼び出される...いわゆるUEFI上で動くアプリケーションを保存したしりするパーティションらしい。

今回の場合このESPにはブートローダーを導入することになるが、ここでsyslinuxなどを利用するとsyslinuxは自分のインストールされているパーティション外のカーネルイメージなどを読むことができないため、必然的にESPは/bootと兼用になる。(ESP内部にカーネルイメージを保存するようにする)

パーティション設定

上でも少し書いたように、syslinuxなどをブートローダーにつかうと/bootとESPを兼用しなければならないため、今回はブートローダーとしてgrubを用いる。
もしもsyslinuxやgummiootが使いたい場合は、以下のような切り方をせず/bootとESPを兼用するようにする。

今回は次のようにパーティションを切った。
以下ではこのパーティションで切ったとして話をすすめるので、適切に自分の設定に置き換えてほしいorz

/dev/sda1 -> ESP(512MB)
/dev/sda2 -> /boot (128MB)
/dev/sda3 -> swap (適当MB)
/dev/sda4 -> /var (20GB)
/dev/sda5 -> / (70GBくらい)  

ESPの大きさはなんでも良いが、聞いた話によると512MBが推奨されるらしい。
それ以外のパーティションについては適切に大きさを決めた。
(ちなみにswapパーティションはTypeを8200に設定すると良い)

パーティションを実際に切る際にはcgdiskを使うと良い。

$ cgdisk /dev/sda

とする。
また、ESPパーティションはtypeとしてef00が設定されている必要がある。
そこで、gdiskを使って設定する(cgdiskでもおそらく設定可能)。

$ gdisk /dev/sda

としてgdiskを起動し

Command (? for help): t

のように"t"と入力してESPパーティションを指定し"ef00"とtypeを入力して決定する。
以下のようにpコマンドで確認して正しく設定できてるかチェックする。

f:id:opamp_sando:20131030231447p:plain

※上記の画面ではswap用パーティションを8200に設定し忘れている

ここまで出来たらパーティションを切る作業は完了。続いてパーティションのフォーマットをしていく。

※ 上の画像に書かれてるprotective MBRとは、MBRベースのアプリケーションがGPTにアクセスした場合、GPTを破壊してしまう場合があるため、それの防止策としてMBRに見せかけたprotective MBRが用いられる。

パーティションのフォーマット

パーティションファイルシステムは基本的に任意でいいがESPと/bootだけはある程度決まったものを使わないと色々と動かなかったりする。特にESPはFAT32かFAT16を使うようになっているので、ESPは次のように初期化する。

$ mkfs.vfat -F32 /dev/sda1

もし、これでクラスタ云々というwarningが出た場合は、次のように"-s2"や"-s1"というオプションをつけてこれが出ないようにする必要がある。
これが出るのを放置して進むとESPをUEFIが読み込めなくなる。

$ mkfs.vfat -s2 -F32 /dev/sda1

これで警告が出ずに終了できたらESPの準備は終わり。

続いて/bootだが、これはおかしな形式を使うとブートローダーが読めなくなる可能性があるので、普通に"ext4"などを使うのが良い。grubは少なくとも"ext4"にしておくと読んでくれる。

$ mkfs.ext4 /dev/sda2

という感じ。

同様に他のパーティションも適当な形式でフォーマットする。

mountする

mountは大体はMBRと同様の方法で良いのだが、ESPもマウントすることに注意する。
例えば/mnt/boot/efiなどにマウントすると良い。

今回の例では...

$ mount /dev/sda5 /mnt 
$ mkdir -p /mnt/boot/efi
$ mount /dev/sda2 /mnt/boot
$ mount /dev/sda1 /mnt/boot/efi

という感じ。
もちろん/bootとESP兼用で行う場合はその必要はない。

pacstrap ~ 基本設定まで

この後pacstrapでのインストールから、rootのパスワードやhostnameなどの設定までは大体同じなので省略するが、pacstrapは以下のように追加で"grub dosfstools efibootmgr"のパッケージをインストールするようにする。

$ pacstrap /mnt base base-devel vim grub dosfstools efibootmgr

これが完了したらgenfstabしてchroot。その後、基本的な設定を行う。

※ Macintoshにデュアルブートなどをする場合efibootmgr等のツールを利用しないほうがいいです。  
OSXにはblessというこれと同じような役割を果たすコマンドがあるのでコレを利用するのが一番安全です。 
また、以下の手順にしたがってgrub-installを実行すると内部的にefibootmgrを使うのでMacintoshへの
デュアルブートなどでこの手順の通りに作業することはあまりおすすめしません。 

ブートローダーのインストール

ブートローダーであるgrubをインストールする。
その前に以下のコマンドをコピペしてefivarfsをマウントしておく。これをしないと失敗する。

追記:最近のArchLinuxのisoでは自動化されているためこのコマンドは不必要になっている。
試しに実行してみても良いが既にマウントされている的なエラーがで返る場合はそのまま進んで良い。
$ mount -t efivarfs efivarfs /sys/firmware/efi/efivars  

grub-installする前に/boot/efiEFIディレクトリを作成しておく

$ mkdir /boot/efi/EFI

続いてgrub-installを走らせる。

$ grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub --boot-directory=/boot/efi/EFI --recheck --debug  

ここは実は"--boot-directory"を設定しない場合は/boot以下にgrubのブートファイルが入る。
これでもおそらく大丈夫だが、今回はgrubはすべてESPに含める形でインストールを行った。

gurb-installが成功したら次のコマンドを走らせる。

$ grub-mkconfig -o /boot/efi/EFI/grub/grub.cfg

普通、デフォルトでカーネルイメージを発見し起動設定をgrub.cfgに自動で書き込んでくれる。
なので、特にエラーがおこらなかった場合は手動でgrub.cfgを書き直す必要はない。

再起動

マウントしているパーティションをすべてumountして再起動する。

$ reboot  

起動できれば終わり

grubが起動しArchLinuxがブートできれば今回の作業は成功。

失敗した場合...

もしgrubすら立ち上がらない場合はgrubのインストールが失敗している可能性が高い。
その場合は、特に最後の"grub-install"あたりをよく見直すといいと思う。

grubは立ち上がるがArchLinuxがブートできない場合は、間違いなくgrub.cfgの設定に間違いがあると思うので、grub.cfgの設定を見直すといいと思う。

参考資料

最後に参考資料。 ArchWikiが大変役に立ちました。

Unified Extensible Firmware Interface - ArchWiki

GUID Partition Table - ArchWiki

GRUB - ArchWiki

Designing for 64-bit Windows (Windows Drivers)

など。
ちなみに、ArchWiki中では今回/mnt/boot/efi(/boot/efi)にマウントしたESPパーティションを、一般的に$espを使って表してるので、wikiを見て作業する際には$espは適切に置き換えてコマンドうたないとダメだよ?

最後に、何かミスがあれば遠慮なくご指摘くだされば訂正しますorz

追加メモ: 一部のwindows8のpcにデュアルブートする場合efiのbootentryにgrubを登録しても再起動したら
初期化されbootentryから自動削除されgrubが起動できないという事態が最近発生しました。
なんとなく原因はわかったのですが解決策がよくわかりません。解決できたら近いうちに記事にするかもしれません。
windows8なPCにデュアルブートなどを考えてる場合は注意してください。
というかもっとUEFIの仕組みや制御(設定)方法をちゃんと勉強しないとダメだね。
Firefox ブラウザ無料ダウンロード