From 6ccc91303f5fa64c94a08f15a38ab5bcd1407b22 Mon Sep 17 00:00:00 2001 From: The_miro Date: Wed, 20 May 2026 00:01:19 +0200 Subject: [PATCH] fix(setup): port KEYMAPS+vconsole support to auto-installer and answerfile generator arch-autoinstall.sh was missing the keymap handling added to the guided installer in the previous two commits, so booting the ISO in auto mode (answerfile embedded) never called loadkeys and left the installed system with no /etc/vconsole.conf. - Add the same KEYMAPS array + selection logic to arch-autoinstall.sh (AF mode reads .keymap, interactive mode prompts) - Call loadkeys and export KEYMAP into the chroot - Write /etc/vconsole.conf inside the chroot - Add keymap dialog to generate-answerfile.sh so the field is populated - Document .keymap in the arch-autoinstall.sh answerfile field list Co-Authored-By: Claude Sonnet 4.6 --- setup/arch-autoinstall.sh | 34 ++++++++++++++++++++++++++++++++-- setup/generate-answerfile.sh | 10 ++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/setup/arch-autoinstall.sh b/setup/arch-autoinstall.sh index 29799d7..fb443c6 100755 --- a/setup/arch-autoinstall.sh +++ b/setup/arch-autoinstall.sh @@ -4,7 +4,7 @@ # If /answerfile.json exists (e.g. embedded in the ISO via build.sh --preconf), # all prompts are answered from it. Missing fields fall back to interactive prompts. # -# Answerfile fields: drive, kernel, hostname, username, encrypt, fido2_root, +# Answerfile fields: drive, kernel, keymap, hostname, username, encrypt, fido2_root, # fido2_user, run_tui (password always prompted interactively) set -euo pipefail @@ -55,6 +55,35 @@ if $AF_MODE; then command -v jq &>/dev/null || pacman -Sy --noconfirm jq fi +############################################ +# KEYMAP +# To add more layouts: append "code|Display Name" to KEYMAPS +############################################ +KEYMAPS=( + "us|English US" + "de|German" +) + +if $AF_MODE; then + LIVE_KEYMAP=$(af_get '.keymap' 'us') +else + echo "Select keyboard layout:" + for i in "${!KEYMAPS[@]}"; do + _km_code="${KEYMAPS[$i]%%|*}" + _km_name="${KEYMAPS[$i]##*|}" + printf " %d) %-14s (%s)\n" $((i+1)) "$_km_name" "$_km_code" + done + read -rp "Choice [1]: " _KM_IDX + _KM_IDX=$(( ${_KM_IDX:-1} - 1 )) + if (( _KM_IDX >= 0 && _KM_IDX < ${#KEYMAPS[@]} )); then + LIVE_KEYMAP="${KEYMAPS[$_KM_IDX]%%|*}" + else + LIVE_KEYMAP="${KEYMAPS[0]%%|*}" + fi +fi +loadkeys "$LIVE_KEYMAP" +KEYMAP="$LIVE_KEYMAP" + ############################################ # SAFETY WARNING ############################################ @@ -263,7 +292,7 @@ fi ############################################ # PASS VARIABLES INTO CHROOT ############################################ -export HOSTNAME USERNAME USERPASS ROOT_PART KERNEL FIDO_ROOT FIDO_USER ENCRYPT_DISK +export HOSTNAME USERNAME USERPASS ROOT_PART KERNEL FIDO_ROOT FIDO_USER ENCRYPT_DISK KEYMAP ############################################ # CHROOT CONFIGURATION @@ -275,6 +304,7 @@ set -euo pipefail echo "en_US.UTF-8 UTF-8" > /etc/locale.gen locale-gen echo "LANG=en_US.UTF-8" > /etc/locale.conf +echo "KEYMAP=${KEYMAP}" > /etc/vconsole.conf # Time / hostname ln -sf /usr/share/zoneinfo/Europe/Vienna /etc/localtime diff --git a/setup/generate-answerfile.sh b/setup/generate-answerfile.sh index 6e05e95..8bc7e45 100644 --- a/setup/generate-answerfile.sh +++ b/setup/generate-answerfile.sh @@ -118,6 +118,14 @@ AF_KERNEL=$(dialog --backtitle "$BACKTITLE" \ "linux-zen" "Zen performance kernel" \ 3>&1 1>&2 2>&3) || AF_KERNEL="linux" +# ── Keymap ──────────────────────────────────────────────────────────────────── +AF_KEYMAP=$(dialog --backtitle "$BACKTITLE" \ + --title " Keyboard Layout " \ + --menu "Select keyboard layout (live environment + installed system):" 10 60 2 \ + "us" "English US" \ + "de" "German" \ + 3>&1 1>&2 2>&3) || AF_KEYMAP="us" + # ── Hostname ────────────────────────────────────────────────────────────────── AF_HOSTNAME=$(dialog --backtitle "$BACKTITLE" \ --title " Hostname " \ @@ -315,6 +323,7 @@ fi SUMMARY="" [[ -n "$AF_DRIVE" ]] && SUMMARY+=" Drive: $AF_DRIVE\n" [[ -n "$AF_KERNEL" ]] && SUMMARY+=" Kernel: $AF_KERNEL\n" +[[ -n "$AF_KEYMAP" ]] && SUMMARY+=" Keymap: $AF_KEYMAP\n" [[ -n "$AF_HOSTNAME" ]] && SUMMARY+=" Hostname: $AF_HOSTNAME (+ MAC suffix at deploy)\n" [[ -n "$AF_USERNAME" ]] && SUMMARY+=" Username: $AF_USERNAME\n" SUMMARY+=" Encrypt: $AF_ENCRYPT\n" @@ -349,6 +358,7 @@ mkdir -p "$(dirname "$OUTPUT")" printf ' "_generated": "%s",\n' "$(date -Iseconds)" printf ' "drive": %s,\n' "$(json_str "$AF_DRIVE")" printf ' "kernel": %s,\n' "$(json_str "$AF_KERNEL")" + printf ' "keymap": %s,\n' "$(json_str "$AF_KEYMAP")" printf ' "hostname": %s,\n' "$(json_str "$AF_HOSTNAME")" printf ' "username": %s,\n' "$(json_str "$AF_USERNAME")" printf ' "encrypt": %s,\n' "$AF_ENCRYPT"