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

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

我正在尝试以非交互方式更改 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

然后设置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

最后运行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

如果我想从 切换lightdm到,也会发生同样的情况gdm3
我是否遗漏了什么,或者这根本不起作用?

我在脚本中看到过,gdm3如果有/etc/X11/默认显示管理器.debconf-update文件、systemd单位和/etc/X11/默认显示管理器已相应更新。
不幸的是,这种方法不起作用,lightdm因为该方法使用了其他方法来完成工作。

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

答案1

在阅读了.post*、'.pre*' 和.config脚本之后gdm3lightdm我找到了一种以交互方式运行的方法来在显示管理器之间切换,并保持上述、和脚本dpkg-reconfigure的魔力。prepostconfig

您所要做的就是更新/etc/X11/默认显示管理器使用要更改为的显示管理器二进制文件。然后以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

从 更改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

正如前面提到的,最后一步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

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

环境变量也很有用,DEBCONF_DEBUG可以查看debconf正在做什么。可以将其设置为

  • user
  • developer
  • db
  • .*以上就是全部内容

答案2

对于使用该工具的人来说,这是在 Ubuntu 20 上执行此操作的可行方法。

---

- name: Render /etc/X11/default-display-manager
  template:
    src: etc/X11/default-display-manager
    dest: /etc/X11/default-display-manager
    owner: root
    group: root
    mode: "0644"
  become: yes

- name: Switch to XFCE4 window manager
  debconf:
    name: lightdm
    question: shared/default-x-display-manager
    vtype: string
    value: lightdm
  register: reconfigure_xfce4
  become: yes

- name: Reconfigure dpkg with XFCE4 choice
  command: dpkg-reconfigure lightdm
  environment:
    DEBIAN_FRONTEND: noninteractive
    DEBCONF_NONINTERACTIVE_SEEN: true
  become: yes
  when: reconfigure_xfce4.changed

- name: Select XFCE4 as session manager
  command: update-alternatives --set x-session-manager /usr/bin/xfce4-session
  become: yes
  when: reconfigure_xfce4.changed

- name: Set runlevel default to multi-user
  file:
    src: /lib/systemd/system/multi-user.target
    dest: /etc/systemd/system/default.target
    state: link
  become: yes
  register: change_runlevel

- name: Set runlevel to multi-user
  command: systemctl isolate multi-user.target
  become: yes
  when: change_runlevel.changed

相关内容