您无需成为经验丰富的 Linux 用户即可遵循本指南!只要求您是一个好奇的人,具有基本的命令行界面技能,例如sudo权限执行命令编辑文本文件

本指南展示了如何使用 Linux 工作站在具有 Persistent Storage 的 Raspberry Pi 4 B 上执行 Alpine Linux 3.14 64 位的无头安装

Headless Installation 意味着树莓派在第一次启动后只能通过 Network (ssh) 访问,Persistent Storage 意味着将设置第二个分区以永久保存Raspberry Pi 可能提供的服务生成的用户文件和数据。

系统将安装为无盘模式并且对系统的任何更改都将使用Alpine Local Backup保存。

要求:

• %[raspberrypi.org/products/raspberry-pi-4-mod..Raspberry Pi 4B

• 15.3W USB-C 电源(官方或类似)。

• 16GB 或更大的 Class 10 MicroSD 卡。

• 一台运行Linux 和sudo权限的计算机。

• 电缆或WiFi 互联网连接允许Raspberry Pi 和Linux 计算机连接到同一网络。

创建具有两个分区的可启动 MicroSD 卡

目标是拥有一张包含两个分区的 MicroSD 卡:

系统分区:一个fat32分区,带有bootlba标志,位于 MicroSD 卡的一小部分,足以存储系统和应用程序(建议 256MB 到 2GB)。

存储分区:一个ext4分区,占用剩余的 MicroSD 卡容量,用作用户的持久存储以及 Raspberry Pi 可能提供的服务生成的数据。

识别 MicroSD 卡

• 不要不要将其插入您的计算机并运行以下命令:

  `lsblk`

• 记下输出,将 MicroSD 卡插入计算机并再次运行lsblk。样本输出:

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 223,6G  0 disk 
├─sda1   8:1    0   600M  0 part /boot/efi
├─sda2   8:2    0     1G  0 part /boot
└─sda3   8:3    0   222G  0 part /home
sdb      8:16   0 465,8G  0 disk 
└─sdb1   8:17   0 465,8G  0 part 
sdc      8:32   0 465,8G  0 disk 
└─sdc1   8:33   0 465,8G  0 part 
sdd      8:48   1  59,5G  0 disk 
└─sdd1   8:49   1  59,5G  0 part /run/media/bray/67E7-60D4
zram0  252:0    0     4G  0 disk [SWAP]

• 请注意,sdd是 64gb MicroSD 卡(在本例中),它安装了一个分区sdd1

从现在开始,您可以复制/粘贴命令,但请记住将sdd替换为您机器上标识的 MicroSD 磁盘名称。

清理

• 卸载分区:

`sudo umount /dev/sdd1`

or

`sudo umount /dev/sdd?*` *(If the device has more than one partition mounted.)*

• 移除分区:

`sudo parted /dev/sdd rm 1` *(Repeat that for other existent partitions if needed, replacing `1` with the partition number.)*

• 擦除文件系统/分区表签名:

`sudo wipefs -af /dev/sdd`

• 验证设备未应用标签且分区表为空:

`sudo parted /dev/sdd print`

样本输出:

Error: /dev/sdd: unrecognised disk label
Model: Generic STORAGE DEVICE (scsi)      
Disk /dev/sdd: 63,9GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:

创建所需的分区

• 在 MicroSD 卡上创建 MBR 分区方案:

`sudo parted /dev/sdd mklabel msdos`

*(You may run `sudo parted /dev/sdd print` anytime to observe the changes applied.)*

• 创建系统分区 (2GB):

`sudo parted /dev/sdd mkpart primary 1 2g`

• 将bootlba标志添加到系统分区:

`sudo parted /dev/sdd set 1 boot on`

`sudo parted /dev/sdd set 1 lba on`

• 创建存储分区 (62GB):

`sudo parted /dev/sdd mkpart primary 2001 64g`

*(Replace `64g` with the size of your MicroSD card, ex.: `16g`.)*

• 在分区1上构建fat32文件系统,在分区2上构建ext4文件系统:

`sudo mkfs.vfat -F 32 /dev/sdd1`

`sudo mkfs.ext4 /dev/sdd2`

• 再次使用sudo parted /dev/sdd print验证 MicroSD 卡的状态,它应该以这样的方案结束:

Model: Generic STORAGE DEVICE (scsi)
Disk /dev/sdd: 63,9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags    
 1      1049kB  2000MB  1999MB  primary  fat32        boot, lba
 2      2001MB  63,9GB  61,9GB  primary  ext4

将 Alpine Linux 刷入 MicroSD 卡

•下载适用于 Raspberry Pi 的 Alpine Linux(适用于 Raspberry Pi 4 B 的aarch64)。

• 弹出并取出MicroSD,然后重新插入。

• 运行lsblk以验证两个分区挂载点。

Sample output:
    sdd      8:48   1  59,5G  0 disk 
    ├─sdd1   8:49   1   476M  0 part /run/media/bray/4F85-22E7
    └─sdd2   8:50   1  59,1G  0 part /run/media/bray/6a9f9b14-628b-431f-9f3c-721d526

• 将 tarball 解压到系统的(可引导fat322GB)分区:

`cd /run/media/bray/4F85-22E7`

`tar -zxvf ~/Downloads/alpine-rpi-3.14.0-aarch64.tar.gz`

*(Substitute directories and filenames.)*

• 由于它将是无头安装(无需插入外部显示器),您可以通过用户自定义配置文件设置 GPU 的最小内存使用量,最大限度地利用可用内存:

*(Make sure you’re still on the same working directory as the previous command. Check with `pwd`.)*

`echo "gpu_mem=32" > usercfg.txt`

为无头安装设置

要执行无头安装,需要在可引导分区的根目录上有一个覆盖文件,其中包含一些预定义的网络配置,这些配置将允许 Raspberry Pi 连接并可以在本地网络上访问。

验证本地网络设置,并确定可用的 IP 号码

• 从包管理器安装nmap:

RHEL/CentOS/Fedora/RockyLinux - `sudo dnf install nmap`

Ubuntu/Mint/Kali/Debian(or other Debian-based) - `sudo apt install nmap`

...或来自任何替代方式。

• 验证您的计算机在所连接子网上的 IP 地址:

`hostname -I`

样本输出:

    192.168.0.129 192.168.122.1 10.19.0.12 100.85.0.1 fdeb:446c:912d:8da:: fdeb:446c:912d:8da::

您需要的是输出192.168.0.129中的第一个 IP(在此示例中),并且假设计算机使用标准配置连接,网关 IP 地址将为192.168.0.1

• 扫描本地子网,以识别当前使用的 IP:

`nmap -sn 192.168.0.0/24`

样本输出:

    Starting Nmap 7.80 ( https://nmap.org ) at 2021-06-22 10:01 -03
    Nmap scan report for _gateway (192.168.0.1)
    Host is up (0.00036s latency).
    Nmap scan report for 192.168.0.128
    Host is up (0.0053s latency).
    Nmap scan report for fd2lm (192.168.0.129)
    Host is up (0.000038s latency).
    Nmap scan report for 192.168.0.145
    Host is up (0.0053s latency).
    Nmap done: 256 IP addresses (4 hosts up) scanned in 3.26 seconds

验证正在使用哪些 IP,并且不得重新分配。在示例中,它是以.128.129.145结尾的 IP。

配置、构建覆盖文件并将其添加到可引导分区中

手动设置从头开始构建覆盖文件所需的目录/文件/脚本可能有点棘手(可能是另一篇博客文章),因此,为了简化,我们将使用“样板”解决方案并分配所需的配置在它之上。

• 下载此存储库github.com/mesca/alpine_headless。

*(This is a crafted solution to simplify the creation of an overlay file that temporarily sets up the network connection and the SSH server for the Alpine’s first boot on the Raspberry Pi.)*

• 应用网络配置:

With the repository on your machine, edit the following file on your code editor:

`alpine_headless/ovl/etc/network/interfaces`

gateway地址替换为您的子网网关地址(本示例中为192.168.0.1),并通过将address替换为先前验证的可用 IP 地址来分配静态 IP 地址。在此示例中,我将使用结尾.125

该文件将类似于以下内容:

    auto lo
    iface lo inet loopback

    auto eth0
    #iface eth0 inet dhcp
    iface eth0 inet static
        address 192.168.0.125
        netmask 255.255.255.0
        gateway 192.168.0.1

    auto wlan0
    iface wlan0 inet dhcp

• 设置 WiFi 连接:

*(You may skip this step if the Raspberry Pi will connect via network cable.)*

在代码编辑器上编辑以下文件:

`alpine_headless/ovl/etc/wpa_supplicant/wpa_supplicant.conf`

更改本地 WiFi 网络名称(ssid)和密码(psk),例如:

    network={
        ssid="change_me"
        psk="change_me"
    }

• 构建覆盖文件:

Make sure you are at the repository’s `alpine_headless/` folder, and run:

`./make.sh`

• 将覆盖文件复制到 MicroSD 引导分区的根目录:

`cp localhost.apkovl.tar.gz /run/media/bray/4F85-22E7`

*(Replace the MicroSD mount point. Check again with ‘lsblk’ if needed.)

* • 仔细检查 MicroSD 引导分区,它必须包含 Alpine Linux 文件、usercfg.txt文件和localhost.apkovl.tar.gz文件:

`ls -la /run/media/bray/4F85-22E7`

输出应与此类似:

    total 5548
    drwxr-xr-x. 5 bray bray    4096 dez 31  1969 .
    drwxr-x---+ 4 root       root            80 jun 22 11:09 ..
    drwxr-xr-x. 3 bray bray    4096 jun 15 11:35 apks
    drwxr-xr-x. 2 bray bray    4096 jun 15 11:35 boot
    drwxr-xr-x. 2 bray bray   20480 jun 15 11:35 overlays
    -rw-r--r--. 1 bray bray      25 jun 15 11:35 .alpine-release
    -rw-r--r--. 1 bray bray   26894 jun 11 05:10 bcm2710-rpi-2-b.dtb
    -rw-r--r--. 1 bray bray   28392 jun 11 05:10 bcm2710-rpi-3-b.dtb
    -rw-r--r--. 1 bray bray   29011 jun 11 05:10 bcm2710-rpi-3-b-plus.dtb
    -rw-r--r--. 1 bray bray   26890 jun 11 05:10 bcm2710-rpi-cm3.dtb
    -rw-r--r--. 1 bray bray   49214 jun 11 05:10 bcm2711-rpi-400.dtb
    -rw-r--r--. 1 bray bray   49218 jun 11 05:10 bcm2711-rpi-4-b.dtb
    -rw-r--r--. 1 bray bray   49892 jun 11 05:10 bcm2711-rpi-cm4.dtb
    -rw-r--r--. 1 bray bray   20120 jun 11 05:10 bcm2837-rpi-3-a-plus.dtb
    -rw-r--r--. 1 bray bray   20525 jun 11 05:10 bcm2837-rpi-3-b.dtb
    -rw-r--r--. 1 bray bray   20989 jun 11 05:10 bcm2837-rpi-3-b-plus.dtb
    -rw-r--r--. 1 bray bray   19852 jun 11 05:10 bcm2837-rpi-cm3-io3.dtb
    -rw-r--r--. 1 bray bray   52456 jun 15 06:06 bootcode.bin
    -rw-r--r--. 1 bray bray      60 jun 15 11:34 cmdline.txt
    -rw-r--r--. 1 bray bray     408 jun 15 11:34 config.txt
    -rw-r--r--. 1 bray bray    5448 jun 15 06:06 fixup4.dat
    -rw-r--r--. 1 bray bray    7314 jun 15 06:06 fixup.dat
    -rw-r--r--. 1 bray bray     927 jun 22 11:10 localhost.apkovl.tar.gz
    -rw-r--r--. 1 bray bray 2229120 jun 15 06:06 start4.elf
    -rw-r--r--. 1 bray bray 2953312 jun 15 06:06 start.elf
    -rw-r--r--. 1 bray bray      11 jun 21 12:11 usercfg.txt

• 弹出并取出MicroSD 卡,它终于可以首次启动了!

无头安装、设置和持久存储

远程访问树莓派

• 将 MicroSD 卡插入 Raspberry Pi,插入网络电缆(如果需要),然后打开电源。

• 几秒钟后,再次运行nmap -sn 192.168.0.0/24并验证 Raspberry Pi 是否与之前定义的 IP 地址连接。

• 以root用户身份通过 SSH 远程访问 Raspberry Pi,无需密码:

ssh root@192.168.0.125

(请记住替换此示例中的 IP 地址。)

如果您收到这样的错误:

    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    (...)

这意味着已经有另一个系统使用分配给 Raspberry Pi 的静态 IP,并且在您的本地计算机上存在与此远程关联的指纹。

如果发生该错误,请编辑文件~/.ssh/known_hosts,删除以分配给 Raspberry Pi 的 IP 地址开头的行。

如果 SSH 访问成功,您将看到如下提示:

    Welcome to Alpine!

    The Alpine Wiki contains a large amount of how-to guides and general
    information about administrating Alpine systems.
    See <http://wiki.alpinelinux.org/>.

    You can setup the system with the command: setup-alpine

    You may change this message by editing /etc/motd.

    (none):~#

(请注意,以#结尾的提示行表明您以root用户身份登录。)

Alpine Linux 初始设置

• 执行 Alpine 的初始设置:

`setup-alpine`

系统将提示您分配/选择: ○ 键盘布局主机名(您可以留空,使用默认值) ○ 网络接口 (您可以留空,使用默认值)IP地址 (您可以留空以继续使用当前分配的IP地址)网络掩码 (您可以留空,使用默认)网关 (您可以留空,使用默认)网络手动配置 (您可以留空,使用默认)网关 (您可以留空,使用默认)DNS域名 _ (你可以留空,使用默认)_ ○ DNS域服务器 (你可以留空,使用默认)更改root密码 (你必须创建root密码)时区HTTP/FTP 代理 (你可以留空)NTP客户端 (你可以留空,使用默认)存储库镜像 (你可以留空为空,使用默认)SSH 服务器 (您可以留空,使用默认)*“输入存储配置的位置”(如果默认未选中,则分配 mmcblk0p1。)缓存迪r(如果默认未选中,则分配 /media/mmcblk0p1/cache。)*

• 设置后更新系统:

apk update && apk upgrade

• 保存setup-alpine应用的所有更改和系统更新:

By default, Alpine Linux is installed as Diskless Mode, and any changes might be saved using Alpine Local Backup (lbu).

`lbu commit -d`

• 将基本配置添加到安装的新 SSH 服务器:

The overlay file created previously won’t run anymore since the system was installed and set up via the `setup-alpine` script. That means the SSH server we accessed on the first boot will not be set anymore.

Before the first reboot, the SSH server installed by the setup-alpine script must be configured to allow remote access again.

Open the following file on the text editor of your choice (`vi/nano`):

(Alpine Linux 使用vi作为默认文本编辑器,如果您对vi/vim不满意,我建议您安装nano来执行此任务:apk add nano。)

`vi /etc/ssh/ssd_config or nano /etc/ssh/sshd_config`

找到以下指令,取消注释并分配值,如下例所示,然后保存并退出编辑器:

    (...)
    Port 22
    (...)
    PermitRootLogin yes
    (...)
    PubkeyAuthentication yes
    (...)
    PasswordAuthentication yes
    PermitEmptyPasswords no
    (...)

• 提交更改并重新启动:

`lbu commit -d`

`reboot`

• 重新启动后,再次以root 身份访问Raspberry Pi:ssh root@192.168.0.125。这一次将提示您输入创建的root 密码。

设置持久存储

设置第二个 MicroSD 分区,用作将要创建的用户的主目录,并用作持久存储。

• 使用以下命令验证两个分区是否存在:

`blkid`

样本输出:

    /dev/mmcblk0p2: UUID="8a98a5df-e8a9-4f03-b1f6-6c9ecad2e854" TYPE="ext4"
    /dev/mmcblk0p1: UUID="0815-9310" TYPE="vfat"

• 为第二个分区 (mmcblk0p2) 创建安装点:

`mkdir /media/mmcblk0p2`

• 将安装指令添加到fstab(并再次安装全部):

echo "/dev/mmcblk0p2 /media/mmcblk0p2 ext4 rw,relatime 0 0" >> /etc/fstab

mount -a

(您可以仔细检查它是否安装了mount。)

• 提交更改:

`lbu commit -d`

创建管理员用户

• 在持久存储上创建用户 (user1) 的主目录:

mkdir -p /media/mmcblk0p2/home/user1

• 创建管理员用户 (user1):

adduser -h /media/mmcblk0p2/home/user1 user1

• 将用户添加到wheel组:

adduser user1 wheel

• 安装sudo:

apk add sudo

• 通过应用 sudo 命令并提供用户密码,允许来自wheel组的用户完全访问系统:

visudo

此命令将在 vi 文本编辑器上打开 /etc/sudoers 文件。您必须找到并取消注释以下行:

`# %wheel ALL=(ALL) ALL`

从未使用过 vi/vim 编辑器的说明:

    - Navigate down to find the line we want, by using the arrow keys.
    - When the line is found, place the cursor on top of the # character and type `x` key.
    - Type `:x` and press Enter to save and leave.

• 再次提交更改:

lbu commit -d

• 更新 SSH 服务器配置以阻止root次登录尝试:

*(From now on the system will be accessed remotely by the admin user created `user1`.)*

Open the following file on the text editor of your choice (`vi/nano`):

vi /etc/ssh/ssd_config or nano /etc/ssh/sshd_config

找到以下指令,赋值,保存并退出编辑器:

    (...)
    PermitRootLogin no
    (...)

• 提交并重新启动:

    lbu commit -d

    reboot

• 重新启动后,您可以通过 SSH 以管理员用户创建的身份进行连接:

`ssh user1@192.168.0.125`

发出命令whoami来验证当前用户名,发出命令pwd来验证主目录。

样本输出:

    Welcome to Alpine!

    The Alpine Wiki contains a large amount of how-to guides and general
    information about administrating Alpine systems.
    See <http://wiki.alpinelinux.org/>.

    You can setup the system with the command: setup-alpine

    You may change this message by editing /etc/motd.

    rpi4b-s1:/$ whoami
    user1
    rpi4b-s1:/$ pwd
    /media/mmcblk0p2/home/user1

验证用户命令提示符末尾是否有$符号,这意味着您以普通用户身份登录。

安装后

Alpine 安装已准备就绪,Raspberry Pi 已准备就绪!在本节中,我将推荐一些您可能会觉得有用的调整。

在调整之前,我想加强现有的存储策略:

对系统的任何更改,包括配置和软件包安装,必须使用 Alpine 本地备份 (lbu commit -d) 手动保存,否则,系统重新启动后将无法生存。

存储在用户主目录下的任何用户文件和用户配置 通常会持续系统重启,以及存储在第二个分区中的任何其他文件,挂载在/media/mmcblk0p2上。

推荐调整

• 安装man页。man是你最好的朋友,Alpine Linux 默认不提供它:

`sudo apk add mandoc man-pages mandoc-apropos less less-doc`

• 启用edge存储库,以便能够安装各种软件包。

在文本编辑器上打开/etc/apk/repositories:

`sudo vi /etc/apk/repositories`

取消注释communitymain``edge存储库的条目:

    /media/mmcblk0p1/apks
    http://dl-cdn.alpinelinux.org/alpine/v3.14/main
    #http://dl-cdn.alpinelinux.org/alpine/v3.14/community
    http://dl-cdn.alpinelinux.org/alpine/edge/main
    http://dl-cdn.alpinelinux.org/alpine/edge/community
    #http://dl-cdn.alpinelinux.org/alpine/edge/testing
Save and quit the text editor.

• 安装lm-sensors以以人类可读的形式快速检查 Raspberry Pi CPU 温度:

`sudo apk add lm-sensors`

使用命令检查 CPU 温度:sensors

• 提交安装后更改:

`lbu commit -d`.

• 最后,额外的一步,炫耀!安装neofetch:sudo apk add neofetch。运行neofetch命令!它将在终端上打印系统信息,就像这篇文章的标题图像一样。打印或拍摄屏幕照片。推文说:“谢谢@braycodes”


Logo

更多推荐