O Linux inicializa a maioria dos periféricos para que eles fiquem em um estado conhecido. Isso inclui o teclado: os dados internos do Linux sobre o teclado combinam melhor com os LEDs, então o que o Linux faz é desligar os LEDs (até onde eu lembro, a CPU não consegue ler o estado dos LEDs em um teclado de PC). e declara todos os * Lock para estarem desligados.
Eu gosto de ter NumLock por padrão. Para consoles de texto do Linux, o que eu costumava fazer é executar
for t in /dev/tty[0-9]*; do setleds -D +num <$t; done
de um script de inicialização ( /etc/rc.local
ou /etc/init.d/50_local_setleds
ou onde quer que a distribuição goste de colocá-los).
Hoje em dia, pelo menos em algumas distribuições como o Debian, você pode adicionar LEDS=+num
a /etc/console-tools/config
(ou /etc/kbd/config
dependendo de qual você tiver).
O sistema de janelas X tem seu próprio controle de teclado, então você precisa lidar com isso separadamente. O que eu faço é desativar o caps lock permanentemente (não tenho uma tecla Caps Lock no meu layout) e ativar o bloqueio numérico permanentemente (não tenho uma tecla Num Lock no meu layout, e as teclas do teclado envia KP_1
e assim por diante). Se você quiser manter os modificadores, mas ativar o Num Lock, você pode escrever um para chamar XKbLockModifiers
para definir o modificador dentro de X e XChangeKeyboardControl
para definir o LED físico.
¹ Usado para, porque eu não me incomodo com consoles de texto há algum tempo.