Tο OpenRC είναι ένα σύστημα εκκίνησης, λειτουργικών συστημάτων τύπου Unix, το οποίο βασίζεται σε εξαρτήσεις, το οποίο διαδόθηκε σαν ένα εναλλακτικό σύστημα εκκίνησης διεργασιών, όταν οι διανομές μετέβαιναν σε αυτό, από το systemd, εξ' ού και ο ορισμός του ως «αιρετικό».
Δημιουργήθηκε από τον Roy Marples, έναν από τους developers του NetBSD, ο οποίος δραστηριοποιούταν παράλληλα στο Gentoo project.
Το OpenRC είναι το προεπιλεγμένο σύστημα εκκίνησης των Gentoo, Alpine Linux, Hyperbola GNU/Linux-libre, Parabola GNU/Linux-libre, Artix Linux, Maemo Leste, TrueOS και άλλων συστημάτων τύπου Unix, ενώ σε μερικές άλλες όπως το Devuan, το παρέχουν εναλλακτικά.
Αυτό σημαίνει ότι τα πακέτα και οι υπηρεσίες (daemons) αυτών των διανομών, το υποστηρίζουν, παρέχοντας όλα τα διαθέσιμα scripts.
Το OpenRC διαβάζει τις εντολές του πυρήνα που χρησιμοποιούνται κατά την εκκίνηση του λειτουργικού συστήματος, και ξεκινά το προκαθορισμένο επίπεδο υπηρεσιών (runlevel) το οποίο ορίζεται από την παράμετρο softlevel, εφόσον δοθεί ως τιμή αντί του προκαθορισμένου (default).
Διακρίνονται:
Στα εσωτερικά τα οποία είναι επεξηγηματικά από την ονομασία τους:
Και στου χρήστη:
- boot: Ξεκινά όλα τα απαραίτητες υπηρεσίες για τα άλλα επίπεδα υπηρεσιών (runlevels)
- default: Χρησιμοποιείται σε λειτουργίες καθημερινής βάσης (day-to-day-operations)
- nonetwork: Χρησιμοποιείται όταν δεν απαιτείται συνδεσιμότητα σε δίκτυο
- single: Λειτουργία μονού χρήστη (Single-user mode)
Τρόπος χρήσης
Η ενεργοποίηση παράλληλων υπηρεσιών στο OpenRC, γίνεται τροποποίοντας την γραμμή του rc_parallel στο αρχείο /etc/rc.conf ως εξής:
Η μετάβαση από το ένα επίπεδο υπηρεσιών στο άλλο μπορεί να γίνει με την χρήση της εντολής
openrc<επίπεδο>, για παράδειγμα:
Επίσης μπορεί να επιλεχθεί σε ποιο επίπεδο θα γίνεται το boot, ανάμεσα σε default, nonetwork ή single-user επίπεδο υπηρεσιών (runlevels) με το ακόλουθο παράδειγμα παραμετροποίησης του grub.conf:
/boot/grub/grub.conf
title=Regular start-up
kernel (hd0,0)/boot/vmlinuz-linux root=/dev/sda3
title=Start without networking
kernel (hd0,0)/boot/vmlinuz-linux root=/dev/sda3 softlevel=nonetwork
title=Single-user mode
kernel (hd0,0)/boot/vmlinuz-linux root=/dev/sda3 softlevel=single
Πρόσθεση/αφαίρεση υπηρεσιών σε/από runlevels:
# rc-update add net.eth0 boot
# rc-update del dropbox default
Κατάλογος υπηρεσιών:
Για να δείτε όλες τις διαθέσιμες δέσμες εντολών εκκίνησης (init scripts) και το τρέχον επίπεδο υπηρεσιών (εφόσον έχουν προστεθεί σε κάποιο), χρησιμοποιείστε την εντολή
rc-update show -v :
Για να δείτε μόνο τις δέσμες εντολών εκκίνησης (init scripts) που έχουν προτεθεί σε ένα επίπεδο υπηρεσιών (runlevel), εκτελέστε μία από τις εντολές:
# rc-update
# rc-update show
Ονομασίες επιπέδων υπηρεσιών (runlevels):
Τα επίπεδα υπηρεσιών στο OpenRC, είναι φάκελοι και μπορείτε να τα δείτε με την εντολή:
Για να δημιουργήστε επιπλέον επίπεδα υπηρεσιών, μπορείτε απλά να το κάνετε, εκτελώντας την εντολή:
# install -d /etc/runlevels/$runlevel
Στοίβες επιπέδων υπηρεσιών (stacked runlevels):
Μπορείτε να διαχειριστείτε παραλλαγές τους, χρησιμοποιώντας την εντολή:
Παράδειγμα χρήσης σε laptop για ομαδοποίηση υπηρεσιών δικτύωσης με βάση την τοποθεσία, μπορείτε να δείτε στο
OpenRC/StackedRunlevel στα Αγγλικά.
Hotplug:
Το OpenRC παρακολουθεί και μπορεί να ενεργοποιηθεί (triggered) βάση εξωτερικών γεγονότων (events), όπως όταν υπάρχει νέο υλικό από την udev.
Δείτε στο
OpenRC/Event Driven για περισσότερες λεπτομέρεις στα Αγγλικά.
Αυτόματη επαναφορά (respawning) των υπηρεσιών που κατέρρευσαν:
Το OpenRC μπορεί να επιστρέψει (δώσει) την κατάσταση των υπηρεσιών στην κατάσταση ρύθμισης του επιπέδου τους (runlevel), να παρέχει αρχεία δέσμης εντολών με καταστάσεις και αυτόματη επαναφορά.
Όταν κάποιος χρήστης, δίνει την εντολή
openrc ως root (για το προκαθορισμένο επίπεδο υπηρεσιών), οι υπηρεσίες που είχαν καταρρεύσει θα ξεκινήσουν και οι υπηρεσίες που ξεκίνησαν χειρωνακτικά από τον χρήστη, θα σταματήσουν.
Για να το παρακάμψετε, χρησιμοποιήστε την εντολή
openrc -n ή την εντολή u]
openrc --not-stop[/u].
Εξ ορισμού, το openrc θα προσπαθήσει να ξεκινήσει τις κατεστραμμένες υπηρεσίες, και όχι να τις επανεκκινήσει.
Αυτό μπορεί να μεταβληθεί στο αρχείο /etc/rc.conf αλλάζοντας τις επιλογές:
rc_crashed_stop (default NO) & rc_crashed_start (default YES)
Υποστήριξη CGroups:
Το OpenRC υποστηρίζει εκτεταμένα την χρήση των cgroups, για λεπτομέρειες μπορείτε να δείτε στο
OpenRC/CGroups στα Αγγλικά.
rc.local:
Το OpenRC, δεν εκετελεί εξ' ορισμού το
/etc/rc.local αλλά αντιθέτως εκτελεί αρχεία δέσμης εντολών από τον φάκελο
/etc/local.d, τα οποία έχουν την κατάληξη
.start όταν ξεκινούν και την κατάληξη
.stop όταν σταματουν.
Για να μιμηθήτε την παλία καλή συμπεριφορά του
rc.local, δημιουργήστε το αρχείο
/etc/rc.local/rc.local.start όπως στο υπόδειγμα και κάντε το εκτελέσιμο με την εντολή
chmod +x:
# /etc/local.d/rc.local.start
[ -e /etc/rc.local ] && /etc/rc.local
Βεβαιωθείτε ότι η εκτέλεση υπηρεσιών local είναι ενεργοποιημένη.
Τα αρχεία δέσμης εντολών στο
/etc/local.d εκτελούνται με λεκτική ταξινόμηση και το παραπάνω παράδειγμα προϋποθέτει ότι το αρχείο
/etc/rc.local έχει δικαιώματα εκτέλεσης.
Παράδειγματα
Πολλαπλές διεπαφές δικτύωσης (network interfaces):
Η υπηρεσία SSH πρέπει να ενεργοποιηθεί μόνο για το εσωτερικό δίκτυο, για την οντότητα (instance) του
eth0 και ποτέ για το
wlan0.
Για να παρακαμφθεί η εξάρτηση δικτύων από το
/etc/init.d/sshd και επαναπροσδιορίστε την υπηρεσία, να εξαρτιέται μόνο από το
net.eth0:
/etc/conf.d/sshd
rc_need="!net net.eth0"
Πολλαπλές διεπαφές δικτύωσης (network interfaces) Multiple network interfaces in multiple runlevels:
Η υπηρεσία SSH πρέπει να ξεκινά με το
eth0 και όχι με το
wlan0 στο "default" επίπεδο υπηρεσιών (runlevel), αλλά στο επίπεδο υπηρεσιών "office" πρέπει να ξεκινά με το
wlan0 και όχι με το
eth0.
/etc/rc.conf
#rc_depend_strict="YES"
Δημιουργήστε συβολικούς συνδέσμους (symlinks) στον daemon
sshd με τα ακόλουθα ονόματα διεπαφών δικτύου:
# ln -s sshd /etc/init.d/sshd.eth0
# ln -s sshd /etc/init.d/sshd.wlan0
Οι ρυθμίσεις πρέπει να διαβάζονται από τα αρχεία
/etc/conf.d/sshd.eth0 και το
/etc/conf.d/sshd.wlan0 πλέον, άρα:
# cp /etc/conf.d/sshd /etc/conf.d/sshd.eth0
# cp /etc/conf.d/sshd /etc/conf.d/sshd.wlan0
Προσθέτετε τις εξαρτήσεις, με τις εντολές:
# echo 'rc_need="!net net.eth0"' >> /etc/conf.d/sshd.eth0
# echo 'rc_need="!net net.wlan0"' >> /etc/conf.d/sshd.wlan0
Σε αυτό το παράδειγμα η διεπαφές
net.eth0 και
net.wlan0, διαβάζουν τις ρυθμίσεις τους από το αρχείο
/etc/conf.d/net, ή το
/etc/conf.d/net.office, βάση του ενεργού επιπέδου υπηρεσιών (runlevel).
Οπότε πρέπει να προσθέσετε όλα τα αρχεία δέσμης εντολών σε διαφορετικά επίπεδα υπηρεσιών:
# rc-update add sshd.eth0 default
# rc-update add sshd.wlan0 office
# rc-update add net.eth0 default office
# rc-update add net.wlan0 default office
Για την μετάβαση ανάμεσα στο "default" runlevel και το "office" runleve, χωρίς επανεκκίνηση του συστήματος, μεταβείτε πρώτα στο "nonetwork" runlevel.
Οι υπηρεσίες των διεπαφών θα σταματήσουν με αυτόν τον τρόπο και θα επανα-διαβαστούν οι ρυθμίσεις των υπηρεσιών του αντίστοιχου runlevel.
Αυτό θα έχει καλύτερο αποτέλεσμα όταν το επίπεδο "nonetwork" είναι μία στοίβα με τα "default" και "office" επίπεδα υπηρεσιών (runlevels), και ο διαχειριστής παραθύρων και οι υπόλοιπες μη σχετιζόμενες με το δίκτυο υπηρεσίες, προτεθούν στο αποκλειστικά, στο επίπεδο υπηρεσιών του "nonetwork".
default runlevel <---> nonetwork runlevel <---> office runlevel # rc nonetwork && rc office
# rc nonetwork && rc default
Παράδειγμα γραφής υπηρεσίας clamav (του συγγραφέα) Δημιουργία του αρχείου ρυθμίσεων της υπηρεσίας
clamd.confd:
# Config file for /etc/init.d/clamd
START_CLAMD=yes
START_FRESHCLAM=yes
CLAMD_NICELEVEL=3
FRESHCLAM_NICELEVEL=19
IONICE_LEVEL=2
Δημιουργία αρχείου clamd.initd και μετά καθορισμός εξαρτήσεων της υπηρεσίας:
#!/sbin/openrc-run
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# Contributor linuxer <linuxer@artixlinux.org>
daemon_clamd="/usr/bin/clamd"
daemon_freshclam="/usr/bin/freshclam"
daemon_milter="/usr/bin/clamav-milter"
extra_commands="logfix"
depend() {
use net
provide antivirus
}
Σε συνέχεια πρέπει να διαβάσει από την clamconf για να λάβει την κατάσταση της υπηρεσίας:
get_config() {
clamconf | sed 's/["=]//g' | \
awk "{
if(\$0==\"Config file: $1.conf\") S=1
if(S==1&&\$0==\"\") {
print \"$3\"
exit
}
if(S==1&&\$1~\"^$2\$\") {
print \$2!=\"disabled\"?\$2:\"$3\"
exit
}
}"
}
Κατόπιν περιγράφουμε το πως θα ξεκίνησει και πως θα σταματήσει, καθώς και τα μυνήματα που θα παρέχει :
start() {
# populate variables and fix log file permissions
logfix
if [ "${START_CLAMD}" = "yes" ]; then
checkpath --quiet --mode 755 \
--owner "${clamd_user}":"${clamd_user}" \
--directory `dirname ${clamd_socket}`
if [ -S "${clamd_socket}" ]; then
rm -f ${clamd_socket}
fi
ebegin "Starting clamd"
start-stop-daemon --start --quiet \
--nicelevel ${CLAMD_NICELEVEL:-0} \
--ionice ${IONICE_LEVEL:-0} \
--exec ${daemon_clamd}
eend $? "Failed to start clamd"
fi
if [ "${START_FRESHCLAM}" = "yes" ]; then
checkpath --quiet --mode 755 \
--owner "${clamd_user}":"${clamd_user}" \
--directory `dirname ${clamd_socket}`
ebegin "Starting freshclam"
start-stop-daemon --start --quiet \
--nicelevel ${FRESHCLAM_NICELEVEL:-0} \
--ionice ${IONICE_LEVEL:-0} \
--exec ${daemon_freshclam} -- -d
retcode=$?
if [ ${retcode} = 1 ]; then
eend 0
einfo "Virus databases are already up to date."
else
eend ${retcode} "Failed to start freshclam"
fi
fi
if [ "${START_MILTER}" = "yes" ]; then
if [ -z "${MILTER_CONF_FILE}" ]; then
MILTER_CONF_FILE="/etc/clamav-milter.conf"
fi
ebegin "Starting clamav-milter"
start-stop-daemon --start --quiet \
--nicelevel ${MILTER_NICELEVEL:-0} \
--ionice ${IONICE_LEVEL:-0} \
--exec ${daemon_milter} -- -c ${MILTER_CONF_FILE}
eend $? "Failed to start clamav-milter"
fi
}
stop() {
if [ "${START_CLAMD}" = "yes" ]; then
ebegin "Stopping clamd"
start-stop-daemon --stop --quiet --name clamd
eend $? "Failed to stop clamd"
fi
if [ "${START_FRESHCLAM}" = "yes" ]; then
ebegin "Stopping freshclam"
start-stop-daemon --stop --quiet --name freshclam
eend $? "Failed to stop freshclam"
fi
if [ "${START_MILTER}" = "yes" ]; then
ebegin "Stopping clamav-milter"
start-stop-daemon --stop --quiet --name clamav-milter
eend $? "Failed to stop clamav-milter"
fi
}
Τέλος προδιαγράφουμε το logging της υπηρεσίας:
logfix() {
clamd_socket=$(get_config clamd LocalSocket /run/clamav/clamd.sock)
clamd_user=$(get_config clamd User clamav)
freshclam_user=$(get_config freshclam DatabaseOwner clamav)
if [ "${START_CLAMD}" = "yes" ]; then
# fix clamd log permissions
# (might be clobbered by logrotate or something)
local logfile=$(get_config clamd LogFile)
if [ -n "${logfile}" ]; then
checkpath --quiet \
--owner "${clamd_user}":"${clamd_user}" \
--mode 640 \
--file ${logfile}
fi
fi
if [ "${START_FRESHCLAM}" = "yes" ]; then
# fix freshclam log permissions
# (might be clobbered by logrotate or something)
local logfile=$(get_config freshclam UpdateLogFile)
if [ -n "${logfile}" ]; then
checkpath --quiet \
--owner "${freshclam_user}":"${freshclam_user}" \
--mode 640 \
--file ${logfile}
fi
fi
}
Άδεια χρήσης OpenRC
To
OpenRC είναι ελεύθερο λογισμικό και η άδεια χρήσης του είναι παρόμοια με την two-clause BSD.
https://github.com/OpenRC/openrc/blob/master/LICENSE (αντίγραφο της άδειας του, υπάρχει ως συνημμένο αρχείο στο τέλος του άρθρου)
Καλό διάβασμα!
Πηγές άρθρου:
Artix Linux OpenRC WikiGentoo Linux OpenRC WikiWikepedia OpenRC ReferenceΥπηρεσία clamav-opernrcΆδεια χρήσης λογισμικού: