在Raspberry PI 4上启动Linux的历险

2020-06-28 15:09:11

Linux raspberry pi大约在两个月前,我开始为我正在进行的一个项目构建一个四节点的Raspberry pI4集群。找出在每个节点上安装Linux的最佳方法让我陷入困境,接下来的四周我都在刮牦牛胡子。

引导PI最常见的方式是从SD卡启动。但是它们又慢又不可靠--我不喜欢它们。某些型号的PI 2和PI 3支持从USB存储启动,但PI 4还不能这样做。因此,我不得不为每个PI使用SD卡。或者我是这样想的。

原来,Raspberry PI 2和3也支持网络引导。去年年底发布了支持PXE for PI 4的测试版固件。我在LinuxHit上找到了一篇文章,详细介绍了安装固件和设置网络引导的过程。

为了测试这一点,我在其中一个PI上更新了固件并配置了PXE服务器。我尝试通过网络和…启动另一个PI。成功了!以下是PXE服务器设置过程的要点:

将/boot和/的其余内容复制到本地文件系统上的单独文件夹中。我将我的文件分别复制到/tftp/raspbian-boot和/nfs/raspbian-root。

我不能从相同的引导和根文件系统引导所有三个节点,因为它们不是只读的。我不想为每个节点维护这些文件的副本。但这是一个已解决的问题-Docker已经允许您从单个基础映像启动多个容器。因此,我将按照Docker的做法-使用raspbian-root和raspbian-boot作为我的下层目录,为每个节点创建OverlayFS。我会像以前一样通过NFS分享它们。

其中一个节点的配置如下所示。其他两个节点遵循相同的模式。注意,我将raspbian-root和raspbian-boot移到了USB硬盘驱动器(挂载在/mnt),以获得更好的读/写性能。DC-a6-32-XX-XX-XX是节点的MAC地址。我在dnsmasq中使用tftp-ique-root=mac选项,根据每个节点的MAC地址为其维护单独的引导环境。

$mount-t overlay nog-boot-o lowerdir=/mnt/raspbian-boot,upperdir=/mnt/up/nog-boot,workdir=/mnt/work/nog-boot-o nfs_export=on-o index=on-o redirect_dir=noollow/tftpboot/dc-a6-32-XX-XX-XX$mount-t overlay nog-root-o lowerdir=/mnt/R。workdir=/mnt/work/nog-root-o nfs_export=on-o index=on-o redirect_dir=NOFLOW/nfs/nog$cat/tftpboot/dc-a6-32-XX-XX-XX/cmdline.txtconsole=序列0,115200控制台=tty1root=/dev/nfs nfsroot=<;IP地址>;:/nfs/nog,vers=4.1,proto=TCP rw IP=dhcp rootwait level=Deadline

(如果您想知道nog是什么:我以星球大战宇宙中的行星命名我的服务器。遵循这一传统,我将Pis Mandalore(PXE服务器)命名为Nog、Ordo和Werda)。

NFS和OverlayFS彼此并不友好。在一个周末试图解决一些奇怪的问题后,我放弃了。

但是OverlayFS不是唯一存在的写入时拷贝文件系统,不是吗?ZFS和BTRFS提供我可以使用的子卷和快照。但在此之前,我拖延了两个星期,决定用哪一个。

计划很简单:我将分别为raspbian-root和raspbian-boot创建一个子卷。然后,我将为每个子卷创建三个快照-每个节点一个快照。我在外部驱动器上创建了一个btrfs文件系统,并运行以下命令。

$btrfs子卷创建raspbian-root$btrfs子卷为每个节点创建raspbian-boot#根据需要更改文件夹名称$btrfs子卷快照raspbian-boot nog-boot$btrfs子卷快照raspbian-root nog-root$mount--bind/mnt/nog-boot/tftpboot/DC-a6-32-XX-XX-XX$mount--bind/mnt/nog-root/nfs/nog#Don。:/nfs/nog,vers=4.1,proto=tcp rw ip=dhcp rootwait level=Deadline。

嗯,这招奏效了!我在没有SD卡的情况下运行PI!!现在,我需要做的就是创建systemd单元文件来启动所有需要的服务并挂载快照。我终于可以开始做我的项目了。

等一下。仔细查看cat/tftpboot/dc-a6-32-XX-XX-XX/cmdline.txt的输出。如果您和我一样,您将第一次意识到,此文件中的root=定义将从何处挂载根文件系统。现在,我们告诉它从/dev/nfs挂载。如果我连接一个外部驱动器并将root=设置为指向该外部驱动器,该怎么办?

RPI 4不能直接从USB驱动器启动。与中一样-开机时无法在USB驱动器上找到/引导。但是,如果我们使用cmdline.txt提供/boot,并使用cmdline.txt从USB驱动器挂载/引导,会怎么样呢?测试时间到了。

我将raspbian-root复制到USB驱动器,编辑fstab以挂载/使用分区的PARTUUID,并将其连接到Nog。然后我更新了/tftpboot/dc-a6-32-XX-XX-XX/cmdline.txt的内容。

在几次重启之后,它起作用了!我现在有一个运行在USB硬盘上的RPI 4!

让我们从我要找的东西开始吧。我只想不要处理SD卡,因为它们速度慢,不可靠。可靠性是相对的-一切都会在某个时候失败。但是一个质量不错的USB硬盘可能会比SD卡更耐用。因此,让我们只看一些读/写性能数据,看看它们之间的比较。

$sync;dd if=/dev/Zero of=twogefile bs=1M count=2048;sync#写入性能$sudo sh-c";sync&;&;echo 3>;/proc/sys/vm/drop_caches";$dd if=twogefile of=/dev/null bs=1M count=2048#读取性能。

通过网络引导,我能够获得类似于10类SD卡的读写速度。请注意,引导映像托管在连接到Mandalore(PXE服务器)的USB硬盘驱动器上。NFS似乎是这里的瓶颈-硬盘驱动器的原始读/写速度比这个要好得多。所有PI都连接到Netkit的8端口千兆以太网交换机。

不足为奇的是,当PI使用USB硬盘时,情况会有相当大的改善。请注意,我使用的外置驱动器是从非常旧的MacBook改装而来的5400rpm硬盘。我在易趣上花了10美元买的。YMMV。

现在,我让Mandalore从SD卡引导和/或从USB硬盘挂载。Nog、Ordo和Werda通过网络从Mandalore获取/引导和/或从USB硬盘挂载。