大多数人在设置树莓派电脑时都会安装某种形式的 Linux。直到最近,创建可启动 SD 卡的安装工具仅适用于 Windows 和 MacOS 桌面系统。 如果你在桌面上运行 Linux,你将获得一个从命令行手动执行它的说明页面。
这可行。 但是,如果你尝试使用多个树莓派板,随着时间的推移,这会变得很乏味。 作为一名工程师和程序员,我开始考虑自动化它,使其更容易,并且以开源项目通常开始的方式,我推出了 PiFlash。
2016 年我编写 PiFlash 只是为了自己使用。 到 2017 年 2 月,它已经发展到足以让我在 SVPerl(硅谷 Perl)上关于在树莓派上使用 Perl 的演示文稿中介绍它,然后我被邀请为 Opensource.com 撰写两篇文章:树莓派上的 Perl 入门 和 如何保护你的树莓派。
PiFlash 功能
PiFlash 具有吸引初学者和专家的功能。
与大多数其他开源软件工具一样,如果你不感兴趣,则无需查看它所使用的语言。 但是源代码可供高级用户和参与者使用。
对于专家用户,PiFlash 简化了编写 SD 卡的过程。 当你下载可启动的 OS “镜像”文件时,它通常位于 ZIP 存档或压缩文件中。 所有发行版都以略有不同的方式打包它们。 使用 PiFlash,你无需解压缩镜像。 只需将下载的文件指定为输入,PiFlash 就会完成提取的繁琐部分。
对于初学者,有一个重要的安全功能:PiFlash 将仅写入 SD 卡,并且拒绝写入任何其他类型的设备。 由于你必须使用 root 权限来写入卡,因此系统将执行你告诉它的任何操作。 因此,在尝试为新的树莓派手动刷新 SD 卡时,可能会意外擦除错误的设备,可能是你想要保留的硬盘驱动器。
这就是 PiFlash 保护你免受危险的地方。 在内部,它使用来自 util-linux 包的 lsblk 命令查找设备属性,该包是所有 Linux 发行版的一部分。 它可以识别使用各种驱动程序的 SD 卡。 如果它不是 SD 卡,它将拒绝写入块设备。
幸运的是,树莓派基金会在其 Windows 和 MacOS 用户说明中使用的 Etcher GUI 工具已扩展到 Linux,因此现在 Linux 上为那些喜欢 GUI 的人提供了一个 GUI 选项。 但是,如果你想自动化该过程,或者你想要高级用户级别的自定义,那么只有命令行工具才能完成这项工作。
最新版本的 PiFlash 添加了插件模块,可以在安装 OS 镜像后修改 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 输出设备参数中需要它。
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
接下来,下载要安装的系统镜像。 树莓派基金会有一个旧的 可能性列表,不再更新。 由于 Raspbian 是树莓派的官方 Linux 发行版,因此驱动程序支持首先在那里提供。 但是其他的也有效:Ubuntu 在列表上,但 Fedora 不在,因为 ARM 和树莓派支持是在列表制作之后出现的,但是你可以 下载它。
刷写 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 或配置文件启用它们。 插件的名称是 Perl 模块名称,没有 PiFlash::Plugin:: 前缀。 对于多个插件,它是一个逗号分隔的名称列表。 启用插件可以使用一个钩子,该钩子在写入 SD 卡后挂载启动和根文件系统时调用。 有关插件的更多信息,请访问 PiFlash::Plugin 模块文档。
以下是我自己的待办事项列表中即将推出的插件模块的一些想法...
- 在 SD 卡启动之前,更改 SD 卡上用户和 root 帐户的密码
- 设置网络参数和主机名
- 修改通常需要手动运行 raspi-config 或编辑 config.txt 的系统配置参数
- 围绕你构建的 ARM 内核设置自定义 Linux 环境
我的想法当然受到我想做什么的影响。 你可能想要朝其他方向发展,因此请考虑贡献补丁和插件。
PiFlash 的源代码存储库位于 GitHub 上。 也请在那里提交问题报告和代码/文档贡献。
5 条评论