OpenRC

OpenRC
FejlesztőOpenRC
Első kiadás2008. 03. 08 (v0.1)[1]
Legfrissebb stabil kiadás
(2017. 11. 29)
Programozási nyelvC
Operációs rendszerLinux, Unix, BSD
KategóriaInit rendszer
Licenc2-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]

Történelmi áttekintés

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]

Jellemzők

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.

Konfiguráció

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.dkö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"

Futási szintek

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).

Példák a futási szintekre
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

Szolgáltatások

A szolgáltatásokat /etc/init.dkö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 stopparanccsal 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:

Az OpenRC és systemd parancsok összehasonlítása[8]
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

Források

  1. a b SOpenRC-0.1 released (angol nyelven). https://roy.marples.name/blog , 2008. március 8. [2017. december 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. december 13.)
  2. a b OpenRC - Gentoo Wiki (angol nyelven). wiki.gentoo.org. (Hozzáférés: 2017. december 13.)
  3. OpenRC - readme (angol nyelven). https://github.com. (Hozzáférés: 2017. december 13.)
  4. baselayout is dead, long live OpenRC (angol nyelven). https://roy.marples.name/blog. [2017. december 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. december 13.)
  5. OpenRC is trademarked! Suggestions? (angol nyelven). https://roy.marples.name/blog. [2017. december 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. december 13.)
  6. OpenRC -> URC or UberRC ? (angol nyelven). https://roy.marples.name/blog. [2017. december 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. december 13.)
  7. OpenRC ready for testing (angol nyelven). https://roy.marples.name/blog. [2017. december 14-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. december 13.)
  8. OpenRC - ArchWiki (angol nyelven). wiki.archlinux.org. (Hozzáférés: 2018. január 21.)