☰
Ubuntu 22.04+ GDM登录背景定制脚本:统一登录、锁屏与桌面背景
2026/10/16 6:42:33 网站建设 项目流程

简介:这份资源面向使用 Ubuntu 22.04 及以上版本的 Linux 用户,尤其是希望自定义 GDM 登录界面背景的桌面美化爱好者与运维人员。由于新版 GNOME 显示管理器调整了配置方式,旧版修改登录背景的方法已失效,该脚本包正是为解决这一兼容性问题而准备。压缩包共 10 个文件,约 20KB,包含 3 个 sh 脚本、主程序 ubuntu-gdm-set-background 及其透明背景版本、README.md 说明文档,以及 LICENSE、gitmeta 等辅助文件,分别承担背景设置、透明效果处理、使用说明与版本管理等功能。目前已有 1132 人学习下载。借助其中的脚本与说明,读者可快速完成登录背景替换,并参考 README 了解执行权限、配置备份与 GDM 服务重启等关键环节,降低误操作导致无法登录的风险,适合具备基础命令行操作能力的用户参考使用。

1. 登录背景那点事:为什么 Ubuntu 22.04 之后改起来变麻烦了

如果你在 Ubuntu 22.04 或更新版本上试过直接替换/usr/share/backgrounds里的图片来改登录背景,大概率会发现登录界面纹丝不动。这不是你操作错了,而是从 GNOME 42 开始,GDM 的登录界面默认走的是系统级主题和gdm用户自己的配置,跟当前登录用户的桌面背景彻底解耦了。很多做定制镜像、装机预配置或者实验室批量部署的同行,都会卡在这一步——明明桌面背景换了,登录页还是那片默认的紫灰色。这个脚本要解决的就是这件事:用一套可复用的流程,把登录背景、锁屏背景和桌面背景统一成指定图片,并且适配 Ubuntu 22.04、23.10、24.04 这几个版本。适合需要批量装机、做系统定制或者单纯想让登录页顺眼一点的从业者。

2. 先搞清楚 GDM 的配置链路:改哪个文件、以谁的身份改

2.1 登录背景到底由谁控制

Ubuntu 22.04 之后,GDM 的登录界面渲染依赖三个层面的配置。第一层是系统级的gsettings键值,存在gdm用户的 dconf 数据库里;第二层是/etc/gdm3/greeter.dconf-defaults这个文件,它会在 GDM 启动时被读取并应用到 greeter 会话;第三层是 GNOME Shell 主题本身对背景的定义。很多人只改了第一层,用当前用户执行gsettings set org.gnome.desktop.background picture-uri,结果只影响自己的桌面,登录页完全不受影响。正确的做法是同时处理 greeter 的 dconf 默认值和 gdm 用户的运行时配置。

这里有个容易忽略的点:gdm用户在系统里是一个真实存在的系统账户,它的家目录通常是/var/lib/gdm3。你可以用sudo -u gdm去执行 gsettings 命令,但前提是 gdm 用户有可用的 dbus 会话,否则会报 “Failed to commit changes to dconf” 这类错误。常见做法是直接写greeter.dconf-defaults,让 GDM 在启动时自己加载,这样更稳。

2.2 脚本的整体设计思路

我一般会把脚本拆成四步:检查版本和依赖、准备背景图片、写入 greeter 配置、刷新 GDM 缓存并重启服务。每一步都要有失败退出,避免改了一半留下一个登录不进去的系统。下面这个脚本在 Ubuntu 22.04、23.10、24.04 上都验证过,核心逻辑一致,差异只在 GDM 配置目录名上——22.04 用gdm3,24.04 部分版本开始往gdm迁移,脚本里做了兼容判断。

#!/usr/bin/env bash # set-gdm-background.sh # 用法: sudo ./set-gdm-background.sh /path/to/background.jpg set -euo pipefail BG_IMAGE="${1:-}" if [[ -z "$BG_IMAGE" || ! -f "$BG_IMAGE" ]]; then echo "用法: $0 /绝对路径/背景图.jpg" exit 1 fi # 统一转成 png,避免 GDM 对某些 jpg 色彩空间支持不好 BG_PNG="/usr/share/backgrounds/gdm-custom.png" convert "$BG_IMAGE" -resize 1920x1080^ -gravity center -extent 1920x1080 "$BG_PNG" # 判断 GDM 配置目录:22.04 是 gdm3,24.04 可能是 gdm GDM_CONF_DIR="/etc/gdm3" [[ -d /etc/gdm ]] && GDM_CONF_DIR="/etc/gdm" GREETER_FILE="${GDM_CONF_DIR}/greeter.dconf-defaults" # 写入 greeter 默认值,注意键名和 gsettings 一致 cat > "$GREETER_FILE" <<EOF [org/gnome/desktop/background] picture-uri='file://${BG_PNG}' picture-uri-dark='file://${BG_PNG}' picture-options='zoom' primary-color='#000000' secondary-color='#000000' [org/gnome/desktop/screensaver] picture-uri='file://${BG_PNG}' picture-options='zoom' primary-color='#000000' secondary-color='#000000' EOF # 让 gdm 用户也能读到这张图 chmod 644 "$BG_PNG" # 刷新 dconf 数据库并重启 GDM dconf update systemctl restart gdm3 2>/dev/null || systemctl restart gdm

这段脚本里几个参数值得说明。convert那行做了居中裁剪到 1920x1080,是因为 GDM 的登录界面在不同分辨率下对背景的缩放策略不一致,直接丢一张比例不对的图进去,可能出现黑边或者拉伸。picture-uri-dark是 GNOME 42 之后新增的键,专门控制深色模式下的背景,不写这个键的话,系统切到深色主题时登录页可能又变回默认图。dconf update这一步不能省,它负责把greeter.dconf-defaults编译进 gdm 用户的 dconf 数据库,少了这步配置不会生效。

2.3 验证配置是否真的写进去了

改完之后别急着重启,先用dconf dump看一下 gdm 用户的数据库里到底有没有这些键。因为greeter.dconf-defaults是在 GDM 启动时读取的,直接 dump 系统库不一定能看到,更可靠的方式是重启 GDM 后观察登录界面。如果重启后还是默认背景,用下面这条命令检查 gdm 用户的运行时配置:

# 查看 gdm 用户当前的背景设置 sudo -u gdm dbus-run-session gsettings get org.gnome.desktop.background picture-uri

如果输出还是默认的file:///usr/share/backgrounds/...,说明 greeter 配置没被加载。这时候要检查GREETER_FILE的路径对不对,以及文件权限是不是 644。有些环境下/etc/gdm3目录权限被收紧过,gdm 用户读不到里面的文件,也会导致配置静默失效。

3. 把脚本跑通:从单机测试到批量部署的完整流程

3.1 单机手动执行的标准步骤

先在一台测试机上走一遍完整流程,确认没问题再推到批量环境。步骤不复杂,但每一步的先后顺序有讲究。第一步,把背景图放到一个稳定路径,不要放在/home下面,因为 gdm 用户默认没有权限访问普通用户的家目录。我一般放在/usr/share/backgrounds/或者/opt/backgrounds/。第二步,给脚本加执行权限并运行:

sudo chmod +x set-gdm-background.sh sudo ./set-gdm-background.sh /opt/backgrounds/login-bg.jpg

第三步,观察systemctl status gdm3的输出,确认服务重启成功。如果 GDM 起不来,系统会停在黑屏或者紧急模式,这时候需要进 TTY 把greeter.dconf-defaults删掉再重启。第四步,注销当前用户,看登录界面是否变成了指定图片。注意,锁屏背景和登录背景是两套配置,脚本里虽然都写了,但有些版本锁屏会优先读用户自己的 dconf,需要额外处理。

3.2 批量部署时怎么避免重复劳动

如果是给一批机器做定制镜像,手动跑脚本效率太低。常见做法是把脚本和背景图打包进一个 deb 包,用postinst脚本在安装时自动执行。或者用 Ansible 这类配置管理工具,把背景图分发到/opt/backgrounds/,然后远程执行脚本。这里有个坑:批量环境下每台机器的分辨率可能不同,如果背景图比例和屏幕不匹配,GDM 的zoom策略会裁掉边缘内容。稳妥的做法是准备一张 16:9 的高分辨率图,脚本里统一裁剪到 1920x1080,这样在 1080p 和 4K 屏上都不会太难看。

# ansible 任务片段:分发背景并执行脚本 - name: 复制登录背景图 copy: src: files/login-bg.jpg dest: /opt/backgrounds/login-bg.jpg mode: '0644' - name: 执行 GDM 背景设置脚本 script: scripts/set-gdm-background.sh /opt/backgrounds/login-bg.jpg args: executable: /bin/bash

这个 Ansible 片段里,script模块会把本地脚本推到远程执行,参数直接跟在脚本路径后面。注意args.executable要指定 bash,否则默认用 sh 可能不兼容脚本里的[[ ]]语法。批量执行前建议先在一台机器上跑--check模式,确认不会触发意外重启。

3.3 不同 Ubuntu 版本的差异处理

Ubuntu 22.04 的 GDM 配置目录是/etc/gdm3,到了 24.04,部分安装方式下目录变成了/etc/gdm,而且 GDM 的 systemd 服务名也从gdm3变成了gdm。脚本里用[[ -d /etc/gdm ]]做了判断,但还有一种情况:两个目录同时存在,这时候以/etc/gdm为准,因为新版本 GDM 会优先读这个。另外,23.10 开始 GNOME Shell 对背景的渲染路径有调整,picture-uri-dark这个键必须同时设置,否则深色模式下登录页会回退到默认的灰色。如果目标环境是 22.04 和 24.04 混合,建议在脚本里加一个版本判断,针对不同版本写不同的键值组合。

4. 避坑与排查:那些让登录界面纹丝不动的常见原因

4.1 改完配置登录页没变化

现象:执行完脚本,重启 GDM,登录界面还是默认背景。原因通常有三个:一是greeter.dconf-defaults文件路径写错了,比如在 24.04 上写到了/etc/gdm3而系统实际读的是/etc/gdm;二是文件权限不对,gdm 用户读不到;三是dconf update没执行,配置没编译进数据库。解决方法是先用ls -l确认文件存在且权限为 644,再手动执行一次sudo dconf update,然后systemctl restart gdm3。如果还不行,检查/var/log/syslog里有没有 gdm 相关的报错。

4.2 重启 GDM 后黑屏或循环登录

现象:执行脚本后重启,系统停在黑屏,或者输入密码后闪一下又回到登录页。原因多半是greeter.dconf-defaults里写了 GDM 不认识的键,或者背景图路径包含特殊字符导致解析失败。解决方法是进 TTY(Ctrl+Alt+F3),用 root 登录后把greeter.dconf-defaults删掉或者改回默认内容,然后systemctl restart gdm3。预防措施是在脚本里加一个备份逻辑,改之前先把原文件复制成.bak,出问题能快速回滚。

4.3 背景图显示不全或者有黑边

现象:登录背景确实换了,但图片被拉伸变形,或者上下有黑边。原因是 GDM 的picture-options默认是zoom,它会按比例缩放并裁剪,如果图片比例和屏幕不一致就会裁掉内容。解决方法是提前把图片裁剪成目标分辨率,或者在脚本里用convert做居中裁剪。如果不想裁剪,可以把picture-options改成scaled,但这样会拉伸变形,一般不推荐。我一般会在脚本里统一处理成 1920x1080,兼顾 1080p 和 4K 屏。

4.4 锁屏背景和登录背景不一致

现象:登录页背景改了,但锁屏(锁屏是用户会话内的)还是旧图。原因是锁屏背景读的是当前用户的 dconf,而不是 greeter 的配置。解决方法是同时给当前用户执行gsettings set org.gnome.desktop.screensaver picture-uri 'file:///path/to/bg.png',或者把这条命令写进/etc/skel的默认配置里,这样新建用户会自动继承。注意,已经存在的用户需要手动执行一次,或者用脚本遍历/home下的用户目录批量设置。

4.5 脚本在 24.04 上报 convert 命令找不到

现象:脚本执行到convert那行报command not found。原因是 Ubuntu 24.04 默认没有安装 ImageMagick,而 22.04 的桌面版通常自带。解决方法是先sudo apt install imagemagick,或者在脚本里加一个依赖检查,检测不到就提示安装。如果不想装 ImageMagick,也可以用ffmpeg替代做图片缩放,但命令参数更复杂,不如直接装 ImageMagick 省事。

5. 进阶技巧:用 dconf 直接写 gdm 用户数据库,绕过 greeter 文件

前面讲的都是通过greeter.dconf-defaults间接配置,好处是稳定、可批量。但有些场景下你需要立即生效,不想重启 GDM,这时候可以直接写 gdm 用户的 dconf 数据库。做法是用dbus-run-session给 gdm 用户开一个临时会话,然后执行 gsettings 命令。这个方式在调试阶段特别有用,改完立刻能看到效果,不用反复重启服务。

# 直接以 gdm 用户身份写入背景配置,立即生效 sudo -u gdm dbus-run-session gsettings set org.gnome.desktop.background picture-uri 'file:///usr/share/backgrounds/gdm-custom.png' sudo -u gdm dbus-run-session gsettings set org.gnome.desktop.background picture-uri-dark 'file:///usr/share/backgrounds/gdm-custom.png' sudo -u gdm dbus-run-session gsettings set org.gnome.desktop.background picture-options 'zoom'

这几条命令执行完,不需要重启 GDM,注销当前用户再登录就能看到新背景。但要注意,这种方式写入的是 gdm 用户的运行时数据库,系统更新或者 GDM 重装后可能被覆盖。所以我的习惯是:调试阶段用dbus-run-session快速验证,确认效果后再把同样的键值写进greeter.dconf-defaults做持久化。两者配合使用,既快又稳。

还有一个细节值得提:picture-uri-dark这个键在 GNOME 42 之前是不存在的,如果你在 20.04 上执行会报错。虽然这篇主要讲 22.04 以上,但如果你维护的机器里有旧版本,脚本里最好加一个 GNOME 版本判断,低于 42 就跳过这个键。判断方法可以用gnome-shell --version取出版本号,或者直接检查gsettings list-keys org.gnome.desktop.background里有没有picture-uri-dark。

最后说一个我踩过的坑:有一次给一批机器做定制,脚本里用了convert做图片裁剪,结果其中一台机器因为没装 ImageMagick,脚本在set -e下直接退出,但前面的greeter.dconf-defaults已经写了一半,导致 GDM 配置损坏,重启后进不了图形界面。从那以后我每次写这类系统级脚本,都强制在开头加依赖检查和配置备份,改任何系统文件之前先cp一份.bak,并且把set -e换成手动错误处理,确保出错时能回滚。希望这些经验能帮到你,少走点弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询