Установка параметров 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 }}
Другие вопросы по тегам