M1 MacでUTMにGentooをインストールする

先日、10年ほど使っていたMacbook Airのバッテリが膨張してきたのでM1 Macに買い替えた。
dotfile整備したりdockerなどインストールして、さて次はVirtualBoxを...というところで、VirtualBoxがM1 Macには対応していないことを知った。

代わりの選択肢はいくつかあるが、その一つにUTMという仮想マシン作成ソフトがある。
今回はこのUTMを使ってGentoo Linuxをインストールしてみる。

環境はこちら

~ $ system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro17,1
      Chip: Apple M1
      Total Number of Cores: 8 (4 performance and 4 efficiency)
      Memory: 16 GB
      System Firmware Version: 6723.140.2
      OS Loader Version: 6723.140.2

目次

UTMとは

UTMは、QEMU(オープンソースのCPUエミュレータ)のラッパー。
VirtualBoxとの違いを以下に簡単にまとめた。

UTM VirtualBox
ホストOS macOS(Intel, Apple M1) macOS(Intel), Windows, Linux(x86/64)
ゲストOS Windows, Linux(x86/x64, ARM64) macOS(Intel), Windows, Linux(x86/64)
方法 エミュレーション 仮想化

ポイントとして、UTMではホストとゲストのCPUアーキテクチャが異なっていても動かすことができる(パフォーマンスは落ちるが)。例えば従来のIntel Mac(x64)上でARMアーキテクチャLinuxを動かしたり、Apple M1(ARM64)上でx64アーキテクチャLinuxを動かすことができる。

MacbookIntelチップ搭載モデルは今後生産中止されていくと予想されるので、M1 Macに買い替えた人がUTMを使い始めるケースが増えていくのではないかと思う。

Gentooのインストール

M1 MacARMアーキテクチャのCPUなので、GentooもARM64をインストールしようと考えていた。
が、残念ながらARM64のハンドブックは現在利用できないので、AMD64をインストールすることにした。*1
wiki.gentoo.org

1. 仮想マシン作成

utmをインストール

brew install --cask utm

以下のハードウェア要件を満たすように仮想マシンを作成する

f:id:y_nishizawa:20211220101129p:plain
仮想マシンスペック
Gentooをインストールするディスク(NVMEで30GB)と、isoをマウントするディスク(IDE)を作成した

2. インストールメディアの選択

Downloads – Gentoo Linux
上記からamd64のisoイメージをダウンロードし、仮想マシンのCD/DVDにマウントして起動

3. ネットワーク設定

DHCPが動いていない環境だとネットワーク設定手順が必要
今回はDHCP機能付きルータを使っていてすでにpingが通るので何もする必要がない

livecd ~ $ ping -c 3 www.gentoo.org

4. ディスクの準備

まず自分の環境がBIOS起動かUEFI起動かを確認する

livecd ~ $ ls /sys/firmware
acpi dmi efi memmap

efiディレクトリがあるのでUEFIで起動していることが分かる
UEFI起動の場合はGPTでパーティションを作成する*2

4.1 GPT でディスクをパーティショニングする

GPTでEFIシステム、swap、ルートパーティションを作成する

livecd ~ $ fdisk /dev/nvme0n1
# パーティションを作成する(コマンドは省略)
4.2 ファイルシステムを作成する
livecd ~ $ mkfs.vfat -F 32 /dev/nvme0n1p1
livecd ~ $ mkfs.ext4 /dev/nvme0n1p3
livecd ~ $ mkswap /dev/nvme0n1p2
livecd ~ $ swapon /dev/nvme0n1p2

Tips: parted -l コマンドでmountされていないファイルシステムが正しく作成されていることを確認できる

4.3 ルートパーティションのマウント
livecd ~ $ mount /dev/nvme0n1p3 /mnt/gentoo
livecd ~ $ cd /mnt/gentoo

5. Gentooインストールファイルをインストール

5.1 stage tarballをインストールする

日時を設定する

livecd /mnt/gentoo $ ntpd -q -g

amd64 stage openRCをダウンロードする

livecd /mnt/gentoo $ links https://www.gentoo.org/downloads/mirrors/

展開

livecd /mnt/gentoo $ tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner

6. Gentooベースシステムのインストール

6.1 chrootする

DNS情報をコピーする

livecd ~ $ cp --dereference /etc/resolv.conf /mnt/gentoo/etc/

必要なファイルシステムをマウントする

livecd ~ $ mount --types proc /proc /mnt/gentoo/proc
livecd ~ $ mount --rbind /sys /mnt/gentoo/sys
livecd ~ $ mount --rbind /dev /mnt/gentoo/dev
livecd ~ $ mount --rbind /run /mnt/gentoo/run

新しい環境に入る

livecd ~ $ chroot /mnt/gentoo /bin/bash
livecd ~ $ source /etc/profile
livecd ~ $ export PS1="(chroot) ${PS1}"
(chroot) livecd ~ $

ブートパーティションをマウントする

(chroot) livecd ~ $ mount /dev/nvme0n1p1 /boot
6.2 Portageを設定する

Gentoo ebuildリポジトリのスナップショットをインストールする

(chroot) livecd ~ $ emerge-webrsync

@worldの更新

(chroot) livecd ~ $ emerge --ask --verbose --update --deep --newuse @world
6.3 タイムゾーン
(chroot) livecd ~ $ echo "Japan" > /etc/timezone
(chroot) livecd ~ $ emerge --config sys-libs/timezone-data
6.4 ロケールの設定
(chroot) livecd ~ $ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
(chroot) livecd ~ $ locale-gen
(chroot) livecd ~ $ eselect locale set 4  #en_US.utf8を選択した
(chroot) livecd ~ $ env-update && source /etc/profile && export PS1="(chroot) ${PS1}"

(optiional) vimを使いたい(required)

(chroot) livecd ~ $ emerge --ask vim

7. Linuxカーネルの設定

7.1 カーネルソースのインストール
(chroot) livecd ~ $ emerge --ask sys-kernel/gentoo-sources
(chroot) livecd ~ $ eselect kernel set 1
(chroot) livecd ~ $ emerge --ask sys-apps/pciutils
7.2 genkernel*3

genkernelと、依存するlinux-firmwareをインストールするためのライセンス設定

# /etc/portage/package.license

# Accepting both licenses for linux-firmware
sys-kernel/linux-firmware linux-fw-redistributable no-source-code
# Accepting both licenses for genkernel
sys-kernel/genkernel linux-fw-redistributable no-source-code

genkernelのインストール

(chroot) livecd ~ $ emerge --ask sys-kernel/genkernel

カーネル(/boot/vmlinuz*)、モジュール群(/lib/modules)、initramfs(/boot/initramfs*)を生成する

# etc/fstab
/dev/nvme0n1p1  /boot         vfat    noauto, noatime   1 2

(chroot) livecd ~ $ genkernel all #1日くらい待つ

8. システムの設定

# etc/fstab
/dev/nvme0n1p1  /boot         vfat    noauto, noatime   1 2
/dev/nvme0n1p2  none          swap    sw                0 0
/dev/nvme0n1p3  /             ext4    noatime           0 1
/dev/cdrom      /mnt/cdrom    auto    noauto, user      0 0

# /etc/conf.d/hostname
hostname="zawanishi"

# /etc/conf.d/keymaps
keymap="jp106"
(chroot) livecd /etc/init.d $ emerge --ask net-misc/dhcpcd
(chroot) livecd /etc/init.d $ rc-update add dhcpcd default
(chroot) livecd /etc/init.d $ rc-service dhcpcd start  # DHCPが既に動いていれば不要

(chroot) livecd ~ $ passwd

9. 必要なシステムツールのインストール

(optional)なくても動くが大体ないと困る

# syslog
(chroot) livecd /etc/init.d $ emerge --ask app-admin/sysklogd
(chroot) livecd /etc/init.d $ rc-update add sysklogd default
# cron
(chroot) livecd /etc/init.d $ emerge --ask sys-process/cronie
(chroot) livecd /etc/init.d $ rc-update add cronie default
# file index
(chroot) livecd /etc/init.d $ emerge --ask sys-apps/mlocate
# ssh
(chroot) livecd /etc/init.d $ rc-update add sshd default

VFATはデフォルトでサポートされていないのでインストールが必要

(chroot) livecd /etc/init.d $ emerge --ask sys-fs/dosfstools

10. ブートローダの設定

GRUB2をインストール
emergeで出てくるメッセージにGRUB_PLATFORMS="efi-64"があることを確認する

(chroot) livecd ~ $ emerge --ask --verbose sys-boot/grub
(chroot) livecd ~ $ grub-install --target=x86_64-efi --efi-directory=/boot
(chroot) livecd ~ $ grub-mkconfig -o /boot/grub/grub.cfg

シャットダウン

(chroot) livecd ~ $ exit
livecd ~ $ umount -R /mnt/gentoo
livecd ~ $ halt

UTMの管理画面でCD/DVDをClearして再起動
Gentooの起動画面が出れば成功

f:id:y_nishizawa:20211220093938p:plain
gentoo起動画面

まとめ

楽しみながらLinuxを学ぶことができる。
最適なパフォーマンスを得るための設定をするのは難しい(自分も全然わかってない)が、とりあえず動かすだけならLinux初心者でもなんとかなる。
LPICを取ろうとしている人やLinux環境で仕事をしているけどあんまり詳しくない人、駆け出しエンジニアを抜け出したい人なんかにもオススメしたい。

*1:ARM64がサポートされていないわけではなく、インストール手順のサポートがされていない

*2:VirtualBoxでインストールする場合、BIOS起動なのでMBRパーティションで作成する

*3:公式ハンドブックではマニュアル設定がオススメされているがかなり難しいので、初めてのインストールではgenkernelを使うと良いと思う