背景
みなさんはRaspberry PiにはRaspbianという,Debianから派生したOSを入れていると思います.Raspberry Pi FoundationもRaspbianが公式のOSだと謳っています.
なぜデフォルトがDebianではないのか
32ビットARM向けのDebianには armel
と armhf
の2種類があります1.前者はARMv4T以上,後者はARMv7 (かつThumb-2およびVFP3-D162) 以上をサポートします.
ところで,Raspberry PiのARMのバージョンは以下となっています.全モデルのRaspberry Piで同じOSを使うとすると,Raspberry Pi 1がARMv6なので,まず armhf
は使えません.しかし armel
はsoft float (たぶん3) なので使いたくなかったみたいです4.
モデル | ARMのバージョン |
---|---|
Raspberry Pi 1 | ARMv6 |
Raspberry Pi 2 | ARMv7 |
Raspberry Pi 3 | ARMv8 |
そこで,Raspberry Pi 1でも対応しているVFPv2を使うDebianのポートを作ることにしたっぽい.根気がすごいですね.
Debian for 64-bit ARM
Raspberry Pi 3はRaspbianとかだと32ビットの互換モードで動きますが,ちゃんとしたARMv8なので64ビットでも動きます.
ところで,Debianにはarm64
という64ビットARM向けのポートがあります.
https://wiki.debian.org/RaspberryPi3 を見てみたら,公式のDebian arm64
イメージをそのままRaspberry Pi 3で動かせそうだったのでやってみました.
今思えばRaspberry Pi 2,3でarmhf
動かせるよな.こっちの方が需要ありそう.
Raspberry Pi 3を64ビットモードで動かす手順
基本的には https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=137963 や https://wiki.gentoo.org/wiki/Raspberry_Pi_3_64_bit_Install に書いてあるので詳しくは書きません.
- Debianの
qemu-debootstrap
で/
をインストールする. -
/boot
を適当に準備する.-
start_cd.elf
とfixup_cd.dat
- カーネルとモジュールを https://packages.debian.org/stretch/linux-image-4.9.0-4-arm64 から持ってくる.
- device tree
bcm2837-rpi-3-b.dtb
は https://packages.debian.org/stretch/linux-image-4.9.0-4-arm64 にあるやつを使う.起動するカーネルとバージョンが合わないとブートしないので注意.- バージョン合わせをよしなにやってくれるスクリプト
/etc/kernel/postinst.d/raspi3-dtb
を書いた5のでぜひ使ってください.
- バージョン合わせをよしなにやってくれるスクリプト
-
config.txt
とcmdline.txt
の例は下に書いておきます.- 初回起動時はinitrdがないので,initrdのエントリはコメントアウトします.
- ファイルがなかったり間違えてたりしたらTFTPのロードやNFSのマウントが止まるので,トラブルシューティングの参考にしてください.
-
- 起動する.
-
raspi3-dtb
スクリプトをコピーする. -
apt-get update && apt-get install linux-image-arm64
- ここでinitrdが作られます.
arm_64bit=1
kernel=vmlinuz64
# 初回起動時はコメントアウトし,以降はコメントアウトしない.
initramfs initrd64.img
cmdline=cmdline.txt
device_tree=bcm2837-rpi-3-b.dtb
enable_uart=1
gpu_mem=16
console=ttyAMA0,115200 root=/dev/nfs nfsroot=${サーバのIPアドレス}:/srv rw ip=dhcp rootwait rootdelay=2
#!/bin/sh -e
version="$1"
if [ -z "${version}" ]; then
echo >&2 "W: $0: ${DPKG_MAINTSCRIPT_PACKAGE:-kernel package} did not pass a version number"
exit 2
fi
if [ -n "$2" ]; then
bootdir=$(dirname "$2")
else
bootdir="/boot"
fi
dtb="/usr/lib/linux-image-${version}/broadcom/bcm2837-rpi-3-b.dtb"
dtb_base=$(basename "${dtb}")
dtb_new="${bootdir}/${dtb_base}-${version}"
cp "${dtb}" "${dtb_new}"
if [ "${bootdir}" = "/boot" ]; then
ln -fs "boot/${dtb_base}-${version}" "/${dtb_base}"
fi
-
Raspberry Pi 2,3はVFPv4なのでOK: https://github.com/Terminus-IMRC/auxv-rpi ↩
-
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472jj/chr1359124234797_00011.html によるとARM1136JF-Sまでずっとsoft floatだが, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/index.html によるとARM1136JF-SはARMv6で,そうなるとARMv6まではずっとsoft floatだったんだなって. ↩
-
公式っぽいスクリプトがある https://packages.debian.org/stretch/raspi3-firmware が,なんか /boot/firmware にSDカードをマウントすることを前提に作られていて,自分の環境と合わなかったので自分で書いた. ↩