Mac m1 gentoo インストール備忘録
記事の目的
「自分でカスタマイズして作れる OS がある」と gentoo を紹介され、ロマンを感じたため、最低限のものでも良いので、「動く」ように Gentoo を導入することを目的に取り掛かりました。
ほぼパーティションなどについての知識がない状態でやったため、エラーが発生していたり、経験者の方にしてみては不合理なことをしているかもしれません。導入にあたっては以下の記事を参考にさせていただいたので、 Gentoo を本格的に導入されたい方は、どうぞそちらをご参照ください。
参考記事
環境
- パソコン:Macbook Air M1
- RAM : 16 GB
- ROM : 512GB
- macOS : Version 13.2.1
前準備
-
UTM をインストール
インストールしてない場合はbrew install utm
でインストールが可能です。
-
ISO イメージのダウンロード
https://www.gentoo.org/downloads/ からamd64 or arm64 の "minimal install cd" をダウンロードします。ここでは arm64 をベースに進めています。 -
UTM セットアップ
GUI で "Create a new machine" から "Virtualize" >> "linux" >> "Boot ISO image" 参照先に 2. でインストールした ISO イメージを選択します。 -
メモリや容量などの選択
筆者はデフォルトで済ませていますが、カスタマイズ用などに必要なファイル群などがあったりする場合には、用意したもの選択する必要があるかもしれません。
流れ
-
UTM を起動
起動したのち、ブート先の選択画面が表示されるので、上の Boot LiveCD (kernel:gentoo)を選択します。しばらく待つと "Thank you for using gentoo Linux!" と出るので、そしたらブート成功です。
-
ネットワークの確認
これからの処理の中でダウンロードする処理があるので、ネットにつながっていることを確認したいです。確認するには以下のコマンドを使います。ping -c 3 www.gentoo.org
筆者はこれで上手くいったので次に進みますが、整っていない場合にはハンドブックにどのような処理をすべきか書かれております。
ネットワークの設定
-
ディスクの準備
メモリやディスクのパーティションを行う必要があります。そしてそのパーティションを行う場合に UEFI というブートシステムを使っているのか、BIOS を使っているのかでやり方が違うので、それを確認する必要があります。「どう確認しようか」と思っていたところ、こちらの記事の筆者様の記事を参照して、以下のコマンドで探すことができることを知りました。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
ここまで来てディスクの準備は完了です。
-
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 コマンドでファイル群がインストールされているのを確認できると思います。
-
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
-
カーネルの設定
さて、今度はカーネルの設定に移ります。ガイドブックにはファームウェアなどについての記述がありますが、全部すっ飛ばして、カーネルのインストールを見ます。ガイドブックには「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
-
システムの設定
ホスト名やネットワークの設定など周辺の設定をします。まずはホスト名の設定を行います。(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
-
ツールのインストール
恐らく後々困ることになるのですが、ひとまず「動く」システムを作ることを目的にしていたので、sshd などはインストールしませんでした。ただ、ファイルシステムがデフォルトではサポートされていないものもあったのでそのツールだけインストールすることにしました。筆者は Fat32 をインストールしたので、それに対応するツールをインストールしました。(ファイルシステム毎にインストールするツールはガイドブックを参照ください)(chroot) livecd /usr/src/linux $ emerge --ask sys-fs/dosfstools
-
ブートローダの設定
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