Raspberry Pi 3 - 浏览器客户端

来自 Alpine Linux

本指南旨在设置一个基于 RAM 的 Alpine 系统,该系统能够运行 X 和 firefox。本教程将介绍如何设置自动登录,以及如何在启动时无需用户交互即可启动 X,这对于信息亭或数字标牌非常有用。稍后我将使用 chromium,它曾用于生产标牌,并且运行良好,配合本地网站。

本指南(或多或少,我可能做了一些其他的自定义)已在生产环境中通过 3.13.5 版本(在 RPI4 上)测试,并且稳定运行超过 3 年。我也在 x86 架构的 3.17 版本上运行过(未经过长时间测试)。

请注意,本指南最初是针对 RPI3 编写的,已在 x86 上使用过,目前在 RPI4 上运行,但指南尚未完全更新。希望在时间允许的情况下,当我必须重制标牌(或新的标牌)时,我将能够编辑本文档以代表 RPI4 或 RPI5 与 alpine。

概述

本指南使用以下内容

  • aarch64 img(尽管本指南也经过测试,与 x86 大致兼容)
  • Raspberry Pi3
  • community repo。

它基于本指南:Raspberry Pi。由于运行 X 和 Firefox 所需的依赖项,完成本教程后,用户可操作的 RAM 磁盘空间非常小。(在 v3.11 中约为 30MB)。2GB RPI 4 在不调整 /boot/config.txt 的情况下,有 1GB 的可用内存。1GB 可能足以满足大多数需求。

之所以使用 aarch64,是因为 firefox-esr 位于 community 仓库中。armhf(截至 v3.11)在 base 或 community 仓库中没有预打包 firefox。

请参阅 https://pkgs.alpinelinux.org/packages?name=*firefox*&branch=v3.11&arch=aarch64

注意:aarch64 构建不兼容所有 Raspberry Pi 型号。请参阅 Raspberry Pi

步骤

基本安装

这些步骤是从 Raspberry Pi 页面复制的。(请注意,为了本指南的缘故,假设 RPI 是仅 RAM 安装。虽然没有要求必须这样做)。

使用 fdisk 或 gdisk 格式化 SD 卡。第一个分区必须是可启动的 FAT 文件系统。例如

Command (m for help): p
Disk /dev/sdb: 59.5 GiB, 63864569856 bytes, 124735488 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1  *     2048 62916607 62914560  30G  b W95 FAT32

# mkdosfs -F 32 /dev/sdX1

解压到挂载的磁盘上

# mount /dev/sdX1 /mnt/folder # tar xvf archive.tar -C /mnt/folder/.

如果您计划增加可用 RAM(例如,对于具有 2 或 4GB 内存的 RPI4)或更改其他配置设置,请立即在 usercfg.txt 中进行。

再次复制 Raspberry Pi 页面

   Insert the SD card into the Raspberry Pi and turn it on
   Log in to Alpine as root. Leave the password empty.
   Type setup-alpine, hit enter.
   Once the installation is complete, commit the changes by typing lbu commit -d

需要记住的事项

  • 无需创建多个分区(例如在 sdcard 上)。占用整个存储介质的一个分区就足以在 diskless / sys 模式下使用。
  • 对于 setup-alpine 安装,大多数选择将是默认值。尤其是在提示“No disks available, try boot media /mmcblk0p1”时。选择默认值 [n]。如果您在安装过程中犯了错误,您可以随时重新映像并重新开始。

节省空间:使用 busybox 而不是 chronyd,使用 dropbear 而不是 openssh

设置完成后,确保已安装 dropbear

# apk add dropbear

启动它

# rc-service dropbear start

将其添加到默认运行级别

# rc-update add dropbear

如果您需要精确的时钟,请在此处启用 software/ntp。(此步骤是可选的)

# rc-update add swclock boot # 启用软件时钟 # rc-update del hwclock boot # 禁用硬件时钟 # setup-ntp

浏览器客户端安装

启用 community repo (/etc/apk/repositories) (取消注释 community)

# nano /etc/apk/repositories # apk update

安装 firefox 依赖项

# apk add libx11-dev libxft-dev libxinerama-dev font-dejavu

注意:字体/图标主题是 FF 正确显示所必需的。没有它,firefox 将加载,但文本不会在浏览器菜单上呈现。

可用 RAM tmp fs 的数量可以在安装时通过以下命令查看:watch df -h

安装 firefox

# apk add firefox-esr

安装 X

# setup-xorg-base

RPI 也需要 X

# apk add xf86-video-fbdev

注意:如果您使用的是 x86,则此命令可能会有所不同。例如,我没有安装任何 xf86-video... 驱动程序,并且在 Xorg 上遇到了 libEGL.so 缺失库错误,通过 “apk search libEGL.so” 解决了该问题,该命令指向 mesa-egl。注意:apk search 区分大小写。其他一些视频驱动程序可能是 xf86-video-intel、xf86-video-vesa... 如果显示驱动程序出现错误,请参阅 Xorg 日志。

此时,我们使用了大约 421MB 的 RAM(如果未设置 NTP)。

Filesystem                Size      Used Available Use% Mounted on
devtmpfs                 10.0M         0     10.0M   0% /dev
shm                     457.9M         0    457.9M   0% /dev/shm
/dev/mmcblk0p1           30.0G    259.4M     29.7G   1% /media/mmcblk0p1
tmpfs                   457.9M    420.0M     37.9M  92% /
tmpfs                    91.6M    188.0K     91.4M   0% /run
/dev/loop0               24.9M     24.9M         0 100% /.modloop

# lbu_commit -d

自动登录,启动时自动运行 Startx

此时,您应该能够以 root 用户身份登录,并手动运行 startx。现在我们将添加配置文件,以实现无需用户交互即可进行操作。

根据我的理解,这里发生的事情是

1) 用户登录。/etc/profile 运行(其中包括对 startx 的调用) 2) Startx 引用任何相关的 xinitrc(用户文件夹或 /etc/X11),它调用 /etc/startup.sh 3) /etc/startup.sh 运行任何命令,例如 dwm、firefox 或 chromium。 

如果您希望在登录时手动启动 startx,则省略 /etc/profile,或者选择仅包含 /root/.profile 的自定义配置文件,以便其他用户可以在不启动 xserver 的情况下登录。可以通过在 shell 脚本中包含对 “logger” 的调用,在 /var/log/messages 中跟踪上述行为。


/root/ 不保存任何文件,因此有必要编辑 /etc/ 中的文件并在所有更改后运行 lbu_commit -d。首先,让我们添加一个名为 firefox 的文件。lbu_commit 是 alpine 本地备份。如果您想保存 /etc 以外的文件夹,请参阅:Alpine_local_backup#Include_special_files.2Ffolders_to_the_apkovl 另请参阅:/etc/apk/protected_paths.d/lbu.list

创建一个名为 /etc/startup.sh 的文件

/etc/startup.sh 的内容

#!/bin/sh firefox-esr http://awebsite.com

!!!注意:这是 ash,而不是 bash。默认情况下,alpine 附带 ash shell。Bash 在仓库中可用。您也可以将 firefox-esr 替换为例如 dwm。

确保该文件是可执行的。

# chmod +x /etc/startup.sh

我们必须编辑 xinitrc 和 profile 配置。通常,这会在用户目录中完成,但在这里我们将使用全局变量以简化操作。请注意,这里我们是“移动” xinitrc,而不是复制它。这不是笔误。新文件将只有一行(用于调用 /etc/startup.sh 脚本)。

# mv /etc/X11/xinit/xinitrc /etc/X11/xinit/xinitrc_BAK # nano /etc/X11/xinit/xinitrc

在此文件中,插入

/etc/X11/xinit/xinitrc 的内容

... /etc/startup.sh

/etc/profile 的末尾(保留现有文件)追加

/etc/profile 的内容

... startx

记住运行 lbu_commit -d
对于自动登录,alpine 使用 busybox,它具有 /sbin/getty/bin/login 的别名。可以导航到 /sbin//bin/ 并运行 /sbin/getty -h 以查看可用的设置。要使 root 在启动时自动登录,请查看现有的 inittab 并根据下面的配置进行编辑

/etc/inittab 的内容

# 设置几个 getty #tty1::respawn:/sbin/getty 38400 tty1 tty2::respawn:/sbin/getty 38400 tty2 tty3::respawn:/sbin/getty 38400 tty3 tty4::respawn:/sbin/getty 38400 tty4 tty5::respawn:/sbin/getty 38400 tty5 tty6::respawn:/sbin/getty 38400 tty6 tty1::respawn:/bin/login -f root

此时创建一个辅助用户可能是一个好主意。虽然本指南为了简单起见以 root 用户身份运行,但在尝试以 root 用户身份登录时,Xorg 可能会出现启动循环。如果您不小心将自己锁定在外(哎呀),只需 scp 一个新的 startup.sh 文件即可。

禁用屏幕保护程序,并刷新网页(可选)

作为信息亭,Raspberry Pi 需要禁用屏幕保护程序(Display Power Management Signaling DPMS)。[需要引证] 我的特定应用程序(视频流)需要偶尔刷新。这些分别通过 xorg.conf、xdotool 和 crontab 进行管理。

/etc/X11/xorg.conf 的内容

Section "Extensions" Option "DPMS" "Disable" EndSection

# apk add xdotool

# crontab -u root -e 
* * * * * DISPLAY=:0 /usr/bin/xdotool key F5

注意:xset 在这里不是一个选项,因为它默认未包含。如果需要,可以从仓库安装。
就是这样。重启后,RPI 应该在没有用户干预的情况下启动进入 firefox。此时,您拥有一个从 RAM 启动的、功能正常的最小化操作系统,带有 firefox,以及约 30MB 的可用空间用于进一步配置。如果您使用 RPI4,您将有更多可用资源。

数字标牌

使用 GNULinux 和 x86/RPI 用于数字标牌是很常见的。快速浏览 https://elinux.org/RPi_Projects/Digital_Signage 将显示许多选项。与那些预构建的项目相比,您为什么要使用本指南进行数字标牌?

  1. Alpine 从 RAM 运行,这可以延长存储设备(闪存/硬盘)的寿命。
  2. 没有必要使用“云”服务或互联网连接。
  3. 您可以完全控制构建和设计(所有信息亭构建步骤都有文档记录,并且学习曲线很小,与上面提到的一些更复杂的项目相比)。
  4. 自由软件。没有经常性成本(可选维护除外)。
  5. 不依赖外部基础设施/框架。完全自由。

在本指南的补充中,我们将安装 Chromium,它似乎是事实上的标准。但是,您可以使用任何 X-Window 应用程序。在这里,我们还将运行一个带有 PHP 的 Web 服务器,该服务器托管我们想要在标牌上显示的资源。确保在 /etc/apk/repositories 中启用 community apk。

# apk add chromium

/etc/startup.sh 中添加 chromium 而不是 firefox

/etc/startup.sh 的内容

... chromium-browser --home-page http://127.0.0.1/resource --no-sandbox --window-size=1920,1280 --start-fullscreen --test-type

注意:这是一个潜在的不安全设置。建议用户添加用户,并删除 --no-sandbox 标签。使用的标签如下:--home-page 将使我们从给定的 URL 开始。--no-sandbox 将允许 root 运行 chromium。--window-size 将为我们提供我们想要的分辨率,而 start-fullscreen 将确保浏览器占据整个屏幕。

如果您将设备部署在电视上,并且不确定其分辨率,则可以使用以下命令从终端(不在 X 中)访问分辨率

# xrandr -d :0

例如,我在 1920x1280 的计算机显示器上构建了我的设备,但是当我部署时,电视是 1920x1080。由于我们直接在 X 上运行 chromium,没有任何 WM,因此有必要从控制台查询 xrandr。如果需要,您可以安装 DWM 并隐藏栏,从而可以通过在 dwm 的 config.h 中配置的键盘快捷键访问终端,但不需要 WM。

确保运行 lbu_commit -d,以便根据需要在 SD 或 HDD 存储上的 apkvol 中保存任何更改。

安装 Apache/PHP

请参阅 Apache

安装 xset 以禁用屏幕保护程序

# apk add xset # xset q # xset s off

隐藏浏览器滚动条

这可以使用 CSS 完成。

body {
  overflow: hidden; /* Hide scrollbars */
}

提示/故障排除

为什么使用此设置?为什么不是 Awesome 或 dwm?

我尝试了 RPi 上 Alpine 的几种不同设置,发现 (dwm | awesome) 和 Firefox 需要太多依赖项才能在 /tmp(在 RAM 中运行)中具有 512MB 的 RPI3 上运行。其他使用较少依赖项的浏览器不稳定(应用程序正在查看视频流)。直接在 X 上运行 firefox 适合可用空间,并且稳定。这是使用 aarch64 而不是 armhf 的原因之一。使用 Alpine,默认情况下,2GB RPI4 具有 1GB 的可用 RAM(用于存储),并且没有此限制。应该可以通过 /boot/config.txt 获得更多 RAM

如果您的应用程序不需要媒体(例如静态网页),您可能可以在 RPi 上运行其他浏览器,例如 midori、falkon 或 surf,而不会出现稳定性问题。

VLC 或 GTK/QT 应用程序也可能适合 RPI 3 上的有限空间。但这尚未经过测试。

Firefox 的宽度和高度不适合显示器

可以使用 -height 和 -width 标志调用 Firefox,例如

firefox -width 480 -height 640 example.org

RPI3 上 Firefox 因内存不足而定期崩溃

在 RPI3 上,我发现 firefox 在观看视频几天后会持续崩溃。在服务器上,我看到了内存耗尽的通知。这可能是内存泄漏。由于可用 RAM 较小,Firefox 会崩溃,导致屏幕空白。

解决方案是通过 cron 设置系统的每晚重启。系统自此一直稳定。但是,如果我再次这样做,我将使用具有 >1GB 内存的 RPI4,这可能会消除每晚重启的需要。

Firefox-esr 在 x86 3.17 版本上出现段错误

在旧的 intel atom 上网本上运行 firefox 时,我看到 firefox 在尝试运行时出现“段错误”。但是 dwm 可以工作。这可能是由于上网本是 x86(和 atom)。Chromium 在 pkgs.alpinelinux.org 中仅适用于 x86-64,因此在为给定设置分配时要记住这一点。

如何轻松备份我的无盘系统?

您应该备份 apkvol,它位于 /media/mmc(sd 卡的位置)。

相关链接