# Zuwenig Speicher für consolefont?

## 3PO

Hallo Zusammen,

beim Starten von consolefont, bekomme ich folgende Fehlermeldung:

```
consolefont       | * Setting console font [default8x16] ...                                                                                                                                                                            [ ok ]

consolefont       |getfont: KDFONTOP: Auf dem Gerät ist kein Speicherplatz mehr verfügbar
```

Das kann aber aber eigentlich gar nicht sein, denn Speicher ist genug frei:

```
server01 ~ # free -h

              gesamt       benutzt     frei      gemns.  Puffer/Cache verfügbar

Speicher:         15G        5,8G        4,0G         42M        5,5G        9,3G

Swap:           19G          0B         19G

server01 ~ #
```

```
server01 ~ # df -h

Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf

/dev/sda3        91G     60G   27G   70% /

devtmpfs         10M       0   10M    0% /dev

tmpfs           1,6G    3,8M  1,6G    1% /run

cgroup_root      10M       0   10M    0% /sys/fs/cgroup

shm             7,7G    8,0K  7,7G    1% /dev/shm

cachedir        4,0M    4,0K  4,0M    1% /lib64/splash/cache

/dev/sda1       124M     32M   87M   27% /boot

/dev/sdc1        26T    6,5T   18T   27% /mnt/storage

none            7,7G       0  7,7G    0% /run/user/0

server01 ~ #
```

Hat Jemand eine Idee, wo ich da mit dem Suchen anfangen könnte?

----------

## mike155

Hallo 3PO,

das klingt sehr merkwürdig!

Ich habe mir den Quellcode von "sys-apps/kbd" angeschaut. Der Fehler passiert vermutlich in der Datei "src/kdfontop.c" ab Zeile 60:

```
i = ioctl(fd, KDFONTOP, &cfo);

[...]

if (errno != ENOSYS && errno != EINVAL) {

        perror("getfont: KDFONTOP");

        return -1;

}
```

Ich würde mich da mal reinhängen und mir vor dem Aufruf von ioctl() ausgeben lassen, auf welche Datei (welches Device) die Funktion ioctl() ausgeführt wird. Vermutlich bekommt man das auch mit strace raus.

Viele Grüße

Mike

----------

## 3PO

Ehrlich gesagt, verstehe ich nicht so richtig, was Du mir damit sagen willst?

----------

## mike155

 *Quote:*   

> Ehrlich gesagt, verstehe ich nicht so richtig, was Du mir damit sagen willst?

 

Du hattest von einem Fehler berichtet und gefragt, was es sein könnte. Da Google keine brauchbaren Antworten liefert und auch noch niemand geantwortet hat, scheint es etwas "merkwürdiges" zu sein.

Also, ich würde in den Source-Code schauen und versuchen herauszufinden, was passiert. Die Datei und Zeile des Source Codes habe ich Dir genannt; offenbar passiert der Fehler bei einem ioctl() Aufruf. Die nächste Frage ist, auf welches Device dieser ioctl-Aufruf stattfindet und welche Parameter übergeben werden. Das kann man entweder mit strace herausfinden, oder in dem man im Source-Code ein paar printf()-Anweisungen vor den ioctl-Aufruf schreibt. Sobald man weiß, welche Parameter bei dem ioctl-Aufruf übergeben werden, dürfte auch klar sein, wer für das Problem verantwortlich ist und was den Fehler auslöst... 

So würde ich es machen - aber es gibt bestimmt auch andere Methoden. Jedenfalls glaube ich nicht, dass Du zu wenig Speicher hast. Irgendetwas funktioniert nicht - und statt einer aussagekräftigen Fehlermeldung gibt es dann die "kein Speicherplatz mehr"-Meldung.

----------

## 3PO

Da ich leider kein C spreche, fällt das modifizieren des Codes erst mal aus.  :Smile: 

Ich habe bei dem o.g. PC kein Keyboard angeschlossen und habe auch bisher nicht feststellen können, dass etwas nicht funktionieren würde. Mir ist halt beim Sichten des rc Los aufgefallen, dass consolefont wegen angeblichen Speichermangel nörgelt.

Seltsam ist auch, dass es noch 2 weiteren Servern auftritt und bei 3 anderen wiederum nicht.

----------

## mike155

OK, probieren wir es ganz anders. Wenn Du als "root" folgende Anweisung ausführst:

```
/etc/init.d/consolefont restart
```

Bekommst Du die Fehlermeldung dann auch? Oder erscheint die Fehlermeldung nur, wenn consolefont beim Starten des Systems ausgeführt wird?

----------

## 3PO

Die Meldung kommt auch beim Restart.

----------

## mike155

Der Fehler ist also reproduzierbar - das ist schon mal gut!   :Smile: 

Das Script "/etc/init.d/consolefont" ruft verschiedene Programme auf. Kannst Du herausfinden, bei welcher Anweisung der Fehler ausgegeben wird?

Ich vermute, dass es bei einem der "setfont"-Aufrufe passiert. Du könntest also in dem Script "/etc/init.d/consolefont" vor die beiden "setfont"-Aufrufe echo-Anweisungen schreiben, um die genauen Parameter herauszufinden:

```
Zeile 55:

   if ! setfont $consolefont $param -C $ttydev$x >/dev/null; then

wird zu:

    echo "setfont $consolefont $param -C $ttydev$x"

    if ! setfont $consolefont $param -C $ttydev$x >/dev/null; then

Zeile 66:

    setfont -O "$RC_LIBEXECDIR"/console/font

wird zu

    echo "setfont -O $RC_LIBEXECDIR/console/font"

    setfont -O "$RC_LIBEXECDIR"/console/font

```

Wenn Du dann "/etc/init.d/consolefont restart" aufrufst, wird eine Reihe von Anweisungen ausgegeben, ungefähr folgendermaßen:

```
setfont default8x16  -C /dev/tty1

setfont default8x16  -C /dev/tty2

...

setfont default8x16  -C /dev/tty11

setfont default8x16  -C /dev/tty12

setfont -O /lib64/rc/console/font
```

Wenn Du die bei Dir ausgegebenen Anweisungen nun von Hand ausführst: Bei welcher Anweisung wird der Fehler ausgegeben?

----------

## l3u

Hilft das hier vielleicht?

https://forums.gentoo.org/viewtopic-t-134911-start-0.html

?

----------

## 3PO

Ich habe mal ein "set -x" eingebaut:

--> https://paste.pound-python.org/show/hk9bKKy5rHe5jLHqSOlW/

Wenn ich das richtig interpretiere, passiert der Fehler an dieser Stelle:

```
....

consolefont       |+ mkdir -p /lib64/rc/console

consolefont       |+ setfont -O /lib64/rc/console/font

consolefont       |getfont: KDFONTOP: Auf dem Gerät ist kein Speicherplatz mehr verfügbar

consolefont       |+ return 0

....
```

----------

## mike155

OK, dann prüfe bitte noch einmal, dass der Fehler auftritt, wenn Du "setfont -O /lib64/rc/console/font" ausführst. Wenn das so ist, führe danach bitte folgende Anweisung aus:

```
strace -o /tmp/trace.txt -f setfont -O /lib64/rc/console/font
```

Bitte poste die Datei /tmp/trace.txt über https://paste.pound-python.org. Dann werden wir vermutlich sehen, wo der Fehler herkommt.

----------

## 3PO

https://paste.pound-python.org/show/T1YnsmEB1OoM3b6j65EX/

----------

## mike155

Die spannenden Zeilen in dem Trace sind:

 *Quote:*   

> open("/dev/tty0", O_RDWR)         = 3
> 
> ioctl(3, TCGETS, {B38400 opost isig icanon echo ...}) = 0
> 
> ioctl(3, KDGKBTYPE, 0x7ffd32d45f87) = 0
> ...

 

Bevor wir weitersuchen, zuerst noch zwei Fragen: Welche Version vom Linux-Kernel (uname -r -m) und welche Version von sys-apps/kbd hast Du installiert? Falls es eine ältere Version von sys-apps/kbd ist: Tritt der Fehler auch mit Version 2.0.4 auf?

----------

## 3PO

```
server01 ~ # uname -a

Linux server01 4.14.10-gentoo-r1 #1 SMP PREEMPT Sun Dec 31 14:43:56 CET 2017 x86_64 Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz GenuineIntel GNU/Linux

server01 ~ #
```

```
server01 ~ # eix sys-apps/kbd

[I] sys-apps/kbd

     Verfügbare Versionen:   1.15.5-r1 2.0.3 ~2.0.4 **9999 {nls pam test}

     Installierte Versionen: 2.0.3(00:03:10 02.01.2018)(nls pam -test)

     Startseite:             http://kbd-project.org/

     Beschreibung:           Keyboard and console utilities

server01 ~ #
```

Version 2.0.4 habe ich noch nicht getestet.

----------

## mike155

Sieht eigentlich alles gut aus! Ich habe auch Kernel 4.14 und kbd 2.0.3 und bei mir tritt der Fehler nicht auf.

Wenn ein Wechsel auf kbd 2.0.4 das Problem nicht behebt, würde ich auf Linux Kernel ".config" tippen. Hast Du die Kernel Config selbst angepasst? Fehlt vielleicht ein Häkchen bei den Device Drivers (Character Devices oder Video)? Vielleicht kannst Du die Kernel Config zwischen den Servern, bei denen der Fehler auftritt und bei denen der Fehler nicht auftritt miteinander vergleichen? 

PS: Falls jemand weitersuchen möchte: soweit ich sehe, tritt der Fehler in der Funktion con_font_get() in der Datei /usr/src/linux/drivers/tty/vt/vt.c auf. Leider wird ENOSPC an mehreren Stellen zurückgegeben - ohne weiteres Debuging ist deshalb nicht klar, weshalb ENOSPC zurückgegeben wird.

----------

## 3PO

2.0.4 behebt den Fehler nicht.

Was mir aber aufgefallen ist, ist dass bei den Servern, bei denen es nicht funktioniert, eine Datei "fonts" in "/lib64/rc/console" mit 0 Byte angelegt wird, wenn "setfont -O /lib64/rc/console/font" aufgerufen wird.

Bei den Rechnern, wo es funktioniert, wird mit "setfont -O /lib64/rc/console/font" keine Datei angelegt.

----------

