我正在尝试以非交互方式更改 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-manager
为lightdm
并验证它。
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
脚本之后gdm3
,lightdm
我找到了一种以交互方式运行的方法来在显示管理器之间切换,并保持上述、和脚本dpkg-reconfigure
的魔力。pre
post
config
您所要做的就是更新/etc/X11/默认显示管理器使用要更改为的显示管理器二进制文件。然后以dpkg-reconfigure
非交互方式运行,您就完成了。好吧,gdm3
不更新debconf
数据库,而lightdm
会更新,但手动执行此操作是可以的。
开始了...
从 更改lightdm
为gdm3
。
$ 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
从 更改gdm3
为lightdm
。
$ 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