OpenRC | |
Fejlesztő | OpenRC |
Első kiadás | 2008. 03. 08 (v0.1)[1] |
Legfrissebb stabil kiadás | (2017. 11. 29) |
Programozási nyelv | C |
Operációs rendszer | Linux, Unix, BSD |
Kategória | Init rendszer |
Licenc | 2-cl. BSD |
Az OpenRC weboldala |
Az OpenRC egy nyílt forráskódú függőség-alapú init rendszer.
Az OpenRC nem rugaszkodik el sem az eredeti Unixos filozófiától (KISS), sem az init rendszerek eredeti céljától, ugyanakkor a mai igényeknek megfelelően rugalmas is, így egy modern, de Unix közeli operációs rendszer számára ideális. 100%-osan kompatibilis a Gentoo init szkriptjeivel, habár a BSD rendszerek által is használt.[2]
Roy Marples 2004-ben Gentoo/Linux fejlesztőként moduláris hálózati szkripteket írt a baselayout csomag számára, majd 2005-ben a baselayout karbantartója lett.
2007-ben újraírta a teljes baselayout csomagot, mely baselayout-2 néven vált ismertté és bekerült a Gentoo-ba.
2007 év végére baselayout-2 még mindig maszkolt státuszban volt a FreeBSD felhasználók számára, így életben tartotta a baselayout-2 projektet, de egy újba vágott bele.[3]
Az új - baselayoutot temető - projekt neve OpenRC lett, melyet BSD licenc alatt szándékozott kiadni.[4]
Még 2007 decemberében kiderült, hogy az OpenRC (Open Robot Control) bejegyzett név,[5] melyet hosszas elmélkedés követett.[6]
A probléma megoldódott és 2008-ra az új OpenRC tesztelésre készen állt,[7] majd március 8-ára megszületett az első kiadás.[1]
Az OpenRC egy C és shell nyelven megírt kompakt init rendszer, mely képes a függőségek kezelésére és szolgáltatások párhuzamos indítására.
Az OpenRC konfigurációs állományai szintén a shell szkriptek paradigmáit követik. A globális konfigurációs állomány a /etc/rc.conf
, a szolgáltatások konfigurációs állományai pedig a /etc/conf.d
könyvtárban találhatóak.[2]
A globális konfigurációs állomány rendszerint, de nem kizárólagosan az OpenRC beállítási paramétereit tartalmazza például:
# Global OpenRC configuration settings
# egyenként rákérdez a futtatandó szolgáltatásokra (hibakeresésnél hasznos)
rc_interactive="YES"
# loggolás engedélyezése egy bizonyos fájlba
rc_logger="YES"
rc_log_path="/var/log/rc.log"
A szolgáltatásoknak lehetnek lokális konfigurációs állományai, melyek általában a szolgáltatásra jellemző nevet kapnak, például X display manager esetén xdm:
# az x általában a 7-es virtuális terminálon indul
# ez ellenőrzi az ütközést (ha már fut egy X)
CHECKVT=7
# ssdm indítása, de lehet xdm, gdm stb.
DISPLAYMANAGER="sddm"
A futási szintek használatával indulási sebesség-optimalizálást, hibakeresést stb. lehet elősegíteni. Tegyük fel, hogy nincs állandó netes elérésünk, akkor minek indítanánk el a hálózattal kapcsolatos szolgáltatásokat (hálózat keresés, samba, nfs szerver/kliens).
név | leírás
(ettől el lehet térni a legtöbb esetben, de nem célszerű) |
---|---|
sysinit | rendszerspecifikus dolgok (pl. dev, proc, sys) |
boot | a bootolással kapcsolatos dolgok (pl. keymap, fsck, swap) • a sysinit és boot az összes többi indító futási szintesetén automatikusan elindul |
single | a sysinit kivételével az összes futási szint leállítása |
reboot | minden futási szint leállítása és a rendszer újraindítása |
shutdown | minden futási szint leállítása |
nonetwork | nem indítja el a netes szolgáltatásokat |
default | alapértelmezett szint, ide bekerülhet már bármi (pl. xdm, mysql) • külön kérés ill. átnevezés nélkül ez fog indulni a sysinit és a boot után |
A szolgáltatásokat /etc/init.d
könyvtárban lévő shell szkriptek indítják, melyre egy példa:
#!/sbin/openrc-run
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License, v2 or later
extra_started_commands="reload"
piddir="/run/samba"
# függőségek kezelése a szolgáltatásokban
depend() {
after slapd # spald után induljon
need net # a net szükséges
use cupsd # használjon cupsd-t
}
DAEMONNAME="${SVCNAME##samba.}"
[ "${DAEMONNAME}" != "samba" ] && daemon_list=${DAEMONNAME}
# segítő függvény (nem szükséges, de több is használható)
signal_do() {
local signal="$1"
[ -z "${signal}" ] && return 0
local result=0 last_result=0 daemon= cmd_exec=
for daemon in ${daemon_list} ; do
eval cmd_exec=\$${daemon}_${signal}
if [ -n "${cmd_exec}" ]; then
ebegin "${my_service_name} -> ${signal}: ${daemon}"
#echo ${cmd} '->' ${!cmd}
${cmd_exec} > /dev/null
last_result=$?
eend ${last_result}
fi
result=$(( ${result} + ${last_result} ))
done
return ${result}
}
# szabványos indító függvény
start() {
${my_service_PRE}
[ -d "${piddir}" ] || mkdir -p "${piddir}"
signal_do start && return 0
eerror "Error: starting services (see system logs)"
signal_do stop
return 1
}
# szabványos megállító függvény
stop() {
${my_service_PRE}
if signal_do stop ; then
${my_service_POST}
return 0
fi
}
# szabványos újraindító függvény
reload() {
${my_service_PRE}
signal_do reload
}
A fenti példa is mutatja, hogy egy szolgáltatás szabványos indítása szolgáltatás_név start
, újraindítása (frissítése) szolgáltatás_név reload
, leállítása pedig szolgáltatás_név stop
paranccsal történik.
Az OpenRC-ben végrehajthatóak ugyanazon parancsok amik a népszerű systemd-ben. Ezt az összehasonlítást foglalja össze a következő táblázat:
OpenRC | systemd | |
---|---|---|
A futó szolgáltatások listázása | rc-status | systemctl list-units |
Az elakadt szolgáltatások listázása | rc-status --crashed | systemctl --failed |
A futási szintekhez tartozó szolgáltatások listázása | rc-update show | |
Az összes elérhető szolgáltatás listázása | rc-update -v show | |
A szolgáltatások listázása, futási szintek nélkül | rc-service -l | systemctl --all |
Szolgáltatás engedélyezése|tiltása | rc-update add|del daemon [runlevel] | systemctl enable|disable daemon |
Parancs adása a szolgáltatásnak • szolgáltatások: start, stop, restart, ... |
rc-service daemon command | systemctl command daemon |