Linux kernel hacking: real-time backup con i kernel tracepoints

I tracepoint (Documentation/trace/tracepoints.txt) sono degli hook “lightweight” che possono essere piazzati in determinati punti nel codice del kernel per registrare l’occorrenza di determinati eventi.

Un tracepoint definisce automaticamente la “probe function” che potrà essere piazzata in punti desiderati all’interno del codice del kernel (instrumentation).

Ogni volta che l’esecuzione passa da tali punti la “probe function” viene invocata e l’infrastruttura di tracing provvede a salvare il contesto dell’evento e le informazioni desiderate all’interno di un tracing buffer. Il tracing buffer sarà poi accessibile dallo userspace tramite il debugfs (/sys/kernel/debug/tracing/trace).

I kernel tracepoint sono utilizzati tipicamente come strumento di debug per tracciare in tempo reale l’occorrenza di particolari eventi, raccogliere statistiche, ecc.

In questo articolo vedremo un utilizzo dei tracepoint un po’ diverso dal solito e sfrutteremo la capacità di tracking in tempo reale e la leggerezza dell’infrastruttura dei tracepoint per realizzare un sistema di notifiche efficace e soprattutto a basso overhead.

[Read more…]

Linux kernel hacking: contenitori di processi/2

Nell’articolo precedente abbiamo analizzato i concetti base dei Linux cgroup. Abbiamo visto un esempio pratico di come lo scheduler CFS possa attuare una distribuzione equa della risorsa CPU tra i vari cgroup. Infine, abbiamo realizzato un cgroup subsystem molto semplice (il noop-cgroup), sfruttando solamente la funzionalità di raggruppamento dei processi.

In questa seconda parte analizzeremo più in dettaglio l’aspetto di programmazione in kernel space, realizzando un cgroup subsystem un po’ più avanzato, interfacciandoci anche con un’altra parte del kernel: le system call.

[Read more…]

Linux kernel hacking: contenitori di processi/1

Dalla versione 2.6.24, il kernel Linux mette a disposizione un framework denominato Control Groups (o cgroups) che permette di creare veri e propri contenitori di processi.

Ad ogni contenitore possono essere associate determinate configurazioni che permettono di definire ad esempio il tracciamento e/o il controllo sull’utilizzo di determinate risorse.

L’infrastruttura dei cgroup mette a disposizione solo le funzionalità di raggruppamento dei task, sono poi i vari cgroup subsystem che implementano le particolari politiche di controllo per ciascuna risorsa: come ad esempio la CPU, la banda di I/O, la memoria, i permessi di accesso a determinati device, eccetera.

[Read more…]