大多数人在设置 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 上。也请在那里提交问题报告和代码/文档贡献。
5 条评论