简介:这份资源面向使用 Ubuntu 22.04 及以上版本的 Linux 用户,尤其是希望自定义 GDM 登录界面背景的桌面美化爱好者与运维人员。由于新版 GDM 配置方式调整,旧方法已失效,该脚本包提供了适配新环境的解决方案,并额外附带透明背景版本,兼顾不同视觉需求。压缩包共 10 个文件,约 20KB,以 3 个 sh 脚本为核心,分别对应 23 版前后及透明背景场景,另含主程序、README 说明文档、LICENSE 授权文件及若干元数据标记文件,结构紧凑、开箱即用。目前已有 1132 人学习下载,说明其在同类需求中具备一定参考价值。读者可借助脚本快速完成登录背景替换,并通过 README 了解用法与注意事项,同时参考授权信息评估使用范围,适合具备基础 Linux 权限操作能力、希望省去手动改配置的用户直接取用。
1. 一条命令改掉 Ubuntu 登录背景:这个脚本到底值不值得收
装完 Ubuntu 22.04 或 24.04,默认登录界面那张紫红色渐变图看久了确实腻。想换成自己的壁纸,翻遍「设置」里的外观选项,发现根本没有登录背景这一项——这是 GDM3 的典型表现,它把登录界面资源锁在系统主题目录里,普通用户改不动。网上流传的做法要么让你手动去/usr/share/gnome-shell/theme里翻 CSS,要么让你装第三方主题管理器,步骤碎、版本差异大,22.04 和 24.04 的路径还不一样,很容易改完直接黑屏进不去桌面。
这份「Ubuntu 22.04 以上版本修改登录背景脚本」解决的正是这个痛点:把 GDM3 登录背景替换这件事封装成可重复执行的脚本,自动识别系统版本、备份原文件、处理权限和 SELinux/AppArmor 相关的读取限制,改完还能一键回滚。适合两类人——一类是刚装完系统想个性化桌面的新手,照着跑就行;另一类是做批量部署的运维,需要把统一壁纸推到几十台机器上,脚本化比手动改靠谱得多。下面把它拆开讲清楚原理、参数和几个我实际踩过的坑。
2. 先搞懂 GDM3 背景加载链路:为什么直接替换图片会失效
2.1 登录背景不是一张图,而是 CSS 里的一条引用
很多人第一反应是找到登录界面用的那张图片,直接覆盖掉。这个思路在 Ubuntu 22.04 上大概率翻车。GDM3 的登录界面由 GNOME Shell 主题驱动,背景图是通过 CSS 的background-image属性引用的,路径写在主题的gnome-shell.css里。你替换了图片文件,但 CSS 引用的可能是另一个文件名,或者被url()里的相对路径指向别处,结果就是改了等于没改。
常见做法是先定位当前生效的主题目录。Ubuntu 22.04 默认用 Yaru 主题,登录界面的资源在/usr/share/gnome-shell/theme/Yaru/下;24.04 部分版本路径有调整,可能落在/usr/share/gnome-shell/theme/直属目录。脚本要做的第一件事就是探测这个路径,而不是写死。
# 探测当前 GDM3 使用的主题目录 # gsettings 读的是当前会话,GDM 有自己的 dconf,所以要看 gdm 用户配置 sudo -u gdm dbus-launch gsettings get org.gnome.desktop.interface gtk-theme # 同时检查主题资源实际落点 ls -d /usr/share/gnome-shell/theme/*/ 2>/dev/null ls /usr/share/gnome-shell/theme/*.css 2>/dev/null这段命令的逻辑是:先以 gdm 用户身份读取它实际加载的 GTK 主题名,再去文件系统里确认这个主题的资源目录存在。参数上,sudo -u gdm是关键,因为 GDM 运行在独立的 gdm 用户会话下,你用当前用户跑gsettings读到的是自己的配置,跟登录界面无关。如果dbus-launch报错,说明系统没装dbus-x11,先补上再继续。
2.2 权限与读取时机:改完不生效的两个隐藏原因
定位到 CSS 之后,替换背景图还涉及两个容易忽略的点。第一是文件权限,GDM 以 gdm 用户读取主题资源,如果你替换的图片权限是600且属主是 root,gdm 读不到,登录界面会回退到默认背景甚至纯色。第二是 GNOME Shell 的缓存,主题 CSS 和图片有时会被缓存,改完不重启 GDM 看不到效果。
脚本里对应的处理是:替换后统一chmod 644并chown root:root,然后systemctl restart gdm3。注意重启 GDM 会踢掉当前图形会话,所以脚本一般建议在 TTY 或者确认没有未保存工作的情况下执行。
# 备份原背景并替换,处理权限 THEME_DIR="/usr/share/gnome-shell/theme/Yaru" BG_FILE="$THEME_DIR/login-background.jpg" sudo cp "$BG_FILE" "$BG_FILE.bak.$(date +%s)" sudo cp /home/$USER/Pictures/my-login.jpg "$BG_FILE" sudo chown root:root "$BG_FILE" sudo chmod 644 "$BG_FILE" # 重启 GDM 使配置生效 sudo systemctl restart gdm3逻辑说明:先带时间戳备份,避免覆盖上一次的备份;替换后立刻修正属主和权限,这是 gdm 能读到的前提;最后重启服务。参数上,$(date +%s)生成秒级时间戳保证备份不重名,systemctl restart gdm3在部分系统上服务名是gdm,脚本里要做兼容判断。
提示:如果你在虚拟机里测试,重启 GDM 后如果卡在黑屏,切到 TTY(Ctrl+Alt+F3)用备份文件还原即可,别慌。
3. 脚本核心逻辑拆解:版本判断、备份与回滚怎么落地
3.1 用 /etc/os-release 做版本分支,别用 lsb_release
脚本要兼容 22.04 和 24.04,版本判断是第一步。很多人习惯用lsb_release -a,但这个命令在最小化安装的 Ubuntu 上可能不存在,得先装lsb-release包。更稳的做法是直接读/etc/os-release,它是 systemd 体系的标准文件,任何 Ubuntu 都有。
# 读取版本号,提取主版本 source /etc/os-release UBUNTU_VER="${VERSION_ID}" echo "检测到 Ubuntu 版本: $UBUNTU_VER" case "$UBUNTU_VER" in 22.04) THEME_BASE="/usr/share/gnome-shell/theme/Yaru" ;; 24.04|24.10) THEME_BASE="/usr/share/gnome-shell/theme" ;; *) echo "未测试的版本 $UBUNTU_VER,脚本按 24.04 路径尝试" THEME_BASE="/usr/share/gnome-shell/theme" ;; esac逻辑说明:source /etc/os-release把文件里的变量导入当前 shell,VERSION_ID就是「22.04」「24.04」这样的字符串。case分支按版本给THEME_BASE赋值,未知版本走兜底路径并给出提示,而不是直接退出——这样用户至少能看到尝试结果。参数上,24.10也归到新路径,因为 GNOME 版本接近。
3.2 备份策略:为什么单份备份不够
我见过有人只备份一份login-background.jpg.bak,结果第一次改坏了,第二次又改,备份被覆盖,原图彻底找不回。脚本里的备份要带时间戳,并且把「原始文件」和「上一次修改前」区分开。更稳妥的做法是首次运行时把原始文件另存到一个固定位置,比如/var/backups/gdm-login/,后续每次修改再存时间戳副本。
# 首次运行保存原始背景到固定备份目录 BACKUP_DIR="/var/backups/gdm-login" sudo mkdir -p "$BACKUP_DIR" if [ ! -f "$BACKUP_DIR/original.jpg" ]; then sudo cp "$BG_FILE" "$BACKUP_DIR/original.jpg" echo "已保存原始背景到 $BACKUP_DIR/original.jpg" fi # 每次修改前存时间戳副本 sudo cp "$BG_FILE" "$BACKUP_DIR/before-$(date +%Y%m%d-%H%M%S).jpg"逻辑说明:original.jpg只在第一次运行时写入,之后不再覆盖,保证永远能回到出厂状态;before-时间戳.jpg记录每次改动前的状态,方便逐步回退。参数上,date +%Y%m%d-%H%M%S生成可读的时间戳,比秒级数字更直观。备份目录选/var/backups是因为它本来就是系统备份的标准位置,权限也合适。
3.3 回滚函数:一条命令还原到任意备份
脚本的价值一半在改,一半在能退。回滚逻辑要能列出所有备份让用户选,或者直接还原到原始状态。
# 回滚到原始背景 rollback_original() { if [ -f "$BACKUP_DIR/original.jpg" ]; then sudo cp "$BACKUP_DIR/original.jpg" "$BG_FILE" sudo chown root:root "$BG_FILE" sudo chmod 644 "$BG_FILE" sudo systemctl restart gdm3 echo "已还原到原始登录背景" else echo "未找到原始备份,无法回滚" fi } # 列出所有时间戳备份 list_backups() { ls -lh "$BACKUP_DIR"/before-*.jpg 2>/dev/null || echo "暂无时间戳备份" }逻辑说明:rollback_original直接拿固定备份覆盖回去,并重复权限修正和 GDM 重启,保证还原后立刻生效。list_backups用ls -lh展示备份文件的大小和时间,方便用户判断选哪个。参数上,2>/dev/null把「没有匹配文件」的报错吞掉,换成友好提示。
注意:回滚同样会重启 GDM,当前图形会话会中断,操作前确认没有正在编辑的文档没保存。
4. 避坑与排查:改登录背景最常见的五个翻车现场
4.1 改完登录界面还是默认背景
现象:脚本跑完提示成功,重启后登录界面纹丝不动。原因通常是 CSS 里引用的文件名和你替换的文件名不一致,或者主题目录判断错了。解决:打开$THEME_BASE/gnome-shell.css,搜索background-image,确认它引用的具体路径和文件名,再对照你替换的文件。如果 CSS 引用的是url("login-background.jpg")而目录里实际叫login-background.png,替换就无效。
4.2 登录界面变纯黑或纯色
现象:重启 GDM 后登录界面没有背景图,只剩纯色。原因基本是权限问题——gdm 用户读不到你替换的图片。解决:ls -l看文件权限,确保是644且属主root:root。如果图片放在/home下再cp过去,注意cp默认保留源权限,可能带成600,脚本里显式chmod就是防这个。
4.3 重启 GDM 后无法进入桌面
现象:systemctl restart gdm3之后卡在黑屏或登录循环。原因可能是主题 CSS 被改坏,或者替换的图片格式 GDM 不支持(比如用了 CMYK 的 JPEG 或超大分辨率)。解决:切 TTY 用回滚函数还原,或者手动cp备份文件回去再重启。预防办法是替换前用file命令确认图片是标准 RGB JPEG/PNG,分辨率别超过 4K。
4.4 脚本在 24.04 上报「目录不存在」
现象:22.04 能跑,24.04 提示THEME_BASE不存在。原因是 24.04 的 GNOME Shell 主题结构有调整,Yaru 子目录可能不在了。解决:脚本里加if [ ! -d "$THEME_BASE" ]判断,不存在就回退到/usr/share/gnome-shell/theme并提示用户手动确认。别硬编码单一路径。
4.5 多用户环境下背景被覆盖
现象:A 用户改完背景,B 用户登录后发现又变回默认。原因是某些主题更新或系统升级会重置/usr/share/gnome-shell/theme下的文件。解决:把自定义背景和 CSS 修改做成一个可重复执行的脚本,系统升级后重跑一次;或者把主题复制到/usr/local/share下再通过配置指向,避免被包管理器覆盖。后者更稳但步骤多,脚本里可以作为进阶选项。
5. 进阶技巧:把登录背景做成可配置项与批量部署
脚本跑通单机之后,真正省事的是把它变成可配置、可批量推的工具。我一般会在脚本开头加一个配置文件读取,把图片路径、是否重启 GDM、备份目录都抽成变量,这样同一份脚本在不同机器上只改配置不改代码。
# config.conf 示例 LOGIN_BG_SOURCE="/home/deploy/wallpapers/corp-login.jpg" AUTO_RESTART_GDM="yes" BACKUP_DIR="/var/backups/gdm-login"脚本里用source config.conf导入,然后判断AUTO_RESTART_GDM决定是否自动重启。批量部署时,把脚本和配置推到各机器,用ssh循环执行,或者写进 Ansible 的shell模块。注意批量场景下别让所有机器同时重启 GDM,错开时间或者改成下次登录生效。
验证是否生效有个小技巧:不用真的注销,直接看 GDM 的日志确认它加载了新资源。
# 查看 GDM 启动日志里主题加载情况 journalctl -u gdm3 -b | grep -i "theme\|background" | tail -20如果日志里出现Failed to load background之类的报错,说明图片路径或权限还有问题,回去查第 4 章那几条。另一个验证点是直接以 gdm 用户身份读文件:sudo -u gdm cat $BG_FILE > /dev/null && echo OK,能读出 OK 就说明权限没问题。
还有个容易被忽略的细节:Ubuntu 的锁屏背景和登录背景是两套配置。你改了 GDM 登录背景,锁屏可能还是旧的。锁屏背景由当前用户的org.gnome.desktop.screensaver picture-uri控制,用gsettings set单独设。两者要一致的话,脚本里可以顺带把当前用户的锁屏也改了,但注意这只对当前用户生效,其他用户登录后还是各自的设置。
从那以后我每次改 GDM 相关配置,都强制先跑一遍备份函数再动手,哪怕只是改一个像素。血泪经验是:登录界面改坏不像普通应用崩了重开就行,它可能让你连桌面都进不去,只能切 TTY 救。希望这份拆解帮到你,少走一次黑屏的弯路。
本文还有配套的精品资源,点击获取