Posts 为树莓派 4 安装纯净的 arm64 Debian GNU/Linux 系统
Post
Cancel

为树莓派 4 安装纯净的 arm64 Debian GNU/Linux 系统

为树莓派 4 安装 arm64 的 Debian

树莓派 4 也出来好久了,最近有攒下来的零花钱可以买了,于是就买了一块。但因为我是 Debian Puriest, 所以不是很喜欢 Raspbian ,刚巧树莓派 4 也有了 64 位内核,就准备折腾为它安装一个纯净的 Debian 。话不多说,立即开始。

本文适用于想折腾的用户,需要一定的 Linux 基础知识。并且已经有其它方法来达到同样的目标。

本文参考了:https://david.wragg.org/blog/2020/01/installing-64-bit-debian-on-rpi.html

前期准备

为了达成这个目标,你需要:

  • 一台树莓派 4B。
  • 一台 Linux 机器,保存临时备份的文件(虚拟机或许也行)。
  • debootstrap 程序,你可以在大多数发行版中的软件包仓库中找到。
  • 一个显示器和一套键鼠,用于第二阶段安装(如果没有多余的,可以使用串口连接到电脑)。
  • 一张已经刷入了 Raspbian 的 SD 卡(你可以将 Debian 直接与现有系统替换)。
  • 稳定的网络连接。
  • 一双灵巧的手、清醒的大脑。

如果你要安装其他发行版的 Linux,大致步骤也许是差不多的,不过在安装前请仔细阅读相应的发行版的安装手册。

接下来请浏览一遍大致步骤,然后再做决定;你也可以浏览文章最后的 FAQ 一节来了解更多细节。

大致步骤

文章通过在另一台 Linux 机器上执行 debootstrap 来替换当前的 Raspberry Pi OS,保留之前使用的内核、固件和模块。

整个过程可以概括为:

  1. 刷入 Raspbian 并设置 WiFi 基本设置。
  2. 更新树莓派的内核和固件。
  3. 启用 64 位内核并使用该内核启动系统。
  4. 将树莓派的启动介质挂载在 Linux 上。
  5. 备份重要设置、内核模块(/lib/modules)、固件(/lib/firmware)到 Linux。
  6. 擦除分区,使用 debootstrap 安装新系统。
  7. 启动树莓派并进行第二阶段的安装。注意,在该阶段需要显示器和键盘,或串口控制台。
  8. 手动设置新安装好的 Debian。

注意事项

  • 尽管是使用 Raspbian 内核,3D 和硬件加速也许不可用(因为我并没有试过安装桌面)。
  • 此操作会升级你的固件。
  • 安装过程中无法使用 SSH !在进行第二阶段安装以及安装后联网之前你只能使用显示器和键盘,或串口控制台操作你的树莓派。
  • debootstrap 是一个可以在某个文件系统中部署最小 Debian 系统的工具,是 Debian 安装器的一部分。它可以运行在当前运行的 Linux 上,支持跨架构安装。它分为两个步骤,第一个步骤负责下载软件包并准备安装环境;第二阶段负责安装基本系统和软件包。

让我们开始吧!

0x00 Raspbian 安装和配置

首先,前往下载 Raspbian。使用你喜欢的工具将其写入 SD 卡并安装在树莓派上。

将网线连接至树莓派。如果没有,则可以在配置之后手动连接 Wi-Fi。

待树莓派启动后,立即运行配置工具。

1
sudo raspi-config

你一定需要做的事情就是设置 Wi-Fi 区域。Wi-Fi 区域如果不被设置,在安装完系统之后很可能无法工作:

  1. 选择 Network Settings
  2. 选择 Wireless LAN
  3. 此时它会提示你设置 Wi-Fi 区域。

你也可以进行你想做的其他配置,比如配置声音输出等。
如果你没有连接以太网,请使用 raspi-config 配置好你的 Wi-Fi 连接!

配置完毕,接下来更换镜像源(如果需要),然后升级系统:

1
sudo apt update && sudo apt upgrade

现在你需要将树莓派的内核和固件升级到最新测试版:

1
sudo rpi-update
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** We're running for the first time
 *** Backing up files (this will take a few minutes)
 *** Backing up firmware
 *** Backing up modules 4.19.97-v7l+
#############################################################
WARNING: 'rpi-update' updates to pre-releases of the linux 
kernel tree and Videocore firmware.

'rpi-update' should only be used if there is a specific 
reason to do so - for example, a request by a Raspberry Pi 
engineer.

DO NOT use 'rpi-update' as part of a regular update process.

##############################################################
Would you like to proceed? (y/N)

在这里输入 y 并回车,开始更新。更新可能需要等待较长时间。 在内核升级完之后,你需要以 root 身份编辑 /boot/config.txt 以启用 64 位内核:

1
2
3
sudo -s
echo arm_64bit=1 >> /boot/config.txt
exit

在更换新内核之前可以查看一下 uname 的输出:

1
2
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux

cat /proc/cpuinfo :

1
2
3
4
5
6
7
8
9
processor	: 0
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 108.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

time echo 'scale=2000;4*a(1)' | bc -l 计算圆周率(仅供娱乐):

1
2
3
real	0m3.827s
user	0m3.798s
sys	    0m0.014s

现在关闭你的树莓派,拔下 SD 卡,将其插入读卡器,连接到另一台 Linux 机器。


0x01 备份重要文件

在正式安装之前,我们需要备份一些重要的配置文件。

Debian 原生不提供(?)适用于树莓派 4 的内核模块和固件,所以我们只能使用现成的。

  • fstab 文件也需要备份,因为 debootstrap 并不会自动生成这些文件。
  • /etc/wpa_supplicant/wpa_supplicant.conf 也需要备份,因为里面包含有 Wi-Fi 配置信息。

找一个临时文件夹,然后进入 root Shell。假设你的 rootfs 设备为 /dev/sda2 ,挂载在 /mnt/sdroot :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo -s     # 进入 root Shell
export TMPDIR=/tmp  # 设置临时文件夹,当然你可以手动新建一个文件夹
mkdir /mnt/sdroot   # 创建目录
mount /dev/sda2 /mnt/sdroot     # 挂载根文件系统

# 备份内核模块和固件
cp -a /mnt/sdroot/lib/firmware /mnt/sdroot/lib/modules $TMPDIR/
# 备份 fstab 和 wpa_supplicant.conf
cp -a /mnt/sdroot/etc/fstab $TMPDIR/fstab
cp -a /mnt/sdroot/etc/wpa_supplicant/wpa_supplicant.conf $TMPDIR/wpa_supplicant.conf

# 卸载文件系统
umount /mnt/sdroot
exit
  • 如果你需要在安装完成之后立即获得网络连接,你可能需要提前写一个 interfaces 文件。下面是示例:
    1
    2
    3
    
    auto eth0
    allow-hotplug eth0
    iface eth0 inet dhcp
    

0x02 安装 Debian

备份完成,我们可以抹除之前的数据了:

1
sudo mkfs.ext4 -L debian /dev/sda2

现在请挂载你的文件系统,执行 debootstrap 来安装一个最小的 Debian Buster 系统:

1
2
sudo mount /dev/sda2 /mnt/sdroot
sudo debootstrap --include=wpasupplicant,dbus --arch=arm64 --foreign buster /mnt/sdroot

相应地,如果你想用 sid 分支,将 buster 改为 sid 即可。

如果你需要镜像源来获得更快的下载速度,请执行:

1
sudo debootstrap --include=wpasupplicant,dbus --arch=arm64 --foreign buster /mnt/sdroot http://mirrors.ustc.edu.cn/debian/

如果中途失败,你可以重新执行本条命令。

等待安装完成,然后来做一些配置。首先我们需要挂载启动分区(即那个 100M 大小,名称为 boot 的 FAT32 分区)。

1
2
sudo mkdir /mnt/boot
sudo mount /dev/sda1 /mnt/boot

之后我们需要恢复之前备份的文件,假设备份的文件在 /tmp

1
2
3
4
5
6
7
8
sudo -s
export TMPDIR=/tmp
# 恢复备份的模块和固件
cp -a $TMPDIR/firmware /mnt/sdroot/lib/firmware
cp -a $TMPDIR/modules /mnt/sdroot/lib/modules
# 恢复 fstab 和 wpa_supplicant.conf
cp -a $TMPDIR/fstab /mnt/sdroot/etc/fstab
cp -a $TMPDIR/wpa_supplicant.conf /mnt/sdroot/etc/wpa_supplicant

这时候请不要着急,我们还有一些工作要做。要在本地网络上区别你的树莓派,你需要重新指定主机名:

1
echo yourhostname > /mnt/sdroot/etc/hostname
  • 如果你准备提前写好 interfaces 文件,请在此时写入到目标分区。

接下来你需要检查 fstab 文件以及 /mnt/boot/cmdline.txt 中的 root 参数,根文件系统的标识点必须与 blkid 中相应分区的的输出结果 PARTUUID 一致。否则你的树莓派将无法进入系统。

  • 如果你使用串口,请编辑 /mnt/boot/cmdline.txt ,将 console=tty1 改为 console=ttyS0 。之后你可以以 115200, 8N1 的参数连接串口。

在上述步骤全部完成之后,卸载文件系统,将安装了 Debian 的 SD 卡插入树莓派启动。

1
sudo umount /mnt/sdroot /mnt/boot ; sync ; sync

0x03 第二阶段

如果你连接了显示器或串口,你应看到输出的内核消息。等屏幕不再滚动,敲一下回车,一个非常简陋的 Shell 就会被激活。这个 Shell 的简陋程度是:它不支持命令历史记录,不支持 Tab 补全,你仅仅能按下的其他按键只有退格键和回车。所以每一条命令都要小心执行。

现在我们需要挂载一些必要的文件系统,然后进行 debootstrap 的第二阶段。第二阶段会解包基本系统,安装核心组件。

1
2
3
mount /proc
mount -o remount,rw /dev/root /
/debootstrap/debootstrao --second-stage

此阶段同样需要等待一段时间。如果你没有连接显示器或串口,你需要等待至少 5 分钟或直到 ACT LED 不再亮起或闪动。 接下来的步骤非常重要,我们需要设置 root 用户的密码,否则重启后你无法登录。

1
passwd

输入你的 root 密码,敲回车,再输入一遍密码敲回车。密码设置完成后,卸载文件系统,同步写入并重启:

1
mount -r -o remount -f /dev/root ; sync ; sync ; reboot -f

0x04 配置 Debian

到此时我们的纯 Debian 就安装好了,尽管它还是个最小安装,我们依然可以通过软件包来增加功能来满足基本需求。

首先配置网络(如果你之前备份了 interfaces 文件并恢复了它,或者你已经提前写好了该文件,可以跳过):

1
nano /etc/network/interfaces

对于一个连接了有线网络,并且网络内有 DHCP 的系统,你可以这样填写:

1
2
3
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp

对于无线网络:

1
2
3
4
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
	wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

保存文件,执行 ifup 来使设置生效:

1
ifup eth0

过几秒,你的树莓派应该连接到了网络:

1
ip addr

连接到了网络,你现在可以直接像以前一样操作 Debian 了:

1
apt update && apt upgrade

配置本地化、时区和键盘布局:(一般情况下我们需要 American English 作为键盘布局)

1
2
3
4
5
dpkg-reconfigure tzdata
apt install locales
dpkg-reconfigure locales
apt install console-setup
dpkg-reocnfigure keyboard-configuration

然后安装基本系统工具:

1
2
3
4
5
apt update

tasksel install standard ssh-server

apt install accountsservice bash-completion ca-certificates curl git htop perl sudo dnsutils net-tools openssl neofetch cowsay bc

添加用户:

1
2
adduser user
usermod -aG sudo user  # 将其添加至 sudo 组中

重启你的树莓派,恭喜你,大功告成,你的 Debian 基本系统已经安装好了。 接下来看看它的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ neofetch

       _,met$$$$$gg.          user@hostname 
    ,g$$$$$$$$$$$$$$$P.       ------------------ 
  ,g$$P"     """Y$$.".        OS: Debian GNU/Linux 10 (buster) aarch64 
 ,$$P'              `$$$.     Host: Raspberry Pi 4 Model B Rev 1.2 
',$$P       ,ggs.     `$$b:   Kernel: 4.19.113-v8+ 
`d$$'     ,$P"'   .    $$$    Uptime: 17 mins 
 $$P      d$'     ,    $$P    Packages: 721 (dpkg) 
 $$:      $$.   -    ,d$$'    Shell: bash 5.0.3 
 $$;      Y$b._   _,d$P'      Terminal: /dev/pts/0 
 Y$$.    `.`"Y$$$$P"'         CPU: (4) @ 1.500GHz 
 `$$b      "-.__              Memory: 193MiB / 3755MiB 
  `Y$$
   `Y$$.                                              
     `$$b.
       `Y$$b.
          `"Y$b._
              `"""

uname -a :

1
Linux hostname 4.19.113-v8+ #1300 SMP PREEMPT Thu Mar 26 17:04:40 GMT 2020 aarch64 GNU/Linux

cat /proc/cpuinfo :

1
2
3
4
5
6
7
8
processor	: 0
BogoMIPS	: 108.00
Features	: fp asimd evtstrm crc32 cpuid
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

再次娱乐一下,计算圆周率 time echo 'scale=2000;4*a(1)' | bc -l :

1
2
3
real	0m11.069s
user	0m11.053s
sys 	0m0.014s

后日谈

我不会告诉你这个词从哪里学到的( Debian 算是装完了,但是想要的东西还是没有,怎么办?不同的人有不同的需求,我可以把我遇到的问题一一列出:

Q: 我想输出声音,怎么办?

A:你可以安装声音支持包。但是仍然需要一些配置。

1
sudo apt install alsa-base pulseaudio alsa-utils

然后确认 /boot/config.txt 中有该项内容并且并没有被注释掉:

1
dtparam=audio=on

重启树莓派,执行 aplay -lL 看看是否有 3 个输出设备。

接下来执行 pactl list sinks,如果你得到了一个单声道(Mono)输出,请按照以下步骤执行:

  • 编辑 /usr/share/pulseaudio/alsa-mixer/profile-sets/default.conf,将 [Mapping analog-mono] 一节全部使用分号 ; 注释掉:

    1
    2
    3
    4
    5
    6
    7
    
       104	;[Mapping analog-mono]
       105	;device-strings = hw:%f
       106	;channel-map = mono
       107	;paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono
       108	;paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headset-mic
       109	;priority = 7
       110	
    
    • 重启你的设备,再次执行 pactl list sinks 你应该会得到双声道输出。

Q:如何切换输出设备?

通过执行 amixer cset numid=3 1 可以将输出切换到 3.5mm 端口。 类似的,将值 1 改为 2 即可切换到 HDMI1,3 则为 HDMI2。

Q:我的输出没有声音 / 太小了!

A:你的输出设备可能被静音或者输出级别太低。

  • 运行 alsamixer
  • 按下 F6,选择声卡,回车。检查有没有设备被静音(竖条下面显示 MM 即被静音)。
  • 如果有,按 键将高亮移动到那个输出,按下 M
  • 如果你看到了白色条很低的设备,移动到它上面,按 调整音量。 待调整到合适的音量后,按 ESC 退出。

Q:我想把声音强制输出到 3.5mm 口,如何操作?

A:确实可以做到。对内核模块 snd_bcm2835 指定参数即可让声卡只有一个输出设备。

  • 按照论坛页面的指引,编辑 /boot/cmdline.txt (注意,该文件只能有一行),在文件尾部追加以下内容:
    1
    
    snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1 snd_bcm2835.enable_compat_alsa=0
    
  • 重启树莓派,执行 aplay -lL,你会发现输出设备变成了一个。

Q: 蓝牙在哪里呀?怎么才能让蓝牙工作呢?

A: 关于蓝牙的更多信息,请浏览这篇后续文章

Q:树莓派 4B 的千兆网卡是真的么?

A:的确是真的!你真的可以跑出至少 990Mbps 的下载速度。

  • 以下是台式机和树莓派之间 iperf3 的结果。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
      $ iperf3 -c 192.168.1.4 -p 2333
      Connecting to host 192.168.1.4, port 2333
      [  5] local 192.168.1.254 port 49212 connected to 192.168.1.4 port 2333
      [ ID] Interval           Transfer     Bitrate         Retr  Cwnd
      [  5]   0.00-1.00   sec   113 MBytes   949 Mbits/sec    0    246 KBytes       
      [  5]   1.00-2.00   sec   112 MBytes   942 Mbits/sec    0    246 KBytes       
      [  5]   2.00-3.00   sec   112 MBytes   942 Mbits/sec    0    280 KBytes       
      [  5]   3.00-4.00   sec   112 MBytes   942 Mbits/sec    0    291 KBytes       
      [  5]   4.00-5.00   sec   112 MBytes   944 Mbits/sec    0    291 KBytes       
      [  5]   5.00-6.00   sec   112 MBytes   944 Mbits/sec    0    310 KBytes       
      [  5]   6.00-7.00   sec   112 MBytes   938 Mbits/sec    0    310 KBytes       
      [  5]   7.00-8.00   sec   113 MBytes   946 Mbits/sec    0    310 KBytes       
      [  5]   8.00-9.00   sec   112 MBytes   939 Mbits/sec    0    310 KBytes       
      [  5]   9.00-10.00  sec   112 MBytes   943 Mbits/sec    0    310 KBytes       
      - - - - - - - - - - - - - - - - - - - - - - - - -
      [ ID] Interval           Transfer     Bitrate         Retr
      [  5]   0.00-10.00  sec  1.10 GBytes   943 Mbits/sec    0             sender
      [  5]   0.00-10.04  sec  1.10 GBytes   938 Mbits/sec                  receiver
    
      iperf Done.
    
  • 以下是树莓派与台式机之间 iperf3 的结果。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
      $ iperf3 -c 192.168.1.254 -p 2333
      Connecting to host 192.168.1.254, port 2333
      [  5] local 192.168.1.4 port 54788 connected to 192.168.1.254 port 2333
      [ ID] Interval           Transfer     Bitrate         Retr  Cwnd
      [  5]   0.00-1.00   sec  70.4 MBytes   590 Mbits/sec    0    373 KBytes       
      [  5]   1.00-2.00   sec  67.7 MBytes   568 Mbits/sec    0    373 KBytes       
      [  5]   2.00-3.00   sec  68.6 MBytes   575 Mbits/sec    0    373 KBytes       
      [  5]   3.00-4.00   sec  68.6 MBytes   575 Mbits/sec    0    373 KBytes       
      [  5]   4.00-5.00   sec  68.2 MBytes   572 Mbits/sec    0    373 KBytes       
      [  5]   5.00-6.00   sec  69.3 MBytes   582 Mbits/sec    0    373 KBytes       
      [  5]   6.00-7.00   sec  69.5 MBytes   583 Mbits/sec    0    373 KBytes       
      [  5]   7.00-8.00   sec  68.4 MBytes   573 Mbits/sec    0    373 KBytes       
      [  5]   8.00-9.00   sec  68.7 MBytes   576 Mbits/sec    0    373 KBytes       
      [  5]   9.00-10.00  sec  68.2 MBytes   573 Mbits/sec    0    373 KBytes       
      - - - - - - - - - - - - - - - - - - - - - - - - -
      [ ID] Interval           Transfer     Bitrate         Retr
      [  5]   0.00-10.00  sec   688 MBytes   577 Mbits/sec    0             sender
      [  5]   0.00-10.04  sec   686 MBytes   573 Mbits/sec                  receiver
    
      iperf Done.
    

在文章的最后,希望大家能多多支持原文章作者和我!Enjoy your Pure Debian experience with your Raspberry Pi!

Copyright (C) Cyanoxygen, published under CC BY-SA NC 3.0.

This post is licensed under CC BY 4.0 by the author.

Welcome to Reliena’s Garage!

为运行非官方 Linux 的树莓派 4B 找回蓝牙功能

Comments powered by Disqus.