使用 RPi 2 构建大屏幕指挥中心
当树莓派的制造商实现了他们的计划,在今年早些时候发布了配备 1GB 内存的多核版本微型计算机时,我认为这是一个绝佳的机会,可以将这款单板 Linux 电脑应用到实际工作中——我们公司网络运营中心的实际工作。
NYSERNet, Inc. 是一家光纤网络公司,为纽约州的主要大学和研究中心提供高速连接。我们的部分工作是密切关注从布法罗到纽约市的光纤网络。如果出现故障,我们需要迅速知晓。
过去,我们有一个步入式指挥中心,配备了十个壁挂式 19 英寸显示器,由两台大型 Windows PC 塔式机箱驱动,这些机箱装有重型显卡和足够的 VRAM,以确保一切正常运行。屏幕上显示网络地图、数据中心视图和天气等信息。
但在最近的办公室改造期间,我们决定淘汰所有电缆、笨重的 PC 和显卡共享设备。我们希望新的空间——配备两台新的 50 英寸超高清显示器,而不是成排的 19 英寸显示器——干净整洁,并给员工和访客带来一种“哇,真酷!”的感觉。

图 1. 一台 50 英寸 Vizio 电视以高分辨率显示 NYSERNet, Inc. 的网络地图,由 Raspberry Pi 2 Model B 驱动,左侧的小黑盒就是它。图中 RPi 从其通常隐藏在屏幕后面的位置拉出(照片由 John S. Tonello 拍摄)。
隆重推出 Raspberry Pi 2 Model B。
凭借其强大的全新四核处理器和两倍于其前代产品的内存,RPi 似乎是驱动我们新的大型 4K 显示器以及运行 NOC 团队使用的几个重要应用程序的完美计算机,这些应用程序包括基于 Java 的网络地图、Iceweasel(Firefox Web 浏览器衍生产品)和 InterMapper(一种专有的网络监控工具)。Raspbian,一种与我们的 Ubuntu 环境非常契合的 Debian 衍生版本,将是操作系统的理想选择。
在我们能够深入研究并将一个非常公开且必要的系统交给一对 35 美元的 RPi 之前,我必须确保它们有足够的视频处理能力来驱动大型电视。毕竟,我们需要 4K 分辨率,以便获得清晰屏幕视图所需的像素深度以及容纳我们将要运行的应用程序所需的足够图形空间。旧的十屏幕设置在每个显示器上都有不同的应用程序窗口;双屏幕设置需要显示同样多的窗口。
我分别在运行 Windows 8.1 的 HP Mini 和 RPi 2 Model B 上进行了一些初步测试。Mini 只能达到 1080p,但我发现 RPi 确实可以通过其内置的全尺寸 HDMI 端口和板载 Broadcom 显卡提供我想要的分辨率。我还发现我可以在不将可怜的 RPi 超频到极限而使其着火的情况下做到这一点。
选择 RPi对于这个项目,我需要两个 RPi,每个新的大屏幕电视各一个。您可以轻松设置更多。我订购了两套最新的 Raspberry Pi 2 Model B 套件,每套包括一台计算机、一张 8GB SD 卡、一个通风塑料外壳和一个 USB 电源适配器。这款特定的 RPi 非常理想,因为它功能足够强大,可以同时运行高分辨率视频和我们的网络监控应用程序。之前的 RPi B+ 配备 512MB 内存,无法提供我所需的那种性能。如果您不需要超高清分辨率,旧款 RPi 也可以正常工作。
本文的其余部分假设您知道如何设置 Raspberry Pi。如果不知道,我在“资源”部分列出了一篇很好的文章,其中解释了如何操作。我使用 Raspbian 作为我的基础操作系统。
一旦您的 RPi 启动并运行,最好将其连接到您的网络。如果在此设置过程中视频设置出现问题,您将需要另一种方式来编辑配置文件。为 RPi 提供网络地址并设置 SSH 就可以做到这一点。
如果您能够找到带有预装 Raspbian(或 NOOBS)SD 卡的套件,那也可以。其他版本,例如 Arch Linux ARM 和 Pidora,也可能是不错的选择,因为此解决方案更多地依赖于 RPi 的基本配置,而不是其上的操作系统。
总而言之,这些套件每个大约花费 65 美元。我还购买了几条 12 英寸的 HDMI 电缆——每对 RPi-TV 一条。
选择屏幕对于这个项目来说,获得高分辨率屏幕非常重要,经过一番比较,我最终选择了 Vizio 50 英寸 4K 超高清 LED 智能电视 (P502UI-B1E)。它具有 3840x2160 分辨率、120Hz 刷新率以及我想要的 16:9 宽高比。这款特定的电视售价不到 800 美元,这对我们很有利。
配置 RPi使用 raspi-config 工具(内置于 Raspbian 中),您可以微调计算机处理内存、视频显示和一系列其他 RPi 参数的方式。就我的目的而言,我使用它来处理三件事
-
超频
-
过扫描
-
内存分配
顺便说一句,这些设置也可以通过编辑 /boot/config.txt 来修改,因此如果您的发行版上没有 raspi-config,您可以使用配置文件来设置参数。RPi 上的 /boot/config.txt 有点类似于其他计算机上的 BIOS,并且有很好的 Raspbian 文档可供参考。有关更多信息,我在“资源”部分中包含了一个相关链接。
要开始修改,请启动 raspi-config
$ sudo raspi-config
超频是第一个菜单中的选项 7;过扫描和内存分配是“高级选项”菜单下的选项 A1 和 A3。从超频开始(图 2)。

图 2. 超频
阅读警告后,按 Enter 键确认(图 3)。重要的是要知道超频可能会使您的 RPi 发生奇怪的事情,因此请小心。

图 3. 超频警告
您将获得六个超频选项。每个选项都提供越来越高的速度和热量。尽管 RPi 2 Model B 的额定频率为 900MHz,但我还是选择了“中等”超频预设,它提供 900MHz ARM、250MHz 内核、450MHz SDRAM 和 2 过压(图 4)。

图 4. 选择超频预设
在尝试了基本设置(不超频)后,我发现这种中等超频使应用程序运行速度更快,这意味着使用 RPi 的用户体验更好。
如果您的应用程序资源占用较少,您可能可以完全跳过超频。但是,即使多个 Iceweasel 窗口或选项卡也可能占用系统资源,并可能导致您希望获得更多性能。请记住,RPi 需要进行相当多的图形处理,这将消耗内存和周期。
选择“中等”,按 Tab 键移至“确定”并按 Enter 键,您将返回到 raspi-config 主菜单。
现在是时候进行两个“高级选项”配置更改了:过扫描和内存。首先,让我们看一下过扫描。
当您首次将 RPi 连接到显示器并启动它时,您可能会在屏幕上看到黑条。这些是未使用的像素,默认情况下禁用过扫描是为了给您提供一种图形安全模式。如果您的显示器较新(例如我的两台 4K 电视),您可以安全地禁用过扫描,并允许 RPi 使用所有屏幕空间。
在 raspi-config 主菜单中选择“高级选项”,然后从列表中选择“过扫描 (A1)”(图 5)。您有两个选项:“禁用”或“启用”。选择“禁用”,然后按 Tab 键移至“确定”以返回主菜单。

图 5. 过扫描
通常很难知道过扫描是否会搞砸事情,因此这是一个保存您所做的工作并重新启动 RPi 的好时机。从主菜单中选择“完成”。这将使您进入命令提示符
$ sudo reboot
如果您的屏幕在重新启动后看起来正常(没有黑条,没有奇怪的像素化,也没有奇怪的闪烁),那么您应该一切顺利。如果它搞砸了,或者搞砸到您无法阅读任何内容,您将需要从另一台计算机 ssh
连接到 RPi,并从那里重新运行 raspi-config。在这种不太可能发生的情况下,从远程 shell 重复之前的步骤,然后选择“启用过扫描”选项。
现在您可以进行对本项目影响最大的修改——更改 RPi 分配其 1GB 板载内存的方式
$ sudo raspi-config
再次进入“高级选项”菜单,这次选择“内存分配 (A3)”选项(图 6)。

图 6. 内存分配
您将获得几个选择:16、32、128、256 和 512。开箱即用,RPi 将其 1GB 内存中的 64MB 提交给 GPU。这远远不足以提供我们想要的像素分辨率。经过一些实验,我发现将 GPU 的内存最大化(512)效果最好(图 7)。

图 7. 最大化内存
这种相对大量的视频内存提供了超高清屏幕所需的图形性能。尽管如此,不要期望它像台式机一样运行。当您调整应用程序窗口大小或移动应用程序窗口时,仍然会存在一些图形滞后。
按 Tab 键移至“确定”,按 Tab 键移至“完成”,然后返回到命令行。重新启动以使内存更改生效。
修改启动配置一旦完成过扫描、超频和内存分配修改,本项目其余的繁重工作将在启动配置文件中完成:/boot/config.txt。有关其所有功能的完整描述,请参阅“资源”部分中的链接。
使用您喜欢的文本编辑器以 root 身份打开该文件
$ sudo vi /boot/config.txt
文件内文档很有帮助,并将为您提供有关各种参数的易于遵循的提示。在此文件中,您还将看到之前使用 raspi-config 所做的一些更改。如果您没有使用 raspi-config,您可以在以下步骤中对过扫描、超频和内存分配进行必要的修改。
首先,禁用过扫描
disable_overscan=1
如果您在 raspi-config 中设置了此项,则此项将已取消注释并设置为 1。在该条目下方,您将看到过扫描调整。这些都应该注释掉。framebuffer_width
和 framebuffer_height
设置也是如此。除非您有特定的显示器,否则请注释掉这些行
# uncomment this if your display has a black border
# of unused pixels visible and
# your display can output without overscan
disable_overscan=1
# uncomment the following to adjust overscan. Use
# positive numbers if console goes off screen,
# and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16
如果 RPi 没有自动检测到您的 HDMI 显示器,请取消注释 hdmi_force_hotplug=1
行。这应该可以解决问题。
为了使 RPi 支持超高清屏幕分辨率,您需要使用 hdmi_group
和 hdmi_mode
来启用自定义设置。hdmi_group
参数设置您正在使用的显示器类型:0 将自动检测,1 将设置 CEA(电视的典型设置),2 将设置 DMT(显示器的典型设置)。
尽管我使用的是 Vizio 电视,但我需要将 hdmi_group
设置为 2
# Set monitor mode to DMT
hdmi_group=2
根据您选择的屏幕,您可能需要稍微尝试一下这些设置。请记住,如果出现问题并且您无法再读取屏幕,请 ssh
连接到您的 RPi 并撤消您的更改。
驱动 Vizio 电视需要自定义分辨率,而任何预设模式都不提供该分辨率,因此您需要将 HDMI 输出格式设置为 87,即自定义模式
# Make our custom resolution the default
hdmi_mode=87
有关 hdmi_mode
值的完整列表(包括分辨率和频率),请参阅本文“资源”部分中的 Config.txt 链接。
设置自定义模式后,您现在需要为协调视频时序 (CVT) 添加特定参数。格式为
hdmi_cvt=<width> <height> <framerate> <aspect>
↪<margins> <interlace> <rb>
因此,针对 3840x2160 Vizio 电视的此条目的简化版本如下所示
hdmi_cvt 3840 2160 24
同样,您可以修改这些设置以匹配您屏幕的参数。这很像调整任何计算机显示器上的屏幕分辨率——宽度、高度和帧速率是关键。
我还将帧缓冲区宽度和高度设置为与我的 hdmi_cvt
宽度和高度匹配,然后设置了较高的像素频率限制
max_framebuffer_width=3840
max_framebuffer_height=2160
hdmi_pixel_freq_limit=400000000
经过一些反复试验,这些设置效果很好。有关更多详细信息,请参阅 RPi Config(请参阅“资源”)。
如果您没有使用 raspi-config 设置超频和 GPU 内存分配,请立即将这些参数添加到 /boot/config.txt 的末尾
arm_freq=900
gpu_mem=512
您的整个 /boot/config.txt 设置现在应如下所示
disable_overscan=1
hdmi_group=2
hdmi_mode=87
hdmi_cvt 3840 2160 24
max_framebuffer_width=3840
max_framebuffer_height=2160
hdmi_pixel_freq_limit=400000000
arm_freq=900
gpu_mem=512
保存 /boot/config.txt 并重新启动。当 RPi 重新启动后,您应该会获得想要的高分辨率视图。
部署第二个 RPi 与复制您刚刚设置的 RPi 的 SD 卡并将其插入第二个 RPi 一样简单。(有关如何操作的信息,请参阅“资源”。)
鼠标和键盘共享由于我的两个 RPi 都在图形模式下运行,我需要键盘和鼠标,但在 NYSERNet, Inc. 指挥中心,消除杂乱是一个重要目标。当需要控制 RPi 时,我不希望到处都是键盘和鼠标。我只想要每个一个,并且我希望这些设备能够无线控制这两台计算机。答案是 SSH 及其 x2x 功能。(有关完整的 Linux Journal x2x 操作指南,请参阅“资源”。)
使用 x2x,您可以将鼠标(和键盘焦点)从一个 RPi 移动到另一个 RPi,从一个显示器移动到另一个显示器,就好像这些屏幕连接到一台计算机一样。它快速且无缝。
我将一个蓝牙 USB 适配器连接到我称为 rpi01 的主 RPi。系统立即检测到它并连接了我的蓝牙键盘和鼠标。我使用窗口管理器测试了功能,一切正常,尽管我需要稍微调整鼠标速度,以便它可以更快地穿梭于广阔的桌面。
RPi 对大多数现代蓝牙 USB 适配器都很友好,因此您应该能够获得一个即插即用的适配器。从那里,您需要与您的辅助 RPi(在我的例子中是 rpi02)共享鼠标和键盘。由于 rpi01 是我的“主” RPi,并且我想连接到位于另一个 RPi 左侧(或 -west
)的我的“辅助” RPi,因此我在 rpi01 上打开一个终端并输入以下内容
pi@rpi01:~$ ssh -X pi@rpi02 x2x -west -to :0
此示例假设您以用户 pi 身份登录到您的主 RPi,并且您想以用户 pi 身份连接到您的辅助 RPi。另一种说法是:如果您的蓝牙鼠标和键盘在 rpi01 上工作,并且您想连接到 192.168.1.11 上的 rpi02,请发出命令
pi@rpi01:~$ ssh -X pi@ 192.168.1.11 x2x -west -to :0
:0
表示主显示器。连接后,鼠标现在将在屏幕之间无缝移动,并且键盘的焦点也会跟随。如果需要,您可以创建一个脚本并将其放在主 RPi 的桌面上,以便您可以在重新启动后快速运行 SSH x2x。
对于那些想要从两个或多个不使用 Linux 的系统执行此操作的人来说,Synergy 是一个不错的选择。这是一个 10 美元的应用程序,可在 Linux、Mac 和 Windows 上运行。
设置 VNC 作为远程控制替代方案如果您不希望任何键盘和鼠标杂乱地放在您计划悬挂显示器的公共空间中(或者因为您只是不经常将它们与 RPi 一起使用),那么 SSH x2x 的一个很好的替代方案是 VNC。
过去在 Linux 上设置 VNC 并访问活动会话相当困难,但这种情况随着 vino 软件包的出现而发生了改变。现在,会话内 VNC 可以通过简单的图形控制面板开箱即用。
使用您的软件包管理器在每个目标 RPi 上安装 vino。安装完成后,打开终端并运行 vino 设置实用程序
$ vino-preferences

图 8. VNC 桌面共享首选项
在“共享”下,同时启用“允许其他用户查看您的桌面”和“允许其他用户控制您的桌面”。取消选中“您必须确认对这台计算机的每次访问”,这样您就不必在目标 RPi 上确认连接。同时选中“要求用户输入此密码”,并输入密码以阻止任何未经授权的访问。
单击“关闭”并重新启动 RPi。这将确保 vino-server 启动。在以后的启动中,vino-server 将自动启动。同样,这里的目标是设置这些 RPi,以便您可以远程完成所有操作,而无需登录以启动基本服务。
一旦 RPi 重新启动,在您使用的任何其他 RPi 上重复 vino 软件包安装和设置,然后转到您的桌面并安装 VNC 兼容的远程桌面客户端。所有平台都有许多选项,但我更喜欢我的 Linux Mint 17 桌面上的 Remmina。Remmina 支持 VNC 和 RDP,并且可以轻松限制图形分辨率和连接速度,以自定义远程用户体验。
使用您的软件包管理器安装 Remmina。它开箱即用地支持 VNC,但您也可以手动安装 remmina-plugin-vnc。
安装完成后,通过输入 remmina
从命令行启动 Remmina(或打开图形控制面板)
$ remmina
使用适当的参数创建新连接(图 9)。

图 9. 创建配置文件
为您要连接的每个 RPi 创建一个配置文件。为每个配置文件命名,确保您已选择 VNC 协议,输入 RPi 的服务器地址,使用默认 RPi 帐户(通常为 pi,除非您已更改),并设置颜色深度和质量。
我使用了 256 种颜色深度和“差”质量,因为我想要更好的远程用户体验。如果您对颜色和质量过于贪婪,RPi 将会吃力地重绘和刷新 VNC 窗口,该窗口大约是典型桌面显示器大小的四倍。
单击“保存”或“连接”,您将连接到您的 RPi。请耐心等待。我发现即使在快速 LAN 上,此连接也不是即时的。这需要几秒钟。连接后,您可以使用 Remmina 显示全屏视图,并使用其窗口滑块导航到不适合您较小桌面显示器上的 RPi 桌面的区域。
在将新的 50 英寸电视悬挂在我们的指挥中心之前,我进行了最后的测试,所有设备仍然在地面上。我启动了每个 RPi,安装并启动了我需要的应用程序,测试了网络和远程连接,并让整个系统运行了几天。一旦我确信一切都稳定了,我们就将屏幕悬挂在低调的壁挂架上,用短 HDMI 电缆连接了 RPi,并将它们塞在电视后面。任何人看到都只会看到显示器;其余的都整齐地隐藏起来了。
最终想法由于您的 RPi 可能位于网络上,因此最好使用防火墙保护它们。我设置了一些 iptables 规则,几乎阻止了所有流量。
此外,为了使 RPi 更易于维护,您可能需要安装 Webmin,这是一款用于 Linux 环境的免费基于 Web 的管理工具。它在 Raspbian 下运行良好,并且在不使用时不会占用资源。
资源NOOBS RPi 配置: https://www.raspberrypi.org/documentation/installation/noobs.md
Config.txt 文档: https://www.raspberrypi.org/documentation/configuration/config-txt.md
RPi 配置文档: http://elinux.org/RPiconfig
复制 SD 卡: https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=46911
Linux Journal x2x 操作指南: https://linuxjournal.cn/content/share-keyboardmouse-between-multiple-computers-x2x
Synergy 鼠标和键盘共享: http://www.synergy-project.org