りりごんのへや

ただの備忘録。Linuxだとかプログラミングだとか...?

UEFI な Gentoo をインストール

UEFIブートできるGentooのインストールは何度か試してみたが、毎回何故かEFI Shellが出てきてしまう。
今日やっと成功したので、メモがてらに書いておこう。

UEFIブートなGentooをインストールするときは、

ファイルシステムの構築

パーティション構成はこのようにした。
ディスクタイプはGPT。

/dev/sda1	/boot/efi	vfat	noauto,noatime	1 2
/dev/sda2	/		ext4	noatime		0 1
/dev/sda3	none		swap	sw		0 0

/boot/efi下にEFI起動ファイルが置かれて、/boot下にカーネルが置かれる?この辺りは私自身、知識が曖昧でよくわかってない。
パーティションファイルシステムを作成してマウント。

# mkfs.vfat -F 32 /dev/sda1
# mkfs.ext4 /dev/sda3
# mkswap /dev/sda2
# mount /dev/sda1 /mnt/gentoo
# mkdir -p /mnt/gentoo/boot/efi

stage3アーカイブを適当なサイトからダウンロードして、解凍する。
私の地域ではiij.ad.jpが速いようだ。

# cd /mnt/gentoo
# wget ftp://ftp.iij.ad.jp/pub/linux/gentoo/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20150326.tar.bz2
# tar xvjpf stage3-amd64-20150326.tar.bz2

make.confを編集して、DNS情報をコピーしておく。

# cp -L /etc/resolv.conf /mnt/gentoo/etc

chroot

ファイルシステムの構築が終わったら、chrootしてその環境に入る。
その前に、procやsysなどをマウントする。

# mount -t proc proc /mnt/gentoo/proc
# mount --rbind sys /mnt/gentoo/sys
# mount --rbind dev /mnt/gentoo/dev
# chroot /mnt/gentoo /bin/bash
# source /etc/profile

これでカーネルは違えど、新しいGentooの環境に入ることが出来た。

カーネルの設定

カーネルソースをインストールしてmenuconfig。

# emerge -av gentoo-sources
# cd /usr/src/linux
# make menuconfig

systemdも一緒に導入したいのでまとめてその辺りの設定も有効にしておく

    Gentoo Linux --->
          Support for init systems, system and service managers --->
            [*] OpenRC, runit and other script based systems and managers
            [*] systemd

    General Setup --->
      -*- Control Group support --->
            --- Control Group support
            [ ]   Example debug cgroup subsystem
            [*]   Freezer cgroup subsystem
            [*]   Device controller for cgroups
            [*]   Cpuset support
            [*]     Include legacy /proc/<pid>/cpuset file
            [*]   Simple CPU accounting cgroup subsystem
            [*]   Resource counters
            [*]     Memory Resource Controller for Control Groups
            [*]       Memory Resource Controller Swap Extension
            [*]         Memory Resource Controller Swap Extension enabled by default
            [*]       Memory Resource Controller for Kernel Memory accounting
            [ ]     HugeTLB Resource Controller for Control Groups
            [*]   Enable perf_event per-cpu per-container group (cgroup) monitoring
            [*]   Group CPU scheduler --->
            [*]   Block IO contoroller
            [ ]     Enable Block IO controller debugging
      -*- Namespaces support --->
            --- Namespaces support
            [*] UTS namespace
            [*] IPC namespace
            [*] User namepace
            [*] PID Namespaces
            -*- Network namespace

-*- Enable the block layer --->
      --- Enable the block layer
          Partition Types --->
             :
            [*]   EFI GUID partition support
 
    Processor type and features --->
      [*] EFI runtime service support
      [*]   EFI stub support
      [ ]     EFI mixed-mode support
       :
      [*] Built-in kernel command line
      (init=/usr/lib/systemd/systemd root=PARTUUID=ルートパーティションのUUID もしくは/dev/sdaX) 

    Device Drivers --->
          Generic Driver Options --->
            [*] Support for uevent helper
            ()    path to uevent helper

EFI mixed modeはCPUが64ビットに対応しているにも関わらずUEFIが32ビット専用になっているようなマシンでも、64ビット環境が利用できるようにするためのものらしい。

そして、カーネルコンパイルしてインストール…の前に
/etc/kernel/postinst.d/efi
このスクリプトを /etc/kernel/postinst.d/ に置いておけば、カーネルのmake install時に成果物をEFIブート用に適切に配置してくれるようだ。ありがたや。

GRUB2

作業も後半あとちょっと。
grubをインストールする前にmake.confに書き加えるものがある。

GRUB_PLATFORMS="efi-64"

32ビットマシンの人はefi-32だと思う。
書き加えてgrubをインストール

# emerge -av sys-boot/grub:2

GRUBの設定ファイルの書き出しとブートローダのインストール

# grub2-mkconfig -o /boot/grub/grub.cfg
# grub2-install --target="x86_64-efi" /dev/sda

実は、最初設定ファイルを書き出さなくても起動した。
もちろんルートファイルシステムが読み込めなくてカーネルパニックになった。
しかし、ルートファイルシステムを指定した設定ファイルを書き出しても結局カーネルパニックを起こしたので、今回はカーネルに直接埋め込んでいる。
修正が入ると、カーネルを再コンパイルしなければならないので結構面倒くさいがまあ仕方ない。
ここまでやれば、UEFIGentooが起動できるようになると思う。
このまま環境を整備して次はデスクトップ環境を入れてみようと思う。
systemdに関する詳しいインストール方法や、今回ちょこちょこ省いている作業は下記のサイトを参考にしてください。