Kernel-Log – Was 3.7 bringt (3): Infrastruktur
Linux 3.7 kann anhand von Signaturen die Unversehrtheit von Kernel-Modulen prüfen. Die neue Integrity Appraisal Extension verspricht Schadsoftware zu erkennen. Der Kernel lädt Firmwaredateien jetzt ohne Udev und erhielt für Container wichtige Verbesserungen.
- Thorsten Leemhuis
Linux 3.7 kann Kernel-Module signieren und die Signatur vor dem Laden prüfen, um ihre Unversehrtheit sicherzustellen (u. a. 1, 2, 3, 4, 5, 6, 7). Einige Unternehmensdistributionen nutzen solch eine Funktion schon länger – unter anderem, um bei der Fehlersuche sicherzustellen, dass die vom Anwender verwendeten Module auch vom Distributionskernel stammen. Einige Entwickler haben sich jetzt verstärkt um eine Integration der Funktion in den offiziellen Linux-Kernel bemüht, weil einige Distributionen beim Booten per UEFI Secure Boot nur signierte Kernel-Module laden wollen, was mit dem jetzt integrierten Code möglich ist.
Neu ist auch die Integrity Appraisal Extension für die schon länger im Kernel unterstützte Integrity Measurement Architecture (IMA) (u. a, 1, 2). Schon jetzt kann der Linux-Kernel einen signierten Hash von Dateien erstellen und als erweitertes Attribut im Dateisystem speichern, um darüber die Integrität etwa von Binaries zu prüfen. Die Integrity Appraisal Extension sorgt jetzt dafür, dass der Kernel beim Zugriff auf eine Datei deren Integrität prüft und den Zugriff verweigert, wenn die Datei zwischenzeitlich verändert wurde. Das Verhalten des Appraisal-Mechanismus lässt sich über einen Bootparameter konfigurieren.
Um die dafür nötigen Prüfdaten sicher abzulegen, kann die Erweiterung ein Trusted Platform Module (TPM) nutzen; die Unterstützung dafür haben die Kernel-Entwickler parallel weiter ausgebaut (u. a. 1, 2).
Eigeninitiative
Der Kernel kann Firmwaredateien nun selbst im Dateisystem finden und laden und ist dafür nicht mehr auf Udev angewiesen (1, 2). Diese Neuerung ist Folge einer zuvor vorgenommenen Änderungen am Firmware-Handling von Udev, die in einem bestimmten Fall Verzögerungen beim Systemstart nach sich zog. Dies Verhalten führte zu einer längeren Diskussion, in der Linus Torvalds die Udev-Entwickler deutlich kritisierte – das führte nicht nur zur Entwicklung des Kernel-eigenen Firmware-Loaders, sondern war auch einer der Gründe für den Udev-Fork Eudev.
Udev-Maintainer Kay Sievers hatte bereits vor Umsetzung der Kernel-Änderung erklärt, er fände es gut, wenn der Kernel Firmwaredateien selbst laden könne; gegenüber heise open erläuterte er, dieser Weg sei einfacher und deutlich verlässlicher als die Handhabung durch Udev im Userspace. Eine mittlerweile in Udev eingeflossene Änderung behebt die Verzögerung beim Laden durch Udev ebenfalls.
Abschottung
Eric W. Biederman hat eine größere Patch-Sammlung eingebracht, welche die Unterstützung für Namespaces verbessert (u. a. 1, 2, 3, 4). Das ist für eine striktere Trennung von User- und Gruppen-IDs zwischen Host und Containern wichtig. Die Anpassungen setzen auf den "User Namespace Enhancements" auf, die Biederman zu Linux 3.5 beigesteuert hat und die er damals als Kurskorrektur für User Namespaces bezeichnete.
Durch die jetzigen Änderungen sei nun alles auf den neuen Ansatz angepasst, wenn man von den komplexeren Dateisystemen absehe; dazu zählten CIFS, NFS, OCFS2 und XFS. Die Anpassungen für diese Dateisysteme sind in Entwicklung und folgen vielleicht bei Linux 3.8. Biederman hat noch eine weitere Patch-Sammlung in Vorbereitung, welche die größeren Umbauten am Namespace-Code abschließen soll; durch sie soll die neue Infrastruktur dann komplett sein, sodass User einen Namespace anlegen und nutzen können.
Ressourcenmanagement
Die unter anderem für Container genutzte Cgroups-Infrastuktur warnt jetzt, wenn der Anwender innerhalb einer Control Group eine verschachtelt Hierarchie anlegt, der verwendete Controller dieses Nesting aber nicht sauber unterstützt. Letzteres ist eines von vielen Problemen im Cgroup-Code, deren mittelfristige Beseitigung Cgroup-Betreuer Tejun Heo derzeit vorantreibt. Neu ist auch Unterstützung für Erweiterte Attribute im virtuellen Cgroup-Dateisystem (1, 2) – eine Funktion, die Systemd-Entwickler Lennart Poettering auf die "Plumber's wish list" gesetzt hatte, um Metadaten für Hintergrunddienste speichern zu können.
Verschiedenes
Linus Torvalds hat eigenhändig die Datei Documentation/feature-removal.txt entfernt, in der zuvor die Entfernung von Kernel-Features angekündigt wurde. Torvalds bezeichnet sie im Commit-Kommentar als idiotisch: Wenn niemand ein Feature benutze, dann könne man es direkt entfernen; wenn das nicht der Fall sei, dann gäbe es keinen Grund, etwas zu entfernen.
Der Make-Target, um bei der Kernel-Konfiguration die Standardvorgabe für alle bislang nicht gesetzten Konfigurationsoptionen zu setzen, heißt nun "olddefconfig" – laut dem Entwickler der Änderung hat der bisher für diese Funktion verwendete Target-Name "oldnoconfig" Anwender verwirrt, weil er nicht das umsetzt, worauf der Name hindeutet.
Die Sicherheitserweiterung Yama lässt sich jetzt zusammen mit anderen Linux Security Modules verwenden, um die Yama-Schutzfunktionen etwa mit jenen von SELinux zu kombinieren.
Durch Änderungen beim koordinierten Datenzugriff mit Hilfe von RCU (Read Copy Update) tauchen in der Prozessliste nun Kernel-Threads wie rcu_sched, rcu_preempt oder rcu_bh auf, die laut Programmen wie ps oder top auf manchen Systemen recht viel CPU-Zeit verbrauchen. Diese Prozessorzeit hat der RCU-Code auch schon vorher verbraucht – sie wurden allerdings dem Kernel-Thread ksoftirqd zugeordnert. Das und einige weitere Hintergründe zu Änderungen am RCU-Code erläutert dessen Maintainer Paul McKenney in einem LWN.net-Artikel.
Für Kernel-Hacker relevantes
Der Kernel bindet das typischerweise unter /debug/ oder /sys/kernel/debug/ eingehängte Debugfs standardmäßig mit 0700-Rechten ein, damit normalerweise nur noch der Root-Anwender dort lesen kann.
Zum Kernel stieß eine generische Implementation einer einfachen Hash Table. Sie soll bei späteren Kernel-Versionen eine Reihe anderer Implementierungen ersetzen, die in verschiedenen Subsystemen des Kernels entstanden sind und so bislang unabhängig voneinander ganz ähnliche Funktionen erledigten.
Workqueues sind jetzt standardmäßig non-reentrant, sodass der gleiche Code nicht mehr gleichzeitig auf mehreren Prozessoren läuft. Die parallele Ausführung von Workqueues war vielen Entwicklern nicht bewusst, sodass dieser Code häufig nicht wie erwartet funktionierte.
Die Kernel-Entwickler haben begonnen, von Userland-Software verwendete Header-Dateien mit Datentypen-Definitionen in "uapi" genannte Verzeichnisse zu verlagern, die unterhalb von include/ und arch/<arch>/include/ liegen (u. a. 1, 2, 3). Das soll die Unterscheidung von den Kernel-intern genutzten Definitionen erleichtern und einige Probleme beim Einbinden von Header-Dateien aus der Welt schaffen. Diese Umstrukturierung ist einer der Hauptgründe, warum ein Diffstat beim Vergleich mit Linux 3.6 so viele Änderungen ausweist.
Die kleinen Perlen
Die kleinen Perlen
Die folgenden Links führen zu einigen kleineren, aber keineswegs unbedeutenden Änderungen:
- [
] alarmtimer: Implement minimum alarm interval for allowing suspend - [
1] audit: Add typespecific uid and gid comparators - [
] audit: optimize audit_compare_dname_path - [
] bitops: introduce generic {clear,set}_bit_le() - [
] cgroup: Remove CGROUP_BUILTIN_SUBSYS_COUNT - [
] coccicheck: Add the rep+ctxt mode - [
D] CodingStyle: add networking specific block comment style - [
C] CONFIG_HOTPLUG should be always on - [
] coredump: add a new elf note with siginfo of the signal - [
D] coredump: add support for %d=__get_dumpable() in core name - [
C] coredump: make core dump functionality optional - [
D] doc: aliasing-test: close fd on write error - [
D] doc: getdelays.c: remember to close() socket on error in create_nl_socket() - [
D] Documentation: Fix "struct kobj_type" to include newer members. - [
C N] efi: Fix the ACPI BGRT driver for images located in EFI boot services memory - [
C N1] extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices - [
] genalloc: make it possible to use a custom allocation algorithm - [
N] hashtable: introduce a small and naive hashtable - [
] kbuild: Do not package /boot and /lib in make tar-pkg - [
] Kbuild: use normal compression settings for tar*-pkg - [
C] Kconfig: clean up the "#if defined(arch)" list for exception-trace sysctl entry - [
C] Kconfig: clean up the long arch list for the DEBUG_KMEMLEAK config option - [
] kconfig: document oldnoconfig to what it really does in conf.c - [
D 3] KEYS: Add payload preparsing opportunity prior to key instantiate or update - [
N] KEYS: Asymmetric key pluggable data parsers - [
C N] KEYS: Asymmetric public-key algorithm crypto key subtype - [
DN1] KEYS: Document asymmetric key type - [
C N1] KEYS: Implement asymmetric key type - [
N] KEYS: Provide signature verification with an asymmetric key - [
] lib: vsprintf: optimize division by 10000 - [
] lib: vsprintf: optimize division by 10 for small integers - [
] lib: vsprintf: optimize put_dec_trunc8() - [
D] lib/vsprintf: update documentation to cover all of %p[Mm][FR] - [
] localmodconfig: Document localmodconfig in README - [
C 3] Make most arch asm/module.h files use asm-generic/module.h - [
D 1] memcg: trivial fixes for Documentation/cgroups/memory.txt - [
] memory-hotplug: preparation to notify memory block's state at memory hot remove - [
] memory.txt: remove stray information - [
1] menuconfig: Add jump keys to search results - [
] menuconfig: Extend dialog_textbox so that it can exit on arbitrary keypresses - [
] menuconfig: Extend dialog_textbox so that it can return to a scrolled position - [
C] mm: add CONFIG_DEBUG_VM_RB build option - [
1] mm anon rmap: replace same_anon_vma linked list with an interval tree. - [
1] mm: compaction: cache if a pageblock was scanned and no pages were isolated - [
1] mm: compaction: capture a suitable high-order page immediately when it is made available - [
C] mm: enable CONFIG_COMPACTION by default - [
D] mm/frontswap: cleanup doc and comment error - [
N2] mm: interval tree updates - [
1] mm: kill vma flag VM_CAN_NONLINEAR - [
D 4] mm: kill vma flag VM_RESERVED and mm->reserved_vm counter - [
2] mm: move all mmu notifier invocations to be done outside the PT lock - [
D] mm, oom: reintroduce /proc/pid/oom_adj - [
D] mm: remove vma arg from page_evictable - [
N4] mm: replace vma prio_tree with an interval tree - [
] mm, sl[au]b: Taint kernel when we detect a corrupted slab - [
] MODSIGN: Add FIPS policy - [
C] MODSIGN: Implement module signature checking - [
9] netlink: Rename pid to portid to avoid confusion - [
] nohz: Fix idle ticks in cpu summary line of /proc/stat - [
D 1] oom: remove deprecated oom_adj - [
] percpu-rw-semaphores: use light/heavy barriers - [
] percpu-rw-semaphores: use rcu_read_lock_sched - [
C D 2] prio_tree: remove - [
C N1] rbtree: add prio tree and interval tree tests - [
D 1] rbtree: faster augmented rbtree manipulation - [
] rbtree: low level optimizations in rb_erase() - [
] rbtree: low level optimizations in rb_insert_color() - [
DN2] rbtree: move augmented rbtree functionality to rbtree_augmented.h - [
] rbtree: optimize fetching of sibling node - [
C N] rbtree: performance and correctness test - [
] rbtree: remove prior augmented rbtree implementation - [
C] rcu: Add PROVE_RCU_DELAY to provoke difficult races - [
D] rcu: Adjust debugfs tracing for kthread-based quiescent-state forcing - [
C] rcu: Advise most users not to enable RCU user mode - [
D] rcu: Control grace-period duration from sysfs - [
D] rcu: Document SRCU dead-CPU capabilities, emphasize read-side limits - [
D] rcu: Fix CONFIG_RCU_FAST_NO_HZ stall warning message - [
C] rcu: Settle config for userspace extended quiescent state - [
C] rcu: Userspace RCU extended QS selftest - [
1] rcu: Use smp_hotplug_thread facility for RCUs per-CPU kthread - [
D] remoteproc: add rproc_report_crash function to notify rproc crashes - [
C N1] remoteproc: Add STE modem driver - [
C N] RSA: Implement signature verification algorithm [PKCS#1 / RFC3447] - [
] sched: Document schedule() entry points - [
D] sched: Remove __ARCH_WANT_INTERRUPTS_ON_CTXSW - [
] scripts/coccinelle: ptr_ret: Add ternary operator version - [
1] scripts/kernel-doc: added support for html5 - [
N1] smpboot: Provide infrastructure for percpu hotplug threads - [
C] thp, x86: introduce HAVE_ARCH_TRANSPARENT_HUGEPAGE - [
C] time: Convert CONFIG_GENERIC_TIME_VSYSCALL to CONFIG_GENERIC_TIME_VSYSCALL_OLD - [
C] time: Convert x86_64 to using new update_vsyscall - [
C] time: Introduce new GENERIC_TIME_VSYSCALL - [
1] UAPI: Plumb the UAPI Kbuilds into the user header installation and checking - [
9] UAPI: (Scripted) Convert #include "..." to #include <path/...> in drivers/gpu/ - [
8] UAPI: (Scripted) Convert #include "..." to #include <path/...> in kernel system headers - [
N4] UAPI: (Scripted) Disintegrate arch/arm/include/asm - [
N] UAPI: (Scripted) Disintegrate arch/openrisc/include/asm - [
N7] UAPI: (Scripted) Disintegrate include/asm-generic - [
N1] UAPI: (Scripted) Set up UAPI Kbuild files - [
N1] userns: Add kprojid_t and associated infrastructure in projid.h - [
C] userns: Add user namespace support to IMA - [
C] userns: Allow the usernamespace support to build after the removal of usbfs - [
C] userns: Allow USER_NS and NET simultaneously in Kconfig - [
C] userns: Convert adfs to use kuid and kgid where appropriate - [
C] userns: Convert affs to use kuid/kgid wherwe appropriate - [
C] userns: Convert apparmor to use kuid and kgid where appropriate - [
C] userns: Convert audit to work with user namespaces enabled - [
C] userns: Convert befs to use kuid/kgid where appropriate - [
C] userns: Convert bfs to use kuid/kgid where appropriate - [
C] userns: Convert binder ipc to use kuids - [
C] userns: Convert bsd process accounting to use kuid and kgid where appropriate - [
C] userns: Convert btrfs to use kuid/kgid where appropriate - [
C] userns: Convert cls_flow to work with user namespaces enabled - [
C] userns: Convert configfs to use kuid and kgid where appropriate - [
C] userns: Convert cramfs to use kuid/kgid where appropriate - [
C] userns: Convert debugfs to use kuid/kgid where appropriate. - [
C] userns: Convert devtmpfs to use GLOBAL_ROOT_UID and GLOBAL_ROOT_GID - [
C] userns: Convert drm to use kuid and kgid and struct pid where appropriate - [
C] userns: Convert ecryptfs to use kuid/kgid where appropriate - [
C] userns: Convert efs to use kuid/kgid where appropriate - [
C] userns: Convert EVM to deal with kuids and kgids in it's hmac computation - [
C] userns: Convert exofs to use kuid/kgid where appropriate - [
C] userns: Convert extN to support kuids and kgids in posix acls - [
C] userns: Convert fat to use kuid/kgid where appropriate - [
C] userns: Convert freevxfs to use kuid/kgid where appropriate - [
C] userns: Convert gadgetfs to use kuid and kgid where appropriate - [
C] userns: Convert hfsplus to use kuid and kgid where appropriate - [
C] userns: Convert hfs to use kuid and kgid where appropriate - [
C] userns: Convert hostfs to use kuid and kgid where appropriate - [
C] userns: Convert hpfs to use kuid and kgid where appropriate - [
C] userns: Convert hugetlbfs to use kuid/kgid where appropriate - [
C] userns: Convert ipathfs to use GLOBAL_ROOT_UID and GLOBAL_ROOT_GID - [
C] userns: Convert ipc to use kuid and kgid where appropriate - [
C] userns: Convert isofs to use kuid/kgid where appropriate - [
C] userns: Convert jffs2 to use kuid and kgid where appropriate - [
C] userns: Convert jfs to use kuid/kgid where appropriate - [
C] userns: Convert logfs to use kuid/kgid where appropriate - [
C] userns: Convert loop to use kuid_t instead of uid_t - [
C] userns: Convert minix to use kuid/kgid where appropriate - [
C] userns: Convert net/ax25 to use kuid_t where appropriate - [
C] userns: Convert nillfs2 to use kuid/kgid where appropriate - [
C] userns: Convert ntfs to use kuid and kgid where appropriate - [
C] userns: Convert omfs to use kuid and kgid where appropriate - [
C] userns: Convert process event connector to handle kuids and kgids - [
C] userns: Convert quota - [
C] userns: Convert quota netlink aka quota_send_warning - [
C 1] userns: Convert qutoactl - [
C] userns: Convert reiserfs to use kuid and kgid where appropriate - [
C 1] userns: Convert security/keys to the new userns infrastructure - [
C] userns: Convert squashfs to use kuid/kgid where appropriate - [
C] userns: Convert taskstats to handle the user and pid namespaces. - [
2] userns: Convert the audit loginuid to be a kuid - [
C] userns: Convert the qnx4 filesystem to use kuid/kgid where appropriate - [
C] userns: Convert the qnx6 filesystem to use kuid/kgid where appropriate - [
C] userns: Convert the sysv filesystem to use kuid/kgid where appropriate - [
C] userns: Convert the udf filesystem to use kuid/kgid where appropriate - [
C] userns: Convert the ufs filesystem to use kuid/kgid where appropriate - [
C] userns: Convert tomoyo to use kuid and kgid where appropriate - [
C] userns: Convert tun/tap to use kuid and kgid where appropriate - [
C] userns: Convert ubifs to use kuid/kgid - [
C] userns: Convert usb functionfs to use kuid/kgid where appropriate - [
C] userns: Convert xenfs to use kuid and kgid where appropriate - [
C] userns: Convert xt_LOG to print socket kuids and kgids as uids and gids - [
C] userns: Enable building of pf_key sockets when user namespace support is enabled. - [
C] userns: Make credential debugging user namespace safe. - [
C] userns: Make the airo wireless driver use kuids for proc uids and gids - [
C] userns: net: Call key_alloc with GLOBAL_ROOT_UID, GLOBAL_ROOT_GID instead of 0, 0 - [
C] userns: nfnetlink_log: Report socket uids in the log sockets user namespace - [
C 1] userns: Print out socket uids in a user namespace aware fashion. - [
C] userns: Teach inet_diag to work with user namespaces - [
C] userns: Teach trace to use from_kuid - [
C] userns: xt_owner: Add basic user namespace support. - [
C] userns xt_recent: Specify the owner/group of ip_list_perms in the initial user namespace - [
C N2] X.509: Add a crypto key parser for binary (DER) X.509 certificates - [
N1] X.509: Add an ASN.1 decoder - [
C N4] X.509: Add simple ASN.1 grammar compiler - [
C N1] X.509: Implement simple static OID registry - [
N1] x86: Exception hooks for userspace RCU extended QS
Ein "C" im Bereich "[ ]" kennzeichnet Commits mit Änderungen an Kconfig-Dateien, welche die Konfigurationsoptionen samt der zugehörigen Hilfetexte enthalten. Mit "I" ausgezeichneten Patches rüsten neue PCI- oder USB-IDs nach; jene mit "D" verändern die dem Kernel beiliegende Dokumentation; Commits mit "N" legen neue Dateien an. Die Zahl vermittelt einen groben Eindruck zur Größe des Patches: Eine "1" kennzeichnet Patches, die inklusive Kommentar zwischen 10 und 20 KByte groß sind; Patches mit einer "9" sind 90 KByte oder größer.
Die "Was Linux 3.7 bringt"-Serie
Das Kernel-Log kann bereits jetzt einen Überblick über die wichtigsten Neuerungen der Anfang Dezember erwarteten Linux-Version 3.6 geben, da alle größeren Neuerungen bereits in den ersten beiden Entwicklungswochen integriert wurden; Linux 3.7 befindet sich seit dem in der Stabilisierungsphase, in der die Kernel-Hacker nur selten größeren Änderungen vornehmen.
Über einige der Neuerungen von Linux 3.7 hat das Kernel-Log bereits im Rahmen der Artikelserie "Was 3.7 bringt" berichtet:
In den kommenden Wochen werden noch Artikel erscheinen, die sich mit Infrastruktur, Architektur-Unterstützung und Treibern beschäftigen.
Weitere Hintergründe und Informationen rund um Entwicklungen im Linux-Kernel und dessen Umfeld finden sich in den vorangegangenen Kernel-Logs auf heise open. Neue Ausgaben des Kernel-Logs werden auf den Identi.ca- und Twitter-Konten "@kernellog" erwähnt; die englischen, bei den Kollegen von "The H" erscheinenden Übersetzungen auf den Identi.ca- und Twitter-Konten "@kernellog2". Gelegentlich zwitschert der Autor des Kernel-Logs unabhängig davon über einige Kernel-Log-Themen bei Identi.ca und Twitter als "@kernellogauthor". (thl) (thl)