1. 为什么要在 Ubuntu Server 上播放视频和显示网页很多人第一次听到“在 Ubuntu Server 上播放视频、显示网页”这个需求时第一反应是Server 版不是没有图形界面吗这不是自找麻烦吗我一开始也这么想直到实际碰到几个真实场景才发现这个需求其实非常合理而且用对了方法之后整套方案跑起来相当稳。最常见的场景有这么几类一是数字标牌和广告机一台小主机装在电视后面开机自动全屏循环播放宣传视频或者展示网页看板二是监控大屏和数据显示需要把某个内部数据面板或者图表页面常驻显示在显示器上但又不希望有人去操作桌面三是展厅和门店演示需要自动播放产品视频同时还能切换到网页展示交互内容四是开发测试环境后端同学需要在一台干净的服务器上验证视频解码、网页渲染相关的功能不想装一整套桌面系统。这些场景有一个共同点不需要完整的桌面交互体验但需要稳定的图形输出能力。Ubuntu Server 默认不带图形界面这是它的优势——资源占用低、启动快、没有多余服务干扰。但这也意味着想让它播放视频、显示网页就得自己把图形栈和播放器/浏览器补上去。补的方式有很多种选错了会踩不少坑选对了其实十几分钟就能跑通。这篇文章面向的是有一定 Linux 基础、但没怎么折腾过图形输出的同学。我会从整体思路讲起把方案选型的逻辑、核心组件的原理、完整的实操步骤、参数计算以及我自己踩过的坑全部摊开讲清楚。看完之后你应该能在一台 Ubuntu Server 上从零搭出一套能自动播放视频、显示网页的环境并且知道每个环节为什么这么做。需要先说明一点本文讨论的是本地物理显示器输出也就是服务器主机直接接一根 HDMI 或 DP 线到屏幕上。这是数字标牌、监控大屏这类场景最主流、最稳定的做法。至于通过网络把画面投到另一台设备上那是另一个话题涉及的东西完全不同这里不展开。2. 整体方案设计与选型思路2.1 先搞清楚Server 版缺的到底是什么Ubuntu Server 和 Desktop 的本质区别不在于“能不能显示画面”而在于默认安装的软件包集合不同。Server 版默认不安装图形服务器display server、窗口管理器window manager、桌面环境desktop environment这三层东西。但只要硬件支持内核层面的显卡驱动、帧缓冲framebuffer机制都是存在的。所以我们要做的事情本质上就是按需补上图形栈而不是“把 Server 变成 Desktop”。这个认知很重要因为它决定了我们不会去装一整套 GNOME 或者 KDE而是选择更轻量的方案。图形栈从下到上大致是这样的内核层显卡驱动负责和硬件对话输出到显示接口显示服务器层X11 或 Wayland负责管理显示设备、输入设备、窗口的绘制窗口管理器层负责窗口的摆放、边框、焦点应用层播放器、浏览器等具体程序Server 版默认只有内核层。我们要补的是上面三层但可以补得非常薄。2.2 三种主流方案对比在实际操作中我总结出三种可行方案各有适用场景方案核心组件资源占用稳定性适用场景纯帧缓冲方案fbdev / DRM 轻量播放器极低高只播视频无网页需求轻量 X11 方案Xorg Openbox 播放器/浏览器低高视频网页混合推荐完整桌面方案Xorg GNOME/KDE高中需要复杂交互纯帧缓冲方案是最省资源的直接用内核的 DRMDirect Rendering Manager接口把画面画到屏幕上连 X11 都不需要。像ffmpeg配合fbdev输出或者mpv的--vodrm模式都能做到。但它的致命缺点是没法显示网页因为浏览器几乎都依赖 X11 或 Wayland。所以如果你的需求里明确有“显示网页”这个方案直接排除。完整桌面方案就是装个 GNOME 或 KDE然后像用普通电脑一样操作。优点是省心什么都能跑缺点是资源占用大一台低配小主机可能跑不动而且桌面环境自带一堆服务开机慢、容易出小毛病长期无人值守运行不够稳。轻量 X11 方案是我最推荐的。核心是装一个最小的 Xorg配一个极简的窗口管理器比如 Openbox 或者干脆不用窗口管理器然后直接全屏跑播放器或浏览器。资源占用比完整桌面低一个数量级稳定性也好因为组件少、依赖少、出问题的面就小。2.3 为什么选 X11 而不是 Wayland现在 Wayland 是大趋势桌面版 Ubuntu 早就默认 Wayland 了。但在“Server 上跑全屏应用”这个特定场景下我依然推荐 X11原因有三第一兼容性。很多播放器和浏览器的全屏、置顶、禁用屏保这些行为在 X11 下有成熟稳定的实现Wayland 下则经常需要额外的协议支持配置起来更麻烦。第二可控性。X11 的配置文件xorg.conf可以非常精细地控制分辨率、刷新率、多屏布局这对数字标牌场景很重要。Wayland 在这方面还在完善中。第三调试方便。X11 出问题的时候日志清晰工具多网上资料也多。Wayland 相对新遇到冷门问题排查起来费劲。当然如果你的硬件比较新X11 驱动支持不好那 Wayland 也是可以考虑的。但对大多数场景X11 是更稳妥的选择。2.4 播放器和浏览器的选型播放器方面mpv是我的首选。它轻量、命令行友好、支持硬件解码、全屏和循环播放都是一行参数的事。vlc也能用但依赖更重命令行控制不如 mpv 灵活。如果只是简单播放ffplay也行但功能偏弱。浏览器方面如果只是显示一个固定的网页看板chromium的无头模式配合--kiosk参数是最常用的。它支持全屏、禁用各种提示、自动刷新。Firefox 的 kiosk 模式也可以但配置项没 Chromium 丰富。如果网页需要复杂交互那可能得考虑更完整的方案但那就偏离“Server 轻量显示”的初衷了。3. 核心组件原理与关键细节解析3.1 Xorg 是怎么把画面送到屏幕上的理解 Xorg 的工作流程对排查问题很有帮助。简单说Xorg 启动后会做这几件事探测硬件通过内核的 DRM 接口找到显卡和连接的显示器读取支持的分辨率和刷新率。选择驱动根据显卡型号加载对应的 DDX 驱动比如 modesetting、intel、amdgpu或者用通用的 fbdev。建立显示在显存里开辟一块区域作为“屏幕”设置好分辨率和色深。监听输入管理键盘鼠标等输入设备。接受客户端连接应用程序通过 X11 协议连接上来把自己的窗口画到屏幕上。这里有个关键点Xorg 需要知道用哪个显示输出。在只有一块显卡、一个显示器的情况下它通常能自动探测。但如果是多屏或者显示器通过转接器连接就可能需要手动指定。这就是为什么有时候装完 Xorg 启动黑屏——它可能把画面输出到了一个不存在的接口上。3.2 分辨率与刷新率的计算逻辑数字标牌场景对分辨率很敏感因为要匹配屏幕的物理分辨率不然会有黑边或者拉伸。Xorg 的分辨率设置涉及几个概念物理分辨率显示器面板的真实像素数比如 1920x1080。模式行Modeline描述一个分辨率下像素时钟、水平/垂直同步时序等参数。Xorg 可以自动生成也可以手动指定。刷新率每秒重画多少次单位 Hz。视频播放一般 60Hz 就够高帧率内容可能需要 120Hz。如果 Xorg 自动探测的分辨率不对可以用xrandr工具手动设置。比如# 查看当前支持的输出和模式 xrandr # 设置 HDMI-1 输出为 1920x1080 60Hz xrandr --output HDMI-1 --mode 1920x1080 --rate 60如果需要的分辨率不在列表里就得用cvt或gtf生成 modeline再用xrandr --newmode添加。这个过程我在第 4 章会详细演示。3.3 mpv 的硬件解码与输出后端mpv 播放视频时有两个关键选择解码方式和输出后端。解码方式上软解CPU 解码兼容性最好但 1080p 以上就可能吃满 CPU低配机器扛不住。硬解GPU 解码把解码工作交给显卡CPU 占用能降到个位数。mpv 用--hwdec参数控制常见值有auto、vaapi、nvdec等。auto会尝试自动选择但有时候选错反而出问题所以生产环境我建议明确指定。输出后端上mpv 用--vo参数控制。在 X11 下--vogpu是默认的走 OpenGL 渲染性能好。如果显卡驱动有问题可以退回--vox11用传统的 X11 绘制兼容性更好但性能差些。在纯帧缓冲场景下--vodrm可以绕过 X11 直接输出。这里有个经验硬解和输出后端要匹配。比如用 VAAPI 硬解输出后端最好也是走 GPU 的不然解码后的帧还要在内存里倒腾一遍反而更慢。3.4 Chromium kiosk 模式的关键参数Chromium 的 kiosk 模式是显示网页看板的核心。几个关键参数--kiosk全屏隐藏所有浏览器 UI。--noerrdialogs不弹错误对话框。--disable-infobars不显示“Chrome 正受到自动测试软件控制”之类的提示条。--disable-session-crashed-bubble崩溃后不弹恢复提示。--incognito无痕模式避免缓存和登录状态干扰。--autoplay-policyno-user-gesture-required允许网页自动播放音视频这个对视频网页很重要。还有一个容易被忽略的点Chromium 需要--no-sandbox吗在 root 用户下运行 Chromium不加--no-sandbox会启动失败。但--no-sandbox会降低安全性。所以更好的做法是创建一个普通用户来跑 Chromium而不是用 root。这一点我在实操部分会强调。4. 完整实操流程与核心环节实现4.1 环境准备与依赖安装假设你手上是一台刚装好的 Ubuntu Server已经能联网。第一步是更新系统并安装基础依赖sudo apt update sudo apt upgrade -y sudo apt install -y xorg openbox mpv chromium-browser unclutter xinit这里解释一下每个包的作用xorgX11 显示服务器核心。openbox极简窗口管理器负责窗口的基本管理。mpv视频播放器。chromium-browser浏览器用于显示网页。unclutter自动隐藏鼠标指针数字标牌场景很有用。xinit提供startx命令用来手动启动 X 会话。如果你的显卡需要专有驱动比如某些 NVIDIA 卡还需要额外安装。但大多数集成显卡用开源的 modesetting 驱动就够了不用折腾。注意安装 Chromium 时Ubuntu 可能会把它装成 snap 包。snap 版的 Chromium 在 kiosk 场景下有一些权限和路径上的坑如果遇到问题可以考虑用 apt 直接装 deb 版或者换用 Firefox。4.2 配置 Xorg 自动启动与分辨率Server 版默认不会自动启动 X。我们需要配置成开机自动进入图形界面。有两种做法一是用startx配合.xinitrc二是配置一个 systemd 服务。前者简单后者更规范。我先讲简单的。创建一个普通用户不要用 root 跑图形程序sudo adduser kiosk sudo usermod -aG video,audio kiosk然后切换到该用户创建~/.xinitrcsu - kiosk nano ~/.xinitrc内容如下#!/bin/sh xset -dpms xset s off xset s noblank unclutter -idle 0.5 -root exec openbox-session这几行的作用是关闭显示器电源管理-dpms、关闭屏保s off、禁止屏幕空白s noblank启动 unclutter 隐藏鼠标最后启动 openbox。然后配置开机自动执行startx。编辑该用户的.bash_profilenano ~/.bash_profile加入if [ -z $DISPLAY ] [ $(tty) /dev/tty1 ]; then exec startx fi这样当这个用户从 tty1 登录时会自动启动 X。分辨率方面如果自动探测不对可以在~/.xinitrc里 openbox 启动前加一行xrandr命令。比如xrandr --output HDMI-1 --mode 1920x1080 --rate 60如果 1920x1080 不在支持列表里先用cvt生成 modelinecvt 1920 1080 60输出类似Modeline 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync然后xrandr --newmode 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync xrandr --addmode HDMI-1 1920x1080_60.00 xrandr --output HDMI-1 --mode 1920x1080_60.004.3 用 mpv 实现视频循环播放mpv 播放视频的命令很直接mpv --fs --loopinf --no-audio --hwdecauto /path/to/video.mp4参数解释--fs全屏。--loopinf无限循环。--no-audio如果不需要声音禁掉可以省资源。--hwdecauto自动硬件解码。如果需要声音去掉--no-audio但要确保音频输出设备正确。可以用--audio-devicealsa/default指定。如果视频有多个想按顺序循环播放可以写个播放列表文件或者用 shell 脚本#!/bin/bash while true; do for f in /path/to/videos/*.mp4; do mpv --fs --no-audio --hwdecauto $f done done这个脚本会无限循环播放目录下所有视频。注意--loopinf就不需要了因为外层 while 已经负责循环。实操心得mpv 在 X11 下全屏时有时候会被窗口管理器干扰出现标题栏或者无法真正全屏。解决办法是在 mpv 参数里加--no-border或者在 openbox 配置里把 mpv 窗口设为全屏无装饰。4.4 用 Chromium 显示网页看板Chromium 的 kiosk 命令chromium-browser --kiosk --noerrdialogs --disable-infobars \ --disable-session-crashed-bubble --incognito \ --autoplay-policyno-user-gesture-required \ http://your-dashboard-url如果网页需要定时刷新Chromium 本身没有内置的定时刷新参数但可以用一个简单的脚本配合xdotool发送 F5或者更优雅的做法是在网页里用 JavaScript 定时location.reload()。如果网页是你自己控制的后者最省事。如果要在视频和网页之间切换可以写一个调度脚本用kill和启动命令来切换。但更简单的做法是让网页里嵌入视频这样只需要 Chromium 一个程序。很多看板系统都支持嵌入视频播放器这样架构最简单。4.5 开机自动启动完整方案把上面的东西串起来最终的自动启动流程是系统启动自动登录kiosk用户到 tty1。.bash_profile检测到 tty1 且无 DISPLAY执行startx。startx读取.xinitrc设置显示参数启动 openbox。openbox 的 autostart 配置里启动 mpv 或 Chromium。openbox 的 autostart 文件在~/.config/openbox/autostart。创建它mkdir -p ~/.config/openbox nano ~/.config/openbox/autostart内容# 启动视频播放 mpv --fs --loopinf --no-audio --hwdecauto /path/to/video.mp4 # 或者启动网页看板 # chromium-browser --kiosk --noerrdialogs --disable-infobars \ # --disable-session-crashed-bubble --incognito \ # --autoplay-policyno-user-gesture-required \ # http://your-dashboard-url 注意末尾的让程序在后台运行不阻塞 openbox 启动。自动登录 tty1 需要配置 systemd。编辑sudo nano /etc/systemd/system/gettytty1.service.d/autologin.conf内容[Service] ExecStart ExecStart-/sbin/agetty --autologin kiosk --noclear %I $TERM这样开机后会自动以 kiosk 用户登录 tty1触发后续流程。5. 常见问题与排查技巧实录5.1 黑屏、花屏、分辨率不对这是最常见的问题原因通常有三类第一类Xorg 没选对显示输出。排查方法是看 Xorg 日志cat /var/log/Xorg.0.log | grep -i output\|connected\|mode日志里会列出检测到的输出接口和它们的状态。如果显示某个接口disconnected但你的显示器明明插着可能是线材或者转接器问题。第二类分辨率模式不支持。用xrandr查看可用模式如果目标分辨率不在列表按 4.2 节的方法手动添加。第三类显卡驱动问题。如果是较新的显卡开源驱动可能支持不完善。可以尝试在 Xorg 配置里指定modesetting驱动或者安装厂商驱动。现象可能原因排查命令完全黑屏Xorg 未启动或输出到错误接口cat /var/log/Xorg.0.log花屏驱动或显存问题dmesg分辨率不对模式未正确设置xrandr画面偏移modeline 时序不对重新生成 modeline5.2 mpv 无法硬件解码如果--hwdecauto不生效mpv 会回退到软解CPU 占用飙升。排查方法mpv --hwdecauto --msg-levelallv /path/to/video.mp4 21 | grep -i hwdec看输出里实际用了什么解码器。如果显示hwdec not available可能是显卡不支持该编码格式的硬解比如老显卡不支持 H.265。驱动没装好VAAPI 或 VDPAU 接口不可用。mpv 编译时没启用对应支持。解决办法确认显卡支持的硬解格式可以用vainfo命令查看然后明确指定--hwdecvaapi或--hwdecnvdec。如果实在不行只能软解但要确保 CPU 性能够。5.3 Chromium 启动失败或显示异常Chromium 在 Server 环境下常见的问题问题一root 用户下无法启动。报错Running as root without --no-sandbox is not supported。解决办法是不要用 root创建普通用户。如果非要用 root加--no-sandbox但不推荐。问题二缺少字体网页显示方块。Server 版默认字体很少装一下sudo apt install -y fonts-noto fonts-noto-cjk问题三网页视频无法自动播放。加--autoplay-policyno-user-gesture-required参数。问题四内存占用越来越高。Chromium 长时间运行可能内存泄漏。解决办法是定时重启用 cron 或者脚本每天重启一次。5.4 鼠标指针不消失数字标牌场景不希望看到鼠标指针。unclutter可以自动隐藏但如果没生效检查unclutter 是否在 openbox 之前启动。参数-idle 0.5是否设置合理0.5 秒无操作后隐藏。有些应用会强制显示指针这时候可以用xdotool把指针移到屏幕角落。5.5 开机自动启动不生效排查顺序确认自动登录配置正确systemctl status gettytty1看状态。确认.bash_profile里的判断条件能触发可以加日志。确认.xinitrc有执行权限chmod x ~/.xinitrc。确认 openbox autostart 文件路径和权限正确。看~/.xsession-errors或者~/.local/share/xorg/Xorg.0.log里的错误。避坑技巧调试阶段不要直接配开机自启先手动startx跑通确认画面正常、程序能启动再配自启。这样出问题的时候能快速定位是图形栈的问题还是自启配置的问题。6. 性能优化与长期运行建议6.1 资源占用控制一套轻量 X11 openbox mpv/Chromium 的方案空闲时内存占用大概在 200-400MBCPU 占用个位数。如果发现占用异常高检查是否有多个 X 会话在跑。Chromium 是否开了太多标签或扩展。mpv 是否在用软解。可以用htop实时观察找出占用大户。6.2 稳定性保障长期无人值守运行稳定性是第一位的。我的经验是禁用不必要的服务Server 版默认跑的一些服务如 snapd、unattended-upgrades如果不需要可以关掉减少干扰。配置自动重启如果播放器或浏览器崩溃用脚本监控并重启。比如用supervisor或者简单的 while 循环。定期重启系统每周重启一次清理内存碎片和潜在泄漏。日志轮转Xorg 和应用的日志会越来越大配置 logrotate 避免占满磁盘。6.3 远程管理虽然是本地显示但远程管理能力很重要。建议开启 SSH方便远程登录排查。如果需要看当前画面可以用xwd截图或者装个 VNC 服务临时查看。配置好防火墙只开放必要端口。实操心得我在一个展厅项目里用这套方案跑了半年多中间只出过一次问题——Chromium 因为网页里的一个内存泄漏跑了一周后卡死。后来加了个每天凌晨重启 Chromium 的 cron 任务就再没出过问题。所以定时重启这个看似笨的办法在实际生产环境里非常有效。7. 方案扩展与变体思路7.1 多屏异显如果一台主机要驱动多个显示器每个显示不同内容X11 的xrandr可以配置多屏布局。比如xrandr --output HDMI-1 --mode 1920x1080 --pos 0x0 \ --output HDMI-2 --mode 1920x1080 --pos 1920x0这样两个屏幕拼成一个 3840x1080 的大桌面。然后可以让 mpv 全屏到其中一个屏幕Chromium 全屏到另一个。mpv 用--screen0或--screen1指定Chromium 用--window-position和--window-size控制。7.2 视频和网页混合显示如果需要在同一个屏幕上一部分显示视频一部分显示网页可以用窗口管理器手动布局。比如 openbox 配置里让 mpv 窗口占左半边Chromium 占右半边。或者更简单做一个 HTML 页面左边嵌入视频右边是数据看板然后 Chromium 全屏显示这个页面。后者架构最简单推荐优先考虑。7.3 定时切换内容用 cron 或者 systemd timer定时切换播放内容。比如白天播放宣传视频晚上显示数据看板。实现方式可以是定时 kill 当前程序并启动另一个或者用一个控制脚本统一管理。这套方案的可扩展性其实很强核心就是“轻量 X11 全屏应用”这个模式。理解了原理之后具体跑什么应用、怎么调度都可以按需组合。我自己在实际项目里就是靠这套思路用一台低配小主机搞定了展厅的视频和网页混合展示成本低、维护少比买成品播放器划算得多。