どうも、nippaです。
Raspberry Pi 4 model B に Raspbian をインストールして使っていたのですが、現時点で32bit版で使いづらかったので、64bit版OSをどうにかして入れたいのが理由です。
CPUは64bitです(BCM2711 - Raspberry Pi Documentation)。
現時点で使えるラズパイ4で64bitを使うとすると、
- Ubuntu MATE
- RaspbianのKernelを64bitに差し替える
- Gentoo Linux
Ubuntu MATE以外はコンパイルが必要です。Gentoo修行をしているので、今回もGentooをインストールします。 公式ページを参考にしています。
- 環境
- 1. 作業用Gentooでの事前準備
- 2. Raspberry Pi の起動
- 3. 起動後の設定
- 感想
環境
作業用: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デバイスの設定を追加する必要があります。
以下の画像を参考にしてください。
パーティションの構成は
番号 | パーティション名 | フォーマット | サイズ | 用途 |
---|---|---|---|---|
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 Bluetoothのfirmwareのダウンロード
以下のファイルを取得する必要がある。 - 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"
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があれば自動接続を行う。
感想
最小構成のGentooをRaspberry Pi 4B+にインストールし、ネットワークの設定を行いました。
次からGentooのカスタムをしていきます。
ではでは、また次回。