Which is right. I hadn't written any code to do that, and hadn't even thought of it. (And as I personally use a US unix keyboard then the default is just fine for me, so hadn't noticed the omission.)
So I set out to discover how to fix this. And it's a twisty little maze.
The prompt when the live image boots comes from the kbd command, called as 'kbd -s'. It does the prompt and sets the keyboard type - there's nothing external involved.
So to save that, we have to query the system. To do this, run kbd with the -t and -l arguments
# kbd -t
USB keyboard
# kbd -l
type=6
layout=33 (0x21)
delay(ms)=500
rate(ms)=40
OK, in the -l output type=6 means a USB keyboard, so that matches up. These are defined in <kbd.h>
#define KB_KLUNK 0x00 /* Micro Switch 103SD32-2 */
#define KB_VT100 0x01 /* Keytronics VT100 compatible */
#define KB_SUN2 0x02 /* Sun-2 custom keyboard */
#define KB_VT220 0x81 /* Emulation VT220 */
#define KB_VT220I 0x82 /* International VT220 Emulation */
#define KB_SUN3 3 /* Type 3 Sun keyboard */
#define KB_SUN4 4 /* Type 4 Sun keyboard */
#define KB_USB 6 /* USB keyboard */
#define KB_PC 101 /* Type 101 AT keyboard */
#define KB_ASCII 0x0F /* Ascii terminal masquerading as kbd */
That handles the type, and basically everything today is a type 6.
Next, how is the keyboard layout matched. That's the 33 in the output. The layouts are listed in the file
Which are a key-value map of name to number. So what we have is:
US-English=33
And if you check the source for the kbd command, 33 is the default.
Note that the numbers that kbd -s generates to prompt the user with have absolutely nothing to do with the actual type - the prompt just makes up an incrementing sequence of numbers.
So, how is this then loaded into a new system? Well, that's the keymap service, which has a method script that then calls
/usr/lib/set_keyboard_layout
(yes, it's a twisty maze). That script gets the layout by calling eeprom like so:
/usr/sbin/eeprom keyboard-layout
Now, usually you'll see:
keyboard-layout=Unknown
which is fair enough, I haven't set it.
On x86, eeprom is emulated, using the file
/boot/solaris/bootenv.rc
So, to copy the keyboard layout from the live instance to the newly
installed system, I need to:
1. Get the layout from kbd -l
2. Parse /usr/share/lib/keytables/type_6/kbd_layouts to get the name that corresponds to that number.
3. Poke that back into eeprom by inserting an entry into bootenv.rc
Oof. This is arcane.
No comments:
Post a Comment