最近我在 SVPerl(硅谷 Perl 组织)上演讲关于 Raspberry Pi 上的 Perl 时,有人问:“我听说 Raspberry Pi 应该使用 Python。是这样吗?” 我很高兴他问了这个问题,因为这是一个常见的误解。Raspberry Pi 可以运行任何语言。Perl、Python 和其他语言都是 Raspbian Linux 初始安装的一部分,Raspbian Linux 是该板的官方软件。
这个神话的起源很简单。Raspberry Pi 的创建者,英国计算机科学教授 Eben Upton,讲述过这样一个故事,“Pi”这个名字的一部分是为了听起来像 Python,因为他喜欢这门语言。他选择它作为他强调孩子们学习编码的重点。但他和他的团队制造了一台通用计算机。Raspberry Pi 上的开源软件对我们没有任何限制。我们都可以自由选择在 Raspberry Pi 上运行什么,并使每个 Raspberry Pi 都成为我们自己的。
我在 SVPerl 的演讲和本文的第二点是介绍我的 “PiFlash” 脚本。它是用 Perl 编写的,但它不需要任何 Perl 知识即可自动化从 Linux 系统为 Raspberry Pi 刷写 SD 卡的任务。它为初学者提供安全保障,这样他们就不会在尝试刷写 SD 卡时意外擦除硬盘驱动器。它为高级用户提供自动化和便利,包括我自己,这也是我编写它的原因。Windows 和 Mac 已经存在类似的工具,但 Raspberry Pi 网站上的说明奇怪地没有为 Linux 用户提供自动化工具。现在有一个了。
开源软件有一个悠久的传统,即新项目开始是因为作者想要 “挠自己的痒处”,或者解决他们自己的问题。这就是 Eric S. Raymond 在他 1997 年的论文和 1999 年的书 “大教堂与集市” 中描述的那样,这本书定义了开源软件开发方法论。我编写 PiFlash 是为了满足像我这样的 Linux 用户的需求。
可下载的系统镜像
在设置 Raspberry Pi 时,您首先需要为其下载操作系统。我们称之为 “系统镜像” 文件。一旦您将其下载到您的桌面、笔记本电脑,甚至另一台 Raspberry Pi 上,您就必须将其写入或 “刷写” 到 SD 卡。在线已经涵盖了详细信息。手动操作可能有点棘手,因为将系统镜像放在整个 SD 卡上而不是分区上很重要。系统镜像实际上将至少包含一个它自己的分区,因为 Raspberry Pi 的启动过程需要一个 FAT32 文件系统分区才能启动。启动分区之后的其他分区可以是操作系统内核支持的任何文件系统类型。
在 Raspberry Pi 上的大多数情况下,我们运行的是带有 Linux 内核的发行版。以下是一些常见的系统镜像列表,您可以为 Raspberry Pi 下载(但没有什么可以阻止您从头开始构建自己的系统镜像)。
Raspberry Pi 基金会的 “NOOBS” 系统是他们为新用户推荐的系统。它代表 “New Out of the Box System”(全新开箱即用系统)。显然,它的目的是听起来像 “noob” 这个词,是 “newbie”(新手)的缩写。NOOBS 启动一个基于 Raspbian 的 Linux 系统,该系统提供一个菜单,您可以使用该菜单自动下载并在您的 Raspberry Pi 上安装其他几个系统镜像。
Raspbian Linux 是专为 Raspberry Pi 定制的 Debian Linux。它是 Raspberry Pi 的官方 Linux 发行版,由 Raspberry Pi 基金会维护。几乎所有 Raspberry Pi 软件和驱动程序都从 Raspbian 开始,然后再转移到其他 Linux 发行版。它可以在所有型号的 Raspberry Pi 上运行。默认安装包括 Perl。
Ubuntu Linux(以及社区版 Ubuntu MATE)将 Raspberry Pi 作为其 ARM(Advanced RISC Machines)处理器支持的平台之一。[RISC(精简指令集计算机)架构] Ubuntu 是 Debian Linux 的商业支持开源变体,因此其软件以 DEB 包的形式提供。包括 Perl。它仅适用于 Raspberry Pi 2 和 3 型号及其 32 位 ARM7 和 64 位 ARM8 处理器。Raspberry Pi 1 和 Zero 的 ARM6 处理器从未获得 Ubuntu 构建过程的支持。
Fedora Linux 从 Fedora 25 开始支持 Raspberry Pi 2 和 3。Fedora 是隶属于 Red Hat 的开源项目。Fedora 是商业 RHEL(Red Hat Enterprise Linux)添加商业软件包和支持的基础,因此其软件像所有 Red Hat 兼容的 Linux 发行版一样,以 RPM(Red Hat Package Manager)包的形式提供。与其他发行版一样,它包括 Perl。
RISC OS 是专为 ARM 处理器制作的单用户操作系统。如果您想体验比 Linux 更紧凑的小型桌面(由于功能较少),这是一个不错的选择。Perl 可以在 RISC OS 上运行。
RaspBSD 是 FreeBSD 的 Raspberry Pi 发行版。它是一个基于 Unix 的系统,但不是 Linux。作为开源 Unix,形式服从功能,它与 Linux 有许多相似之处,包括操作系统环境由一组类似的开源软件包组成,包括 Perl。
OSMC,开源媒体中心,和 LibreElec 是电视娱乐中心系统。它们都基于 Kodi 娱乐中心,Kodi 娱乐中心在 Linux 内核上运行。它是一个非常紧凑和专业的 Linux 系统,所以不要期望在上面找到 Perl。
Microsoft Windows IoT Core 是一个新的进入者,仅在 Raspberry Pi 3 上运行。您需要 Microsoft 开发人员访问权限才能下载它,因此作为 Linux 极客,这让我望而却步。我的 PiFlash 脚本不支持它,但如果那是您正在寻找的,它就在那里。
PiFlash 脚本
如果您查看 Raspberry Pi 的 SD 卡刷写 说明,您会看到从 Windows 或 Mac 执行此操作的说明涉及下载一个工具来写入 SD 卡。但是对于 Linux 系统,这是一组手动操作的说明。我手动执行过很多次,这触发了我的软件开发人员本能来自动化这个过程,这就是 PiFlash 脚本的由来。这很棘手,因为 Linux 系统的设置方式有很多种,但它们都基于 Linux 内核。
我一直认为手动操作过程中最大的潜在错误之一是意外擦除错误的设备,而不是 SD 卡,并破坏我想要保留的硬盘驱动器上的数据。在我在 SVPerl 的演讲中,我惊讶地发现听众中有人犯过这个错误(并且不害怕承认)。因此,PiFlash 脚本的目的之一,即通过拒绝擦除非 SD 卡的设备来为新用户提供安全保障,比我预期的更需要。PiFlash 还会拒绝覆盖包含已挂载文件系统的设备。
对于包括我在内的经验丰富的用户,PiFlash 脚本提供了自动化的便利。下载系统镜像后,我无需解压缩它或从 zip 存档中提取系统镜像。PiFlash 将从其所在的任何格式中提取它并直接刷写 SD 卡。
我已在 GitHub 上发布了 PiFlash 及其说明。
它是一个具有以下用法的命令行工具
piflash [--verbose] 输入文件 输出设备
piflash [--verbose] --SDsearch
输入文件 参数是系统镜像文件,无论您从 Raspberry Pi 软件分发站点下载了什么。输出设备 参数是要写入的 SD 卡的块设备的路径。
或者,使用 --SDsearch 打印系统上 SD 卡的设备名称列表。
可选的 --verbose 参数对于打印出程序的所有状态数据非常有用,以防您需要寻求帮助、提交错误报告或自行排除故障。这就是我开发它时使用的。
以下是使用该脚本将 Raspbian 镜像(仍在 zip 存档中)写入 /dev/mmcblk0 处的 SD 卡的示例
piflash 2016-11-25-raspbian-jessie.img.zip /dev/mmcblk0
如果您指定了 /dev/mmcblk0p1(SD 卡上的第一个分区),它会识别出分区不是正确的位置并拒绝写入。
一个棘手的方面是识别哪些设备是各种 Linux 系统上的 SD 卡。mmcblk0 的示例来自我的笔记本电脑上基于 PCI 的 SD 卡接口。如果我使用 USB SD 卡接口,它将是 /dev/sdb,这更难与许多系统上存在的硬盘驱动器区分开来。但是,只有少数 Linux 块驱动程序支持 SD 卡。PiFlash 检查这两种情况下块设备的参数。如果其他方法都失败了,它将接受可写、可移动且物理扇区计数适合 SD 卡的 USB 驱动器。
我认为这涵盖了大多数情况。但是,如果您有我没见过的其他 SD 卡接口怎么办?我想听取您的意见。请包括 --verbose --SDsearch 输出,以便我可以看到您的系统尝试时存在的环境。理想情况下,如果 PiFlash 脚本得到广泛使用,我们应该围绕维护它为尽可能多的 Raspberry Pi 用户建立一个开源社区。
Raspberry Pi 的 CPAN 模块
CPAN 是 Comprehensive Perl Archive Network(综合 Perl 存档网络),这是一个包含大量 Perl 模块的全球下载镜像网络。所有这些都是开源的。多年来,CPAN 上大量的模块一直是 Perl 的巨大优势。对于成千上万的任务,无需重新发明轮子,您可以直接使用其他人已经发布的代码,然后在您有新东西时提交您自己的代码。
由于 Raspberry Pi 是一个功能齐全的 Linux 系统,因此大多数 CPAN 模块都可以在其上正常运行,但我将重点介绍一些专门用于 Raspberry Pi 硬件的模块。这些通常用于测量、控制或机器人等嵌入式系统项目。您可以通过 Raspberry Pi 的 GPIO(通用输入/输出)引脚将 Raspberry Pi 连接到外部电子设备。
专门用于访问 Raspberry Pi 的 GPIO 引脚的模块包括 Device::SMBus、Device::I2C、Rpi::PIGPIO、Rpi::SPI、Rpi::WiringPi、Device::WebIO::RaspberryPi 和 Device::PiGlow。其他具有 Raspberry Pi 支持的嵌入式系统模块包括 UAV::Pilot::Wumpus::Server::Backend::RaspberryPiI2C、RPi::DHT11(温度/湿度)、RPi::HCSR04(超声波)、App::RPi::EnvUI(植物生长灯)、 RPi::DigiPot::MCP4XXXX(电位器)、RPi::ADC::ADS(A/D 转换)、Device::PaPiRus 和 Device::BCM2835::Timer(板载定时器芯片)。
示例
以下是一些您可以在 Raspberry Pi 上使用 Perl 完成的示例。
示例 1:使用 PiFlash 刷写 OSMC 并播放视频
在此示例中,您将练习使用 OSMC(开源媒体中心)设置和运行 Raspberry Pi。
- 转到 RaspberryPi.Org。在下载区域,获取最新版本的 OSMC。
- 在您的 Linux 桌面或笔记本电脑中插入一张空白 SD 卡。Raspberry Pi 1 使用全尺寸 SD 卡。其他所有设备都使用 microSD 卡,这可能需要一个通用的适配器才能插入。
- 在插入 SD 卡之前和之后检查 “cat /proc/partitions”,以查看系统分配给它的设备名称。它可能是 /dev/mmcblk0 或 /dev/sdb 之类的名称。在如下所示的命令中替换您正确的系统镜像文件和输出设备
piflash OSMC_TGT_rbp2_20170210.img.gz /dev/mmcblk0
- 弹出 SD 卡。将其放入 Raspberry Pi 并启动它,连接到 HDMI 显示器。
- 在 OSMC 设置期间,获取一个 USB 闪存盘并在上面放一些视频。为了演示的目的,我建议使用 “youtube-dl” 程序下载两个视频。运行 “youtube-dl OHF2xDrq8dY”(彭博社关于英国科技(包括 Raspberry Pi)的 “Hello World” 剧集)和 “youtube-dl nAvZMgXbE9c”(CNet 的 Raspberry Pi 前 5 名项目)。将它们移动到 USB 闪存盘,然后卸载并移除它。
- 将 USB 闪存盘插入 OSMC Raspberry Pi。按照视频菜单转到外部设备。
- 当您可以在 Raspberry Pi 上播放视频时,您就完成了练习。玩得开心。
示例 2:从目录播放随机视频的脚本
此示例使用脚本从 Raspberry Pi 上的目录随机播放视频。根据视频及其安装位置,这可以是一个信息亭显示器。我编写它是为了在使用室内锻炼器材时显示视频。
- 设置 Raspberry Pi 以启动 Raspbian Linux。将其连接到 HDMI 显示器。
- 从 GitHub 下载我的 “do-video” 脚本 并将其放在 Raspberry Pi 上。
- 按照页面上的安装说明进行操作。主要的事情是安装 omxplayer 软件包,它使用 Raspberry Pi 的硬件视频加速流畅地播放视频。
- 在主目录下的名为 Videos 的目录中放置一些视频。
- 运行 “do-video”,视频应该开始播放。
示例 3:读取 GPS 数据的脚本
此示例更高级且是可选的,但它展示了 Perl 如何从外部设备读取数据。在我之前示例中 GitHub 上的 “Perl on Pi” 页面上,还有一个 gps-read.pl 脚本。它通过串行端口从 GPS 读取 NMEA(美国国家海洋电子协会)数据。页面上有说明,包括我从 AdaFruit Industries 使用的部分来构建它,但可以使用任何输出 NMEA 数据的 GPS。
通过这些任务,我已经证明您确实可以在 Raspberry Pi 上像使用任何其他语言一样使用 Perl。希望您喜欢它。
3 条评论