OpenRC

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page OpenRC and the translation is 98% complete.
Outdated translations are marked like this.
Resources
Article status
This article has some todo items:
  • Revisionare per accuratezza e prove.
  • Completare per coprire l'utilizzo basico su Gentoo.
  • Revisionare per precisione, leggibilità, brevità...
  • La sezione sull' Integrazione con BusyBox richiede prove e documentazione (o rimozione).

OpenRC è un sistema d'init basato su dipendenze per sistemi simil-Unix che mantiene compatibilità con il sistema d'init di sistema, solitamente locato in /sbin/init. OpenRC è il sistema d'init nativo di Gentoo, tuttavia altri sono disponibili.

OpenRC avvia i servizi di sistema necessari nell'ordine corretto all'avvio, li gestisce mentre il sistema è in uso, e li termina allo spegnimento. Esso può gestire demoni installati dalla repository di Gentoo, può opzionalmente supervisionare i processi che avvia, ed ha la possibilità di avviare processi in parallelo - quando possibile - per ridurre i tempi d'avvio.

OpenRC è stato sviluppato per Gentoo, ma è progettato in modo tale da poter esser utilizzato su altre distribuzioni Linux e su sistemi BSD. Di predefinito, OpenRC è chiamato da sysvinit, su Gentoo.

Demoni installati esternamente dalla repository di Gentoo, es. software scaricato come codice sorgente e compilato manualmente, potrebbe alle volte richiedere di essere adattato per funzionare con OpenRC (che non sempre è complicato).

Nota
Vedi la sezione sulla documentazione di OpenRC per collegamenti alla documentazione dal progetto stesso di OpenRC. Vedi l'Handbook per informazioni su come OpenRC funziona con il sistema d'init.

Implementazione

OpenRC non richiede grandi e fondamentali cambiamenti sul sul sistema simil-Unix tradizionale. OpenRC si integra con altro software come un componente di un sistema modulare e flessibile. Esso è progettato per essere veloce, leggero, facilmente configurabile, ed adattabile. OpenRC ha solo alcune dipendenze basiche, su componenti chiave di sistema.

Come un sistema d'init moderno, OpenRC ha molte funzioni utili:

  • Supporto per cgroups.
  • Supervizione dei processi.
  • Avvio basato su dipendenze, con avvio dei servizi in parallelo.
  • Risoluzione e riordine automatico delle dipendenze.
  • Initscripts inizializzati dall'hardware.
  • Impostazione dei valori ulimit e nice per servizio attraverso la variabile rc_ulimit.
  • Permette script d'init complessi che avviano più componenti.
  • Architettura modulare, adatta all'infrastruttura preesistente.
  • OpenRC ha il suo opzionale sistema d'init chiamato openrc-init, vedi OpenRC/openrc-init per dettagli.
  • OpenRC ha il suo opzionale supervisore dei processi, vedi OpenRC/supervise-daemon per details.

Vedi l'articolo sulla comparazione d'init di sistema per ulteriori informazioni su di essi.

Installazione

Generalmente OpenRC non richiede un'installazione manuale, ed è messo a disposizione come componente di un profilo OpenRC all'installazione. Esso sarà presente nella stage 3 tarball, e sarà mantenuto tra gli aggiornamenti di sistema.

Opzioni USE

USE flags for sys-apps/openrc OpenRC manages the services, startup and shutdown of a host

+netifrc enable Gentoo's network stack (net.* scripts)
+sysvinit control the dependency on sysvinit (experimental)
audit Enable support for Linux audit subsystem using sys-process/audit
bash enable the use of bash in service scripts (experimental)
caps Use Linux capabilities library to control privilege
debug Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
newnet enable the new network stack (experimental)
pam Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip
s6 install s6-linux-init
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur
sysv-utils Install sysvinit compatibility scripts for halt, init, poweroff, reboot and shutdown
unicode Add support for Unicode

Se le opzioni USE sono modificate, il pacchetto potrebbe essere ricostruito per applicare i cambiamenti. Per i profili OpenRC, sys-apps/openrc viene come dipendenza di virtual/service-manager, e pertanto non dovrebbe mai essere aggiunto alla lista dei pacchetti selezionati (/var/lib/portage/world file) - l'opzione --oneshot evita di aggiungere OpenRC a questa lista.

root #emerge --ask --oneshot sys-apps/openrc

Configurazione

Files

/etc/rc.conf
Il file di configurazione globale di OpenRC.
Include commenti estensivi che ne documentano la configurazione.
/etc/conf.d
Contiene file di configurazione per initscript individuali.

Registro delle operazioni

OpenRC di predefinito non registra nulla. Per registrare l'output di OpenRC durante l'avvio, decommentare ed impostare l'opzione rc_logger in /etc/rc.conf. Il registro verrà salvato in /var/log/rc.log per impostazione predefinita.

FILE /etc/rc.conf
rc_logger="YES"
#rc_log_path="/var/log/rc.log"

Gestione della rete

OpenRC può essere usato in congiunzione con uno dei molti gestori di rete o anche da solo. Di predefinito, con i profili OpenRC di Gentoo, gli script netifrc sono utilizzati per gestire le connessioni di rete.

Vedi l'articolo sui gestori di rete per averne una lista di opzioni.

Comportamento delle dipendenze

Cambiare le dipendenze predefinite degli script d'init potrebbe essere necessario per accomodare configurazioni più complesse. Vedi /etc/rc.conf per sapere come modificare il comportamento predefinito; fare attenzione all'opzione rc_depend_strict. Inoltre, gli esempi di gestione di rete a seguire mostrano quanto può essere flessibile OpenRC.

Molteplici interfacce di rete (esempio)

Il service SSH deve avviarsi con la rete interna, per esempio eth0 e mai wlan0.

Sovrascrivere la dipendenza "net" da /etc/init.d/sshd, e farla dipendere su "net.eth0":

FILE /etc/conf.d/sshd
rc_need="!net net.eth0"
Molteplici interfacce di rete su multipli livelli d'esecuzione (runlevel) (esempio)

Il servizio SSH deve avviarsi con eth0 (non wlan0) nel livello "default", ma nel livello "office" deve avviarsi con wlan0 (non eth0).

Mantenere il predefinito:

FILE /etc/rc.conf
#rc_depend_strict="YES"

Creare collegamenti simbolici addizionali a sshd con i nomi delle interfacce di rete:

root #ln -s sshd /etc/init.d/sshd.eth0
root #ln -s sshd /etc/init.d/sshd.wlan0

Le impostazioni ora vengono lette da /etc/conf.d/sshd.eth0 e /etc/conf.d/sshd.wlan0:

root #cp /etc/conf.d/sshd /etc/conf.d/sshd.eth0
root #cp /etc/conf.d/sshd /etc/conf.d/sshd.wlan0

Aggiungere le dipendenze:

root #echo 'rc_need="!net net.eth0"' >> /etc/conf.d/sshd.eth0
root #echo 'rc_need="!net net.wlan0"' >> /etc/conf.d/sshd.wlan0

In questo esempio net.eth0 e net.wlan0 leggono le loro impostazioni da /etc/conf.d/net, o /etc/conf.d/net.office in base al livello attivo. Aggiungere tutti gli d'esecuzione (runscript) ai diversi livelli:

root #rc-update add sshd.eth0 default
root #rc-update add sshd.wlan0 office
root #rc-update add net.eth0 default office
root #rc-update add net.wlan0 default office

Per passare tra i livelli d'esecuzione "default" ed "office" senza riavviare il computer, passare al livello "nonetwork" tra di essi. Le interfacce di rete in questo modo verranno fermate, e rileggeranno la loro configurazione specifica al livello. Questo funziona meglio quando "nonetwork" è un livello di mezzo tra "default" ed "office", ed il gestore d'accesso, assieme ad altri servizi non di rete sono aggiunti solamente al livello "nonetwork".

default runlevel <---> nonetwork runlevel <---> office runlevel
root #rc nonetwork && rc office
root #rc nonetwork && rc default

Selezionare un livello d'esecuzione specifico all'avvio

OpenRC legge la linea di comando del kernel usata all'avvio, ed avvierà il livello specificato nel parametro softlevel se dato. Se non viene dato alcun parametro softlevel, il livello "default" sarà usato.

Il seguente esempio mostra una configurazione di grub che permette di avviare il sistema con il livello default oppure nonetwork:

FILE /boot/grub/grub.confgrub.conf d'esempio (GRUB Legacy)
title=Avvio Regolare
 
kernel (hd0,0)/boot/kernel-3.7.10-gentoo-r1 root=/dev/sda3
 
title=Avvio senza Rete
 
kernel (hd0,0)/boot/kernel-3.7.10-gentoo-r1 root=/dev/sda3 softlevel=nonetwork

Vedi sotto per una descrizione su come aggiungere ulteriori livelli d'esecuzione.

Uso

Livelli d'esecuzione

OpenRC può essere controllato e configurato utilizzando i comandi openrc, rc-update ed rc-status.

Eliminare un servizio dal livello d'esecuzione predefinito, dove <service> è il nome del servizio da rimuovere:

root #rc-update delete <service> default

Registro delle operazioni

Non è necessario avere permessi da root per elencare livelli d'esecuzione e servizi (script d'init) ad essi assegnati

Usare rc-update show -v per elencare tutti gli script d'avvio disponibili ed il loro rispettivo livello d'esecuzione (se sono stati aggiunti ad uno):

user $rc-update show -v

Eseguire rc-update o rc-update show mostrerà solamente gli script d'avvio che sono stati aggiunti ad un livello d'esecuzione.

Alternativamente, il comando rc-status può essere usato con l'opzione --servicelist (-s) per vedere lo stato di tutti i servizi.

user $rc-status --servicelist

Livelli d'esecuzione denominati

I livelli d'esecuzione di OpenRC sono implementati come cartelle residenti in /etc/runlevels. Per creare ulteriori livelli (sotto indicati come <runlevel>) basta eseguire:

root #install -d /etc/runlevels/<runlevel>

Ulteriori livelli d'esecuzione so utili in quanto forniscono sistemi alternativi profili d'avvio di sistema.

Livelli d'esecuzione impilati

I livelli d'esecuzione impilati sono usati per permettere ad uno di essi di ereditare le azioni da uno o più livelli. Il comando usato per creare livelli d'esecuzione impilati è rc-update -s. Aggiungere un livello d'esecuzione ad un altro porta alla creazione di una dipendenza tale che ogni script d'init (servizio) in un livello d'esecuzione (impilato) venga avviato o fermato con esso.

Un esempio d'uso dei livelli d'esecuzione impilati su un portatile per raggruppare i servizi di rete in base al luogo è presente su OpenRC/Stacked runlevel.

Prefisso

Gentoo Prefix installa Gentoo in una posizione alternativa, conosciuta come prefisso, permettendo di installare Gentoo in un altro luogo nella gerarchia del filesystem, evitando così conflitti. Con quest'alternativa, Gentoo Prefix è eseguito senza privilegi, e pertanto né l'utente root né diritti aggiuntivi sono richiesti.

Usando un'alternativa (il luogo "prefisso"), è possibile che molti utenti "alternativi" beneficino di una gran parte dei pacchetti nell'albero di Portage di Gentoo Linux. Attualmente utenti dei seguenti sistemi sono in grado di eseguire Gentoo Prefix con successo: Mac OS X su PPC e x86, Linux su x86, x86_64 e ia64, Solaris 10 su Sparc, Sparc/64, x86 e x86_64, FreeBSD su x86, AIX su PPC, Interix su x86, Windows su x86 (con l'aiuto di Interix), HP-UX su PARISC e ia64.

Demoni installati su prefisso sono già supportati dagli script d'esecuzione di OpenRC, con implementazione completa dal Summer of Code 2012.

OpenRC/Prefix, una guida per provarlo.

Hotplug

OpenRC può essere attivato da eventi esterni, come nuovo hardware da udev. Questo è ciò che il documento di configurazione dice riguardo ai servizi hotplug.

FILE /etc/rc.confrc_hotplug
# rc_hotplug controlla quali servizi possono essere hotplugged.
# Un servizio hotplugged è uno avviato da un gestore dev dinamico quando un coincidente
# dispositivo hardware viene trovato.
# Sevizi hotplugged appaiono nel livello d'esecuzione "hotplugged".
# Se rc_hotplug è impostato con alcun valore, viene confrontato il nome di questo servizio
# con ogni schema nel valore, da sinistra a destra, ed il servizio
# viene autorizzato ad essere hotplugged se coincide o no.
# Schemi possono includere shell wildcards.
# Per prevenire servizi dall'essere hotplugged aggiungere il prefisso "!" agli schemi.
# Se rc_hotplug non è impostato o è vuoto, l'hotplugging è completamente disabilitato.
# Esempio - rc_hotplug="net.wlan !net.*"
# Questo permette a net.wlan ed ogni servizio non coincidente con net.* d'essere hotplugged.
# Esempio - rc_hotplug="!net.*"
# Questo permette a servizi che non coincidono con "net.*" d'essere hotplugged.

Supporto per CGroups

A partire dalla versione 0.12, OpenRC ha supporto esteso per cgroups. Vedi OpenRC/CGroups per dettagli. A partire dalla versione 0.51 di OpenRC crgoups unificati (v2) sono abilitati per impostazione predefinita.

Supporto per chroot

root #mkdir -p /lib64/rc/init.d
root #ln -s /lib64/rc/init.d /run/openrc
root #touch /run/openrc/softlevel
root #emerge --oneshot sys-apps/openrc
FILE /etc/rc.confOpenRC config file
rc_sys="prefix"
rc_controller_cgroups="NO"
rc_depend_strict="NO"
rc_need="!net !dev !udev-mount !sysfs !checkfs !fsck !netmount !logger !clock !modules"

Il sistema potrebbe riportare il seguente messaggio a seguito di un tentativo di avvio di un servizio:

* WARNING: <service> is already starting

Ciò può essere corretto eseguendo il seguente comando:

root #rc-update --update

Integrazione di sistema

compatibilità con systemd

logind

Alcune configurazioni richiedono systemd-logind. Elogind può essere un adeguata alternativa indipendente per logind con OpenRC.

tmpfiles.d

systemd ha una sintassi speciale dei file tmpfiles.d per gestire i file temporanei. sys-apps/systemd-tmpfiles è un gestore a sé stante per i sistemi OpenRC. Esiste anche sys-apps/opentmpfiles, ora deprecato, che fornisce un interprete di tmpfiles.d per OpenRC.

Entrambi possono essere usati per gestire entrate volatili in /sys o /proc.

udev ed mdev

udev ed mdev sono sistemi disponibili su Gentoo per gestire /dev. Fu disponibile anche eudev, ma è stato rimosso. sys-fs/udev è il predefinito, ma OpenRC dovrebbe essere in grado di funzionare con entrambi, su Gentoo.

Vecchie installazioni di Gentoo utilizzavano udev come principale fornitore per virtual/udev. In base a bug #575718 questo fu cambiato per eudev, ma ritornò ad udev in bug #807193. Tuttavia, il servizio rc è ancora in /etc/init.d/udev.

Vedi mdev, per gli usi possibili, es. sistemi integrati.

Integrazione di BusyBox

N.B. Questa sezione manca di informazioni su come usare BusyBox con OpenRC.

Si noti che attualmente molti degli applet di BusyBox sono incompatibili con OpenRC, vedi bug #529086 per dettagli. Siate avvertiti che usare OpenRC con BusyBox potrebbe richiedere vario lavoro d'impostazione. BusyBox è meglio adattato ad un uso "integrato", vedi la sezione precedente riguardante mdev.

BusyBox può essere usato per sostituire la maggior parte degli strumenti nello spazio utente richiesti da OpenRC (init, shell, awk, ed altri strumenti POSIX), [1], tutte le chiamate che normalmente porterebbero ad una separazione/esecuzione verrebbero risparmiate, generalmente migliorando la velocità.

Il file d'init SysV /etc/inittab messo a disposizione da Gentoo non è compatibile con l'init di BusyBox. Qui è un esempio di inittab compatibile con BusyBox:

FILE /etc/inittabEsempio di inittab compatibile con l'init di BusyBox
::sysinit:/sbin/openrc sysinit
::wait:/sbin/openrc boot
::wait:/sbin/openrc

BusyBox mette a disposizione vary applet che possono essere usati per sostituire programmi di terze parti come acpid o dhcp/dhcpcd.

Vedi la documentazione di OpenRC su usare BusyBox con OpenRC.

Risoluzione dei problemi

Riavviare servizi interrotti

OpenRC può riportare lo stato dei servizi a quello a cui è impostato il livello d'esecuzione, garantendone il riavvio automatico.

Per riavviare servizi interrotti dal livello d'esecuzione predefinito, eseguire openrc: I servizi interrotti saranno avviati, ed ogni servizio manualmente eseguito verrà terminato. Per mantenere i servizi manualmente avviati in esecuzione, eseguire openrc --no-stop o in breve openrc -n.

Di predefinito openrc prova ad avviare servizi intoppati, non a riavviarli. Ciò può essere controllato dalle opzioni rc_crashed_stop (predefinito NO) ed rc_crashed_start (predefinito YES) in /etc/rc.conf.

Ripristinare manualmente servizi intoppati

Quando un processo s'intoppa all'avvio, un messaggio d'errore o d'avvertimento sarà mostrato quando si proverà ad avviare, fermare, o mostrare lo stato di un servizio. Ad esempio, quando si usa il servizio "docker":

root #rc-service docker status
 * status: crashed
root #rc-service docker start
 * WARNING: docker has already been started
root #rc-service docker stop
 * Caching service dependencies ...                                                                                                  [ ok ]
 * Stopping docker ...
 * Failed to stop docker                                                                                                             [ !! ]
 * ERROR: docker failed to stop

Per risolvere questo problema, eseguire uno zap del servizio:

root #rc-service docker zap

Vedi anche

Risorse esterne

Documentazione di OpenRC

OpenRC ha una propria ed utile documentazione, mantenuta dagli stessi sviluppatori. Sappiate che Gentoo di predefinito non usa tutte le funzioni di OpenRC:

Man pages

  • openrc(8) - Stops and starts services for the specified runlevel.
  • openrc-run(8) - Interpreter used to process OpenRC service scripts.
  • rc-service(8) - Locate and run an OpenRC service with the given arguments.
  • rc-status(8) - Show status info about runlevels.
  • rc-update(8) - Add and remove services to and from a runlevel.