🗂

Mac m1 gentoo インストール備忘録

2023/03/20に公開

記事の目的

「自分でカスタマイズして作れる OS がある」と gentoo を紹介され、ロマンを感じたため、最低限のものでも良いので、「動く」ように Gentoo を導入することを目的に取り掛かりました。

ほぼパーティションなどについての知識がない状態でやったため、エラーが発生していたり、経験者の方にしてみては不合理なことをしているかもしれません。導入にあたっては以下の記事を参考にさせていただいたので、 Gentoo を本格的に導入されたい方は、どうぞそちらをご参照ください。

参考記事

環境

  • パソコン:Macbook Air M1
  • RAM : 16 GB
  • ROM : 512GB
  • macOS : Version 13.2.1

前準備

  1. UTM をインストール
    インストールしてない場合は

    brew install utm
    

    でインストールが可能です。

  2. ISO イメージのダウンロード
    https://www.gentoo.org/downloads/ からamd64 or arm64 の "minimal install cd" をダウンロードします。ここでは arm64 をベースに進めています。

  3. UTM セットアップ
    GUI で "Create a new machine" から "Virtualize" >> "linux" >> "Boot ISO image" 参照先に 2. でインストールした ISO イメージを選択します。

  4. メモリや容量などの選択
    筆者はデフォルトで済ませていますが、カスタマイズ用などに必要なファイル群などがあったりする場合には、用意したもの選択する必要があるかもしれません。

流れ

  1. UTM を起動
    起動したのち、ブート先の選択画面が表示されるので、上の Boot LiveCD (kernel:gentoo)を選択します。しばらく待つと "Thank you for using gentoo Linux!" と出るので、そしたらブート成功です。


  2. ネットワークの確認
    これからの処理の中でダウンロードする処理があるので、ネットにつながっていることを確認したいです。確認するには以下のコマンドを使います。

    ping -c 3 www.gentoo.org
    

    筆者はこれで上手くいったので次に進みますが、整っていない場合にはハンドブックにどのような処理をすべきか書かれております。
    ネットワークの設定


  3. ディスクの準備
    メモリやディスクのパーティションを行う必要があります。そしてそのパーティションを行う場合に UEFI というブートシステムを使っているのか、BIOS を使っているのかでやり方が違うので、それを確認する必要があります。「どう確認しようか」と思っていたところ、こちらの記事の筆者様の記事を参照して、以下のコマンドで探すことができることを知りました。

    BIOS か UEFI の確認

    livecd ~ $ ls /sys/firmware
    acpi devicetree dmi efi fdt qemu_fw_cfg
    

    これでefi がある場合には UEFI であることを確認できます。
    筆者は UEFI でしたので、UEFI を前提に進めます。

    次に、現在のパーティションを確認します。ガイドブックを元に確認しようとすると

    livecd ~ $ fdisk /dev/sda
    ...
    fdisk: cannot open /dev/sda: No such file or directory
    

    と出てしまいました。どうやらこのコマンドはその環境のディスクにアクセスするためのものらしいです。このディスクには /dev/sda がないのでエラーが出てしまいました。それで以下のコマンドでタブを押すと

    livecd ~ $ fdisk /dev/
    /dev/loop0 /dev/sr0 /dev/vda # 上の状態で tab を押した結果
    

    と3つ出たので、一番それらしい /dev/vda を選択しました。

    livecd ~ $ fdisk /dev/vda
    
    Welcome to fdisk (util-linux 2.38.1)
    ...
    Command (m for help):
    

    上手くいきました。
    次にパーティションの設定に行きます。ここで fdisk のコマンドにおける対話型のコマンドについては省略します。詳しくは以下の記事を参照してください。
    fdisk 対話型コマンド一覧
    筆者は pコマンドで割り当てられたパーティションがなかったので、新しく作ります。

    Command (m for help): g
    ...
    Command (m for help): n
    Partition number ... : 1
    First sector ... : 
    Last sector ... : +256M
    
    Command (m for help): t
    Selected partition 1
    Partition type (type L to list all types): 1
    
    Command (m for help): n
    Partition number ... : 2
    First sector ... : 
    Last sector ... : +4G
    
    Command (m for help): t
    Selected partition 2
    Partition type (type L to list all types): 19
    
    Command (m for help): n
    Partition number ... : 3
    First sector ... : 
    Last sector ... :
    
    Command (m for help): p
    ...
    # ここで /dev/vda1 ~ /dev/vda3 全て出ていれば成功
    
    Command (m for help): w
    

    これでパーティションができたので、それにファイルシステムを適用します。なお、適用させるファイルシステムはカスタマイズできます。筆者はガイドブックの通りに行なっています。

    livecd ~ $ mkfs.vfat -F 32 /dev/vda1
    livecd ~ $ mkfs.ext4 /dev/vda3
    

    次にスワップパーティションというものを有効化します。

    livecd ~ $ mkswap /dev/vda2
    livecd ~ $ swapon /dev/vda2
    

    ここまで来たら、あとはそれらのパーティションをルートディレクトリに以下のコマンドでマウントします。

    livecd ~ $ mount /dev/vda3 /mnt/gentoo
    livecd ~ $ cd /mnt/gentoo
    

    ここまで来てディスクの準備は完了です。


  4. Gentoo インストールファイルの導入
    まず時間を合わせることから始まるのですが、どうも筆者は ntpd コマンドを使っても時間が合わなかったため、date で手動で時計を合わせました。(この方法だと毎回ログアウトした場合時間が狂うので注意です)

    (date MMDDHHMMYYYY #Y:Year, M:Month, D:Day, H:Hour, M:Minute) 
    livecd /mnt/gentoo $ date 031522002023    #2023年 3月15日 22:00の場合
    

    links コマンドを使うと GUI でブラウジングができるため、筆者は links を使ってインストールしています。

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

    ここで "Downloads" >> 下にスクロールして arm64, aka, AArch64の "Stage 3 openrc 2023-03-12 229 MiB" を選択します。(2022/3/17時点)
    ダウンロードが終わったら Esc で File >> Exit を選択します。次にダウンロードした tar.xz ファイルを以下のコマンドで展開します。コマンドのオプションの理由はガイドブックを参照ください。

    tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner
    

    大量のデータが展開されると思いますが、完了したら ls コマンドでファイル群がインストールされているのを確認できると思います。


  5. Gentoo ベースシステムのインストール
    インストールファイルを展開したので、今度はユーザが使えるようにシステムをインストールしたいと思います。
    まずは DNSの情報を gentoo にコピーします。

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

    次にファイルシステムをマウントするのですが、最初筆者はガイドブックを見た時唖然としました。「こんなに似てるコマンドを何回も...」でも、今回のように opnerc を利用している場合は --make-rslave などはいらないとのことなので少し短略できます。

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

    現在は gentoo のインストールするための環境にいますが、これから導入したファイルシステムに変更を加えたいので、ファイルのルートディレクトリを /mnt/gentoo に変えて作業を行います。

    livecd /mnt/gentoo $ chroot /mnt/gentoo /bin/bash
    livecd / $ source /etc/profile #表示が /mnt/gentoo から / になったのを確認できる
    livecd / $ export PS1="(chroot) ${PS1}"
    (chroot) livecd / $ mount /dev/vda1 /boot
    

    以下のコマンドで外部からダウンロードするのに必要なスナップショットを取得します。

    (chroot) livecd / $ emerge-webrsync
    

    emerge 系のコマンドはかなり時間かかった印象です。完成したら、@world を更新します。

    (chroot) livecd / $ emerge --ask --verbose --update --deep --newuse @world
    

    続いてタイムゾーンの更新を行います。

    (chroot) livecd / $ echo "Japan" > /etc/timezone
    (chroot) livecd / $ emerge --config sys-libs/timezone-data
    

  6. カーネルの設定
    さて、今度はカーネルの設定に移ります。ガイドブックにはファームウェアなどについての記述がありますが、全部すっ飛ばして、カーネルのインストールを見ます。ガイドブックには「amd64 ベースのシステムにカーネルを手動でインストールしてコンパイルする場合には、Gentoo はsys-kernel/gentoo-sources パッケージを推奨しています。」とありますが、確認したところ arm64でも動作するようなので、同じものをインストールします。終わったらこのカーネルを選択します。

    (chroot) livecd / $ emerge --ask sys-kernel/gentoo-sources
    ...
    
    (chroot) livecd / $ eselect kernel list
    Avaliable kernel symlink targets:
      [1]   linux-6.1.12-gentoo
    (chroot) livecd / $ eselect kernel set 1
    (chroot) livecd / $ emerge --ask sys-apps/pciutils
    

    続いてカーネルを設定するところに入りますが、筆者は自分をチャレンジするためにカーネルを手動で設定しました。ただほとんどは既に設定されているか、設定しなくても良い部分でしたので、ほぼ確認するだけとなりました。設定が終わったら以下のコマンドを実行してコンパイル & インストールを行います。

    (chroot) livecd / $ cd /etc/src/linux
    (chroot) livecd /etc/src/linux $ make && make modules_install # 時間かなりかかる
    ...
    (chroot) livecd /etc/src/linux $ make install
    

  7. システムの設定
    ホスト名やネットワークの設定など周辺の設定をします。まずはホスト名の設定を行います。

    (chroot) livecd / $ echo name > /etc/hostname # name の箇所は自分の希望する名前に置き換えます。
    

    次に、ネットワーク周辺の設定を行います。

    (chroot) livecd /etc/src/linux $ emerge --ask net-misc/dhcpcd
    (chroot) livecd /etc/src/linux $ rc-update add dhcpcd default
    (chroot) livecd /etc/src/linux $ rc-service dhcpcd start
    

    すると以下のようなメッセージが流れました。

    ...
    start-stop-daemon: /sbin/dhcpcd is already running
    Failed to start DHCP Client Daemon
    ERROR: dhcpcd failed to start
    

    どうやら既に DHCP が起動していたようでしたので特に何もしなくても大丈夫なようです。終わったらパスワードの設定を行います。

    (chroot) livecd /etc/src/linux $ passwd
    

  8. ツールのインストール
    恐らく後々困ることになるのですが、ひとまず「動く」システムを作ることを目的にしていたので、sshd などはインストールしませんでした。ただ、ファイルシステムがデフォルトではサポートされていないものもあったのでそのツールだけインストールすることにしました。筆者は Fat32 をインストールしたので、それに対応するツールをインストールしました。(ファイルシステム毎にインストールするツールはガイドブックを参照ください)

    (chroot) livecd /usr/src/linux $ emerge --ask sys-fs/dosfstools
    

  9. ブートローダの設定
    OS の起動に使われるブートローダをインストールします。Gentoo だと GRUB がよく使われるみたいなので、これをダウンロードします。

    (chroot) livecd /usr/src/linux $ emerge --ask --verbose sys-boot/grub
    

    次にこれをインストールするのですが、ブートローダの形態を BIOS と UEFI で選択できるようです。筆者はここで UEFI を選択しました。それでガイドブックの通りにしたのですが、以下のようなエラーが出てしまいました。

    (chroot) livecd /usr/src/linux $ grub-install --target=x86_64-efi --efi-directory=/boot
    grub-install: error: /usr/lib/grub/x86_64-efi/modinfo.sh doesn't exist. ...
    

    ん?コマンドをよく見てみると筆者は arm64 を使っているのに x86_64 を指定していたので存在していないフォルダにアクセスしようとしていました。それで /usr/lib/grub を ls で検索しました。

    (chroot) livecd /usr/src/linux $ ls /usr/lib/grub
    arm64-efi
    

    ここで、arm64-efi を発見したので先ほどのコマンドのターゲットを arm64-efi に変更します。しかし、ここでもまたエラーが出てしまいました。

    (chroot) livecd /usr/src/linux $ grub-install --target=arm64-efi --efi-directory=/boot
    grub-install: efibootmgr not found ...
    

    ガイドブックを少し下までスクロールすると、どうやらefibootmgr はインストールできるみたいです。

    (chroot) livecd /usr/src/linux $ emerge --ask sys-boot/efibootmgr
    ...
    (chroot) livecd /usr/src/linux $ grub-install --target=arm64-efi --efi-directory=/boot
    Installing for arm64-efi platform
    ...
    

    上手くいきました。ここまで来ればもうゴールは目前です。あとは設定を反映させてリブートすれば完成です。

    (chroot) livecd /usr/src/linux $ grub-mkconfig -o /boot/grub/grub.cfg
    (chroot) livecd /usr/src/linux $ exit
    livecd /mnt/gentoo $ umount -R /mnt/gentoo
    umount: /mnt/gentoo: target is busy.
    

    忘れていました。cd をルートディレクトリに変更します。

    livecd /mnt/gentoo $ cd /
    livecd / $ umount -R /mnt/gentoo
    livecd / $ halt
    

    最後に、再起動する前に UTM の gentoo 設定の CD/DVD から ISO ファイルを外します。
    この状態で起動すると、パスワードが求められる画面になります。あとはログインすれば、インストールを確認できました。これで gentoo のインストールが終了です。

感想

初めての経験だったのでエラーに何回か遭ったりしましたが、何はともあれひとまず「動く」gentoo OS をインストールすることができました。ガイドブックの通りに進めるだけでは上手く行かず、他の記事のおかげで最終的なゴールに着いたので、恐らく何度か同じように導入することでインストールすることに慣れていくのかな?という印象でした。

今回は「動く」ような OS のインストールを手掛けましたが、次回以降は今回インストールした OS にアプリケーションを実装したり、fdisk などの実行したコマンドの意味を深く知るようにしたいと思いました。

今まで OS をインストールする際にパーティションやカーネルの設定をする必要はほとんどありませんでしたが、今回の作業を通して良い経験となりました。今後自分でこの記事を見返してまた記事を更新していこうと思います。

Discussion