From: Jeremy Katz Date: Mon, 5 Jan 2009 19:40:34 +0000 (-0500) Subject: Add first pass of keyboard/console font setup X-Git-Tag: 0.1~488 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aabc0553b57f8bb1a586ca8a9750395776d5a871;p=thirdparty%2Fdracut.git Add first pass of keyboard/console font setup First pass of keyboard/console font setup. This ends up being Fedora/RHEL specific as everyone specifies these things in a different place --- diff --git a/TODO b/TODO index a8b6e8a12..a59c869fc 100644 --- a/TODO +++ b/TODO @@ -31,7 +31,9 @@ for us appropriately * mdraid * dmraid * multipath -* Should SELinux policy be done in the initramfs or from the real rootfs? +* Should SELinux policy be done in the initramfs or from the real +rootfs? +* Keyboard layout/consolefont setup is Fedora/RHEL-specific. GENERATOR TODO diff --git a/dracut b/dracut index c974fb49f..2fb060b25 100755 --- a/dracut +++ b/dracut @@ -72,7 +72,7 @@ cryptexe="/sbin/cryptsetup" # and some things that are nice for debugging debugexe="/bin/ls /bin/cat /bin/ln /bin/ps /bin/grep /bin/more" # udev things we care about -udevexe="/lib/udev/vol_id" +udevexe="/lib/udev/vol_id /lib/udev/console_init" # install base files for binary in $exe $debugexe $udevexe $lvmexe $cryptexe ; do @@ -83,13 +83,67 @@ done # ultimately, /lib/initramfs/rules.d or somesuch which includes links/copies # of the rules we want so that we just copy those in would be best mkdir -p $initdir/lib/udev/rules.d -for rule in /lib/udev/rules.d/40-redhat* /lib/udev/rules.d/50* /lib/udev/rules.d/60-persistent-storage.rules /lib/udev/rules.d/61*edd* /lib/udev/rules.d/64* /lib/udev/rules.d/80* /lib/udev/rules.d/95* $rulesdir/*.rules ; do +for rule in /lib/udev/rules.d/10-console* /lib/udev/rules.d/40-redhat* /lib/udev/rules.d/50* /lib/udev/rules.d/60-persistent-storage.rules /lib/udev/rules.d/61*edd* /lib/udev/rules.d/64* /lib/udev/rules.d/80* /lib/udev/rules.d/95* $rulesdir/*.rules ; do cp $rule $initdir/lib/udev/rules.d done # terminfo bits make things work better if you fall into interactive mode for f in $(find /lib/terminfo -type f) ; do cp --parents $f "$initdir" ; done +# FIXME: i18n stuff isn't really distro-independent :/ +if [ -f /etc/sysconfig/keyboard ] || [ -f /etc/sysconfig/console/default.kmap ]; then + if [ -f /etc/sysconfig/console/default.kmap ]; then + KEYMAP=/etc/sysconfig/console/default.kmap + else + . /etc/sysconfig/keyboard + if [ -n "$KEYTABLE" -a -d "/lib/kbd/keymaps" ]; then + KEYMAP="$KEYTABLE.map" + fi + fi + if [ -n "$KEYMAP" ]; then + [ -f /etc/sysconfig/keyboard ] && inst /etc/sysconfig/keyboard "$initdir" + inst /bin/loadkeys "$initdir" + findkeymap $KEYMAP + + for FN in $KEYMAPS; do + inst $FN "$initdir" + case "$FN" in + *.gz) + gzip -d "$initdir$FN" + ;; + *.bz2) + bzip2 -d "$initdir$FN" + ;; + esac + done + fi +fi + +if [ -f /etc/sysconfig/i18n ]; then + . /etc/sysconfig/i18n + inst /etc/sysconfig/i18n "$initdir" + [ -z "$SYSFONT" ] && SYSFONT=latarcyrheb-sun16 + inst /bin/setfont "$initdir" + + for FN in /lib/kbd/consolefonts/$SYSFONT.* ; do + inst $FN "$initdir" + case "$FN" in + *.gz) + gzip -d "$MNTIMAGE$FN" + ;; + *.bz2) + bzip2 -d "$MNTIMAGE$FN" + ;; + esac + done + if [ -n "$SYSFONTACM" ]; then + inst /lib/kbd/consoletrans/$SYSFONTACM "$initdir" + fi + if [ -n "$UNIMAP" ]; then + inst /lib/kbd/unimaps/$UNIMAP "$initdir" + fi +fi + # install our files cp $initfile $initdir/init cp $switchroot $initdir/sbin/switch_root diff --git a/dracut-functions b/dracut-functions index 6c3e03405..2e9250f9b 100755 --- a/dracut-functions +++ b/dracut-functions @@ -290,6 +290,39 @@ resdeps () { resolved="$items" } +findkeymap () { + local MAP=$1 + + if [ ! -f "$MAP" ]; then + MAP=$(find /lib/kbd/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1) + fi + + case " $KEYMAPS " in + *" $MAP "*) + return + ;; + esac + + KEYMAPS="$KEYMAPS $MAP" + + case $MAP in + *.gz) + cmd=zgrep + ;; + *.bz2) + cmd=bzgrep + ;; + *) + cmd=grep + ;; + esac + + for INCL in $($cmd "^include " $MAP | cut -d' ' -f2 | tr -d '"'); do + for FN in $(find /lib/kbd/keymaps -type f -name $INCL\*); do + findkeymap $FN + done + done +} # vim:ts=8:sw=4:sts=4:et