Arcan
Arcan是一个强大的开发框架,可用于创建从专用嵌入式应用程序的用户界面到完整独立桌面环境的几乎任何内容。
其核心是一个健壮且可移植的多媒体引擎,具有经过充分测试和详细文档的Lua脚本接口。开发强调安全性、可调试性和性能 —— 遵循API设计的最小惊讶原则。
有关功能、设计、目标、当前开发、路线图、更新日志、贡献说明等更多详细信息,请参阅arcan-wiki。
还有一个网站收集了其他链接、公告、发布、视频/演示等内容。
-
社区联系方式:请访问irc.libera.chat上的IRC频道#arcan和/或Discord邀请链接
-
开发者信息请参阅HACKING.md
由于Microsoft日益滥用的做法,GitHub存储库即将废弃,因此我们正在迁移到自托管的Fossil。目前存储库会与GitHub保持同步,但不会在那里进行任何活跃的开发活动。请访问fossil.arcan-fe.com。
入门指南
一些发行版,如voidlinux,已将大部分Arcan作为其软件包的一部分,因此您可以选择其中之一来节省一些工作。其他具有活跃社区的方式包括通过Nix(例如:nix-shell -p arcan.all-wrapped)。
Docker容器模板(主要用于无头开发和测试)可以在这里找到,质量从糟糕到差劲不等(就像Docker一样):dockerfiles。
从源代码编译
有许多方法可以调整构建步骤以减少依赖项。根据您的目标,还有更多方法来配置和集成组件;是作为原生桌面运行还是在另一个桌面内作为应用程序运行时运行?
大多数选项都通过在src目录上运行cmake的构建输出公开。
为了简单起见,这里有一个构建预设"everything",我们将在此使用。
依赖项
具体的软件包名称取决于您的发行版,但常见的有:
sqlite3, openal-soft, sdl2, opengl, luajit, gbm, kms, freetype, harfbuzz
libxkbcommon
对于更多编码和解码选项,您可能还需要:
libvlc-core (videolan), ffmpeg套件, leptonica + tesseract (ocr)
libvncserver libusb1, v4l2-loopback, mupdf
首先,我们需要一些现在手动克隆的内部依赖项:
git clone https://github.com/letoram/arcan.git
cd arcan/external/git
./clone.sh
cd ../../
这些通常不是必需的,主要用于确保某些在发行版之间可能有所不同的构建选项(luajit),并确保可以在其他损坏的用户空间中静态链接和执行可恢复的桌面(因此嵌入式启动)。唯一的例外是OpenAL,它被修补以供特殊的(arcan-lwa)构建使用。这计划进行重构以消除该依赖,但目前有其他优先事项。
编译
现在我们可以配置和构建主引擎:
mkdir build
cd build
cmake -DBUILD_PRESET="everything" ../src
与其他基于CMake的项目一样,您可以添加:
-DCMAKE_BUILD_TYPE=Debug
以将发布版本切换为调试版本。
当它完成依赖项探测后,您将得到一份报告,显示已找到哪些依赖项以及哪些功能已打开/关闭,或者如果无法找到某些必需的依赖项,它会提醒您。
像平常一样进行编译和安装(即make, sudo make install)。会生成多个二进制文件,其中"主要"的一个简称为arcan。要进行"源内"测试(无需安装),您应该能够运行:
./arcan -T ../data/scripts -p ../data/resources ../data/appl/welcome
-T参数设置我们内置/共享的脚本集,-p设置可以找到共享资源(如字体等)的位置,最后一个参数是要运行的实际"脚本"。
安装后,这应该简化为:
arcan welcome
它会根据各种环境变量(DISPLAY, WAYLAND_DISPLAY, ARCAN_CONNPATH)的存在自动确定是应该作为本机显示服务器运行,还是在另一个甚至是自身内嵌套运行。
"welcome"是一个简单的内置欢迎屏幕的名称,几秒钟后会自动关闭。
对于更直接有用的内容,您可以尝试内置应用程序"console":
arcan console
它应该像您的普通控制台命令行一样工作,但增加了可以运行(与Arcan兼容的)图形应用程序的功能。有关其他项目,请参阅下面的"相关项目"。
如果输入设备出现问题,快速而简单的"eventtest"位于:
arcan /path/to/arcan/tests/interactive/eventtest
这可能有助于确定责任归属。
SUID注意事项
生成的egl-dri平台"arcan"二进制文件默认以suid方式安装。除非需要某些特定功能,否则这并非严格必要,例如Linux上的笔记本电脑背光控制,因为这些功能需要访问sysfs等。 如果这不相关,你可以去掉二进制文件上的suid属性,但请注意你当前的用户仍然需要访问相关的/dev/input/event、/dev/dri/cardN和/dev/dri/renderN文件才能正常工作 -- 否则输入和/或图形设备可能无法被检测或使用。
该二进制文件确实会分离出一个非suid部分,主引擎就在其上运行,请查看posix/psep_open.c以审核哪些内容以更高权限运行,以及降低权限的代码。特权进程负责协商设备访问、实现虚拟终端切换,并作为看门狗在发生活锁或某些GPU故障时恢复主进程。
钩子脚本
无论使用何种应用程序,扩展引擎行为的另一种方式是所谓的钩子脚本。这些脚本位于由-T命令行参数覆盖的"系统脚本路径"中,或默认的shared/arcan/scripts中。
这些脚本的理念是能够提供"可切换"的功能,这些功能需要引擎内部的配合,以便进行快速的自定义修改或帮助桥接其他工具。
一个很好的例子是"external_input":
arcan -H hooks/external_input.lua -H hooks/external_input.lua myappl
这将打开两个连接点,"extio_1"和"extio_2",允许一个客户端连接并提供输入,这些输入对"myappl"应用程序来说将显示为来自引擎。
这些在手册页中有更详细的介绍。
网络
Arcan-net是一个允许你通过网络转发一个或多个arcan客户端的二进制文件。它默认构建,可以作为单独的网络工具触发,也可以通过设置ARCAN_CONNPATH=a12://id@host:port或当窗口管理器发出迁移请求时从shmif间接启动。
另见:src/a12/net/README.md和src/a12/net/HACKING.md。
Wayland
"arcan-wayland"或在某些地方称为"waybridge"的二进制文件增加了对wayland和X客户端(通过Xwayland)的支持。它可以作为全局系统服务运行,例如:
arcan-wayland -xwl
或者根据具体情况运行,比如:
arcan-wayland -exec weston-terminal
对于兼容的wayland客户端,以及:
arcan-wayland -exec-x11 xterm
对于X客户端。推荐使用"按情况"的方式,因为它比让多个客户端共享同一个桥接进程更安全,且成本可以忽略不计。缺点是一些依赖于建立多个不同wayland连接的复杂客户端可能无法正常工作。Firefox是一个已知的违例。
由于使用wayland的复杂性,有许多调优和故障排除选项,请查阅手册页和--help开关。
数据库
所有运行时配置都整合到一个数据库中,可以是默认的"arcan.sqlite"或明确设置的数据库(arcan -d mydb.sqlite)。
这用于平台特定选项、引擎特定选项以及运行脚本允许启动的受信任客户端。它还用作任何正在运行的arcan应用程序的配置键值存储。
举个快速例子,这是如何检查和修改"Durden"当前使用的键:
arcan_db show_appl durden
arcan_db add_appl_kv durden shadow_on true
一些视频平台的高级配置可以通过保留的arcan应用程序名称设置。例如,这将为"egl-dri"平台版本设置主要图形卡设备名称:
arcan_db add_appl_kv arcan video_device=/dev/dri/card2
要添加"启动目标",你可以使用类似的方法:
arcan_db add_target net BIN /usr/bin/arcan-net -l netfwd
arcan_db add_config arcan-net default 10.0.0.10 6666
arcan_db add_target xterm BIN /usr/bin/arcan-wayland -exec-x11
这允许应用程序以受信任的子进程方式启动程序(继承其连接原语,而不是尝试使用某些操作系统依赖的命名空间来查找它们)。上面的例子会以本地模式生成arcan-net,其中连接到"netfwd"连接路径的客户端将被重定向到监听10.0.0.10:6666的服务器。
这个工具有许多控制和选项,因此建议你查看其手册页以获取更多详细信息和说明。
无头模式
"everything"构建选项还应该生成一个名为"arcan_headless"的二进制文件,至少在BSD和Linux上是这样。这个二进制文件可以用来运行arcan,而不会干扰你的其他图形和显示系统。只要能访问"渲染节点"(/dev/dri/renderD128等),它也应该可以在容器和其他严格的沙盒解决方案中正常工作。
为了使其有用,它可以录制/流式传输到虚拟屏幕。按照上面的例子,这样的设置示例如下:
ARCAN_VIDEO_ENCODE=protocol=vnc arcan_headless console
假设构建系统找到了libvncserver依赖,这应该会在localhost+5900留下一个暴露的(不安全、无保护的……)vnc服务器。查看afsrv_encode以获取可以添加到编码环境中的参数列表,以控制发生的情况。
资金支持
本项目通过NGI0 Entrust获得资金支持,这是由NLnet设立的基金,得到了欧盟委员会下一代互联网计划的财政支持。在NLnet项目页面了解更多信息。
相关项目
如果你对开发自己的项目不感兴趣,那么单独使用这个项目的各个部分可能用处不大。以下是一些你可能想要了解的项目:
-
Durden是主要的桌面环境,使用本项目作为其显示服务器。
-
Safespaces是一个实验性的VR/3D桌面环境。
-
Pipeworld是一个数据流(类似Excel)编程环境。
-
Arcan-Devices收集了额外的驱动程序。
为了支持更多类型的客户端等,还有:
-
Wayland支持(见上面的Wayland部分,以及src/wayland/README.md)。
-
QEmu是一个修补过的QEmu版本,增加了-ui arcan选项。
-
Xarcan是一个修补过的Xorg,允许你在"窗口中"运行X会话。
-
nvim-arcan是一个neovim前端,作为原生arcan客户端。
工具
还有一些辅助工具可用于添加某些功能,如支持VR设备和托盘图标。这些工具单独构建,可以在tools/子目录中找到。它们有自己的独立构建系统和相应的README.md文件。
这些工具假定arcan及其相应的库已经构建并安装。它们与引擎版本锁定并同步,所以如果你升级了引擎,请确保重新构建这些工具。
主要的感兴趣工具有:
Acfgfs
Acfgfs是一个工具,可以将某些arcan应用程序挂载为FUSE文件系统。应用程序必须明确支持这一功能。对于Durden桌面环境,你可以使用global/settings/system/control=somename,然后:
arcan_cfgfs --control=/path/to/durden/ipc/somename /mnt/desktop
桌面控制/配置应该在指定的挂载点上暴露出来。
Aclip
Aclip是一个类似于Xclip的剪贴板管理器。它允许在Durden等桌面环境和X服务器之间桥接剪贴板。
这需要允许剪贴板桥接(出于安全原因默认禁用)。在Durden中,通过global/settings/system/clipboard激活,你可以控制工具获得多少剪贴板访问权限。
Aloadimage
Aloadimage是一个简单的沙盒图像加载器,类似于xloadimage。它在开发使用arcan的应用程序时测试客户端行为很有用,同时也是一个不错的图像查看器,具有相当快的图像加载速度、基本的播放列表控制等功能。
Vrbridge
VR bridge是一个可选的输入驱动程序,提供arcan_vr二进制文件,增加了对各种头戴式显示器的支持。关于其设置和使用的更详细说明可以在"相关项目"部分提到的Safespaces项目中找到。
Trayicon
Arcan-trayicon是一个工具,可以链式加载另一个arcan客户端,以及两个参考图像(激活和非激活状态)。它尝试在运行中的arcan应用程序的图标托盘中注册自己,尽管必须明确启用支持。在Durden中,通过以下路径完成:
global/settings/statusbar/buttons/right/add_external=tray
然后你可以使用:
ARCAN_CONNPATH=tray arcan-trayicon active.svg inactive.svg afsrv_terminal
或者其他arcan客户端,当点击托盘按钮时将被加载,限制在弹出窗口中,然后在弹出窗口被销毁时被杀死。这是一种快速方便的方式来包装各种系统服务和外部命令脚本。