ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu登录背景修改实战:GDM CSS与Shell脚本备份回滚

Ubuntu登录背景修改实战:GDM CSS与Shell脚本备份回滚 简介面向 Ubuntu 22.04 及以上版本的系统用户针对新版 gdm 调整后旧方法失效、登录背景难以通过常规配置修改的痛点这套脚本工具给出了直接可用的解决方案。压缩包共 10 个文件整体约 20KB以 shell 脚本为核心包含适配不同 gdm 版本的分支脚本、透明背景配套脚本与主程序文件同时附有说明文档、许可证文件和版本元数据目录结构清晰便于按需选用。已有 1131 人学习下载。脚本自动完成 gdm 配置编辑与权限处理使用者只需先备份原配置再以管理员身份运行对应版本脚本即可快速更换登录界面背景过程中还能顺带理解新版 gdm 的配置机制差异、系统版本与脚本分支的匹配逻辑以及备份、权限、服务重启等关键排错思路。这套资源适合有一定终端操作基础、希望个性化登录界面或研究 Ubuntu 桌面定制机制的桌面版用户收藏实践。1. 为什么非要写脚本改 Ubuntu 22.04 的登录背景因为你自己换根本没处下手你刚装好 ubuntu 22.04想把自己喜欢的那张高清壁纸设成登录界面背景结果在“设置—背景”里翻了一圈发现只能改用户桌面登录那个界面纹丝不动。网上有人告诉你改/usr/share/gnome-shell/theme/gdm3.css但手改一时爽系统一升级全没换台机器还得重新来一遍。这事真正的解法就是写一个 shell 脚本把定位文件、备份、替换、回滚全部固化下来。脚本不是炫技是给“经常重装系统 习惯自己定制造型”的人准备的后悔药也是给要批量装几十台办公机器、还要保证登录界面统一的运维同事准备的交付物。这篇笔记就按我实际维护 Ubuntu 22.04 和 24.04 的经验把登录背景脚本从原理到排错给你讲清楚。2. 找到登录背景的“开关”GDM 的 CSS 变量与默认配置2.1 GDM 主题文件到底在哪儿先看清楚自己的系统版本Ubuntu 22.04 和 24.04 的登录界面锁屏登录窗口不是赶你的桌面程序管的它属于 GDMGNOME Display Manager。GDM 的壁纸是拿 CSS 样式的写法写在主题文件里的不是设置面板能碰到的。不同版本里这个文件的具体位置稍有偏差常见路径是/usr/share/gnome-shell/theme/gdm3.css/usr/share/gnome-shell/theme/ubuntu.css某些定制过的发行版会在/etc/alternatives/里做软链。我一般会先执行ls /usr/share/gnome-shell/theme/看看自己的系统里实际存在的是哪个文件。这个动作不能省因为网上很多教程直接写“编辑 gdm3.css”但如果你那台机器用的是ubuntu.css就会踩一个很大的坑改了文件名不对的文件折腾半天毫无效果。ls -l /usr/share/gnome-shell/theme/执行结果里你会看到类似gdm3.css - /etc/alternatives/gdm3.css这种软链接。注意如果它是指向/etc/alternatives/的链接那你真正要改的文件得顺着链接找我遇到过有人直接改软链接文件结果重定向到原文件被覆盖。顺着readlink -f跟一下最保险readlink -f /usr/share/gnome-shell/theme/gdm3.css这个命令会输出实际文件路径比如/usr/share/gnome-shell/theme/ubuntu.css你后面的备份和替换都围绕这个真实路径做。这里没有统一硬编码路径就是为了让脚本在不同机器上不至于一上来就找错门。2.2 背景的“开关”在 #lockDialogGroup 这个样式块里找到主题文件后真正控制登录背景的是一段叫#lockDialogGroup的样式。你可以先grep一下看看默认配置长什么样grep -n #lockDialogGroup /usr/share/gnome-shell/theme/gdm3.css正常情况下能看到类似这样的代码块#lockDialogGroup { background: #2c001e url(file:///usr/share/backgrounds/warty-final-ubuntu.png); background-repeat: no-repeat; background-size: cover; background-position: center; }这里background那一行就是登录背景的“开关”。#2c001e是 Ubuntu 默认的深棕底色后面url(...)指向壁纸文件。你要做的事本质就是把这个url(...)里的路径换成你自己的图片路径同时保证background-size这类参数不破坏。为什么是它改了才生效因为 GDM 在启动登录界面时会加载这个主题文件#lockDialogGroup是整个锁屏背景层的作用区。之前有人去改/usr/share/backgrounds/里原图片文件内容这在大多数版本里是白搭的因为 GDM 的 CSS 写死了原路径你要做的是让 CSS 指向新路径而不是调换图片本身。2.3 为什么图形界面设置动不了登录背景这个问题很多人困惑系统设置里明明有壁纸选项但改了登录界面不变。原因很简单GDM 是一个独立于普通用户会话的进程它运行在用户登录之前读取的是系统级配置和主题不读你的用户级dconf/gsettings设置。你在桌面环境里换壁纸写入的是~/.config/下的用户配置GDM 看不到。所以想要改登录背景只能走系统主题文件这条路也就进一步说明“脚本 替换 CSS”是这个方向里最可靠的做法。3. 写一个可复用的修改脚本从备份到回滚3.1 脚本骨架与版本检测我写这类脚本有个原则一开始就做版本检测和备份绝不在没有备份的情况下直接改系统文件。下面这个脚本是针对 Ubuntu 22.04 和 24.04 设计的最小可用版本先看整体结构#!/bin/bash # # change-gdm-background.sh # 用法: sudo ./change-gdm-background.sh /path/to/your/wallpaper.jpg set -euo pipefail WALLPAPER${1:? 用法: $0 图片绝对路径} # 检测系统版本只支持 22.04 及以上 if ! grep -qE 22\.04|23\.04|23\.10|24\.04 /etc/os-release; then echo 错误: 这个脚本只适配 22.04 以上版本。 exit 1 fi # 找到实际的主题 CSS 文件 THEME_CSS$(readlink -f /usr/share/gnome-shell/theme/gdm3.css 2/dev/null || echo ) if [ -z $THEME_CSS ] || [ ! -f $THEME_CSS ]; then echo 错误: 找不到 gdm3.css请检查 /usr/share/gnome-shell/theme/ exit 1 fi echo 目标文件: $THEME_CSS这段脚本开头用set -euo pipefail这是 shell 脚本里比较稳妥的设定任何命令非零退出就停、变量未定义就报错、管道命令失败也算失败。${1:? ...}用来强制要求你传入一个图片绝对路径避免后面替换时拿到空变量。版本检测这里我用grep -qE去匹配/etc/os-release里的版本号这么做比lsb_release更通用因为有些精简过的系统可能没装lsb_release。注意这里我对主题文件求了readlink -f解决了前面说的软链接问题。如果你的系统里gdm3.css是链接那么readlink -f会给出真实路径接下来所有操作都作用在真实文件上避免改错层。3.2 备份与替换函数核心不建议用 pythonsed 就够接下来是核心替换逻辑。我见过有人为了改一行 CSS 调 python 脚本完全是杀鸡用牛刀。用sed是最直接的但有个细节图片路径里如果含有空格、逗号、括号等特殊字符直接塞进sed的模式里就会翻车。处理办法是换用|作为 sed 的分隔符并且对路径里可能出现的|做转义或者更简单粗暴地要求用户提供不带特殊字符的绝对路径。我在生产脚本里两种都兼容# 备份 BACKUP_SUFFIX.bak_$(date %Y%m%d_%H%M%S) cp $THEME_CSS ${THEME_CSS}${BACKUP_SUFFIX} echo 已备份到: ${THEME_CSS}${BACKUP_SUFFIX} # 用 sed 替换 url(...) # 注意: 这里用 | 作为分隔符避免图片路径中的 / 干扰 sed -i s|url(\[^\]*\,|url(\$WALLPAPER\,|g $THEME_CSS sed -i s|url([^]*,|url($WALLPAPER,|g $THEME_CSS sed -i s|background: #2c001e url(\[^\]*\|background: #2c001e url(\$WALLPAPER\| $THEME_CSS # 确保 background-size 存在且有值 grep -q background-size: cover $THEME_CSS || \ sed -i s|#lockDialogGroup {|#lockDialogGroup {\n background-size: cover;| $THEME_CSS这段代码逻辑分三步备份拷贝成带时间戳的.bak文件时间戳精确到秒避免多次运行覆盖掉旧备份。替换这里用了三条sed覆盖双引号和单引号两种写法的 url以及background简写属性的情况。为什么不用一条sed写完因为实际终端里看到的各种系统版本写法不完全一样有些地方url和括号之间有多余空格有些是单引号分三条sed就像查漏补缺反而更稳妥。补上 cover有些精简版主题文件里没有background-size如果缺了这项替换后的壁纸会被默认拉伸成奇怪比例。这里用grep -q先判断有没有覆盖没有就追加进#lockDialogGroup样式块。sed -i是原地编辑注意一定要在备份之后执行。实际脚本里我还会加一步“在替换后立即 grep 检查是否替换成功”防止sed静默失败比如匹配模式没命中也没报错。命令如下# 验证替换 grep url( $THEME_CSS | grep $WALLPAPER || { echo 错误: 替换后未找到新壁纸路径正在回滚... cp ${THEME_CSS}${BACKUP_SUFFIX} $THEME_CSS exit 1 } echo 替换成功这段验证逻辑很有必要。sed匹配不到内容时会正常退出但不会告诉你“我没匹配到”。如果因为主题文件格式不一样你的url写法不是url(...)而是url(...)不带引号上面这几条sed可能就不会命中。加上这个grep验证一旦发现问题立刻用备份回滚相当于给自己上了一道保险。3.3 应用修改重启 GDM 还是重启系统替换完 CSS 文件之后GDM 不会热加载需要让它重新读取主题。最常见的两条路# 方法 A: 重启 GDM 服务 sudo systemctl restart gdm # 方法 B: 重启系统 sudo reboot方法 A 要非常小心如果你此刻正坐在这个图形界面里重启 gdm 会直接把你当前会话踢掉没保存的工作就没了。我在脚本里专门加了一个交互确认echo 即将重启 GDM当前未保存的图形会话会被关闭。 read -r -p 确认继续吗? (y/N) answer case $answer in y|Y) systemctl restart gdm ;; *) echo 已取消请稍后手动重启以应用修改。 ;; esac有的系统用的是gdm3你在老一点的 22.04 上可能用systemctl restart gdm3。我在脚本里做了兼容if systemctl list-unit-files | grep -q gdm3.service; then systemctl restart gdm3 else systemctl restart gdm fi这样无论新老服务名都能接管。如果你是远程 SSH 操作重启 GDM 不影响 SSH 连接倒是可以大胆执行。如果你就在本机切记先保存文件再确认。4. 让脚本适配 22.04 与 24.04版本差异与参数调优4.1 主题文件路径差异与自动检测前面提到readlink -f解决路径问题这里再补充一个重点Ubuntu 24.04 部分版本中/usr/share/gnome-shell/theme/下的 css 文件名可能不叫gdm3.css而是gnome-shell.css或者干脆通过update-alternatives管理。如果你的脚本只硬编码找gdm3.css那在 24.04 上就会直接退出。我一般会加一个兜底搜索# 如果 gdm3.css 不存在则在主题目录下搜索所有 css if [ ! -f $THEME_CSS ]; then THEME_CSS$(find /usr/share/gnome-shell/theme -maxdepth 1 -name *.css -print -quit) fifind ... -maxdepth 1只在主题目录第一层搜索避免误搜到子目录里的其他样式文件。拿到第一个.css文件后再 grep 一下它内部是否真的有#lockDialogGroupgrep -q #lockDialogGroup $THEME_CSS || { echo 错误: 找到的 css 文件里没有 lockDialogGroup 定义 exit 1 }这一步能拦住很多“看起来正确其实无效”的修改。有的机器上主题目录里有多个 css 文件其中一个是给 shell 用的另一个是给 GDM 用的如果没有先 grep 验证改错文件是常有的事。4.2 图片尺寸与 background-size 参数调优壁纸不是越大越好。GDM 在登录界面渲染时会把图片拉伸到整个屏幕如果你只在 CSS 里写死url(...)没有background-size系统默认行为会把图片平铺或者拉伸成很难看的样子。我在脚本里统一强制加入background-repeat: no-repeat; background-size: cover; background-position: center;这个组合是登录背景最不容易翻车的方案。cover的意思是在保持图片原始比例的前提下覆盖整个背景区域必要时裁剪掉图片边缘。所以如果你提供的图片是 1920x1080 的屏幕原图比例不一致也没关系裁剪是自动的不会变形。有些用户会问要不要根据屏幕分辨率生成不同尺寸图片。我的习惯是不需要。登录背景是静态图片用cover之后不需要精确匹配分辨率。真正要注意的是图片文件本身的格式.jpg和.png都行但不要用.webp因为底层 libwebkit 对 webp 的支持有版本差异我在 Ubuntu 22.04 上遇到过 webp 背景显示成黑色块的问题。4.3 用户自定义 CSS 覆盖机制不用动原文件的另一条路如果你不想直接改系统自带的gdm3.css毕竟升级会被覆盖还有一种常见做法创建自己的 CSS 文件然后用update-alternatives让 GDM 指向它。这个思路在 22.04 和 24.04 都适用做法如下sudo cp /usr/share/gnome-shell/theme/gdm3.css /usr/share/gnome-shell/theme/gdm3-custom.css # 然后编辑 gdm3-custom.css 替换背景路径 sudo update-alternatives --install /usr/share/gnome-shell/theme/gdm3.css gdm3.css /usr/share/gnome-shell/theme/gdm3-custom.css 10update-alternatives的作用是把/usr/share/gnome-shell/theme/gdm3.css这个路径软链到你自定义的 css 文件上。好处是原文件保持不动系统哪天覆盖了原文件也只是覆盖了默认那层软链仍然指向你的自定义文件。但坑也很明显——你自己改的gdm3-custom.css不会自动跟随原文件更新如果 Ubuntu 新版本改了样式结构就可能出现登录界面布局错乱。我个人的建议是如果是个人单机直接改原文件 备份就够了如果是批量部署用update-alternatives更干净但升级系统后要重新核对样式。4.4 脚本参数扩展支持 --path 和 --reset写到这里你可能会觉得每次要改背景都得重新执行一次脚本。其实脚本可以做成带参数的工具我通常加两个参数--set 图片路径执行替换。--reset恢复备份或者恢复到原始默认背景。示例框架如下case ${1} in --set) WALLPAPER$2 # 执行前面写的备份替换逻辑 ;; --reset) LATEST_BAK$(ls -t ${THEME_CSS}.bak_* 2/dev/null | head -n1) if [ -n $LATEST_BAK ]; then cp $LATEST_BAK $THEME_CSS echo 已恢复到最近的备份: $LATEST_BAK else echo 找不到备份文件 fi ;; *) echo 用法: $0 --set 图片路径 | --reset ;; esacls -t按时间倒序找最近的备份head -n1取最新那份。这个--reset就是我的后悔药一旦图片路径写错或者替换完发现效果不对一条命令恢复原状不用重新装系统。配合前面的版本检测整个脚本就是一台改登录背景的全能工具箱了。5. 修改登录背景脚本的常见坑与排查记录5.1 现象改了 CSS重启 GDM 后背景还是默认图这件事我碰到的概率最高。最后的处理方式是打开终端检查当前生效的 CSSgrep -o url([^)]* /usr/share/gnome-shell/theme/gdm3.css | head -n 5如果发现输出里还是warty-final-ubuntu.png那说明你改的文件和 GDM 实际加载的文件不是一个。原因通常是GDM 启动时会找gnome-shell-theme.gresource这个二进制资源文件里面打包了默认壁纸CSS 里的路径只是兜底。解决办法是确认系统是否启用了.gresource覆盖机制。你可以查一下这个文件ls -l /usr/share/gnome-shell/gdm-shell-theme.gresource如果存在说明 GDM 用资源包里的主题而不是直接读 css。这会提高修改门槛。但 Ubuntu 官方包默认不会开这个原因更多是你的 css 修改没真正保存或者软链接指向错了。解决用readlink -f确认目标文件改完后再次cat检查内容。另一个容易忽略的点GDM 可能有缓存。执行sudo journalctl -u gdm查看日志确认启动时是否报 css 解析错误。我在 22.04 上碰过一次明明文件改了但 GDM 报Failed to parse stylesheet原因是我的图片路径里中括号没转义。解决把图片路径里的特殊字符全部去掉放到/usr/share/backgrounds/这种纯英文路径下。5.2 现象背景图拉伸变形人脸都拉长了原因CSS 里只有background简写属性没有background-size。这个简写属性如果包含0 0或者auto系统会采用图片原始尺寸在宽屏上就会拉伸或者平铺。解决把background-size: cover加到#lockDialogGroup样式块。我的脚本里已经做了自动追加如果你手改一定记得加。检查命令grep -A5 #lockDialogGroup /usr/share/gnome-shell/theme/gdm3.css确认输出里有background-size: cover;没有就手动补上。5.3 现象开机先闪一下默认背景过两三秒才变成自己的图这个问题不是 GDM 的问题而是 Plymouth 开机动画的背景。Plymouth 是引导阶段的启动闪屏它先于 GDM 显示。你只改 GDM 背景只会影响登录界面开机早期那个闪屏还是原来的。原因两个背景是两套机制。解决如果你连开机闪屏也要统一风格那就得改/usr/share/plymouth/themes/下的主题文件。但这里我不建议动它因为 Plymouth 主题修改风险更高弄不好开机进度条变成花屏。逻辑上“登录背景”只指 GDM 层只要 GDM 背景对了就行开机闪屏那一下大多数人不会在意。5.4 现象Ubuntu 系统升级后脚本失效背景又变回默认原因apt 在更新gnome-shell相关包时会把/usr/share/gnome-shell/theme/gdm3.css直接覆盖成发行版默认版本你的备份文件还在但主文件被打回原形。解决升级后重新跑脚本。如果是批量部署多台机器可以把脚本放到/usr/local/bin/下升级后统一手动再跑一遍。更省事的做法是用我之前提到的update-alternatives因为你自定义的 css 文件不受 apt 覆盖。不过要注意即使 alternative 指向自定义文件如果升级后的gnome-shell不再读这个路径那还是要手动介入。5.5 现象sudo 执行脚本时提示sed: couldnt open file ... Permission denied原因虽然你是sudo但文件可能被immutable属性锁住了。有的安全加固脚本会给重要系统文件加chattr i导致 root 也无法直接改。解决检查属性lsattr /usr/share/gnome-shell/theme/gdm3.css如果输出里有i先解锁sudo chattr -i /usr/share/gnome-shell/theme/gdm3.css改完再把属性加回去或者不加也行。顺便提醒如果文件在/etc/alternatives/链上chattr应该作用于真实文件而不是软链接。5.6 现象修改后登录界面黑屏只剩鼠标光标原因CSS 语法被 sed 改坏了比如图片路径里的引号没有闭合。解决立即用备份回滚。这正是我在脚本里加验证逻辑的意义如果替换后 grep 到的 url 不完整或者多了一个引号脚本能自动回滚。如果已经黑屏了你可以切到 ttyCtrlAltF3登录然后手动执行回滚命令sudo cp /usr/share/gnome-shell/theme/gdm3.css.bak_* /usr/share/gnome-shell/theme/gdm3.css sudo systemctl restart gdm这里通配符bak_*会匹配到你最早的那个备份但保险起见用最近的一次。黑屏第一要务是恢复别想其他锦上添花的东西。6. 把脚本升级成带参数的“后悔药”回滚与验证一条龙最后一层进阶我的脚本里一定包含一个--verify参数用来检查当前状态是否正常。光改完没有验证等于黑匣子。--verify做的事很简单检查 CSS 里#lockDialogGroup这个块的存在并确认background指向的图片文件真实存在。if [ ${1} --verify ]; then CSS_PATH$THEME_CSS grep -n #lockDialogGroup $CSS_PATH || { echo 未找到背景定义; exit 1; } BG_URL$(grep -o url([^]* $CSS_PATH | head -n1 | sed s/url(//;s///) if [ -f $BG_URL ]; then echo 当前登录背景: $BG_URL (文件存在) else echo 登录背景指向文件不存在: $BG_URL fi exit 0 fi这个验证的现实意义很大。我帮同事排查时经常遇到一种情况改完当时是好的过几天图片文件被清理动作删了登录界面就黑屏。有了--verify你好歹有个快速判断工具。另一个我养成的习惯是每次修改之前把当前整个主题目录备份到一个tar.gz而不是单文件备份。因为 GDM 主题有时候会连带依赖其他资源文件单文件备份无法还原完整状态。命令是tar czf /home/yourname/gdm-theme-backup-$(date %F).tar.gz /usr/share/gnome-shell/theme/如果你在用虚拟机验证比如在 VMWare 里跑 ubuntu 22.04 做测试可以直接快照比脚本回滚更省事。但生产机器上快照未必可用脚本级备份更实际。最后我还想提醒一个边界问题这个脚本只负责 GDM 登录背景不碰锁屏界面的账户头像、登录表单样式。如果你用第三方的 GDM 主题管理器要注意它可能会覆盖你 CSS 中关于背景的定义。我的经验是能用纯 shell 脚本解决就不引入额外图形工具最坏情况下所有逻辑都能在 SSH 会话里跑完不会因为图形界面卡死而中断。现在这套脚本我每装一台新 Ubuntu 都会顺手跑一次先--set再--verify就成了我自己的装机模板了。希望帮到你。本文还有配套的精品资源点击获取
返回列表