D.1. /etc/rc.d/init.d/rc
Die rc script ist das erste Skript, das von init aufgerufen wird und den Bootvorgang einleitet.
#! / Bin / bash
################################################ ######################
# Beginnen Sie mit rc
#
# Beschreibung: Haupt-Run-Level-Control-Skript
#
# Autoren: Gerard Beekmans - [E-Mail geschützt]
# : DJ Lucas - [E-Mail geschützt]
# Update: Bruce Dubbs - [E-Mail geschützt]
#
# Version: LFS 7.0
#
################################################ ######################
. /lib/lsb/init-functions print_error_msg()
{
log_failure_msg
# $i wird beim Aufruf gesetzt
MSG="FEHLER:\n\nSie sollten diese Fehlermeldung nicht lesen.\n\n" MSG="${MSG}Dies bedeutet, dass ein unvorhergesehener Fehler aufgetreten ist in\n" MSG="${MSG}${i},\n"
MSG="${MSG}, das mit einem Rückgabewert von ${error_value} beendet wurde.\n"
MSG="${MSG}Wenn Sie diesen Fehler auf einen Fehler in einer der\n" MSG="${MSG}Dateien zurückführen können, die im Buch ${DISTRO_MINI} enthalten sind,\n" MSG="${MSG}seien Sie bitte so freundlich, uns unter ${DISTRO_CONTACT} zu informieren.\n" log_failure_msg "${MSG}"
log_info_msg „Drücken Sie die Eingabetaste, um fortzufahren …“ wait_for_user
}
check_script_status()
{
# $i wird beim Aufruf gesetzt if [ ! -f ${i} ]; dann
log_warning_msg "${i} ist kein gültiger symbolischer Link." SCRIPT_STAT="1"
fi
wenn [ ! -x ${i} ]; dann
log_warning_msg "${i} ist nicht ausführbar, wird übersprungen." SCRIPT_STAT="1"
fi
}
Lauf()
{
wenn [ -z $interaktiv ]; dann
${1} ${2}
$ zurückgeben?
fi
während wahr; tun
read -p "${1} ${2} ausführen (Ja/Nein/Fortsetzen)?" -n 1 runit echo
Fall ${runit} in c | C)
interaktiv=""
${i} ${2}
ret=${?} Pause;
;;
n | N)
0 zurückgeben
;;
y | Y)
${i} ${2}
ret=${?} Pause
;;
esac fertig
return $ret
}
# Alle lokalen Einstellungen/Überschreibungen lesen
[ -r /etc/sysconfig/rc.site ] && Quelle /etc/sysconfig/rc.site
DISTRO=${DISTRO:-"Linux From Scratch"}
DISTRO_CONTACT=${DISTRO_CONTACT:-"[E-Mail geschützt] (Registrierung erforderlich)"} DISTRO_MINI=${DISTRO_MINI:-"LFS"}
IPROMPT=${IPROMPT:-"no"}
# Diese 3 Signale führen nicht dazu, dass unser Skript die Trap "" INT QUIT TSTP beendet
[ "${1}" != "" ] && Runlevel=${1}
wenn [ "${runlevel}" == "" ]; dann echo "Verwendung: ${0} " >&2 Ausgang 1
fi
vorherige=${PREVLEVEL}
[ "${vorherige}" == "" ] && vorherige=N
wenn [ ! -d /etc/rc.d/rc${runlevel}.d ]; dann
log_info_msg "/etc/rc.d/rc${runlevel}.d existiert nicht.\n" Ausgang 1
fi
wenn [ "$runlevel" == "6" -o "$runlevel" == "0" ]; dann IPROMPT="nein"; fi
# Hinweis: In ${LOGLEVEL:-7} ist es ':' 'Strich' '7', nicht minus 7, wenn [ "$runlevel" == "S" ]; dann
[ -r /etc/sysconfig/console ] && Quelle /etc/sysconfig/console dmesg -n "${LOGLEVEL:-7}"
fi
wenn [ "${IPROMPT}" == "yes" -a "${runlevel}" == "S" ]; dann
# Die Gesamtlänge der Begrüßungszeichenfolge der Distribution ohne Escape-Codes wlen=${wlen:-$(echo "Willkommen bei ${DISTRO}" | wc -c )} welcome_message=${welcome_message:-"Willkommen bei ${INFO}${DISTRO}${NORMAL}"}
# Die Gesamtlänge der interaktiven Zeichenfolge ohne Escape-Codes ilen=${ilen:-$(echo "Press 'I' to enter interactive startup" | wc -c )}
i_message=${i_message:-"Drücken Sie '${FAILURE}I${NORMAL}', um den interaktiven Startvorgang zu starten"}
# dcol und icol sind Leerzeichen vor der Nachricht, um die Nachricht zu zentrieren
# auf dem Bildschirm. itime ist die Wartezeit, die der Benutzer benötigt, um eine Taste zu drücken. wcol=$(( ( ${COLUMNS} - ${wlen} ) / 2 ))
icol=$(( ( ${COLUMNS} - ${ilen} ) / 2 )) itime=${itime:-"3"}
echo -e "\n\n"
echo -e "\\033[${wcol}G${Willkommensnachricht}" echo -e "\\033[${icol}G${i_message}${NORMAL}" echo ""
lesen -t "${itime}" -n 1 interaktiv 2>&1 > /dev/null
fi
# Kleinbuchstaben machen
[ "${interactive}" == "I" ] && interactive="i" [ "${interactive}" != "i" ] && interactive=""
# Lesen Sie die Statusdatei, falls vorhanden, ab Runlevel S
[ -r /var/run/interactive ] && Quelle /var/run/interactive
# Versuchen Sie, alle vom vorherigen Runlevel gestarteten Dienste zu stoppen.
# und in diesem Runlevel getötet
wenn [ "${previous}" != "N" ]; dann
für i in $(ls -v /etc/rc.d/rc${runlevel}.d/K* 2> /dev/null) mache
check_script_status
wenn [ "${SCRIPT_STAT}" == "1" ]; dann SCRIPT_STAT="0"
fortsetzen
fi
suffix=${i#/etc/rc.d/rc$runlevel.d/K[0-9][0-9]} prev_start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffix sysinit_start=/etc/rc.d/rcS.d/S[0-9][0-9]$suffix
wenn [ "${runlevel}" != "0" -a "${runlevel}" != "6" ]; dann
if [ ! -f ${prev_start} -a ! -f ${sysinit_start} ]; then MSG="WARNUNG:\n\n${i} kann nicht sein "
MSG="${MSG}ausgeführt, da es nicht " MSG="${MSG}im vorherigen " MSG="${MSG}Runlevel (${previous}) nicht gestartet wurde." log_warning_msg "$MSG"
fortsetzen
fi
fi
ausführen ${i} stoppen error_value=${?}
wenn [ "${error_value}" != "0" ]; dann print_error_msg; fi fertig
fi
wenn [ "${previous}" == "N" ]; dann exportiere IN_BOOT=1; fi
wenn ["$runlevel" == "6" -a -n "${FASTBOOT}" ]; dann touch /fastboot
fi
# Alle Funktionen in diesem Runlevel starten
für i in $( ls -v /etc/rc.d/rc${runlevel}.d/S* 2> /dev/null) mache
wenn [ "${previous}" != "N" ]; dann Suffix=${i#/etc/rc.d/rc$runlevel.d/S[0-9][0-9]} Stopp=/etc/rc.d/rc$runlevel.d/K[0-9][0-9]$suffix vorheriger_Start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffix
[ -f ${prev_start} -a ! -f ${stop} ] && weiter
fi
check_script_status
wenn [ "${SCRIPT_STAT}" == "1" ]; dann SCRIPT_STAT="0"
fortsetzen
fi
Fall ${runlevel} in 0|6)
lauf ${i} stopp
;;
*)
esac
führen Sie ${i} start aus
;;
error_value=${?}
wenn [ "${error_value}" != "0" ]; dann print_error_msg; fi fertig
# Interaktive Variable beim Wechsel von Runlevel S speichern und entfernen, wenn nicht, wenn [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; dann
echo "interaktiv="i"" > /var/run/interaktiv
sonst
rm -f /var/run/interactive 2> /dev/null
fi
# Kopieren Sie das Boot-Protokoll nur beim ersten Booten
wenn [ "${previous}" == "N" -a "${runlevel}" != "S" ]; dann cat $BOOTLOG >> /var/log/boot.log
# Markieren Sie das Ende des Bootvorgangs
echo "--------" >> /var/log/boot.log
# Entfernen Sie die temporäre Datei rm -f $BOOTLOG 2> /dev/null
fi
# RC beenden
wenn [ "${error_value}" != "0" ]; dann print_error_msg; fi fertig
# Interaktive Variable beim Wechsel von Runlevel S speichern und entfernen, wenn nicht, wenn [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; dann
echo "interaktiv="i"" > /var/run/interaktiv
sonst
rm -f /var/run/interactive 2> /dev/null
fi
# Kopieren Sie das Boot-Protokoll nur beim ersten Booten
wenn [ "${previous}" == "N" -a "${runlevel}" != "S" ]; dann cat $BOOTLOG >> /var/log/boot.log
# Markieren Sie das Ende des Bootvorgangs
echo "--------" >> /var/log/boot.log
# Entfernen Sie die temporäre Datei rm -f $BOOTLOG 2> /dev/null
fi
# RC beenden
: Gerard Beekmans - [E-Mail geschützt]
: DJ Lucas - [E-Mail geschützt]
: Bruce Dubbs - [E-Mail geschützt]
: Gerard Beekmans - [E-Mail geschützt]
: DJ Lucas - [E-Mail geschützt]
: Bruce Dubbs - [E-Mail geschützt]
: LFS 7.0
: Mit Code basierend auf Matthias Benkmanns simpleinit-msb http://winterdrache.de/linux/newboot/index.html
Die Datei sollte sich in /lib/lsb befinden
: LFS 7.0
: Mit Code basierend auf Matthias Benkmanns simpleinit-msb http://winterdrache.de/linux/newboot/index.html
Die Datei sollte sich in /lib/lsb befinden