Установка параметров debconf для конфигурации клавиатуры не удалась... макет заканчивается как афганский
У меня есть машина, которую я не установил, с немецкой клавиатурой, но она проигнорировала мои настройки, и она установлена с американской клавиатурой. Я уверен, что я установил это, потому что, если я не устанавливаю это, это спрашивает интерактивно, но я хотел автоматическую установку.
Это Ubuntu 12.04.3
Итак, теперь я хочу написать скрипт, чтобы сделать его немецкой клавиатурой.
Итак, сначала я в интерактивном режиме устанавливаю настройки на одном компьютере, затем читаю настройки, чтобы увидеть их значения, а затем на другом компьютере я устанавливаю выбор с помощью:
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/altgr select The default for the keyboard layout"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/compose select No compose key"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/ctrl_alt_bksp boolean false"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/layoutcode string de"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/layout select German"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/modelcode string pc105"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/model select Generic 105-key (Intl) PC"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/optionscode string "
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/store_defaults_in_debconf_db boolean true"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/switch select No temporary switch"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/toggle select No toggling"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/unsupported_config_layout boolean true"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/unsupported_config_options boolean true"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/unsupported_layout boolean true"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/unsupported_options boolean true"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/variantcode string "
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/variant select German"
debconf-set-selections <<< "keyboard-configuration keyboard-configuration/xkb-keymap select "
Затем я показываю выбор с:
debconf-show keyboard-configuration
И вот вывод:
* keyboard-configuration/modelcode: pc105
* keyboard-configuration/unsupported_config_options: true
* keyboard-configuration/unsupported_config_layout: true
* keyboard-configuration/toggle: No toggling
* keyboard-configuration/compose: No compose key
* keyboard-configuration/layout: German
* keyboard-configuration/xkb-keymap:
* keyboard-configuration/variant: German
debian-installer/console-setup-udeb/title:
* keyboard-configuration/switch: No temporary switch
* keyboard-configuration/unsupported_options: true
console-setup/detect:
console-setup/detected:
* keyboard-configuration/altgr: The default for the keyboard layout
* keyboard-configuration/ctrl_alt_bksp: false
* keyboard-configuration/unsupported_layout: true
* keyboard-configuration/variantcode:
* keyboard-configuration/model: Generic 105-key (Intl) PC
* console-setup/ask_detect: false
* keyboard-configuration/layoutcode: de
keyboard-configuration/other:
* keyboard-configuration/store_defaults_in_debconf_db: true
* keyboard-configuration/optionscode:
И затем, чтобы перенастроить пакет, чтобы система фактически использовала настройки, я запускаю:
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure keyboard-configuration
И вот вывод:
update-initramfs: deferring update (trigger activated)
А затем, чтобы проверить, что произошло, я снова проверяю настройки:
debconf-show keyboard-configuration
И вот вывод:
* keyboard-configuration/modelcode: a4techKB21
keyboard-configuration/unsupported_config_options: true
keyboard-configuration/unsupported_config_layout: true
* keyboard-configuration/toggle: Caps Lock
* keyboard-configuration/compose: No compose key
* keyboard-configuration/layout: Afghani
* keyboard-configuration/xkb-keymap: af
* keyboard-configuration/variant: Afghani
debian-installer/console-setup-udeb/title:
* keyboard-configuration/switch: No temporary switch
keyboard-configuration/unsupported_options: true
console-setup/detect:
console-setup/detected:
* keyboard-configuration/altgr: The default for the keyboard layout
* keyboard-configuration/ctrl_alt_bksp: false
keyboard-configuration/unsupported_layout: true
* keyboard-configuration/variantcode: ,
* keyboard-configuration/model: A4Tech KB-21
* console-setup/ask_detect: false
* keyboard-configuration/layoutcode: us,af
keyboard-configuration/other:
* keyboard-configuration/store_defaults_in_debconf_db: true
* keyboard-configuration/optionscode: grp:caps_toggle,grp_led:scroll
Почему это превратило его в афганский макет (выбранный первым в алфавитном списке для каждого вопроса)? Почему он не может просто использовать мои настройки или, по крайней мере, игнорировать их, а не устанавливать их с поддельными значениями!
И в прошлом я использовал что-то более похожее на это, но с другими вещами (такими как postfix и т. Д.):
apt-get install --reinstall keyboard-configuration
Но в этом случае с настройкой клавиатуры, он делает то же самое, что и
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure.
Я также сравнил интерактивно настроенную машину с той, что была написана с помощью сценария, описанного выше, перед переконфигурированием, и debconf всей машины идентичен, за исключением "grub-pc grub-pc/install_devices ...", который имеет идентификатор и, очевидно, не Соответствующий. И если я запускаю метод сценариев на интерактивно установленной машине, он не переустанавливается на афганский, поэтому системы работают по-разному, несмотря на идентичный debconf.
Есть ли этому решение?
Я уже видел:
Что на самом деле делает "dpkg-переконфигурировать конфигурацию клавиатуры"? http://ubuntuforums.org/showthread.php?t=1793250 автоматизировать dpkg-переконфигурировать tzdata
5 ответов
Так что... надеюсь, когда-нибудь у кого-то будет правильный ответ, но вот что я в итоге сделал, это то же самое, что я делал много лет назад без семени:
настройка интерактивной клавиатуры на одном узле:
dpkg-reconfigure keyboard-configuration
Затем, когда это будет сделано, скопируйте настройки консоли
cd
tar czf console-setup.tgz /etc/console-setup
Затем отправьте этот файл на все узлы или поместите его в http где-нибудь.
Затем установите его на каждом узле с помощью скрипта, а не интерактивно по одному:
cd
wget http://somewebserver/console-setup.gz -O ~/console-setup.tgz
cd /
mv /etc/console-setup /etc/console-setup.bak
tar xzf ~/console-setup.tgz
gunzip -c /etc/console-setup/cached.kmap.gz | loadkeys
И до тех пор, пока вы не перенастроите клавиатуру другим способом, она, вероятно, останется такой (как это было в течение многих лет при предыдущей установке). Но, может быть, есть некоторые вещи, которые снова запутаются, такие как:
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure keyboard-configuration
Наконец, вот решение, и оно такое простое, но я потерял два дня, чтобы его найти :(
Решение 1:
- это будет служить для настройки клавиатуры при установке
keyboard-configuration
впервые или когда вы его уже установили и хотите перенастроить заново. - это будет работать внутри
chroot
слишком :) - и вам не нужно использовать
debconf-set-selections
больше.
DEBIAN_FRONTEND=noninteractive apt-get install -y console-setup keyboard-configuration
# this is the trick, you have to change the default keyboard config before
# running dpkg-reconfigure or you will always end with what it is configured
# in /etc/default/keyboard, so for a french keyboard for example:
echo '
XKBMODEL="pc105"
XKBLAYOUT="fr"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"
' > /etc/default/keyboard
dpkg-reconfigure --frontend noninteractive keyboard-configuration
вот и все. Обратите внимание, что клавиатура не будет настроена в chroot, но будет настроена для следующей перезагрузки.
Я протестировал описанный выше метод с Debian 10, Debian Testing (11), Debian SID, Ubuntu 16.04, Ubuntu 18.04, Ubuntu 20.04, все они установлены с помощью debootstrap.
вы можете увидеть список поддерживаемых опций (XKBLAYOUT
,XKBVARIANT
...) с:
less /usr/share/X11/xkb/rules/xorg.lst
будет использовать значение по умолчаниюus
клавиатуре, если в /etc/default/keyboard есть какая-либо ошибка, поэтому убедитесь, что вы указали только поддерживаемые параметры (например,ubuntu 16
не имеютazerty
вариант дляfr
раскладка, так что если поставить азерти тоdpkg-reconfigure
вернется к клавиатуре США по умолчанию!)
СОВЕТ: если вы пытаетесь подключиться с помощью vnc (например, qemu vnc), то вам абсолютно необходимо использовать клиент TigerVNC, чтобы клавиатура работала должным образом, все остальные клиенты vnc не работают. Как настроить раскладку клавиатуры с помощью клиента VNC на KVM (libvirt)
Решение 2:
еще одно простое решение для ОС с systemd:
localectl set-keymap fr
localectl set-x11-keymap fr
Примечание: это нельзя использовать внутри chroot, поскольку для этого требуется активное соединение с dbus.
Решение 3:
используя setupcon
# let's create multiple keyboard config
echo '
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"
' > /etc/default/keyboard.ENbadr
echo '
XKBMODEL="pc105"
XKBLAYOUT="fr"
XKBVARIANT="azerty"
XKBOPTIONS=""
BACKSPACE="guess"
' > /etc/default/keyboard.FRbadr
#activate the lang you want with
setupcon FRbadr
но это не работает внутри chroot.
Я понимаю ваше разочарование по этому поводу. Вот как я справляюсь с этим в аналогичном контексте (бродячие положения), так что, надеюсь, день настал.
Ключ должен использовать debconf-utils для описания конфигурации. Первый:
sudo apt-get install debconf-utils
Вы можете увидеть текущую конфигурацию с:
debconf-get-selections | grep keyboard-configuration
Работа со всеми этими параметрами конфигурации может быть немного утомительной, поэтому вы можете выполнить интерактивный dpkg-reconfigure keyboard-configuration
на одной машине, как в предлагаемом решении. Затем экспортируйте новые настройки с помощью команды выше в новый файл, скажем file.conf
,
Передайте файл на машины, которые нуждаются в настройке и:
debconf-set-selections < file.conf
dpkg-reconfigure keyboard-configuration -f noninteractive
Это действительно так.
БОНУС: Выполняемые задания
Если вы используете Ansible, вот часть моей книги по этому вопросу:
- name: Configuring keyboard [creating file]
template: src=templates/deb-keyboard.conf.j2 dest=/home/vagrant/.deb-keybard.conf
register: debconf_template
- name: Configuring keyboard [setting selections]
shell: debconf-set-selections < /home/vagrant/.deb-keybard.conf
become: true
when: debconf_template.changed
# or use handlers
- name: Configuring keyboard [reconfiguring dpkg]
command: dpkg-reconfigure keyboard-configuration -f noninteractive
become: true
when: debconf_template.changed
Оказалось, что в моем случае я не указал правильный тип для модулей debconf в Ansible. Если кто-то еще пытается сделать это с Ansible, то на вашем "шаблонном" компьютере (тот, который вы используете для получения всех необходимых настроек в первую очередь) установите debconf-utils
и беги debconf-get-selections | grep keyboard-config
тогда беги debconf-show keyboard-configuration
, Это дает вам список вещей, которые были изменены (элементы с * рядом с ними). Обратите внимание, что элементы в debconf-get-selections
сказать вам, что они типа.
Для меня, чтобы установить их English (UK)
Мне нужно было следующее задание:
- name: Set keyboard layout
debconf:
name: "keyboard-configuration"
question: "keyboard-configuration/{{ item.key }}"
value: "{{ item.value }}"
vtype: "{{ item.type|default('string') }}"
with_items:
- { key: "altgr", value: "The default for the keyboard layout", vtype: "select" }
- { key: "compose", value: "No compose key", vtype: "select" }
- { key: "ctrl_alt_bksp", value: "false", type: "boolean" }
- { key: "variant", value: "English (UK)", vtype: "select" }
- { key: "layout", value: "English (UK)", vtype: "select" }
- { key: "model", value: "Generic 105-key PC (intl.)", vtype: "select" }
Вот две строки примера из команд debconf-*, на которые я ссылался выше:
- (Debconf-получить выбор)
keyboard-configuration keyboard-configuration/layout select English (UK)
- (Debconf-шоу)
* keyboard-configuration/layout: English (UK)
Я использовал здесь ответы, чтобы запустить его с помощью saltstack:
Я использовал шаблон jinja для конфигурации (я удалил некоторые записи, чтобы сделать его короче):
{% if grains["domain"] == "mydomain.de" %}
{% load_yaml as keyboard_data %}
"keyboard-configuration/layoutcode":
"type": "string"
"value": "de"
"keyboard-configuration/layout":
"type": "select"
"value": "German"
{% endload %}
{% else %}
{% load_yaml as keyboard_data %}
"keyboard-configuration/layoutcode":
"type": "string"
"value": "us"
"keyboard-configuration/layout":
"type": "select"
"value": "English (US)"
{% endload %}
{% endif %}
и теперь мое состояние такое:
keyboard_conf:
debconf.set:
- name: "keyboard-configuration"
- data: {{ keyboard_data }}