从零开始无显示屏初始化配置树莓派笔记

Setting up a Raspberry Pi headless from zero

参考资料

背景缘由

在重新折腾树莓派并写下这篇文章之前,我的树莓派4一直承担着云笔记和git服务器的角色,经常连续开机一两天。直到前端时间,突然无法开机,连接屏幕发现报 错。基本可以确定是SD卡长时间进行独写操作,数据产生了损坏。在拖延许久苦于没有服务器用,终于找时间重新折腾了一遍树莓派。这次折腾树莓派,让我产生了一 些新的认识。

几年前我也写过一些折腾树莓派的文章,那时候我甚至尝试过给刚刚有64位处理器的树莓派3手动编译arm64架构的linux内核,而且按照国外的资料竟然编译成功 了。只可惜有很多兼容性问题,而且树莓派3一样只有1G内存,64位内核没有太大实用价值。那时候还是红帽的粉丝,会在树莓派上折腾红帽和fedora。现在的我已 经转投Ubuntu的怀抱了。而且由于树莓派4终于官方支持了通过USB外挂移动硬盘的方式直接启动(Direct USB Boot)。在我尝试了网上关于各种系统做Direct USB Boot的各种教程后,我发现还是有很多问题解决不了,只有官方的Raspberry Pi OS(基于Debian,曾经的Raspbian)能完美支持Direct USB Boot。 所以为了以后折腾的时候能够标准化通用化,没有特殊需要的情况下,默认用官方Raspberry Pi OS。

由于我一直想用树莓派作为我的私人服务器用,刚好现在在学习Docker,而arm架构的Docker在安装和使用上都存在一定差异,因此决定把原来的树莓派3拿来折 腾。于是就有了这篇文章。

一笔带过的写卡操作

现在树莓派相关的工具越来越丰富,写卡变得非常简单,直接用官方的Raspberry Pi Imager擦写即可。因为我都是通过远程命令行使用,因此默认选择 Raspberry Pi OS Lite镜像。

配置无线网络

在写好的SD卡boot分区新建wpa_supplicant.conf文件,文件内配置如下内容:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
fast_reauth=1
country=[WIFI COUNTRY CODE]

network={
  ssid="[NETWORK SSID]"
  psk="[NETWORK PASSWORD]"
}

[WIFI COUNTRY CODE]需要填的内容可以在维基ISO 3166-1找到,中国大陆地区就是CN,香港是 HK,澳门是MO,台湾省是TW。

需要注意的是SSID可能会区分大小写。假如需要配置多个SSID,可以这样配置:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
fast_reauth=1
country=[WIFI COUNTRY CODE]

network={
  ssid="[NETWORK SSID 1]"
  psk="[NETWORK PASSWORD 1]"
  priority=[PRIORITY, greater values have higher priority]
}


network={
  ssid="[NETWORK SSID 2]"
  psk="[NETWORK PASSWORD 2]"
  priority=[PRIORITY, greater values have higher priority]
}

可以使用wpa_passphrase工具生产加密的psk:

$ wpa_passphrase [NETWORK SSID] [NETWORK PASSWORD]

启用SSH

在Raspberry Pi OS中,SSH连接默认是禁用状态。要想写卡后首次启动就能通过SSH连接,需要在写好的SD卡boot分区新建一个空的ssh文件。

执行完这一步,就可以把SD卡插入到树莓派里并通电启动了。Raspberry Pi OS官方镜像默认用户名pi,密码raspberry。

Linux raspberrypi 5.4.51-v7+ #1333 SMP Mon Aug 10 16:45:19 BST 2020 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $

通过ssh命令或者putty远程连接,就可以看到以上提示信息了。

通过raspi-config工具更新设置

这一步一样可以一笔带过,主要检查Hostname,Locale,Time Zone,Keyboard Layout等设置,同时可以修改默认用户pi的密码,以及在高级选项中选择扩 展文件系统,让系统可以使用整张SD卡。

新建sudo用户,禁用原有默认用户pi

# adduser [NEW USER NAME]

# usermod -aG sudo [NEW USER NAME]

# su - [NEW USER NAME]

$ sudo ls -la /root

以下命令可以锁定指定用户

# usermod -L pi

编辑/etc/passwd文件禁止pi用户登录shell

# cp /etc/passwd /etc/passwd.bak

# nano /etc/passwd

将以下行修改为下面的结果,将登录指定的shell替换为/usr/sbin/nologin。

pi:x:1000:1000:,,,:/home/pi:/bin/bash

pi:x:1000:1000:,,,:/home/pi:/usr/sbin/nologin

替换apt软件源,指向国内镜像地址,检查更新

首先备份原文件内容,方便以后恢复。

# cp /etc/apt/sources.list /etc/apt/sources.list.bak
# cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak

然后将/etc/apt/sources.list文件内容改为如下:

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi

再将/etc/apt/sources.list.d/raspi.list文件内容改为如下:

deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

改完以后就可以检查更新了:

# apt update

# apt upgrade

安装常用工具

  1. vim
  2. git
  3. byobu
  4. webmin

其中webmin需要添加源才能安装。可以执行以下命令创建/etc/apt/sources.list.d/webmin.list文件。

# echo deb http://download.webmin.com/download/repository sarge contrib|sudo tee /etc/apt/sources.list.d/webmin.list

然后加入其apt-key即可。

$ wget -q -O- http://www.webmin.com/jcameron-key.asc | sudo apt-key add

# apt install webmin

每次登录启用byobu

$ byobu-enable

至此,一个基础的Linux使用环境在树莓派上就搭建好了。后续内容更多会关注如何在树莓派上部署各种应用或服务,以及搭建开发环境等。