烧录系统镜像

下载镜像

由于笔者用的是4B 8G版,所以镜像选择arm64(2021-05-07-raspios-buster-arm64.img)。

官网下载速度太慢,所以我们选择了清华源

使用命令行烧录

在MacOS上烧录镜像有两种方式

  1. 使用Raspberry Pi Imager,优点是使用简单
  2. 命令行模式,使用dd命令

作为爱折腾的程序员,当然是选择命令行模式了,还可以顺便研究下启动镜像的原理

  1. diskutil list找到SD Card所在磁盘号 N
  2. diskutil unmountDisk /dev/diskN,只有当成功卸载后,才可以使用dd将镜像文件写入SD Card,否则会报Resource busy错误
  3. sudo dd bs=1m if=/Users/leosocy/Downloads/2021-05-07-raspios-buster-arm64.img of=/dev/rdiskN; sync

将上面的N替换为SD Card对应的序号

稍等几分钟之后,镜像烧录完成,

3564+0 records in
3564+0 records out
3737124864 bytes transferred in 359.440753 secs (10397054 bytes/sec)

➜ diskutil list
/dev/disk2 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *248.4 GB disk2
1: Windows_FAT_32 ⁨boot⁩ 268.4 MB disk2s1
2: Linux ⁨⁩ 3.5 GB disk2s2
(free space) 244.7 GB -

几个小疑问

为什么dd成功之后,SD Card自动就有了几个分区?

树莓派的BIOS怎么识别到烧录进SD Card的操作系统的?

计算机的启动过程大致分为以下几个步骤

  1. 按下开机键,CPU将PC寄存器的值强制初始化为0xffff0,这个位置是BIOS程序的入口地址
  2. 该入口地址处是一个跳转指令,跳转到0xfe05b位置,开始执行真正的BIOS程序
  3. BIOS按照启动区的顺序,读取这些启动盘中位于0盘0道1扇区的内容,该内容一共有512字节,如果末尾的两个字节分别是0x550xaa,那么BIOS就会认为它是个启动区
  4. BIOS找到启动区之后把512字节的内容,全部复制到内存的0x7c00这个位置,然后将PC寄存器的值改为0x7c00
  5. 启动区代码主要是加载操作系统内核,最后跳转到加载处

以上内容参考自:《全网最硬核讲解计算机的启动过程》

预置必要配置

烧录镜像成功后,需要新增/修改 boot文件夹下的配置

  1. 开启SSH:增加一个空的ssh.txt文件
  2. 配置WiFi:增加wpa_supplicant.conf文件,内容如下
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="填写wifi的名字"
psk="填写wifi的密码"
priority=1
}
network={
ssid="填写wifi的名字"
psk="填写wifi的密码"
priority=2
}
  • ssid:填写wifi的名称
  • psk:填写wifi的密码
  • priority:该wifi的连接优先级,值越大优先级越高
  • 可以输入多个network
  1. 修改显示配置,config.txt最后增加hdmi_cvt=2560 1440 60 3 0 0 0

笔者用的是4K显示器,但是如果设置成4K对应的分辨率字体太小,所以这里设置成了2560 x 1440

修改完成后,执行diskutil unmountDisk /dev/diskN,最后diskutil eject /dev/diskN推出设备。

修改部分配置

带安装完成后,ssh pi@YOUR_PI_IP登录到机器,进行部分配置的修改

修改键盘布局

  1. sudo raspi-config
  2. 选择 localisation options
  3. 选择 Change Keyboard layout
  4. 选择 Generic 104-key PC
  5. 选择 Other
  6. 选择 Chinese
  7. 选择 Chinese
  8. 选择 The default for the keyboard layout
  9. 选择 no compose key

修改用户名/hostname

  1. 启用root账号,然后切换至root
sudo passwd root  #设置root用户密码
#输入新的UNIX密码:
#再输入一次密码:

sudo passwd --unlock root #启用root用户
su root # 切换成root用户
  1. 修改用户名
usermod -l yourname pi #修改用户名为你的名字
groupmod -n yourname pi #修改组名pi为你的名字
mv /home/pi /home/yourname #更改pi的home目录为你的名字的home目录
usermod -d /home/yourname yourname #修改/etc/passwd中yourname用户的home目录地址

#有的可能需要允许你的名字的用户使用sudo命令,需要编辑/etc/sudoers文件,将末尾的
pi ALL=(ALL) NOPASSWD: ALL
#改为
yourname ALL=(ALL) NOPASSWD: ALL #此操作需要查看配置文件是否限制了用户权限
  1. 修改密码
sudo passwd yourname  #修改yourname用户密码
#输入新的UNIX密码:
#再输入一次密码:

#可重新锁定root用户
sudo passwd -l root

修改软件源

由于科学上网的原因,很多国外的软件源都没办法访问,所以这里我们把常用的源换成国内的。

由于raspberry源对64位Pi OS支持不完全, sources.list需要使用debian源,而32位的直接使用raspberry源就行

sudo vim /etc/apt/sources.list

# 把原来的内容注释掉(最前面加 # 号),在文件最顶部添加下面的内容:
deb https://mirrors.tuna.tsinghua.edu.cn/debian buster main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ buster/updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian buster-updates main contrib non-free

# 修改 raspi.list 文件,用以下内容替换(树莓派基金会单独提供的源,与32位Pi OS的一致):
sudo vim /etc/apt/sources.list.d/raspi.list
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

# 同步更新源、软件包
sudo apt-get update
sudo apt-get upgrade

# 安装必要的库和包
sudo apt-get install build-essential cmake make gcc

如遇到以下报错,可以通过导入对应仓库的公钥来解决

Get:1 http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease [15.0 kB]
Hit:2 http://mirrors.tuna.tsinghua.edu.cn/raspberrypi buster InRelease
Err:1 http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 9165938D90FDDD2E
Reading package lists... Done
W: GPG error: http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian buster InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 9165938D90FDDD2E
gpg --keyserver keyserver.ubuntu.com --recv-keys 9165938D90FDDD2E
gpg --export --armor 9165938D90FDDD2E | sudo apt-key add -
sudo apt-get update

改为静态IP

由于通过DHCP分配的IP有可能会变,这对我们后续的SSH登录、端口转发等都会造成影响,所以这里需要改成静态IP。

# 编辑dhcp配置
sudo vim /etc/dhcpcd.conf
# 在文件最后增加
interface eth0
static ip_address=192.168.1.200/24 # 笔者路由器配置的DHCP池为100~199,所以这里规划静态IP从200开始
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 223.5.5.5 8.8.8.8

其中eth0代表有线以太网接口,如要配置无线网,使用wlan0ip_address就是IP地址,根据实际情况配置;routers是网关地址;domain_name_servers是DNS服务器的地址。

配置基础开发环境

笔者的目标是利用树莓派搭建一个服务器集群,使用k3s进行服务编排,在上面运行自己的博客、FaaS以及其他一些小服务。同时能够在上面编译运行Go、Python等代码。

安装zsh

访问github失败的解决方法

如果访问raw.githubusercontent.com失败,需要用国内的资源来安装

  1. 从gitee上下载安装脚本 wget https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh
  2. 编辑install.sh,修改下面内容,然后执行sh install.sh
# 找到
REPO=${REPO:-ohmyzsh/ohmyzsh}
REMOTE=${REMOTE:-https://github.com/${REPO}.git}

# 改为
REPO=${REPO:-mirrors/oh-my-zsh}
REMOTE=${REMOTE:-https://gitee.com/${REPO}.git}
  1. 修改仓库地址
cd ~/.oh-my-zsh
git remote set-url origin https://gitee.com/mirrors/oh-my-zsh.git
git pull

配置zsh插件

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-completions

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

plugins=(
git
docker
kubectl
z
sudo
extract
zsh-autosuggestions
zsh-syntax-highlighting
zsh-completions
)

安装编程语言

这里推荐一个非常好用的多版本包管理工具asdf,它可以把我们平常用到的pyenv、jenv、goenv等多版本管理的工具融合成一个,方便的安装和管理。

# 安装asdf工具
git clone https://github.com/asdf-vm/asdf.git ~/.asdf

# 添加plugin
asdf plugin add golang
asdf plugin add python

# 选择安装plugin的某个版本
asdf install golang 1.16.8
asdf install python 3.8.9

# 全局切换plugin版本
asdf global golang 1.16.8

笔者在安装python的过程中遇到了下面的报错,可以通过安装sudo apt install libssl-dev解决。

Installing Python-3.8.9...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (Debian 10 using python-build 2.0.7-19-g9ecfdd10)