简介:Ubuntu 22.04及以上版本的默认显示管理器gdm发生配置调整,旧式修改登录背景的方法已失效。这份资源面向需要自定义登录界面的Ubuntu用户,提供专门设计的shell脚本,帮助通过简单命令完成背景更换,不再手动编辑底层配置。压缩包约20KB,共10个文件,类型以sh脚本为主,其中包含适配不同场景的pre-23.sh、post-23.sh及支持透明效果的post-23-transparent.sh,另有核心工具ubuntu-gdm-set-background和README说明文档,便于按需选用。目前已有1129人学习下载,适合升级到新版后找不到登录背景设置入口、又希望快速实现个性化的用户。使用前建议先备份gdm配置,并留意脚本来源安全性;掌握基本sudo操作即可顺利运行,从而获得与旧版本一致的自定义体验。 把Ubuntu登录界面那张固定背景换掉,本来不算个高频需求,但真到想换的时候,你会发现网上教程七零八落,有的说改dconf,有的说改CSS文件,照着操作还经常不生效。尤其是 ubuntu 22.04 及以后的版本,GDM(GNOME显示管理器)接管了登录界面,背景图早就不是“右键设置壁纸”能管到的范畴了。我前前后后也踩了不少坑,最后干脆整理成一个可以直接拿走的 shell 脚本,既能改登录背景,也支持一键恢复,特意做了版本兼容,22.04、23.04、24.04 这些用 GDM 的版本基本都能跑。这篇东西适合两类人:一类是不想折腾、只想赶紧把登录页换张图的普通用户;另一类是刚接触 shell 脚本,想找一个“能落地、有实际用途”的练手项目的朋友。我会把原理、坑点和脚本实现一条龙讲清楚。
1. 为什么自定义Ubuntu登录背景这么麻烦
1.1 登录界面背景和桌面壁纸不是一回事
很多第一次改 Ubuntu 登录背景的人,第一反应是去“设置-背景”里换一张壁纸,换完发现桌面变了,但登录界面依然是那个万年不变的紫色或默认壁纸。原因很简单:桌面壁纸是当前用户通过 GNOME Shell 读取用户级配置显示的,而登录界面在用户登录之前就已经运行了,它属于 GDM 这个系统服务,读取的是系统级主题文件。你改的是“用户张三的桌面”,和“GDM 用户的桌面”压根不在同一个环境里。
所以常规的gsettings set org.gnome.desktop.background picture-uri file:///path这类命令,哪怕你加上sudo -u gdm去执行,也经常无效。因为新版 GDM 渲染登录背景时走的是 GNOME Shell 主题资源,加上 Ubuntu 的 Yaru 主题对资源做了压缩封装,有时候你改了配置文件还不一定被加载。
1.2 三种主流改法对比:CSS替换、dconf、gresource
据我了解,目前社区里能用的方法主要有三条路线,各有各的适用场景和坑:
| 方法 | 原理 | 优点 | 缺点 | 适用版本 |
|---|---|---|---|---|
| 修改主题CSS文件 | 直接改#lockDialogGroup的background属性 | 最简单直接,适合脚本批量处理 | 部分版本资源被 gresource 封装,改了不生效 | 22.04部分版本、23.04、24.04等 |
| dconf + GDM用户环境 | 通过gsettings写入 GDM 用户的 dconf 数据库 | 无需修改系统文件 | Ubuntu 22.04以后可靠性下降,需要额外权限和 session | 早期版本有效 |
| 重建 gnome-shell-theme.gresource | 解包、修改、重打包 GNOME Shell 主题资源 | 从根本上解决资源封装问题 | 操作复杂、升级系统后可能被覆盖 | gresource封装版本 |
在脚本里,我默认采用“修改主题CSS文件”的方案,同时加入了一个“检测+升级提示”的逻辑。如果检测到当前系统的 CSS 文件被 gresource 机制管理,脚本会给出明确提示,告诉你需要走重打包流程,而不是傻乎乎地改完没反应。
2. 手写脚本前必须搞懂的关键细节
2.1 GDM读取背景的机制与路径
GDM 登录界面的背景实质上是 GNOME Shell 的锁屏组件在渲染,具体控制样式的是主题文件里的#lockDialogGroup节点。你需要在这个节点下的background属性里写清楚颜色和背景图的 URL,比如:
#lockDialogGroup { background: #2c001e url("file:///usr/share/backgrounds/my-bg.jpg") no-repeat; }不同 Ubuntu 版本,这个主题文件的默认路径不太一样。我的脚本候选列表里同时包含了这几个常见路径:
/usr/share/gnome-shell/theme/gdm3.css/usr/share/gnome-shell/theme/ubuntu.css/usr/share/gnome-shell/theme/gnome-shell.css
脚本会自动检查哪个文件里包含#lockDialogGroup,然后针对这个文件下手。为什么要遍历?因为我遇到过有人反馈自己的系统默认主题文件是ubuntu.css,有人是gnome-shell.css,直接写死路径的脚本一半概率翻车。
提示:千万记得在修改之前备份原文件。别问我为什么强调,改崩过登录界面的人都知道,GDM 起不来的时候,你连图形界面都进不去,只能切 TTY 手动恢复,那种感觉相当酸爽。
2.2 不同版本下的主题文件差异
Ubuntu 22.04 LTS 默认使用 GNOME 42,GDM 主题主要通过/usr/share/gnome-shell/theme/下的 CSS 控制。但是这里有个坑:部分 22.04 的系统实际加载的是一个名为gnome-shell-theme.gresource的二进制资源文件。这种情况下你直接改ubuntu.css不会生效,因为 GDM 启动时加载的是 gresource,而不是单个 CSS 文件。
到了 23.04、24.04,GDM 又逐步恢复了对普通 CSS 文件的支持(至少我测试的桌面包是可以直接改CSS生效的)。这就导致网上教程“时灵时不灵”。写脚本时我不希望用户卡在这一步,所以在替换文件之前加了检查逻辑:先看目标 CSS 文件是否真实存在于磁盘上,如果存在就继续;如果不存在,脚本会建议你检查系统是否用了 gresource 方案。
2.3 图片路径权限与格式注意事项
如果你在脚本里直接写file:///home/你的用户名/图片.jpg,大概率还是显示不出来。原因在于 GDM 运行时的用户是gdm,它对你的家目录默认没有读取权限。就算你chmod 755家目录,也要考虑其他目录层级是否可达。更稳妥的做法是把背景图放到系统全局目录,比如/usr/share/backgrounds/,这个目录对所有用户可读,GDM 也能访问。
图片格式方面,实测 JPG、PNG 都行,SVG 不推荐。分辨率建议至少和你屏幕分辨率一致,否则 GDM 拉伸图片后会有明显的模糊感。不需要额外处理色彩配置文件,GDM 会按默认无色彩管理方式渲染。
3. 编写一键改背景脚本:从零到可复用
3.1 脚本功能设计与参数约定
我设计脚本时立了几个目标:命令要短、参数要好记、步骤要稳妥。最终参数定义成这样:
-i /path/to/image:设置登录背景图,脚本自动复制到系统目录并修改 CSS。-r:恢复默认登录背景(将背景改回系统默认的紫色)。- 不带参数运行:打印使用帮助。
脚本用 root 权限执行,因为复制文件到/usr/share/backgrounds/和修改/usr/share/gnome-shell/theme/都需要 root。执行sudo即可,没必要用su切换。
3.2 核心代码实现与逐段说明
这个脚本我拆成四段来讲,方便你以后自己改。
第一段,环境检查和参数解析:
#!/bin/bash set -e BG_IMG="" RESTORE=false THEME_CANDIDATES=( "/usr/share/gnome-shell/theme/gdm3.css" "/usr/share/gnome-shell/theme/ubuntu.css" "/usr/share/gnome-shell/theme/gnome-shell.css" )set -e的意思是:只要任何一条命令返回非零状态,脚本立即退出。这在修改系统文件的场景里非常重要,可以避免“前面的步骤已经出错,后续还在继续执行”的连锁风险。你如果是从零开始学 shell 脚本,这个小习惯建议从此养成。
参数解析用getopts:
while getopts ":i:r" opt; do case $opt in i) BG_IMG="$OPTARG" ;; r) RESTORE=true ;; *) echo "用法: $0 -i /path/to/image.jpg 设置登录背景" echo " $0 -r 恢复默认登录背景" exit 1 ;; esac done这里i:的冒号表示参数-i后面需要跟一个值,r不需要值。初次接触的人可能会忘记冒号的含义,我特意把它写清楚。
第二段,图片复制和权限处理:
if [[ -n "$BG_IMG" ]]; then if [[ ! -f "$BG_IMG" ]]; then echo "错误: 图片文件不存在: $BG_IMG" exit 1 fi DEST_DIR="/usr/share/backgrounds" EXT="${BG_IMG##*.}" DEST_FILE="$DEST_DIR/gdm-login-bg.$EXT" cp "$BG_IMG" "$DEST_FILE" chmod 644 "$DEST_FILE" echo "图片已复制到: $DEST_FILE" fiEXT="${BG_IMG##*.}"是 shell 里的“掐头”语法,##*.表示从变量开头删掉最长匹配*.的部分,剩下的就是文件扩展名。如果你之前没用过这种写法,把它当做一个提取扩展名的小技巧即可。chmod 644确保文件权限是“所有者可读写,组和其他人可读”,这是 GDM 能访问该文件的最低要求。
第三段,定位 CSS 文件和备份:
CSS_FILE="" for f in "${THEME_CANDIDATES[@]}"; do if [[ -f "$f" ]] && grep -q "#lockDialogGroup" "$f"; then CSS_FILE="$f" break fi done if [[ -z "$CSS_FILE" ]]; then echo "错误: 未找到包含 #lockDialogGroup 的主题CSS文件。" echo "可能原因: 系统使用 gresource 封装主题,需手动解包处理。" exit 1 fi BACKUP_FILE="${CSS_FILE}.bak.$(date +%Y%m%d%H%M%S)" cp "$CSS_FILE" "$BACKUP_FILE" echo "已备份原文件到: $BACKUP_FILE"这段做了两层保险:一是遍历候选文件,找到真正包含#lockDialogGroup的那一个;二是备份。grep -q是安静模式,只返回匹配状态,不打印内容,用于条件判断非常合适。备份文件名带上时间戳,是为了避免多次执行脚本时把上一次的备份覆盖掉。
第四段,修改 CSS 的核心替换逻辑:
if $RESTORE; then sed -i "/#lockDialogGroup/,/}/s|background: [^;]*;|background: #2c001e;|" "$CSS_FILE" echo "已恢复默认背景色。" else sed -i "/#lockDialogGroup/,/}/s|background: [^;]*;|background: #2c001e url(\"file://$DEST_FILE\") no-repeat;|" "$CSS_FILE" echo "已将登录背景修改为: $DEST_FILE" fi这里用到了sed的地址范围功能:/#lockDialogGroup/,/}/表示从匹配到#lockDialogGroup的行开始,一直处理到下一个}行结束,这样不会误伤其他模块里的background属性。替换的内容也刻意做了一个兼容:不管原来的值是纯色渐变还是带图片,统一用[^;]*匹配到分号之前的所有内容,再替换成新值。
如果你不喜欢默认的#2c001e紫色,也可以改成其他颜色值,比如#1a1a1a或者#000000。
3.3 使用方法与典型执行输出
把上面的代码保存为change-gdm-background.sh,然后执行:
sudo chmod +x change-gdm-background.sh sudo ./change-gdm-background.sh -i /home/user/图片/我的壁纸.jpg正常执行时,输出类似这样:
图片已复制到: /usr/share/backgrounds/gdm-login-bg.jpg 已备份原文件到: /usr/share/gnome-shell/theme/gdm3.css.bak.20240917120000 已将登录背景修改为: /usr/share/backgrounds/gdm-login-bg.jpg此时你重启系统,或者注销回到登录界面,就能看到新背景了。如果不想重启系统,也可以切换到终端执行sudo systemctl restart gdm3,但注意这会强制退出当前桌面会话,所有未保存的文档都会丢,执行前务必确认工作都已保存。
注意:GDM 服务只在登录界面和注销后的界面下运行。你在桌面环境里执行
systemctl restart gdm3,相当于把整个图形会话全部重来,这不是一个温和的操作。我个人的建议是:不着急就重启系统,或者干脆先留着旧背景,等下次自然注销时再看效果。
4. 常见问题与排查技巧实录
4.1 改完没有生效的三大原因
我在自己的机器和几台虚拟机上实测过,也帮朋友远程排查过,总结下来“改完没反应”通常逃不出这三个原因。
第一个是文件路径不对。很多教程让你把图片写在/home/用户名/下,结果 GDM 用户根本没法读。尤其是用了全盘加密的 Ubuntu,家目录在登录前还没解密,GDM 更不可能访问到那里。解决办法很简单:一律把图片复制到/usr/share/backgrounds/这种系统级目录。
第二个是gresource封装问题。刚才提过,部分 22.04 版本和个别定制版系统,实际加载的是gnome-shell-theme.gresource,你改 CSS 文件等于改了份不会被读取的文件。检测方法:执行ls /usr/share/gnome-shell/theme/,如果看到.gresource文件,而 CSS 文件改动后不生效,大概率就是被资源封装接管了。这种情况要么走重打包流程,要么换用支持 gresource 的第三方工具。
第三个是缓存问题。GNOME Shell 有自己的主题缓存,修改 CSS 后有时不会立即加载。即使你重启 GDM,旧的缓存文件可能还留在内存或磁盘缓存目录里(常见的缓存路径在/usr/lib/gnome-shell/或者用户缓存目录下)。最省事的解决办法:执行一次sudo update-initramfs -u,把 initramfs 也更新掉,然后重启系统。脚本里我保留了执行这个命令的钩子,如果你的系统更新策略不是太激进,可以加上保证彻底刷新。
4.2 常见报错与解决方案速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 执行脚本提示“图片文件不存在” | 路径写错或文件名包含中文特殊字符 | 把图片放到简单路径,例如/tmp/bg.jpg再执行 |
提示未找到#lockDialogGroup | 系统使用 gresource 封装或自定义主题 | 执行ls /usr/share/gnome-shell/theme/查看是否存在.gresource,切换到其他方法 |
| 背景图变成一片黑或纯色 | CSS 替换规则把url()部分吃掉了 | 确认DEST_FILE存在,并直接查看 CSS 文件中对应行是否正确 |
| 登录界面正常但锁屏界面没变 | 锁屏和登录背景可能由不同模块控制 | 检查 CSS 文件里是否还有#lockDialogGroup之外的其他锁屏背景定义 |
| 重启后背景恢复默认 | 系统更新覆盖了主题文件 | 更新后重新执行一次脚本,或者写一个 systemd oneshot 服务 |
4.3 我的踩坑心得与建议
最开始我写这个脚本时,想的特别简单,觉得只要定位到 CSS 文件然后sed替换就行。第一次在 22.04 上测试,怎么改都不生效,后来才发现问题出在gresource上——那台机器的主题文件已经被封装成二进制资源,我修改的 CSS 文件只是“装饰品”。后来换了一台 24.04 的机器,一切正常,这让我意识到版本差异是真真切切的坑。
还有一个细节是sed正则的写法。一开始我用的是s|background: .*;|...|,这会在同一行里匹配到多个background时发生意外。后来限定在#lockDialogGroup到}的区间内操作,并且用[^;]*限定不跨分号,问题就少了很多。如果你要拿这个脚本往生产环境里塞,我建议你把sed替换逻辑换成 Python 的 CSS 解析工具,但日常个人使用,这个量级的脚本已经足够。
set -e遇到的一个麻烦是:当 CSS 文件不存在时,grep会返回非零状态,脚本直接退出,不会走到后面的自定义错误提示。所以脚本里我先用[[ -f "$f" ]]判断文件是否存在,存在才执行grep,这避免了set -e的误伤。这种细节如果你不去实际跑一遍,很难意识到它的重要性。
另外,我强烈建议你在执行任何修改之前,先备份未必需要的家目录,但至少保证你手头有一份能用的 Ubuntu 安装镜像或 Live USB。万一登录界面真的彻底起不来,可以从 Live 环境挂载磁盘,把备份的 CSS 文件复制回去,而不是重装系统。我在第一次折腾 GDM 时就没做备份,结果花了几个小时才把系统捞回来,那滋味真不好受。
如果你确定以后要长期自定义登录背景,还有一个更省心的思路:不要改系统默认主题文件,而是创建一个独立的主题目录,比如/usr/share/gnome-shell/theme/login-custom/,在里面放置自定义 CSS 文件,再通过 GDM 配置指向这个主题目录。这样系统更新覆盖默认文件时,你的自定义主题不受影响。不过这个方案对用户的要求更高,脚本也会复杂不少,适合喜欢深入折腾的朋友自己扩展。
最后分享一个我在实际使用中的小技巧:如果你只想让登录背景和锁屏背景一起变,注意统一修改 CSS 文件里所有和lockDialogGroup相关的块。有些系统在#lockDialogGroup之外还有#screenShieldNotifications之类的模块,它们也会影响锁屏界面的显示。我的脚本主要覆盖了主背景,其他模块的微调你可以根据实际 CSS 内容手动补齐。折腾系统的乐趣就在这些细节里,慢慢来,总能调出自己想要的样子。
本文还有配套的精品资源,点击获取