简介:Ubuntu 22.04及以上版本修改登录背景的专用脚本工具,专门针对GDM显示管理器配置逻辑变化而设计,适合Linux桌面用户、系统美化爱好者以及需要批量部署登录界面的管理员使用。压缩包约20KB,内含10个文件,文件结构清晰,以Shell脚本为主,同时提供可执行脚本、透明背景变体、说明文档与许可证;不同脚本变体分别适配新旧GDM配置方式,方便按系统版本选用。目前已有1129人学习。除了直接可运行的脚本外,包内还附有配置思路说明与透明背景选项,并提示了备份GDM配置、以sudo权限执行、重启gdm服务等关键细节,还针对版本兼容性提供检查建议;使用后无需再手动排查失效的旧路径,即可较为稳妥地完成22.04登录背景替换,同时降低因操作不当导致无法登录的风险。资源本身轻量且专注,适合快速解决登录界面定制问题。 在 Ubuntu 22.04 上想把登录界面换成自己喜欢的背景,说简单也简单,说麻烦也真麻烦。很多人第一步就去系统设置里换壁纸,结果桌面确实变了,但开机、注销后出现的登录界面还是原来那副默认样子。原因很简单:登录界面根本不属于你的用户会话,它由独立的 GDM 显示管理器负责,加载的是另一套 GNOME Shell 主题。这篇文章我把实际验证过的一套 shell 脚本分享出来,用来一键修改 Ubuntu 22.04 及以上版本的登录背景,自带备份、恢复逻辑,也能直接套到批量部署场景。无论你是刚接触 Ubuntu 美化,还是要统一办公机、机房机器的登录页,都可以照着做。
1. 登录背景难改的根源:GDM 与桌面壁纸不是一回事
1.1 先分清“登录背景”和“锁屏壁纸”
很多教程和搜索结果把“登录背景”和“锁屏壁纸”混在一起,导致改了半天发现没效果。这两个东西在 Ubuntu 22.04 里完全是两套体系:
- 登录背景:开机、注销或切换用户后,输入密码的那个 GDM 登录界面背景。
- 锁屏壁纸:当前用户会话按下 Super+L 后,用户自己的锁屏界面背景。
当前用户的锁屏壁纸,用 gsettings 就能改,命令如下:
gsettings set org.gnome.desktop.screensaver picture-uri 'file:///path/to/picture.jpg'而 GDM 登录界面是一个独立进程,运行在 gdm 用户下,根本不读你当前普通用户的桌面设置。这也解释了为什么你在“设置 - 背景”里怎么换,登录界面都无动于衷。本文脚本要动的,是 GDM 使用的 GNOME Shell 主题文件,它决定了登录框、输入框、右上角状态栏和背后那层背景的样式。
1.2 GDM 主题文件在哪里:定位 gnome-shell CSS
Ubuntu 22.04 默认使用 GDM3,主题是基于 Yaru 定制的 GNOME Shell 主题。关键文件在:
/usr/share/gnome-shell/theme/ubuntu.css登录背景样式由这个文件里的#lockDialogGroup代码块控制。未修改过的默认内容一般是这样的:
#lockDialogGroup { background: #2c3e50; background-size: cover; background-position: center; }这里的background: #2c3e50就是登录界面那层深蓝紫色背景。我们要做的,就是往这个块里塞进url("图片路径"),把纯色背景换成图片。从 Ubuntu 22.04 到 24.04、25.04,Yaru 主题基本都保留了这套结构,所以这个脚本的兼容性很好。
2. 修改前必须搞清楚的 3 个坑
2.1 找对 CSS 文件,别被 gresource 带偏
网上很多教程上来就让你解包/usr/share/gnome-shell/gnome-shell-theme.gresource,这在 Fedora、Debian 的默认 GNOME 上是对的,但在 Ubuntu 22.04 上会走弯路。Ubuntu 的 Yaru 主题直接以 CSS 散文件形式放在/usr/share/gnome-shell/theme/目录下,不需要解包 gresource。
我踩过这个坑:第一次在这台机器上用了 gresource 解包方案,费了半天劲,最后发现 Ubuntu 加载的根本不是那个文件。后来学乖了,动手前先确认:
ls -l /usr/share/gnome-shell/theme/ grep -n "lockDialogGroup" /usr/share/gnome-shell/theme/ubuntu.css如果你拿到手的系统确实找不到ubuntu.css,而是只有gnome-shell-theme.gresource,那就说明这台机器的 GDM 主题是打包形式。这种情况更稳妥的做法是先备份原始 gresource,然后用gresource命令解包、修改、重新打包。Ubuntu 原版 22.04 用户基本用不到这个步骤,但批量管理非标系统时值得知道。
2.2 图片要放在 gdm 用户能读到的位置
这是最容易忽略的权限问题。很多同学直接把背景图放在/home/用户名/Pictures/下,结果 CSS 改对了、重启后却是黑屏。原因很简单:GDM 登录界面跑在 gdm 用户下,默认没有权限进入普通用户的/home目录。
解决方案很直接:脚本里把图片复制到公共目录,比如/usr/share/backgrounds/login/,并确保文件权限是 644。这样 gdm 用户才能正常读取。这也是为什么本文脚本不直接使用你传入的原路径,而是先复制一份再写入 CSS。
另外建议图片路径和文件名里不要带中文、空格或特殊字符。虽然现代 GNOME 大多能处理,但脚本里任何一步出现转义问题,排查起来都够喝一壶。
2.3 重启 GDM 会踢掉所有登录会话
修改 GDM 主题后,必须重启 GDM 才会重新加载。命令是:
sudo systemctl restart gdm3这个过程会把当前机器上所有图形会话全部断开。如果你是在本地图形界面里运行脚本,重启后当前桌面会被直接踢回登录页,没保存的文档会面临丢失风险。
所以脚本默认加了一个 3 秒倒计时提醒,也支持--no-restart参数。远程批量部署或者不希望立即断线时,可以先跳过重启,等维护窗口手动执行。如果你通过 SSH 远程操作的是图形工作站,也要注意:重启 GDM 会影响正在使用这台机器的人。
3. 一键脚本:备份、修改、恢复全搞定
3.1 脚本用法与设计思路
脚本核心解决三件事:备份、修改、恢复。备份放到第一步,任何对系统文件的修改都必须能回退;修改统一走“复制图片 + 改写 CSS”流程,避免手动编辑;恢复负责找到最近一次备份并还原。
支持两种调用方式:
sudo bash change-login-background.sh /path/to/your-image.jpg sudo bash change-login-background.sh /path/to/your-image.jpg --no-restart sudo bash change-login-background.sh --restore加入--restore参数后,脚本会自动选取时间戳最新的.bak.时间戳备份文件恢复 CSS。重装主题、升级系统弄坏了文件时,这个功能非常救急。
3.2 完整脚本内容
保存为change-login-background.sh,直接复制即可使用:
#!/bin/bash set -euo pipefail CSS_FILE="/usr/share/gnome-shell/theme/ubuntu.css" DEST_DIR="/usr/share/backgrounds/login" RESTART_GDM=1 # 恢复模式 if [ "${1:-}" = "--restore" ]; then LATEST_BACKUP=$(ls -t "${CSS_FILE}".bak.* 2>/dev/null | head -1) if [ -z "$LATEST_BACKUP" ]; then echo "[错误] 没有找到备份文件" exit 1 fi cp -a "$LATEST_BACKUP" "$CSS_FILE" echo "[恢复] 已恢复: $LATEST_BACKUP" systemctl restart gdm3 2>/dev/null || systemctl restart gdm exit 0 fi # 权限校验 if [ "$(id -u)" -ne 0 ]; then echo "[错误] 请用 root 运行: sudo $0 /path/to/image.jpg" exit 1 fi # 参数校验 IMAGE="${1:-}" if [ -z "$IMAGE" ] || [ ! -f "$IMAGE" ]; then echo "[错误] 请传入一个存在的图片文件路径" echo "用法: sudo $0 /path/to/image.jpg [--no-restart]" exit 1 fi if [ "${2:-}" = "--no-restart" ]; then RESTART_GDM=0 fi # 检查 CSS 文件 if [ ! -f "$CSS_FILE" ]; then echo "[错误] 未找到 $CSS_FILE,请确认系统使用的是 GDM3 + Yaru 主题" exit 1 fi # 1. 备份 BACKUP="${CSS_FILE}.bak.$(date +%Y%m%d%H%M%S)" cp -a "$CSS_FILE" "$BACKUP" echo "[备份] 原主题文件已备份到 $BACKUP" # 2. 复制图片到公共目录 mkdir -p "$DEST_DIR" EXT="${IMAGE##*.}" DEST_IMAGE="$DEST_DIR/login-background.${EXT,,}" cp -f "$IMAGE" "$DEST_IMAGE" chmod 644 "$DEST_IMAGE" echo "[图片] 已复制到 $DEST_IMAGE" # 3. 用 perl 替换 lockDialogGroup 背景配置 perl -0pi -e "s|(#lockDialogGroup\s*\{).*?(\n\s*\})|\$1\n background: #2c3e50 url(\"${DEST_IMAGE}\");\n background-size: cover;\n background-position: center;\n\$2|s" "$CSS_FILE" echo "[CSS] 已写入背景配置: $CSS_FILE" # 4. 重启 GDM if [ "$RESTART_GDM" -eq 1 ]; then echo "[重启] 正在重启 GDM,当前图形会话会被断开,请保存好工作..." sleep 3 systemctl restart gdm3 2>/dev/null || systemctl restart gdm else echo "[跳过] 已跳过 GDM 重启,稍后手动执行: sudo systemctl restart gdm3" fi脚本里的 perl 替换是整个流程的难点。用|作为定界符,避免图片路径里的/干扰;-0pi让 perl 以整文件为单位处理,这样才能把#lockDialogGroup { ... }整块匹配出来;\$1和\$2是为了在 bash 双引号里保留 perl 的捕获变量。原始代码块里的任何其他属性会被替换掉,不过从实际文件来看,这个块里基本只有背景相关配置,影响不大,而且已经做了备份,心里有底。
3.3 验证是否生效
重启 GDM 后,重新计算一次哈希值,可以快速确认 GDM 有没有加载新的主题流:
sha256sum /usr/share/gnome-shell/theme/ubuntu.css grep -A3 "lockDialogGroup" /usr/share/gnome-shell/theme/ubuntu.css只要 CSS 里能看到url("/usr/share/backgrounds/login/login-background.jpg"),重启后的登录背景就会生效。验证时记得看真正的 GDM 登录页,而不是自己用户桌面里的锁屏界面。最直接的办法是注销一次,或者重启后停在登录页看一眼。
4. 批量部署与主题更新防恢复
4.1 多台机器统一登录背景的实践
如果你要管理的不是一台机器,而是实验室、办公室里的几十台 Ubuntu 22.04,手动跑脚本显然不现实。最简单粗暴的做法是写一个循环,用 SSH 批量推送图片和脚本:
for host in $(cat hosts.txt); do scp login-bg.jpg root@$host:/tmp/login-bg.jpg scp change-login-background.sh root@$host:/tmp/change-login-background.sh ssh root@$host "bash /tmp/change-login-background.sh /tmp/login-bg.jpg --no-restart" done这里传--no-restart是刻意的。批量重启所有机器的 GDM 会瞬间断开所有人的会话,风险不可控。更好的节奏是先推完配置,再挑一个维护窗口执行:
for host in $(cat hosts.txt); do ssh root@$host "systemctl restart gdm3" done如果环境里有 Ansible,可以把脚本放到files/目录,用script模块批量执行,效果一样。无论用什么方式,都建议先在一台测试机上完整跑一遍,确认图片比例、CSS 路径都正常后,再铺开到整个机房。
4.2 设置自动修复,防止系统更新覆盖
Ubuntu 的 apt 更新偶尔会升级 Yaru 主题相关包,例如yaru-theme-gnome-shell、ubuntu-themes。这类升级很可能把ubuntu.css覆盖回默认状态,登录背景会悄悄还原。
一段时间后你会发现背景没了,一般不会有人主动报告,但统一性就破坏了。我建议写一个简单的 systemd timer 做兜底:定期检查 CSS 里是否有我们写入的标识,如果被覆盖就自动从最新备份恢复。
思路是先让脚本在修改完 CSS 后,往备份目录里记录当时使用的图片路径:
echo "$DEST_IMAGE" > /usr/share/backgrounds/login/.managed然后写一个定时任务:
#!/bin/bash if ! grep -q "login-background" /usr/share/gnome-shell/theme/ubuntu.css; then LATEST_BACKUP=$(ls -t /usr/share/gnome-shell/theme/ubuntu.css.bak.* 2>/dev/null | head -1) if [ -n "$LATEST_BACKUP" ]; then cp -a "$LATEST_BACKUP" /usr/share/gnome-shell/theme/ubuntu.css systemctl restart gdm3 fi fi把这个检查脚本放进 systemd timer,每隔一小时跑一次,代价很小,但能避免“背景突然神秘恢复默认”的尴尬。
4.3 锁屏壁纸和登录背景的正确区分
批量部署时还有个常见需求:用户自己的锁屏壁纸也要统一。这个不能用本文脚本,它属于每个用户自己的 gsettings 配置。管理员可以用 dconf 策略或者通过脚本对每个用户执行:
gsettings set org.gnome.desktop.screensaver picture-uri 'file:///usr/share/backgrounds/your-company-wallpaper.jpg'GDM 登录背景和用户锁屏壁纸是两层,部署时记得分别处理,别只改一个就觉得完事了。
5. 登录背景修改常见问题速查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 重启后登录背景没变化 | 修改的不是 GDM 实际加载的 CSS | 确认/usr/share/gnome-shell/theme/ubuntu.css存在,检查是否走了 gresource 方案 |
| 背景变成纯黑或纯色 | 图片路径权限不足,gdm 用户读不到文件 | 把图片放到/usr/share/backgrounds/login/,确认权限为 644 |
| 图片显示但被拉伸变形 | CSS 里缺少background-size: cover | 检查#lockDialogGroup块内是否完整写入背景属性 |
| 系统更新后背景还原 | Yaru 主题包覆盖了 CSS | 用备份恢复,或配置 systemd timer 自动检测修复 |
| GDM 重启后卡在登录界面循环 | CSS 语法写错,GNOME Shell 崩溃 | 用--restore恢复备份,检查 CSS 语法后再改 |
| 登录背景生效但锁屏壁纸没变 | 两者本来就是两套配置 | 用户锁屏壁纸用 gsettings 单独设置 |
5.1 改完没变化,背景还是老样子
绝大多数情况是文件定位错误。先执行grep -n "lockDialogGroup" /usr/share/gnome-shell/theme/ubuntu.css,有输出才是改对了文件。如果文件不存在,说明当前系统不是标准的 Ubuntu 22.04+ 桌面版,或者主题结构被改动过。这时候先不要硬改,去/usr/share/gnome-shell/theme/目录看看到底有哪些文件,再决定用哪种方案。
5.2 背景黑屏或纯色
这是权限和路径问题的高发区。GDM 进程以 gdm 用户身份运行,对/home下的文件默认没有访问权。脚本已经自动把图片复制到/usr/share/backgrounds/login/,但如果你手动编辑 CSS,一定要自己确认这一点。还有一个细节:图片文件如果被 SELinux 或 AppArmor 限制,也可能出现读不到的情况,普通桌面 Ubuntu 上一般不会遇到,但安全策略做得很严的定制系统要排查。
5.3 图片变形或模糊
一张 1920x1080 的图硬塞进 4K 登录界面,模糊是必然的。建议背景图分辨率不要低于屏幕分辨率,能用高一点就用高一点。脚本里写入的background-size: cover会等比缩放并裁剪,中心部分显示,所以糊不糊主要看源图质量。企业场景里如果要放 Logo 或统一标识,建议规定好图片尺寸,比如 3840x2160,减少不同分辨率机器上的观感差异。
5.4 紧急恢复到默认背景
只要当初是脚本执行的修改,恢复很方便:
sudo bash change-login-background.sh --restore脚本会找到最新的.bak.备份并复制回去,然后重启 GDM。如果连备份都被清理了,那么只能通过重装主题包恢复:
sudo apt install --reinstall yaru-theme-gnome-shell ubuntu-themes装完再手动把背景改回来。这也是为什么我反复强调:任何系统文件修改前,备份是第一位的。
我自己在维护一批 Ubuntu 22.04 工作站时,登录背景统一这件事折腾过好几次。最初也想偷懒用 gsettings,后来搞清楚 GDM 和桌面壁纸是两套体系后,才把整套流程固化成了脚本。现在新机器装完系统,跑一下这个脚本,背景就到位了,再也不用手动改 CSS。最后提醒一句:任何改系统文件的操作都先在虚拟机里跑通,确认没问题再上生产机器。我踩过直接在生产机上改完主题导致无法登录的坑,那感觉真的不好受。
本文还有配套的精品资源,点击获取