IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Gentoo 64bitのインストール(Raspberry Pi用)

どうも、nippaです。

Raspberry Pi 4 model B に Raspbian をインストールして使っていたのですが、現時点で32bit版で使いづらかったので、64bit版OSをどうにかして入れたいのが理由です。

CPUは64bitです(BCM2711 - Raspberry Pi Documentation)。

現時点で使えるラズパイ4で64bitを使うとすると、

Ubuntu MATE以外はコンパイルが必要です。Gentoo修行をしているので、今回もGentooをインストールします。 公式ページを参考にしています。

環境

作業用:Gentoo Linux (Base System release 2.6) on Virtual Box MicroSD:Raspberry Pi4のOSインストール先 Raspberry Pi4 model B (4core/4GB)

1. 作業用Gentooでの事前準備

1.1 クロスコンパイル用のツールをインストールする。

# emerge --ask sys-devel/crossdev

1.2 カスタムレポジトリの作成と設定

mkdir -p /var/db/repos/localrepo-crossdev/{profiles,metadata}
echo 'crossdev' > /var/db/repos/localrepo-crossdev/profiles/raspberrypi4
echo 'masters = gentoo' > /var/db/repos/localrepo-crossdev/metadata/layout.conf
chown -R portage:portage /var/db/repos/localrepo-crossdev

/var/db/repos/localrepo-crossdev/metadata/layout.confに以下を書き込む。

masters = gentoo
thin-manifests = true

/etc/portage/repos.conf/crossdev.confのcrossdevの設定ファイルに書き込む。

[crossdev]
location = /var/db/repos/localrepo-crossdev
priority = 10
masters = gentoo
auto-sync = no

1.3 crossdevを使用して、aarch64-unknown-linux-gnuをインストール

# crossdev -t aarch64-unknown-linux-gnu

1.4 Raspberry Pi 4のfirmwareを取得する。

gitレポジトリで管理されているので、まず、gitのインストールをする。

# emerge --ask dev-vcs/git

作業ディレクトリを作成する。

cd ~
mkdir raspberrypi4
cd raspberrypi4

Firmwareを取得する。

git clone -b stable --depth=1 https://github.com/raspberrypi/firmware

1.5 Raspberry Piのkernelのクロスコンパイル

作業ディレクトリにRaspberry Piのkernelを取得する。

git clone https://github.com/raspberrypi/linux

執筆時点で、3.4GBのサイズです。

ブランチを確認する。

cd ~/raspberrypi4/linux
git branch -a

今回は最新のrpi-4.19.yを利用する。

Kernelのconfigの生成をする。

ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make bcm2711_defconfig

Kernelのクロスコンパイル。

ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make -j2

今回VM上の低スペックGentoo(1CPU:1.6GHz/ RAM 2GB)で作成しているので、2-3時間ほどかかりました。

1.5 Micro SDのパーティションの作成

VMでUSB経由でMicro SDのパーティションを作成する場合、VMのUSBデバイスの設定を追加する必要があります。
以下の画像を参考にしてください。

f:id:NIPPA:20200128141921p:plain
VMのUSBデバイスの追加

パーティションの構成は

番号 パーティション フォーマット サイズ 用途
1 boot fat32 256 MiB ブートローダー領域
2 swap swap 4GiB スワップ領域
3 rootfs ext4 残りの領域 ディスク領域

今回は、fdiskコマンドで作成する。

fdisk /dev/[device]

[device]部分は適宜変更してください。

既存のパーティションがある場合は、

Command (m for help): d

で削除する。

ブート領域のパーティションの作成をする。 fdiskはデフォルトので512kbyte=1sectorとなっている。

Command (m for help): n
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-124735487, default 2048): [Enter]
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-124735487, default 124735487): +256M

Command (m for help): t
Partition number (1-3, default 3): 1
Partition type (type L to list all types): c

Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.

Boot flagをつける。

Command (m for help): a
Partition number (1-3, default 3): 1

スワップ領域のパーティションの作成をする。

Command (m for help): n
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2048-124735487, default 528384): [Enter]
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-124735487, default 124735487): +4G

Command (m for help): t
Partition number (1-3, default 3): 2
Hex code (type L to list all codes): 82

Changed type of partition 'Linux' to 'Linux swap / Solaris'.

ディスク領域のパーティションの作成をする。

Command (m for help): n
Select (default p): p
Partition number (3,4, default 1): 3
First sector (526337-124735487, default 1052672): [Enter]
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-124735487, default 124735487): 124735487

作成したパーティションの確認

Command (m for help): p

Device     Boot   Start       End   Sectors  Size Id Type
/dev/sdb1   *      2048    526336    524289  256M  c W95 FAT32 (LBA)
/dev/sdb2        528384   8916991   8388608    4G 82 Linux swap / Solaris
/dev/sdb3       8916992 124735487 115818496 55.2G 83 Linux

#パーティションテーブルを書き込んでfdiskを終了する。
w 

パーティションをフォーマットする。

mkfs -t vfat -F 32 /dev/sdb1
mkswap /dev/sdb2
mkfs -i 8192 -t ext4 /dev/sdb3

1.6 Gentoo linuxのインストール

mkdir /mnt/gentoo
mount /dev/sdb3 /mnt/gentoo

arm64-stage3をダウンロードし、展開する。

cd /mnt/gentoo
wget http://distfiles.gentoo.org/experimental/arm64/stage3-arm64-20191124.tar.bz2{,.CONTENTS,.DIGESTS}
tar xpvf stage3-arm64-20191124.tar.bz2 --xattrs-include='*.*' --numeric-owner

firmwareをMicro SDコピーする。

cp -rv ~/raspberrypi4/firmware/boot/* /mnt/gentoo/boot

ロスコンパイラしたkernelをコピーする。

cp ~/raspberrypi4/linux/arch/arm64/boot/Image /mnt/gentoo/boot/kernel8.img

Raspberry pi 4用のデバイスツリーをインストールする。

mv /mnt/gentoo/boot/bcm2711-rpi-4-b.dtb /mnt/gentoo/boot/bcm2711-rpi-4-b.dtb_32

cp ~/raspberrypi4/linux/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb /mnt/gentoo/boot

kernelモジュールをインストールする。

cd ~/raspberrypi4/linux/
ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- make modules_install INSTALL_MOD_PATH=/mnt/gentoo

インストールの確認

ls /mnt/gentoo/boot

bcm2708-rpi-b.dtb       bcm2710-rpi-2-b.dtb       bootcode.bin   fixup_cd.dat  kernel8.img       start4.elf
bcm2708-rpi-b-plus.dtb  bcm2710-rpi-3-b.dtb       COPYING.linux  fixup.dat     kernel.img        start4x.elf
bcm2708-rpi-cm.dtb      bcm2710-rpi-3-b-plus.dtb  fixup4cd.dat   fixup_db.dat  LICENCE.broadcom  start_cd.elf
bcm2708-rpi-zero.dtb    bcm2710-rpi-cm3.dtb       fixup4.dat     fixup_x.dat   overlays          start_db.elf
bcm2708-rpi-zero-w.dtb  bcm2711-rpi-4-b.dtb       fixup4db.dat   kernel7.img   start4cd.elf      start.elf
bcm2709-rpi-2-b.dtb     bcm2711-rpi-4-b.dtb_32    fixup4x.dat    kernel7l.img  start4db.elf      start_x.elf

ls /mnt/gentoo/lib/modules
4.19.97-v8+

1.7 rasberrypi/toolsのコンパイル

githubからtoolsを取得する。

cd ~/raspberrypi4
git clone https://github.com/raspberrypi/tools

armstub8-gic.binをビルドする。

cd tools/armstubs

make CC8=aarch64-unknown-linux-gnu-gcc LD8=aarch64-unknown-linux-gnu-ld OBJCOPY8=aarch64-unknown-linux-gnu-objcopy OBJDUMP8=aarch64-unknown-linux-gnu-objdump armstub8-gic.bin

ビルドしたarmstub8-gic.binをデバイスにインストールする。

cp armstub8-gic.bin /mnt/gentoo/boot

1.8 ハードウェアの設定

1.8.1 Bluetoothの設定

Raspberry Piではuart(Universal Asynchronous Receiver Transmitter)にBluetoothが接続されているので、uartをconsoleとして使用する場合は競合します。そこで、起動時のttyAMA0にシリアル接続の割当をオフにします。

vim /mnt/gentoo/etc/inittab

ファイルの以下の部分を以下のようにコメントアウトする。
#f0:12345:respawn:/sbin/agetty 9600 ttyAMA0 vt100

99-com.rulesを作成する。エディタでファイルを開き、

vim /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"

を書き込み、保存する。

1.8.2 Bluetoothfirmwareのダウンロード

以下のファイルを取得する必要がある。 - brcmfmac43455-sdio.bin - brcmfmac43455-sdio.clm_blob - brcmfmac43455-sdio.txt - BCM4345C0.hcd

RasbianのDistrubutionから取得できる。

ディレクトリを作成する。

mkdir -p /mnt/gentoo/lib/firmware/brcm

必要なファイルをレポジトリから取得する。

wget -P /mnt/gentoo/lib/firmware/brcm https://raw.github.com/RPi-Distro/bluez-firmware/master/broadcom/BCM4345C0.hcd

wget -P /mnt/gentoo/lib/firmware/brcm https://raw.github.com/RPi-Distro/firmware-nonfree/master/brcm/brcmfmac43455-sdio.bin

wget -P /mnt/gentoo/lib/firmware/brcm https://raw.github.com/RPi-Distro/firmware-nonfree/master/brcm/brcmfmac43455-sdio.clm_blob

wget -P /mnt/gentoo/lib/firmware/brcm https://raw.github.com/RPi-Distro/firmware-nonfree/master/brcm/brcmfmac43455-sdio.txt

1.9 Gentooのセットアップ

1.9.1 ルートのパスワードの設定

作業しているrootユーザのパスワードをそのまま利用する場合、

cat /etc/shadow | grep "root:"

で出力されたものを、/mnt/gentoo/etc/shadowに書き込む。

1.9.2 fstabの編集

/mnt/gentoo/etc/fstabを開き編集する。Raspberry PiでのSDカードのmmcblk0で認識される。

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

1.9.3 /boot/config.txtの編集

/mnt/gentoo/boot/config.txtを作成し、以下を書き込む。

# set 64 bit mode
arm_64bit=1

enable_gic=1
armstub=armstub8-gic.bin

# 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

1.9.4 /boot/cmdline.txtの編集

/mnt/gentoo/boot/cmdline.txtを作成し、以下を書き込む。

root=/dev/mmcblk0p3 rootfstype=ext4 rootwait

1.9.5 Keymapの設定

/mnt/gentoo/etc/conf.d/keymapsに設定を書き込む。

USキーボードの場合、

keymap="us"

JPキーボードの場合、

keymap="jp"

を書き込む。

2. Raspberry Pi の起動

無事起動すれば、インストール終了です。

Kernelパニックの場合は、config.txtの設定に問題があると思いますので、そこを確認してくだい。

3. 起動後の設定

3.1 有線LANの設定

up状態のネットワークインターフェイスを確認する。

ifconfig

loのローカルネットワークインターフェイス名のみだった場合は、

ifconfig -a

でdown状態のネットワークインターフェイス名も確認できる。

また、利用可能なネットワークインターフェイス名は

ls /sys/class/net

で確認できる。有線のeth0と無線のwlan0になる。

ネットワークインターフェイスのup・downの以下のコマンドで切り替えする。

# Up
ip link set dev [interface name] up
# down
ip link set dev [interface name] down

まず、eth0の設定を行う。eth0をup状態する。

初期起動設定は、loネットワークからリンクを作成して行う。

cd /etc/init.d
ln -s net.lo net.eth0

/etc/conf.d/netを編集して、ネットワークの設定をする。

nano  /etc/conf.d/net

適した設定を行う。設定例は以下の通り。

# DHCPを使う場合
config_eth0="dhcp"

# CIDR記法で静的IPを設定する場合
config_eth0="192.168.0.7/24"
routes_eth0="default via 192.168.0.1"
dns_servers_eth0="192.168.0.1 8.8.8.8"
  
# ネットマスクによる記法で静的IPを設定する場合
config_eth0="192.168.0.7 netmask 255.255.255.0"
routes_eth0="default via 192.168.0.1"
dns_servers_eth0="192.168.0.1 8.8.8.8"

参考:Gentoo Linux ハンドブック:ネットワーク設定

ネットワークの起動・停止は以下の通り。

/etc/init.d/net.eth0 start
/etc/init.d/net.eth0 stop

ランレベルの設定を行う。

rc-update add net.eth0 default
rc

ネットワークの確認を行う。

ifconfig
ping -c 3 www.gentoo.org

3.2 レポジトリの更新

日時の設定をする。

date [MMDDhhmmYYYY]

インターネットにアクセスできる環境が構築できたら、レポジトリの更新を行う。

emerge --sync

3.3a 無線LANの設定: net-wireless/iw

オープンネットワークであれば、net-wireless/iwで接続可能。

`net-wireless/iwのインストール。

emerge --ask net-wireless/iw

SSIDを指定して、接続する。

iw dev wlan0 connect -w [SSID]

初期起動設定は、loネットワークからリンクを作成して行う。

cd /etc/init.d
ln -s net.lo net.wlan0

/etc/conf.d/netを編集して、ネットワークの設定をする。

nano  /etc/conf.d/net

ネットワークの起動・停止は以下の通り。

/etc/init.d/net.wlan0 start
/etc/init.d/net.wlan0 stop

ランレベルの設定を行う。

rc-update add net.eth0 default
rc

3.3b 無線LANの設定: net-wireless/wpa_supplicant

WPA、WPA2を利用する場合、net-wireless/wpa_supplicantをインストールする。

emerge --ask net-wireless/wpa_supplicant

/etc/conf.d/netでwireless-toolsよりもwpa_supplicantの優先度を上げる。

# Prefer wpa_supplicant over wireless-tools
modules="wpa_supplicant"

/etc/wpa_supplicant/wpa_supplicant.confを作成し、編集する。

例として、WPA2の設定になります。

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel
update_config=1

network={
        ssid="SSID name"
        psk=XXXXXXXXXXXXXXXXXXXXXXXXXX
        scan_ssid=1
        proto=WPA2
        key_mgmt=WPA-PSK
        group=TKIP CCMP WEP104 WEP40
        pairwise=TKIP CCMP
        priority=3
}

dhcpを利用する場合、net-misc/dhcpcdをインストールする。

emerge --ask net-misc/dhcpcd

/etc/conf.d/netに以下を追記する。

module_wlan0="wpa_supplicant"
config_wlan0="dhcp"

インターフェイスdhcpの設定をする。

dhcpcd wlan0

dhcpcdの起動(停止)をする。

# start
/etc/init.d/dhcpcd start

#stop
/etc/init.d/dhcpcd stop

wpa_supplicantの起動(停止)をする。

# start
/etc/init.d/wpa_supplicant start

#stop
/etc/init.d/wpa_supplicant stop

ランレベルの設定。

# dhcpcd
rc-update add dhcpcd default

# wpa_supplicant
rc-update add wpa_supplicant default

これで起動した際にネットワークが自動起動し、指定したSSIDがあれば自動接続を行う。

感想

最小構成のGentooRaspberry Pi 4B+にインストールし、ネットワークの設定を行いました。

次からGentooのカスタムをしていきます。

ではでは、また次回。