Raspberry Pi 3にGentoo Linuxをインストールする

ソフトウェア

久しぶりにラズパイで遊びたくなり、昔使っていたラズパイを基板の山から掘り出しました。ラズパイを使った何かをしたのは数年前のことでもはや何も覚えていない状態です。掘り出したラズパイを見るとラズパイ3であること、SDカードは入っていないことがわかりました。

動かすためにはSDカードを用意して、適当なOSをインストールしなければなりません。どんなOSにするかネットで軽く調べてみました。

一番ポピュラーなものとして公式もサポートするRaspberry Pi OSというものがあるそうです。これは少し前までRaspbianという名称だったのが変更になったもののようです。Raspbianは聞いたことのある名前でしたが変更になったのですね。時の流れを感じます。。。そんなRaspberry Pi OSはDebianベースでLinuxディストリビューションの1つです。
他にもUbuntuなど同じようにLinux系のものがとても多く紹介されていました。
Linux以外ではWindows IoT CoreというWindows系のOSも使用できるそうです。

さらに調べる中でGentoo Linuxの文字を見つけました。GentooはIntel CPUのマシン(x86_64)にインストールしたことはありますが、ARM系のマシンにインストールしたことはなく、かるーく調べてみた感じでちょっと難しそうと思ったためチャレンジしてみることに決めました。

インストールするにあたり、公式のドキュメント(GentooのWiki)に情報がまとまっているので基本的にはこれを参照したながら進めました。
公式ドキュメント: https://wiki.gentoo.org/wiki/Raspberry_Pi_3_64_bit_Install
Raspberry Pi 3は64bitのカーネル(OS)を選択できるので今回は64bitのインストールを行います。

クロスコンパイルの環境を作成

Raspberry Pi 3はBroadcomのBCM2837というSoCが搭載されています。これはARM Cortex-A53というコアが採用されていて64bitのARM64というアーキテクチャで動作します。
そのためラズパイで動くカーネルを作成するためにはARM64向けにビルドする必要があります。

今回作業する環境はx86_64のUbuntu 20.04です。そのためARM64向けのコンパイラを使用してクロスコンパイルする必要があります。なのでまずはクロスコンパイルのための環境を作成します。

ちなみにGentoo公式のドキュメントではx86_64のGentoo Linuxで作業する手順が示されています。私の環境はUbuntu 20.04なのでクロスコンパイルの環境作りは少し異なる手順になっています。

コンパイラはgccを使用します。Ubuntuなのでaptで簡単に用意できます。

$ sudo apt install gcc-aarch64-linux-gnu
$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.1' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)

これでバージョン9.4.0のARM64(aarch64)向けgccを使用できるようになりました。

ラズパイのファームウェアを持ってくる

ラズパイのファームウェアはgitのリポジトリで管理されているのでまずgitをインストールします。
そして作業用のディレクトリ(今回はraspberrypi)を作成し、そこへファームウェアをダウンロードします。

$ sudo apt install git
$ mkdir ~/raspberrypi
$ cd ~/raspberrypi
$ git clone -b stable --depth=1 https://github.com/raspberrypi/firmware

ラズパイのカーネルを持ってくる

次にラズパイのカーネルを用意します。上記と同じ場所にダウンロードします。
そしてブランチをrpi-5.10.yに切り替えて使用します。

$ git clone --depth=1 https://github.com/raspberrypi/linux -b rpi-5.10.y
$ cd linux
$ git checkout rpi-5.10.y 
Already on 'rpi-5.10.y'
Your branch is up to date with 'origin/rpi-5.10.y'.

カーネルのコンフィグを行う

カーネルのコンフィグを行います。make menuconfigするいつもの流れです。

$ cd ~/raspberrypi/linux
$ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make bcmrpi3_defconfig
$ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make manuconfig
make menuconfigするとこの画面が表示され設定できるようになる

特に変更しなくてはならない設定項目はなさそうですが、ドキュメントにならって
"CPU Power Management" -> "CPU Frequency scaling" -> "Default CPUFreq governor"
"powersave"から"ondemand"に変更します。

ちなみにmenuconfigはEnterで進み、ESCで戻る、Spaceで選択欄にチェックを入れ、Tabで下のカーソルを切り替えます。

変更後、画面下のカーソルを”Save”にしてデフォルトの”.config”という名前で保存します。

カーネルのコンパイル

コンフィグが完了したので次にコンパイルを行います。makeで指定する並列ジョブ数はCPUの数+1が慣習だそうなので今回は17としました。
ビルドの前に libssl-dev をインストールします。これが無いと scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: そのようなファイルやディレクトリはありません とエラーが出てしまいました。

$ sudo apt install libssl-dev
$ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j17

私の環境(CPU: AMD Ryzen 7 1700)では10分程度でビルドが完了しました。

SDカードのパーティショニング

ラズパイ用のファームウェアとカーネルが準備できたので、次はSDカードに環境を整えます。
8GB以上の容量のあるてきとうなMicro-SDカードを用意します。今回は32GBのSDカードを使用しました。

SDカードのパーティション作成

ブート用にSDカードのパーティションを作成します。ドキュメントでは下記の表の割り当てが示されていたので今回は同じように進めていきます。

boot128MBブート領域FAT32
swap2GBスワップswapfs
root残り全てルート(/)ext4
SDカードのパーティションのサイズ

PCに用意したSDカードを挿し、dmesgコマンドなどで認識されるデバイスファイル名を確認します。私の環境では/dev/sdfとなりました。

デバイス名を確認できたらパーティション作成を行います。今回、パーティション作成にはfdiskを使用します。

MS-DOSのディスクラベルを作成し、/bootに割り当てる128MBのパーティションを作成します。
同様にswap, rootのパーティションを作成し、適切なファイルタイプに変更します。

$ sudo fdisk /dev/sdf

fdisk (util-linux 2.34) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。

デバイスには認識可能なパーティション情報が含まれていません。
新しい DOS ディスクラベルを作成しました。識別子は 0x3aba3162 です。

コマンド (m でヘルプ): o
コマンド (m でヘルプ): n
パーティションタイプ
   p   基本パーティション (0 プライマリ, 0 拡張, 4 空き)
   e   拡張領域 (論理パーティションが入ります)
選択 (既定値 p): p
パーティション番号 (1-4, 既定値 1): 1
最初のセクタ (2048-62945279, 既定値 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62945279, 既定値 62945279): +128M

新しいパーティション 1 をタイプ Linux、サイズ 128 MiB で作成しました。

コマンド (m でヘルプ): n
パーティションタイプ
   p   基本パーティション (1 プライマリ, 0 拡張, 3 空き)
   e   拡張領域 (論理パーティションが入ります)
選択 (既定値 p): p
パーティション番号 (2-4, 既定値 2): 2
最初のセクタ (264192-62945279, 既定値 264192): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (264192-62945279, 既定値 62945279): +2G

新しいパーティション 2 をタイプ Linux、サイズ 2 GiB で作成しました。

コマンド (m でヘルプ): n
パーティションタイプ
   p   基本パーティション (2 プライマリ, 0 拡張, 2 空き)
   e   拡張領域 (論理パーティションが入ります)
選択 (既定値 p): 

既定の回答 p であるものとみなします。
パーティション番号 (3,4, 既定値 3): 
最初のセクタ (4458496-62945279, 既定値 4458496): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4458496-62945279, 既定値 62945279): 

新しいパーティション 3 をタイプ Linux、サイズ 27.9 GiB で作成しました。

コマンド (m でヘルプ): p
ディスク /dev/sdf: 30.2 GiB, 32227983360 バイト, 62945280 セクタ
Disk model: SD/MMC/M.S.PRO  
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x3aba3162

デバイス   起動 開始位置 最後から   セクタ サイズ Id タイプ
/dev/sdf1           2048   264191   262144   128M 83 Linux
/dev/sdf2         264192  4458495  4194304     2G 83 Linux
/dev/sdf3        4458496 62945279 58486784  27.9G 83 Linux

コマンド (m でヘルプ): a
パーティション番号 (1-3, 既定値 3): 1

パーティション 1 の起動フラグを有効にしました。

コマンド (m でヘルプ): t
パーティション番号 (1-3, 既定値 3): 1
16 進数コード (L で利用可能なコードを一覧表示します): c

パーティションのタイプを 'Linux' から 'W95 FAT32 (LBA)' に変更しました。

コマンド (m でヘルプ): t
パーティション番号 (1-3, 既定値 3): 2
16 進数コード (L で利用可能なコードを一覧表示します): 82

パーティションのタイプを 'Linux' から 'Linux swap / Solaris' に変更しました。

コマンド (m でヘルプ): p
ディスク /dev/sdf: 30.2 GiB, 32227983360 バイト, 62945280 セクタ
Disk model: SD/MMC/M.S.PRO  
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x3aba3162

デバイス   起動 開始位置 最後から   セクタ サイズ Id タイプ
/dev/sdf1  *        2048   264191   262144   128M  c W95 FAT32 (LBA)
/dev/sdf2         264192  4458495  4194304     2G 82 Linux スワップ / Solaris
/dev/sdf3        4458496 62945279 58486784  27.9G 83 Linux

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

fdiskを対話形式で使用しているため出力が長くなってしまいました。キー入力した箇所を太字で示していますので、それ以外はfdiskの出力になります。入力を求められても規定値が表示されている場合はEnterキーだけで規定値を選択したことになるので入力が無い箇所は規定値となっています。

SDカードのパーティションをフォーマット

次にパーティションごとにフォーマットを行います。bootはFAT32、swapはswapでrootはext4でフォーマットします。

$ sudo mkfs -t vfat -F 32 /dev/sdf1
mkfs.fat 4.1 (2017-01-24)

$ sudo mkswap /dev/sdf2
スワップ空間バージョン 1 を設定します。サイズ = 2 GiB (2147479552 バイト)
ラベルはありません, UUID=0016553b-f72b-445c-b47c-650caf6812f7

$ sudo mkfs -i 8192 -t ext4 /dev/sdf3
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 7310848 4k blocks and 3655680 inodes
Filesystem UUID: 513ef9ff-eaab-4f2e-b5c9-dd2838852913
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): 
done
Writing superblocks and filesystem accounting information: done

SDカードに必要なファイルを構築

gentooのファイルを配置

SDカードのパーティショニングが終わったのでマウントします。/mnt/gentooというディレクトリを作成し、そこへマウントします。

$ sudo mkdir /mnt/gentoo
$ sudo mount /dev/sdf3 /mnt/gentoo

次にStage3のtarballをダウンロードし展開します。gentoo標準のOpenRCの一番普通そうなものを選択しました。

$ cd ~/raspberrypi
$ wget https://distfiles.gentoo.org/releases/arm64/autobuilds/current-stage3-arm64-openrc/stage3-arm64-openrc-20230326T233159Z.tar.xz
$ sudo tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner -C /mnt/gentoo

次はgentooのemergeが動くようにするためにgentooリポジトリのスナップショットをインストールします。
この時、/mnt/gentoo/var/db/repos/gentooが無いとエラーが出たため作成しておきます。

$ wget https://distfiles.gentoo.org/snapshots/portage-latest.tar.bz2
$ sudo mkdir /mnt/gentoo/var/db/repos/gentoo
$ sudo tar xvpf portage-latest.tar.bz2 --strip-components=1 -C /mnt/gentoo/var/db/repos/gentoo

boot領域にファイルを配置

bootに必要なファイルを配置します。SDカードのbootパーティションをマウントしてダウンロード済みのファームウェアから必要なファイルを移すだけです。

$ sudo mount /dev/sdf1 /mnt/gentoo/boot/
$ sudo cp -rv ~/raspberrypi/firmware/boot/* /mnt/gentoo/boot

そしてカーネルとデバイスツリーを配置します。

$ sudo cp ~/raspberrypi/linux/arch/arm64/boot/Image /mnt/gentoo/boot/kernel8.img
$ sudo mv /mnt/gentoo/boot/bcm2710-rpi-3-b.dtb /mnt/gentoo/boot/bcm2710-rpi-3-b.dtb_32
$ sudo cp ~/raspberrypi/linux/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/gentoo/boot

カーネルモジュールのインストールを行います。

$ cd ~/raspberrypi/linux
$ sudo ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make modules_install INSTALL_MOD_PATH=/mnt/gentoo

ラズパイの周辺機器の設定

シリアルポートの設定

ドキュメント通りに進めます。まず/mnt/gentoo/etc/inittabを編集し下の通りの内容を追加します。今回はすでに同じ内容が存在していたので追加をスキップしました。

f0:12345:respawn:/sbin/agetty 9600 ttyAMA0 vt100

次に/mnt/gentoo/etc/udev/rules.d/99-com.rulesを作成、編集します。下の通りの内容を書き込みます。

SUBSYSTEM=="input", GROUP="input", MODE="0660"
SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660"
SUBSYSTEM=="spidev", GROUP="spi", MODE="0660"
SUBSYSTEM=="bcm2835-gpiomem", GROUP="gpio", MODE="0660"

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\
        chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\
        chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio;\
        chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\
'"

KERNEL=="ttyAMA[01]", GROUP="dialout", PROGRAM="/bin/sh -c '\
        ALIASES=/proc/device-tree/aliases; \
        if cmp -s $ALIASES/uart0 $ALIASES/serial0; then \
                echo 0;\
        elif cmp -s $ALIASES/uart0 $ALIASES/serial1; then \
                echo 1; \
        else \
                exit 1; \
        fi\
'", SYMLINK+="serial%c"

KERNEL=="ttyS0", GROUP="dialout", PROGRAM="/bin/sh -c '\
        ALIASES=/proc/device-tree/aliases; \
        if cmp -s $ALIASES/uart1 $ALIASES/serial0; then \
                echo 0; \
        elif cmp -s $ALIASES/uart1 $ALIASES/serial1; then \
                echo 1; \
        else \
                exit 1; \
        fi \
'", SYMLINK+="serial%c"

Wi-Fiのファームウェアをインストール

ラズパイ3用のファームウェアをダウンロードし配置します。

$ sudo mkdir -p /mnt/gentoo/lib/firmware/brcm
$ sudo wget -P /mnt/gentoo/lib/firmware/brcm https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt
--2023-03-29 01:56:09--  https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt
git.kernel.org (git.kernel.org) をDNSに問いあわせています... 145.40.73.55, 2604:1380:40e1:4800::1
git.kernel.org (git.kernel.org)|145.40.73.55|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 874 [text/plain]
`/mnt/gentoo/lib/firmware/brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt' に保存中

brcmfmac43430-sdio.raspberrypi,3-model-b.t 100%[=======================================================================================>]     874  --.-KB/s    in 0s      

2023-03-29 01:56:10 (135 MB/s) - `/mnt/gentoo/lib/firmware/brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt' へ保存完了 [874/874]

$ sudo wget -P /mnt/gentoo/lib/firmware/brcm https://github.com/armbian/firmware/raw/master/brcm/brcmfmac43430-sdio.bin 
--2023-03-29 01:56:21--  https://github.com/armbian/firmware/raw/master/brcm/brcmfmac43430-sdio.bin
github.com (github.com) をDNSに問いあわせています... 20.27.177.113
github.com (github.com)|20.27.177.113|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://raw.githubusercontent.com/armbian/firmware/master/brcm/brcmfmac43430-sdio.bin [続く]
--2023-03-29 01:56:21--  https://raw.githubusercontent.com/armbian/firmware/master/brcm/brcmfmac43430-sdio.bin
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 185.199.110.133, 185.199.111.133, 185.199.109.133, ...
raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 416477 (407K) [application/octet-stream]
`/mnt/gentoo/lib/firmware/brcm/brcmfmac43430-sdio.bin' に保存中

brcmfmac43430-sdio.bin                     100%[=======================================================================================>] 406.72K  --.-KB/s    in 0.05s   

2023-03-29 01:56:22 (7.65 MB/s) - `/mnt/gentoo/lib/firmware/brcm/brcmfmac43430-sdio.bin' へ保存完了 [416477/416477]

Bluetoothの設定

Bluetooth用のファームウェアをダウンロードします。

$ sudo wget -P /mnt/gentoo/lib/firmware/brcm https://raw.githubusercontent.com/RPi-Distro/bluez-firmware/master/broadcom/BCM43430A1.hcd
--2023-03-29 16:34:08--  https://raw.githubusercontent.com/RPi-Distro/bluez-firmware/master/broadcom/BCM43430A1.hcd
raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 185.199.110.133, 185.199.111.133, 185.199.108.133, ...
raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 30049 (29K) [application/octet-stream]
`/mnt/gentoo/lib/firmware/brcm/BCM43430A1.hcd' に保存中

BCM43430A1.hcd                            100%[====================================================================================>]  29.34K  --.-KB/s    in 0.002s  

2023-03-29 16:34:08 (11.6 MB/s) - `/mnt/gentoo/lib/firmware/brcm/BCM43430A1.hcd' へ保存完了 [30049/30049]

ブート前の段階ではファームウェアのダウンロードのみ行い、設定などはラズパイ起動後に行います。

セットアップ

rootのパスワードを設定

rootユーザーのパスワードを設定します。通常であれば/mnt/gentooにchrootしてpasswdコマンドでパスワードを設定することになると思います。ですがドキュメントでは簡単に設定できるようすでにパスワード記録済みのファイルを載せています。今回はこれをそのまま使用したいと思います。
/mnt/gentoo/etc/shadowファイルに下記の内容を書き込んでください。rootで始まる行がすでに存在する場合は置き換えてください。

root:$6$xxPVR/Td5iP$/7Asdgq0ux2sgNkklnndcG4g3493kUYfrrdenBXjxBxEsoLneJpDAwOyX/kkpFB4pU5dlhHEyN0SK4eh/WpmO0::0:99999:7:::

この内容でパスワードを設定した場合、パスワードは raspberry になります。

マウントの設定

ラズパイ起動時の自動マウントのために/etc/fstabファイルを編集します。ラズパイではSDカードの3つのパーティションが/dev/mmcblk0p1 - 0p3のように認識されます。
/mnt/gentoo/etc/fstabファイルを開いて下記の内容を追記してください。デフォルトで存在するファイルは全てコメントだったので単純にファイル末尾に追記しました。

/dev/mmcblk0p1          /boot           vfat            noauto,noatime  1 2
/dev/mmcblk0p2          none            swap            sw              0 0
/dev/mmcblk0p3          /               ext4            noatime         0 1

ブート時設定ファイル

/mnt/gentoo/boot/config.txtを新規作成し、下記の内容を書き込みます。

# have a properly sized image
disable_overscan=1

# lets have the VC4 hardware accelerated video
dtoverlay=vc4-fkms-v3d

# for sound over HDMI
hdmi_drive=2

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

# gpu_mem is for closed-source driver only; since we are only using the
# open-source driver here, set low
gpu_mem=16

# Force booting in 64bit mode
arm_64bit=1

ブート時のコマンド設定

ブート時のコマンド設定を行います。/mnt/gentoo/boot/cmdline.txtを新規作成し、下記の内容を書き込みます。

root=/dev/mmcblk0p3 rootfstype=ext4 rootwait

キーボードの設定

キーマップを変更します。私はUSキーボードを使用しているのでその設定を行いました。日本語キーボードの場合は”jp106″に設定すると良さそうです。
/mnt/gentoo/etc/conf.d/keymapsに下記の内容を記入します。今回はデフォルトの設定がusとなっていたため何も変更しませんでした。

keymap="us"

ラズパイで起動の確認

ここまででSDカードの準備が完了しましたので作成したSDカードをラズパイに移して起動の確認を行います。
まずはSDカードをアンマウントします。

$ sudo umount /mnt/gentoo/boot
$ sudo umount /mnt/gentoo

umountコマンドを実行すると場合によっては少し時間がかかるかもしれません。その場合、コマンド終了までしっかり待ち、終わってからSDカードを外します。

PCで作成したSDカードをラズパイに移します

SDカードをラズパイに挿したら、画面表示用にHDMIケーブルでモニターとUSBのキーボードも接続します。マウスは使用しないのでキーボードだけでOKです。

USBキーボード、HDMIモニターと電源のMicroUSBを接続したところ

最後にMicroUSBを接続して電源供給します。自動的に電源が入り、MicroUSB近くのLED2つが赤色と緑色に光るはずです。

しばらく待つと画面に起動時のログが流れて、最終的に画像のようなログインのプロンプトが表示されます。
localhost login: と表示されたら、rootと入力します。パスワードの入力が求められますが、前述の手順で設定した場合は raspberry となっています。

Gentooログイン後の画面

ログインに成功すると画像のように localhost ~ # とプロンプトが出ます。ここまで来たらカーネルの起動とログインは成功です。

起動後の設定

ネットワークの設定

起動後、そのままではネットワークが有効になっていないため設定します。
有線のEthernetを使用、DHCPで接続するようにします。
rootログイン後のラズパイで下記を実行します。

# emerge --ask --noreplace net-misc/netifrc

DHCPするためにdhcpcdをインストールしようとし、下記を実行したところネットワークからダウンロードしようとしてエラーになってしまいました。めんどうなのでDHCPは使用せずにひとまず静的にIPアドレスを振ろうと思います。

# emerge --ask --noreplace net-misc/dhcpcd
:
>>> Failed to emerge net-misc/dhcpcd-9.4.1, Log file:
>>> '/var/tmp/portage/net-misc/dhcpcd-9.4.1/temp/build.log'

次にネットワーク接続の設定をします。/etc/conf.d/netを作成、編集します。下記の内容を記入します。

config_eth0="192.168.0.2/24"
routes_eth0="default via 192.168.0.1"

LANケーブルをラズパイに挿してから、サービスを登録、開始します。

# ln -sr /etc/init.d/net.lo /etc/init.d/net.eth0
# rc-update add net.eth0 default
 * service net.eth0 added to runlevel default
# /etc/init.d/net.eth0 start

そしてip addr で確認するとeth0にIPアドレスが割り振られていました。ルータへのpingも動くようになりました。ところがping google.comのようにFQDNを指定するとエラーとなってしまいます。名前解決ができていないようですので修正します。

/etc/conf.d/netにDNSサーバ用の設定を1行追記します。

dns_servers_eth0="192.168.0.1 8.8.8.8"

そしてネットワークを再起動します。

# /etc/init.d/net.eth0 restart

これで名前解決も正常に行えるようになりました。ネットワークがつながったのでdhcpcdをインストールします。
先に時刻を正しく設定しておきます。それからdhcpcdをインストールします。

# date 032822152023
# emerge --ask --noreplace net-misc/dhcpcd

dateコマンドの引数はMMDDhhmmYYYYのフォーマットで日時を指定します。
今度はエラーなくdhcpcdがインストールできました。/etc/conf.d/netをDHCP用に変更します。下記のように書き換えます。

config_eth0="dhcp"

書き換えたらネットワークを再起動します。

# /etc/init.d/net.eth0 restart

DHCP経由でIPアドレスが割り振られ、pingも正常に通ることが確認できました。

システムの更新

ネットワークが動くようになったのでシステムを更新します。更新時にビルドが効率的に行われるように先にCFLAGSを変更します。/etc/portage/make.confを開き、COMMON_FLAGSを下記のように書き換えます。
ちなみにMAKEOPTSはデフォルトでは未設定ですが、未設定の場合はnprocコマンドの返す値が使用されるのでラズパイではデフォルトで4つまで並列で動くようになっています。もし安定動作のために並列数を減らす場合はMAKEOPTS="-j2"などと追記してください。

CFLAGS="-march=armv8-a+crc -mtune=cortex-a53 -O2 -pipe"

更新します。2コマンドの完了に体感で60分程度とそこそこ時間がかかりました。

# emerge --sync
# emerge -auDN @world

ネットワーク経由で自動的に時間を合わせるようにする(ntpd)

NTPを使用してネットワーク経由で自動的に時刻を合わせるようにします。
NTPデーモンをインストールし、デフォルトで起動するように設定、サービスの開始を行います。

# emerge --ask net-misc/ntp
# rc-update add ntpd default
# rc-service ntpd start

ハードウェアクロックを停止させ、ソフトウェアクロックを使用するように設定します。

# rc-update del hwclock boot
# rc-update add swclock boot 

タイムゾーンの設定をします。また、タイムゾーンライブラリもインストールします。

# find /usr/share/zoneinfo | grep -i tokyo
/usr/share/zoneinfo/Asia/Tokyo
# echo "Asia/Tokyo" > /etc/timezone
# emerge --ask sys-libs/timezone-data

NTPクライアントの開始とデフォルトで起動するように設定します。

# rc-service ntp-client start
# rc-update add ntp-client default

SSH接続ができるようにする

これ以降の作業がキーボードとモニターがなくてもできるようにするためにsshを導入しておきます。
sshdはすでにシステムにインストール済みなので起動するだけです。
その前にrootユーザーとパスワード認証でログインできるように設定を変更しておきます。

/etc/ssh/sshd_configファイルを開き、#PermitRootLogin prohibit-passwordのコメントを解除しyesに変更するのとPasswordAuthntication noの行をyesに変更します。

PermitRootLogin yes
PasswordAuthentication yes
# rc-service sshd start
# rc-update add sshd default

sshd起動後、他のPCからsshログインをしてみます。私の環境ではssh root@192.168.0.171でログインできました。

Wi-Fiを動かす

現状ではWi-Fiは動かせていません、下記は作業メモ

認証方式がWPAかWPA2のWi-Fiに接続する方法を行っていきます。まず必要なツールをインストールします。

# emerge --ask net-wireless/iw net-wireless/wpa_supplicant

Bluetoothを動かす

現状ではBluetoothは動かせていません。

個人的な設定

tmuxのインストール

ssh接続して作業する場合、複数のセッションを確保したいことが多くあります。こういった場合にtmuxが使えると便利なのでインストールします。

# emerge --ask app-misc/tmux

インストールはこれだけです。3分程度で完了しました。基本的な使い方はtmuxと入力し実行し、Ctrl-b +%で縦に画面を分割(横に2つ並ぶように分割される)、Ctrl-b+”で横に画面分割し、Ctrl-b+oで移動します。また、Ctrl-b+cでページを作成してCtrl-b+n, Ctrl-b+pで移動できます。他の使い方は検索してみてください。

設定ファイルは~/.tmux.confです。これもお好みで変更してください。検索するといろいろな人がおすすめの設定を公開しているのが見つかります。

vimのインストール

エディタはvimを気に入って使用しているのでインストールします。gentooはデフォルトではvimどころかviすらインストールされていないのです。インストールするまではnanoを使用しましたが使い方がわからず苦戦しました。馴染んだエディタが無いのはしんどいのでさくっと用意します。

# emerge --ask app-editors/vim

これでvim9.0がインストールされました。あとはお好みの.vimrcを置いて快適に使えるようになります。

おわり

これでRaspberry Pi 3BでGentooが動く環境を作ることができました。あとは周辺機器をつないだり、好きなソフトウェアを動かして使い倒すだけです!

コメント