Linux am Dienstag: Programm für den 5. Oktober 2021

Einen verregneten Dienstag kann man nur durch den Sonnenschein am Abend aufwerten 😀

Linux am Dienstag: Programm für den 5. Oktober 2021

Ab 19 Uhr wenden wir uns wieder mal Themen aus der Linuxwelt zu. u.a. im Programm:

  • Vortrag – Wir bauen einen Tresor mit CryptSetup und SSHFS
  • UNICEF – Fedora zum öffentlichen Gut durch DPGA erklärt
  • Digitalisierung – Digitaler Führerschein floppt
  • Nachhaltigkeit – Atari1040ST seit 1986 im Einsatz
  • Sicherheitslücken – Chrome Exploits gehen in die nächste Runde

Außerdem im Programm „Manche Bugs sind nicht auszurotten: Eine Anwendung will Ressourcen freigeben, die gar nicht belegt sind.“ . Natürlich sind wieder Nachrichten aus aller IT-Welt dabei.

Wie jede Woche per Videokonferenz auf https://meet.cloud-foo.de/Linux .

Kleine Anmerkung: Die bisherigen Vorträge findet man jetzt unter https://linux-am-dienstag.de/archiv/ .

Bug: schließe Dateien, die Du gar nicht offen hast

Aus der Kategorie „Bugs, die Linux schrieb“ heute für Euch der nicht auszumerzende Fehler mit den MAX OPEN FILES.

Bug: schließe Dateien, die Du gar nicht offen hast

Wer von Euch schon ein Programm geschrieben hat, wird evtl. mal über den dezenten Hinweis des Programmierlehrers gestolpert sein, alle Ressourcen die man öffnet, auch wieder zu schließen. Obwohl es heute Garbage-Kollektoren gibt, die so etwas aufräumen, ist es nicht nur schlechter Stil, wenn man das nicht macht, sondern kann massive Probleme wie Memory Leaks verursachen.

Das Spiel geht aber auch anders herum, nämlich Ressourcen zu schließen, die gar nicht offen sind 😉 Und das hat unter Linux ganz massive Probleme zur Folge.

Hier ein Mitschnitt auf einem PC heute morgen:

[pid 25178] dup2(48, 0) = 0
[pid 25178] pipe([51, 52]) = 0
[pid 25178] close(51) = 0
[pid 25178] dup2(52, 1) = 1
[pid 25178] close(52) = 0
[pid 25178] dup2(1, 2) = 2
[pid 25178] getrlimit(RLIMIT_NOFILE, {rlim_cur=8*1024, rlim_max=8*1024}) = 0
[pid 25178] close(8191) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8190) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8189) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8188) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8187) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8186) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8185) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8184) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8183) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8182) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8181) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8180) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8179) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8178) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8177) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8176) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8175) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8174) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8173) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8172) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8171) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8170) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8169) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8168) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8167) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8166) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8165) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8164) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8163) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8162) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8161) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8160) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8159) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8158) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8157) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8156) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8155) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8154) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8153) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8152) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8151) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8150) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8149) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8148) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8147) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8146) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8145) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8144) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8143) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8142) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8141) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8140) = -1 EBADF (Bad file descriptor)
[pid 25178] close(8139) = -1 EBADF (Bad file descriptor)
… ja, das geht so bis 50, dann …
[pid 25178] close(19) = 0
[pid 25178] close(18) = 0
[pid 25178] close(17) = 0
[pid 25178] close(16) = 0
[pid 25178] close(15) = 0
[pid 25178] close(14) = 0
[pid 25178] close(13) = 0
[pid 25178] close(12) = 0
[pid 25178] close(11) = 0
[pid 25178] close(10) = 0
[pid 25178] close(9) = 0
[pid 25178] close(8) = 0
[pid 25178] close(7) = 0
[pid 25178] close(6) = 0
[pid 25178] close(5) = 0
[pid 25178] close(4) = 0
[pid 25178] close(3) = 0
[pid 25178] geteuid() = 110
[pid 25178] execve(„/sbin/unix_chkpwd“, [„/sbin/unix_chkpwd“, „XXXXXXXXXXXX“, „nonull“], [/* 0 vars */]) = 0
[pid 25178] brk(NULL) = 0x5574dbb77000
[pid 25178] fcntl(0, F_GETFD) = 0
[pid 25178] fcntl(1, F_GETFD) = 0
[pid 25178] fcntl(2, F_GETFD) = 0
[pid 25178] access(„/etc/suid-debug“, F_OK) = -1 ENOENT (No such file or directory)
[pid 25178] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcfc6241000
[pid 25178] access(„/etc/ld.so.preload“, R_OK) = -1 ENOENT (No such file or directory)
[pid 25178] open(„/etc/ld.so.cache“, O_RDONLY|O_CLOEXEC) = 3
[pid 25178] fstat(3, {st_mode=S_IFREG|0644, st_size=43265, …}) = 0
[pid 25178] mmap(NULL, 43265, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcfc6236000
[pid 25178] close(3) = 0

Wie man an dem Mitschnitt ( strace ) sehen kann, versucht der Prozess alle offenen Dateihandles, und Sockets gehören da auch dazu, von 8191 bis 3 zu beenden, und bekommt dabei einen Fehler. Die relevante Stelle:

[pid 25178] getrlimit(RLIMIT_NOFILE, {rlim_cur=8*1024, rlim_max=8*1024}) = 0
[pid 25178] close(8191) = -1 EBADF (Bad file descriptor)

8*1024 ist 8192, also 8191+1 bzw. 0…8191 => 8192 Handles . RLIMIT_NOFILE ist die maximale Anzahl an offenen Dateien, die ein Prozess auf diesem System haben darf. Je nach Systemeinstellungen können das auch mal mehr oder weniger sein.

Wie man also leicht erkennen kann, werden alle 8141 Filehandles mit einem Fehler geschlossen: „-1 EBADF (Bad file descriptor)„, weil sie nicht offen waren. Schrieb ich 8141? ja, weil ab Filehandle 50 tatsächlich offene Filehandles geschlossen werden. Es wurden also von dem Prozess genau 51 Dateien (0..50) dauerhaft offen gehalten.

Das Schließen von Dateien die nicht offen sind, verursacht eine ungeheure Last, weil natürlich von einem Fehler ausgegangen wird. Die genutzten Systembibliotheken tun alles um diesen Fehler auszumerzen und verbrauchen dabei richtig viel Last. Das wiederum ist kein Fehler des Programms selbst, sondern der benutzten „Lib“ ( englische Kurzform von Bibliothek ).

Die Folge

Die Folge der Aktion war, daß der Prozess bei 156% CPU Verbrauch lag, was auf einem 8 Kerner an sich kein Problem ist, aber leider dabei soooooviel Behinderung der Lib( s.u. ) erzeugte, daß „top -c“ über 6 Sekunden brauchte zu starten.

Wenn Top das schon so behindert, könnt Ihr Euch denken, was das mit einem Fileserver macht: „System geht nur noch eingeschränkt zu nutzen.“

Mehr Infos

Wer sich den Bug aus der Nähe ansehen möchte, findet hier eine Version des Fehlers bei ClamAV und Fedora:

https://bugzilla.redhat.com/show_bug.cgi?id=1852460

Wie Ihr am Datum des Bugreports sehen könnt, gibt es diese Bugs nicht erst seit gestern. Allerdings sind sie in aktuellen Distros, die kein LTS sind (so wie das System von dem der obige strace stammt), bereits ausgemerzt worden.

Falls Euch aber mal so ein Fehler über den Weg laufen sollte, dann könnt Ihr den so temporär beheben:

1. mit „strace -f -p PID“ den Prozess belauschen lassen.
2. bei der close() Orgie darauf achten, ab welchem Filehandle ( oben war es „50“ ) die Orgie aufhört.
3. mit „ulimit -n {ermittelte Zahl+30}; /pfad/zum/programm {optionen}“ den Prozess neustarten.

Den Schritt 3 kann man auch anders organisieren, je nach dem ob es ein Systemd Start ist, könnte man das neue FilesOpenLimit im Unitfile setzen und so dafür sorgen, daß der Bug nicht so starke Auswirkungen hat. In dem Punkt müßt Ihr etwas flexibel sein, wie das bei Euch konkret am Besten geht.

Fedora Linux von UNICEF/DPGA als Öffentliches Gut anerkannt

Am 26. August 2021 wurde Fedora Linux von der UNICEF Ausgründung „Digital Public Goods Alliance“(DPGA) als Öffentliches Gut anerkannt.

Fedora Linux von UNICEF/DPGA als Öffentliches Gut anerkannt

An dieser Stelle ein herzliches Dankeschön an alle die derzeit am Fedora Projekt mitarbeiten oder früher mitgewirkt haben: Ihr seid großartig \o/

Die Digital Public Goods Alliance ist eine Ausgründung der UN, die maßgeblich von der Regierung von Norwegen und der UNICEF unterstützt wurde.

Der Anerkennungsprozess wurde zwar nicht gerade öffentlichkeitswirksam durchgeführt, trotzdem ist er dem einen oder anderen doch aufgefallen 😉 Ich sollte vielleicht öfter mal im Fedora Magazin lesen, was die Kollegen da so schreiben 🙂

Das Anerkennungsverfahren wird mit einem Online Fragebogen gestartet, in dem z.B. die Liste der Länder enthalten ist, die das Gut nutzen, in diesem Fall konnte vom Fedoraprojekt diese Liste bereitgestellt werden:

AD: Andorra
AE: United Arab Emirates
AF: Afghanistan
AG: Antigua and Barbuda
AI: Anguilla
AL: Albania
AM: Armenia
AO: Angola
AQ: Antarctica
AR: Argentina
AS: American Samoa
AT: Austria
AU: Australia
AW: Aruba
AX: Åland Islands
AZ: Azerbaijan
BA: Bosnia and Herzegovina
BB: Barbados
BD: Bangladesh
BE: Belgium
BF: Burkina Faso
BG: Bulgaria
BH: Bahrain
BI: Burundi
BJ: Benin
BL: Saint Barthélemy
BM: Bermuda
BN: Brunei Darussalam
BO: Bolivia, Plurinational State of
BQ: Bonaire, Sint Eustatius and Saba
BR: Brazil
BS: Bahamas
BT: Bhutan
BW: Botswana
BY: Belarus
BZ: Belize
CA: Canada
CC: Cocos (Keeling) Islands
CD: Congo, the Democratic Republic of the
CF: Central African Republic
CG: Congo
CH: Switzerland
CI: Côte d'Ivoire
CK: Cook Islands
CL: Chile
CM: Cameroon
CN: China
CO: Colombia
CR: Costa Rica
CV: Cape Verde
CW: Curaçao
CX: Christmas Island
CY: Cyprus
CZ: Czech Republic
DE: Germany
DJ: Djibouti
DK: Denmark
DM: Dominica
DO: Dominican Republic
DZ: Algeria
EC: Ecuador
EE: Estonia
EG: Egypt
EH: Western Sahara
ER: Eritrea
ES: Spain
ET: Ethiopia
FI: Finland
FJ: Fiji
FK: Falkland Islands (Malvinas)
FM: Micronesia, Federated States of
FO: Faroe Islands
FR: France
GA: Gabon
GB: United Kingdom
GD: Grenada
GE: Georgia
GF: French Guiana
GG: Guernsey
GH: Ghana
GI: Gibraltar
GL: Greenland
GM: Gambia
GN: Guinea
GP: Guadeloupe
GQ: Equatorial Guinea
GR: Greece
GS: South Georgia and the South Sandwich Islands
GT: Guatemala
GU: Guam
GW: Guinea-Bissau
GY: Guyana
HK: Hong Kong
HN: Honduras
HR: Croatia
HT: Haiti
HU: Hungary
ID: Indonesia
IE: Ireland
IL: Israel
IM: Isle of Man
IN: India
IO: British Indian Ocean Territory
IQ: Iraq
IS: Iceland
IT: Italy
JE: Jersey
JM: Jamaica
JO: Jordan
JP: Japan
KE: Kenya
KG: Kyrgyzstan
KH: Cambodia
KI: Kiribati
KM: Comoros
KN: Saint Kitts and Nevis
KR: Korea, Republic of
KW: Kuwait
KY: Cayman Islands
KZ: Kazakhstan
LA: Lao People's Democratic Republic
LB: Lebanon
LC: Saint Lucia
LI: Liechtenstein
LK: Sri Lanka
LR: Liberia
LS: Lesotho
LT: Lithuania
LU: Luxembourg
LV: Latvia
LY: Libya
MA: Morocco
MC: Monaco
MD: Moldova, Republic of
ME: Montenegro
MF: Saint Martin (French part)
MG: Madagascar
MH: Marshall Islands
MK: Macedonia, the Former Yugoslav Republic of
ML: Mali
MM: Myanmar
MN: Mongolia
MO: Macao
MP: Northern Mariana Islands
MQ: Martinique
MR: Mauritania
MS: Montserrat
MT: Malta
MU: Mauritius
MV: Maldives
MW: Malawi
MX: Mexico
MY: Malaysia
MZ: Mozambique
NA: Namibia
NC: New Caledonia
NE: Niger
NF: Norfolk Island
NG: Nigeria
NI: Nicaragua
NL: Netherlands
NO: Norway
NP: Nepal
NR: Nauru
NU: Niue
NZ: New Zealand
OM: Oman
PA: Panama
PE: Peru
PF: French Polynesia
PG: Papua New Guinea
PH: Philippines
PK: Pakistan
PL: Poland
PM: Saint Pierre and Miquelon
PN: Pitcairn
PR: Puerto Rico
PS: Palestine, State of
PT: Portugal
PW: Palau
PY: Paraguay
QA: Qatar
RE: Réunion
RO: Romania
RS: Serbia
RU: Russian Federation
RW: Rwanda
SA: Saudi Arabia
SB: Solomon Islands
SC: Seychelles
SE: Sweden
SG: Singapore
SH: Saint Helena, Ascension and Tristan da Cunha
SI: Slovenia
SJ: Svalbard and Jan Mayen
SK: Slovakia
SL: Sierra Leone
SM: San Marino
SN: Senegal
SO: Somalia
SR: Suriname
SS: South Sudan
ST: Sao Tome and Principe
SV: El Salvador
SX: Sint Maarten (Dutch part)
SZ: Swaziland
TC: Turks and Caicos Islands
TD: Chad
TF: French Southern Territories
TG: Togo
TH: Thailand
TJ: Tajikistan
TK: Tokelau
TL: Timor-Leste
TM: Turkmenistan
TN: Tunisia
TO: Tonga
TR: Turkey
TT: Trinidad and Tobago
TV: Tuvalu
TW: Taiwan, Province of China
TZ: Tanzania, United Republic of
UA: Ukraine
UG: Uganda
US: United States
UY: Uruguay
UZ: Uzbekistan
VA: Holy See (Vatican City State)
VC: Saint Vincent and the Grenadines
VE: Venezuela, Bolivarian Republic of
VG: Virgin Islands, British
VI: Virgin Islands, U.S.
VN: Viet Nam
VU: Vanuatu
WF: Wallis and Futuna
WS: Samoa
XK: Kosovo
YE: Yemen
YT: Mayotte
ZA: South Africa
ZM: Zambia
ZW: Zimbabwe

Wobei für diese Länder so wenig Aktivität ist, daß es nur vereinzelte Nutzer geben wird:

CX: Christmas Island
EH: Western Sahara
GS: South Georgia and the South Sandwich Islands
NU: NiueVerwaltungsliste
PN: Pitcairn
SH: Saint Helena, Ascension and Tristan da Cunha
SJ: Svalbard and Jan Mayen
TF: French Southern Territories
TK: Tokelau

Natürlich werden da auch Fragen zu Nutzungslizenzen, Datenschutz und Datensammlungen gestellt. Wer in die Umfangreiche Liste hineinsehen möchte, der kann das -> hier <- tun.

Das Validierungsverfahren der Nominierung wird dann auf Github öffentlich durchgeführt. Ist das erfolgreich abgeschlossen, erfolgt ein weiteres Hauptverfahren, daß dann zum Eintrag in die Verwaltungsliste führt.

Am 26.August war es dann soweit, Fedora Linux wurde als Öffentliches Gut durch die DPGA anerkannt. Nochmals Danke an alle, die das möglich gemacht haben.

Referenzen:

Fedora Linux earns recognition from the Digital Public Goods Alliance as a DPG!

Request Form: https://digitalpublicgoods.net/registry/fedora-linux.html

Nominierung: https://github.com/unicef/publicgoods-candidates/pull/633

Anerkennung: https://github.com/unicef/publicgoods-candidates/pull/634