以非交互方式重新配置显示管理器

Tho*_*mas 5 gdm display-manager lightdm 18.04

我正在尝试以非交互式方式更改 Ubuntu 18.04.1 上的默认显示管理器,以在脚本中执行此操作。

使用时一切正常

  • dpkg-reconfigure gdm3
  • dpkg-reconfigure lightdm

我尝试设置shared/default-x-display-manager为有效的显示管理器并运行dpkg-reconfigure,但这并没有达到目的。


首先检查设置了哪个显示管理器。

root@host:~# cat /etc/X11/default-display-manager
/usr/sbin/gdm3
root@host:~# cat /etc/X11/default-display-manager
/usr/sbin/gdm3
Run Code Online (Sandbox Code Playgroud)

然后设置shared/default-x-display-managerlightdm验证它。

root@host:~# echo set shared/default-x-display-manager lightdm | debconf-communicate 
0 value set
root@host:~# echo get shared/default-x-display-manager | debconf-communicate 
0 lightdm
Run Code Online (Sandbox Code Playgroud)

最后运行dpkg-reconfigure --frontend noninteractive lightdm并检查哪个显示管理器处于活动状态。不幸的是又是gdm3这样。

root@host:~# dpkg-reconfigure --frontend noninteractive lightdm
root@host:~# echo get shared/default-x-display-manager | debconf-communicate 
0 gdm3
root@host:~# cat /etc/X11/default-display-manager 
/usr/sbin/gdm3
root@host:~# ll /etc/systemd/system/display-manager.service
lrwxrwxrwx 1 root root 32 Jan 31 20:03 /etc/systemd/system/display-manager.service -> /lib/systemd/system/gdm3.service
Run Code Online (Sandbox Code Playgroud)

如果我想从 切换lightdm到 ,也会发生同样的情况gdm3
我在这里缺少什么或者这根本不起作用?

我在脚本中看到,gdm3如果存在/etc/X11/default-display-manager.debconf-update文件,则该systemd单元和/etc/X11/default-display-manager会相应更新。
不幸的是,这不起作用lightdm,因为这个方法使用其他一些方法来完成这项工作。

希望其他人能够对此有所了解,并知道一种以非交互方式配置显示管理器的便捷方法。

Tho*_*mas 6

在阅读了.post*、 '.pre*' 和的.config脚本之后,我找到了一种交互式运行的方法,以在显示管理器之间进行更改并保持所提到的、和脚本的魔力。gdm3lightdmdpkg-reconfigureprepostconfig

您所要做的就是使用您想要更改为的显示管理器二进制文件更新/etc/X11/default-display-manager文件。然后dpkg-reconfigure以非交互方式运行就完成了。嗯,gdm3不会更新debconf数据库,而lightdm会更新,但手动更新是可以的。

开始了...


更改从lightdmgdm3

$ echo "/usr/sbin/gdm3" > /etc/X11/default-display-manager
$ DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true dpkg-reconfigure gdm3
$ echo set shared/default-x-display-manager gdm3 | debconf-communicate
Run Code Online (Sandbox Code Playgroud)

更改从gdm3lightdm

$ echo "/usr/sbin/lightdm" > /etc/X11/default-display-manager
$ DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true dpkg-reconfigure lightdm
$ echo set shared/default-x-display-manager lightdm | debconf-communicate
Run Code Online (Sandbox Code Playgroud)

正如已经提到的,最后一步echo set shared/default-x-display-manager lightdm | debconf-communicate在这里并不是真正必要的,因为 的脚本lightdm会处理它。但为了简化脚本,设置它并没有什么坏处。


将所有内容组合到 shell 脚本中可能如下所示。如果需要,可以添加更多控制。

$ cat set_dm.sh
#!/bin/bash

set_dm() {
    DISPLAY_MANAGER="gdm3"
    DISPLAY_MANAGER_SERVICE="/etc/systemd/system/display-manager.service"
    DEFAULT_DISPLAY_MANAGER_FILE="/etc/X11/default-display-manager"

    if [ -n "${1}" ]
    then
        DISPLAY_MANAGER="$1"
    fi

    DISPLAY_MANAGER_BIN="/usr/sbin/${DISPLAY_MANAGER}"
    if [ ! -e "${DISPLAY_MANAGER_BIN}" ]
    then
        echo "${DISPLAY_MANAGER} seems not to be a valid display manager or is not installed."
    exit 1
    fi

    echo "${DISPLAY_MANAGER_BIN}" > "${DEFAULT_DISPLAY_MANAGER_FILE}"
    DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true dpkg-reconfigure "${DISPLAY_MANAGER}"
    echo set shared/default-x-display-manager "${DISPLAY_MANAGER}" | debconf-communicate &> /dev/null 

    echo -n "systemd service is set to: "
    readlink "${DISPLAY_MANAGER_SERVICE}" 

    echo -n "${DEFAULT_DISPLAY_MANAGER_FILE} is set to: "
    cat "${DEFAULT_DISPLAY_MANAGER_FILE}"

    echo -n "debconf is set to: "
    echo get shared/default-x-display-manager | debconf-communicate 
}

set_dm $1
Run Code Online (Sandbox Code Playgroud)

真正交互运行需要两个变量DEBIAN_FRONTEND=noninteractive和 。DEBCONF_NONINTERACTIVE_SEEN=true

环境变量也有帮助,DEBCONF_DEBUG可以查看debconf正在做什么。可以设置为

  • user
  • developer
  • db
  • .*这是以上所有内容

  • 太棒了,谢谢你!这是我能找到的唯一能真正展示如何以非交互方式执行此操作*并且有效*的东西,以便我可以自动更新大量 Ubuntu 主机(通过 Puppet)以将它们从 lightdm 切换到 gdm :) (2认同)