在树莓派3上运行官方的arm64 Debian操作系统
背景 –
我相信大家都会在Raspberry Pi上安装Raspbian这个从Debian衍生出来的操作系统。Raspberry Pi基金会也宣称Raspbian是官方操作系统。
为什么默认选项不是Debian呢?
有两种类型的Debian适用于32位ARM处理器:armel和armhf。前者支持ARMv4T及更高版本,而后者支持ARMv7(同时支持Thumb-2和VFP3-D162)。
顺便提一下,Raspberry Pi的ARM版本如下所示。如果在所有Raspberry Pi型号上使用相同的操作系统,由于Raspberry Pi 1是ARMv6,所以首先无法使用armhf。然而,armel是软浮点(可能是3),所以似乎不想使用它4。
所以,他们似乎决定创建一个适用于Raspberry Pi 1的Debian端口,使用VFPv2指令集。真是坚持不懈啊。
64位ARM架构上的Debian
根据中文描述的要求,下面是对文本的本地化转述(转述为标准中文):
树莓派3代在Raspbian等操作系统上可以以32位兼容模式运行,但实际上它是ARMv8架构的,所以也可以以64位模式运行。
另外,Debian还有一种专门为64位ARM架构定制的版本,称为arm64。
查看了https://wiki.debian.org/RaspberryPi3,发现可以直接在树莓派3代上运行官方的Debian arm64镜像,于是尝试了一下。
现在回想起来,树莓派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获取内核和模块。
-
- 使用https://packages.debian.org/stretch/linux-image-4.9.0-4-arm64中的bcm2837-rpi-3-b.dtb设备树文件。请注意要与启动的内核版本相匹配,否则无法启动。
-
- 请使用我编写的/etc/kernel/postinst.d/raspi3-dtb脚本来进行版本匹配。
-
- 下面提供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
https://www.debian.org/ports/ 可以在Raspberry Pi 2和3上使用VFPv4:https://github.com/Terminus-IMRC/auxv-rpi
根据http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472jj/chr1359124234797_00011.html,ARM1136JF-S一直都是软浮点,然而根据http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/index.html,ARM1136JF-S是基于ARMv6的,因此在ARMv6之前都一直是软浮点。
https://www.raspbian.org/RaspbianFAQ
有一个类似官方脚本的脚本https://packages.debian.org/stretch/raspi3-firmware,但是它假设SD卡已经挂载在/boot/firmware,与我的环境不兼容,所以我自己写了一个。