PiFlash 入门:在 Linux 上启动你的 Raspberry Pi

Linux 用户可以使用 PiFlash 告别手动创建 Raspberry Pi 可启动 SD 卡的时代。
187 位读者喜欢这篇文章。
Vector, generic Raspberry Pi board

大多数人在设置 Raspberry Pi 电脑时会安装某种形式的 Linux。直到最近,用于创建可启动 SD 卡的安装工具仅适用于 Windows 和 MacOS 桌面。如果你的桌面运行的是 Linux,你将获得一页关于如何从命令行手动操作的说明。

这确实可行。但是,如果你尝试使用多个 Raspberry Pi 开发板,随着时间的推移,这会变得乏味。作为一名工程师和程序员,我开始考虑自动化这个过程,使其更轻松,并且以开源项目通常的启动方式,我创建了 PiFlash

我在 2016 年编写 PiFlash 只是为了自己使用。到 2017 年 2 月,它已经发展到足够成熟,我在 SVPerl(硅谷 Perl)关于在 Raspberry Pi 上使用 Perl 的演示文稿中介绍了它,然后受邀为 Opensource.com 撰写了两篇文章:Raspberry Pi 上的 Perl 入门如何保护你的 Raspberry Pi.

PiFlash 功能

PiFlash 具有吸引初学者和专家的功能。

像大多数其他开源软件工具一样,如果你不感兴趣,你不需要了解它的编写语言。但是,源代码可供高级用户和参与者使用。

对于专家用户,PiFlash 简化了写入 SD 卡的过程。当你下载可启动的操作系统“镜像”文件时,它通常在 ZIP 压缩包中或被压缩。所有发行版对它们的打包方式略有不同。使用 PiFlash,你无需解压缩镜像。只需将下载的文件指定为输入,PiFlash 将完成提取的繁琐部分。

对于初学者,有一个重要的安全功能:PiFlash 将仅写入 SD 卡,并拒绝写入任何其他类型的设备。由于你必须使用 root 权限才能写入卡,系统将执行你告诉它的任何操作。因此,在为新的 Raspberry Pi 手动刷写 SD 卡时,可能会意外擦除错误的设备,例如你想要保留的硬盘驱动器。

这就是 PiFlash 保护你免受危险的地方。在内部,它使用 util-linux 包中的 lsblk 命令查找设备属性,该包是所有 Linux 发行版的一部分。它可以识别使用各种驱动程序的 SD 卡。如果块设备不是 SD 卡,它将拒绝写入。

幸运的是,Raspberry Pi 基金会在其 Windows 和 MacOS 用户说明中使用的 Etcher GUI 工具已扩展到 Linux,因此现在 Linux 上为喜欢 GUI 的用户提供了一个 GUI 选项。但是,如果你想自动化该过程,或者如果你想要高级用户级别的自定义,则只有命令行工具才能完成这项工作。

最新版本的 PiFlash 添加了插件模块,这些模块可以在安装操作系统镜像后修改 SD 卡的文件系统,因此你可以开始探索新的自动化选项。

安装 PiFlash

PiFlash 可从 CPAN(Comprehensive Perl Archive Network)获取——但在继续之前,请确保你已安装所有依赖包。要安装依赖项

在基于 RPM 的 Linux 系统上(Red Hat Enterprise、Fedora、CentOS 等)

sudo dnf install coreutils util-linux perl file-libs perl-File-LibMagic perl-IO perl-Exception-Class perl-Try-Tiny perl-Module-Pluggable perl-File-Path perl-YAML-LibYAML gzip unzip xz e2fsprogs dosfstools

在基于 Debian 的 Linux 系统上(Debian、Ubuntu、Raspbian 等)

sudo apt-get install coreutils util-linux klibc-utils perl-base libmagic1 libfile-libmagic-perl libio-all-perl libexception-class-perl libtry-tiny-perl libmodule-pluggable-perl libyaml-libyaml-perl gzip xz-utils e2fsprogs dosfstools

对于基于源代码的发行版或其他打包系统,请参阅 CPAN 文档以获取依赖项列表。

接下来,使用 CPAN 工具安装 PiFlash

cpan PiFlash

我已设置了基于 Dist::Zilla 的构建,以制作 DEB 和 RPM 包,但它尚未包含在任何主要的软件包存档中。这在未来是可能的。

运行 PiFlash

如果你直接运行 piflash 命令而不带任何参数,它将打印使用信息。

usage: piflash [--verbose] [--resize] [--config conf-file] input-file output-device
       piflash [--verbose] [--config conf-file] --SDsearch
       piflash --version

扫描系统中的 SD 卡以获取确切的设备名称,你将在下面的 Pi-Flash output-device 参数中需要它。

piflash --sdsearch

如果未找到 SD 卡,它会提示找不到任何内容。

no SD cards found on system

顺便说一句,如果你有 PiFlash 不知道的 SD 卡写入器,请在 GitHub 上提交报告告知我。对于问题报告和故障排除,请使用 --verbose 选项收集程序的内部信息,以便我查看你的系统具有 PiFlash 未识别的哪个驱动程序。

你的确切设备名称可能因驱动程序和你系统上其他设备使用的名称而异。如果你有基于 USB 的 SD 读卡器/写入器,它可能会显示如下内容

SD cards found: /dev/sdb

或者,如果你有内置的 SD 卡插槽,它可能会使用不同的驱动程序,并且名称会指示它是使用 MMC (MultiMediaCard) 驱动程序的 SD 卡 使用

SD cards found: /dev/mmcblk0

接下来,下载系统镜像进行安装。Raspberry Pi 基金会有一个旧的 可能性列表,该列表不再更新。由于 Raspbian 是 Raspberry Pi 的官方 Linux 发行版,因此驱动程序支持首先在那里提供。但是其他发行版也可以使用:Ubuntu 在列表上,但 Fedora 不在,因为 ARM 和 Raspberry Pi 支持是在列表制作之后才出现的,但是,你可以 下载它

刷写 SD 卡的命令是 piflash <input-file> <output-device 。以下是一些刷写它的命令示例,具体取决于你下载的系统以及哪个块设备具有你的 SD 卡

piflash 2018-11-13-raspbian-stretch-full.zip /dev/mmcblk0
piflash Fedora-LXDE-armhfp-29-1.2-sda.raw.xz /dev/sdb

PiFlash 现在有一个 --resize 选项,它将调整 SD 卡上的根分区大小以填充设备的其余部分。它仅在根是 Linux ext2/3/4 文件系统时才有效。大多数发行版都将其作为安装后可以手动执行的选项提供,但这将其自动化为一个步骤。

插件、自动化和未来发展

在撰写本文时,PiFlash 0.3.1 是最新版本。

PiFlash 0.1.0 引入了插件模块,这意味着名为 PiFlash::Plugin::Something 的 Perl 模块将可供程序使用。作为安全预防措施,由于 PiFlash 可以以 sudo-root 身份运行命令,因此插件不会自动加载。相反,必须通过命令行上的 --plugin 或配置文件启用它们。插件的名称是不带 PiFlash::Plugin:: 前缀的 Perl 模块名称。对于多个插件,它是一个逗号分隔的名称列表。启用的插件可以使用一个钩子,该钩子在写入 SD 卡后挂载启动和根文件系统时调用。有关插件的更多信息,请参阅 PiFlash::Plugin 模块文档。

以下是我自己的待办事项清单中关于即将推出的插件模块的一些想法...

  • 在 SD 卡启动之前更改用户和 root 帐户的密码
  • 设置网络参数和主机名
  • 修改通常需要手动运行 raspi-config 或编辑 config.txt 的系统配置参数
  • 围绕你构建的 ARM 内核设置自定义 Linux 环境

当然,我的想法受到我想做的事情的影响。你可能想要朝其他方向发展,因此请考虑贡献补丁和插件。

PiFlash 的源代码存储库在 GitHub 上。也请在那里提交问题报告和代码/文档贡献。

User profile image.
Ian 从小学起就对计算机和飞行有着并行的兴趣。在 Linux 出现之前,他就在 Unix 上编写代码,并在内核发布 6 个月后开始使用 Linux。他拥有计算机科学硕士学位,并且是 CSSLP(认证安全软件生命周期专业人员)。业余时间,他是一名飞行员和认证飞行教员。

5 条评论

干得漂亮。你认为现在还有人积极为 perl 项目做贡献吗?

是的。没有哪种编程语言占据绝对主导地位。如果一种语言得到积极维护并拥有开发者社区,它就有资格成为你工具箱中的工具。而且任何程序员都应该拥有不止一种工具,以扩展经验。关注积极的方面——因为负面评论通常只是来自推销其他东西的人。

特别是对于 PiFlash,我得到了 Perl 社区成员 CPAN Testers 的一些意外帮助,他们为上传到 CPAN(Comprehensive Perl Archive Network)的模块提供了自动化测试系统——他们告诉我 PiFlash 的一些单元测试用例(我作为 PiFlash 的一部分编写的)在基于 Debian 的 Linux 发行版和 FreeBSD 上失败了。对于 Debian,我找到了并修复了他们报告的问题。CPAN Testers 提供了很大的帮助。

对于 FreeBSD,这是一个更大的问题,不会很快解决。我不得不将其标记为当前不支持,这样他们就不会浪费时间运行这些测试。由于 PiFlash 使用来自 util-linux 的 lsblk 命令,因此它与 Linux 内内核的功能相关联。PiFlash 最初是为 Linux 设计的。为了扩展以支持 FreeBSD 和其他 *BSD 内核,它将需要一个操作系统内核抽象层。我需要来自其他运行 BSD 的人的帮助,以处理它必须在 BSD 系统上执行的特定操作。如果其他人愿意帮助 BSD 部分,我愿意添加 BSD 支持。

回复 by Lewis Cowles (未验证)

感谢你的工作,但我想你从没听说过 EtcherIO。它以 AppImage 的形式分发,你只需下载并在 Linux 上运行。如果我没记错的话,它也适用于 Windows 和 Mac。

是的,我知道——那就是我提到的 GUI。当 PiFlash 启动时,它在 Linux 上还不可用。PiFlash 有其自身的利基市场,可以通过插件自动化 GUI 工具无法完成的任务。选择适合你的。但不要忽视其他人寻求的利基市场。

回复 by wb666greene (未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.