基于 Alpine 定制单功能用途(kiosk)电脑
前言
故事回到 7 年前, 在网上冲浪的时候发现了一篇介绍使用 Ubuntu 打造 kiosk 单功能用途电脑的文章, 挺好玩的, 就翻译了一下并比葫芦画瓢先后用了 CentOS 7, ArchLinux 进行了实现. 历史文章:
翻译 - 使用Ubutnu14.04和Chrome打造单功能用途电脑(大屏展示电脑)
使用CentOS 7+lightdm+Openbox+Chromium打造单功能用途电脑(大屏展示电脑)
ArchLinux+lightdm+Openbox+Chromium定制单功能用途电脑
再来介绍一下什么是 kiosk, 直接看下图, 保证你在许多公共场合见到过类似这样的一体机, 当然人家还会集成摄像头扫码, NFC 刷卡等外设.
至于这些设备使用的底层的操作系统, 基本上都是 Windows 或者 Android. 之前使用 CentOS, ArchLinux 实现的过程其实都还比较繁琐, 也比较重. 接下来就是本次挑战所用到的主角 Alpine Linux 登场了. 它本来用的比较多的场景就是在 Docker 里面作为基础镜像, 因为足够轻量. 官网下载的最新版本系统 IOS 镜像文件仅有 200 多 MB, 对于硬件资源的要求也更不用说有多低门槛了. 好了, 下面直接进入主题.
创建虚拟机
-
首先从清华镜像站下载 Alpine Linux 最新版本的 ISO 镜像文件:
https://mirrors.tuna.tsinghua.edu.cn/alpine/latest-stable/releases/x86_64/alpine-standard-3.22.0-x86_64.iso -
在 VirtualBox 中创建一台虚拟机, 选择下载好的 ISO 镜像文件.
内存随便给个 2G, CPU *2
硬盘 8G 就够了
-
创建好虚拟机后, 我们再打开它的 Settings, 改一下网络模式用
Bridged Adapter
并选中我们物理机的本地网卡. 这样可以将虚拟机直接对接到和物理机相同的网络环境中, 方便我们后续通过 SSH 远程连接访问.
安装 Alpine 系统
- 启动虚拟机后, 会自动从 ISO 引导到命令行界面, 用 root 用户登录(没有密码)
- 运行
setup-alpine
启动安装程序, 使用下面回复:
- Keymap:
none
- Hostname:
自己写
- Interface:
eth0
- Manual network:
n
- New root password:
自己写
- Timezone:
Asia/Shanghai
- Proxy:
none
- NTP client:
busybox
- APK Mirror:
14
清华源 - Setup a user:
自己写
注意这里需要单独创建一个新的普通用户, 给后面浏览器运行的时候用 - ssh server:
openssh
- Disk to use:
sda
- Use it:
sys
注意这个需要指定安装方式使用 sys 即当成安装到本地磁盘的系统 - Erase and continue:
y
完整安装步骤响应截图:
- 安装完毕后, 将 ISO 从虚拟机中移除, 然后执行
reboot
重启即可进入本地磁盘中的系统.
配置 kiosk
- 从本地启动的系统使用普通用户
lpwm
和密码登录后, 先运行ip a
检查当前 IP 地址
- 接下来我们就可以在物理机上通过 SSH 使用安装过程中新创建的普通用户
lpwm
进行远程登录, 这样可以方便我们复制粘贴命令
- 先在当前登录的普通用户状态下创建 X 桌面环境的配置文件
echo -e "#!/bin/sh\nopenbox-session &\nfirefox -kiosk https://www.bing.com" > ~/.xinitrc && chmod +x ~/.xinitrc
展开解释一下配置文件中执行的两条命令:
openbox-session &
在后台运行 openbox 会话进程, 用于提供基础的桌面环境支持.
firefox -kiosk https://www.bing.com
以 kiosk 模式启动 Firefox 并访问 Bing. 该模式下鼠标右键不可用. 相关介绍: Firefox for Enterprise Kiosk mode
- 切换到 root 用户后安装桌面环境所需的最少依赖环境
susetup-xorg-base && apk add openbox font-noto-cjk firefox
注:
setup-xorg-base
是 Alpine Linux 中的一个脚本,用于安装 X Window System(Xorg)的基础组件。它提供了一个简单的安装方式,适用于需要图形界面的环境。
openbox
是一款轻量级、高度可定制的开源窗口管理器,适用于 Linux 和其他类 Unix 系统。
font-noto-cjk
是一个开源的字体家族,由 Google 的 Noto 字体项目开发,专门设计用于覆盖中文(简体与繁体)、日文和韩文(CJK)的字符。
firefox
不用说了吧
- [可选] 为 Firefox 创建策略配置, 禁止用户访问开发者工具(F12)
echo '{"policies": {"DisableDeveloperTools": true}}' | tee /usr/lib/firefox/distribution/policies.json
- 再返回 Virtualbox 的虚拟机中, 运行
startx
启动桌面环境, 直接打开了 kiosk 模式下的 Firefox 并访问了指定的 URL.
配置开机自动登录
至此, 我们已经实现了主要的功能, 但是系统每次启动后还需要手动登录用户并且运行 startx
才可以进入全屏的 kiosk 界面. 下面继续修改 Alpine 配置实现开机自动以 lpwm
用户登录并启动 xorg (startx
)
# 注意以 root 身份下执行# 添加 agetty 包
apk add agetty# 编辑配置文件
vi /etc/inittab
将 tty1
开头的行注释掉, 插入下面内容:
tty1::respawn:/sbin/agetty --autologin lpwm --noclear tty1 linux
参考文档: TTY Autologin
继续为普通用户创建登录自动运行的脚本
su - lpwm
vi ~/.profile
粘贴下面内容保存退出:
if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; thenstartx
fi
reboot
重启
最终效果
后记
相较于之前使用 CentOS/ArchLinux 作为基础系统的方式, Alpine Linux 在完全配置后的磁盘占用空间仅有 1.1GB, 可以说是相当迷你了:
经过测试, 在 kiosk 模式下的 Firefox 中还可以正常播放视频以及声音, 完美~
如果需要临时切换到命令行中进行系统调试, 还可以通过快捷键 Ctrl + Alt + F2
切换到 tty2
会话 (最多到 F6, inittab
中预先定义的) 进行 CLI 操作.