Added bootscripts

This commit is contained in:
Vladimir Pertsev 2022-06-25 14:46:56 +05:00
parent 8bc6a8314e
commit b9127d642e
32 changed files with 4606 additions and 0 deletions

1179
bootscripts/ChangeLog Normal file

File diff suppressed because it is too large Load Diff

132
bootscripts/Makefile Normal file
View File

@ -0,0 +1,132 @@
ETCDIR=${DESTDIR}/etc
LIBDIR=${DESTDIR}/lib
SERVICEDIR=${LIBDIR}/services
MAN8=${DESTDIR}/usr/share/man/man8
SBIN=${DESTDIR}/sbin
MODE=754
DIRMODE=755
CONFMODE=644
all: links
install: all
create-dirs:
install -d -m ${DIRMODE} ${ETCDIR}/rc.d/rc0.d
install -d -m ${DIRMODE} ${ETCDIR}/rc.d/rc1.d
install -d -m ${DIRMODE} ${ETCDIR}/rc.d/rc2.d
install -d -m ${DIRMODE} ${ETCDIR}/rc.d/rc3.d
install -d -m ${DIRMODE} ${ETCDIR}/rc.d/rc4.d
install -d -m ${DIRMODE} ${ETCDIR}/rc.d/rc5.d
install -d -m ${DIRMODE} ${ETCDIR}/rc.d/rc6.d
install -d -m ${DIRMODE} ${ETCDIR}/rc.d/rcS.d
install -d -m ${DIRMODE} ${ETCDIR}/rc.d/init.d
install -d -m ${DIRMODE} ${ETCDIR}/sysconfig
install -d -m ${DIRMODE} ${LIBDIR}
install -d -m ${DIRMODE} ${SERVICEDIR}
install -d -m ${DIRMODE} ${MAN8}
install -d -m ${DIRMODE} ${SBIN}
ln -sfn services ${LIBDIR}/lsb
ln -sfn rc.d/init.d ${ETCDIR}/init.d
files: create-dirs
install -m ${MODE} lfs/init.d/checkfs ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/cleanfs ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/halt ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/console ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/localnet ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/modules ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/mountfs ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/mountvirtfs ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/network ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/rc ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/reboot ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/sendsignals ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/setclock ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/swap ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/sysctl ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/sysklogd ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/template ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/udev ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/init.d/udev_retry ${ETCDIR}/rc.d/init.d/
install -m ${MODE} lfs/sbin/ifup ${SBIN}
install -m ${MODE} lfs/sbin/ifdown ${SBIN}
install -m ${CONFMODE} lfs/sbin/ifup.8 ${MAN8}
ln -sf ifup.8 ${MAN8}/ifdown.8
install -m ${MODE} lfs/lib/services/ipv4-static-route ${SERVICEDIR}
install -m ${MODE} lfs/lib/services/ipv4-static ${SERVICEDIR}
install -m ${CONFMODE} lfs/lib/services/init-functions ${SERVICEDIR}
if [ ! -f ${ETCDIR}/sysconfig/createfiles ]; then \
install -m ${CONFMODE} lfs/sysconfig/createfiles ${ETCDIR}/sysconfig/ ;\
fi
if [ ! -f ${ETCDIR}/sysconfig/modules ]; then \
install -m ${CONFMODE} lfs/sysconfig/modules ${ETCDIR}/sysconfig/ ;\
fi
if [ ! -f ${ETCDIR}/sysconfig/udev_retry ]; then \
install -m ${CONFMODE} lfs/sysconfig/udev_retry ${ETCDIR}/sysconfig/ ;\
fi
if [ ! -f ${ETCDIR}/sysconfig/rc.site ]; then \
install -m ${CONFMODE} lfs/sysconfig/rc.site ${ETCDIR}/sysconfig/ ;\
fi
links: rcS rc0 rc1 rc2 rc3 rc4 rc5 rc6
rcS: files
ln -sf ../init.d/mountvirtfs ${ETCDIR}/rc.d/rcS.d/S00mountvirtfs
ln -sf ../init.d/modules ${ETCDIR}/rc.d/rcS.d/S05modules
ln -sf ../init.d/localnet ${ETCDIR}/rc.d/rcS.d/S08localnet
ln -sf ../init.d/udev ${ETCDIR}/rc.d/rcS.d/S10udev
ln -sf ../init.d/swap ${ETCDIR}/rc.d/rcS.d/S20swap
ln -sf ../init.d/checkfs ${ETCDIR}/rc.d/rcS.d/S30checkfs
ln -sf ../init.d/mountfs ${ETCDIR}/rc.d/rcS.d/S40mountfs
ln -sf ../init.d/cleanfs ${ETCDIR}/rc.d/rcS.d/S45cleanfs
ln -sf ../init.d/udev_retry ${ETCDIR}/rc.d/rcS.d/S50udev_retry
ln -sf ../init.d/console ${ETCDIR}/rc.d/rcS.d/S70console
ln -sf ../init.d/sysctl ${ETCDIR}/rc.d/rcS.d/S90sysctl
rc0: files
ln -sf ../init.d/network ${ETCDIR}/rc.d/rc0.d/K80network
ln -sf ../init.d/sysklogd ${ETCDIR}/rc.d/rc0.d/K90sysklogd
ln -sf ../init.d/sendsignals ${ETCDIR}/rc.d/rc0.d/K92sendsignals
ln -sf ../init.d/swap ${ETCDIR}/rc.d/rc0.d/K94swap
ln -sf ../init.d/mountfs ${ETCDIR}/rc.d/rc0.d/K96mountfs
ln -sf ../init.d/localnet ${ETCDIR}/rc.d/rc0.d/K98localnet
ln -sf ../init.d/halt ${ETCDIR}/rc.d/rc0.d/S99halt
rc1: files
ln -sf ../init.d/network ${ETCDIR}/rc.d/rc1.d/K80network
ln -sf ../init.d/sysklogd ${ETCDIR}/rc.d/rc1.d/K90sysklogd
rc2: files
ln -sf ../init.d/network ${ETCDIR}/rc.d/rc2.d/S10network
ln -sf ../init.d/sysklogd ${ETCDIR}/rc.d/rc2.d/S20sysklogd
rc3: files
ln -sf ../init.d/sysklogd ${ETCDIR}/rc.d/rc3.d/S10sysklogd
ln -sf ../init.d/network ${ETCDIR}/rc.d/rc3.d/S20network
rc4: files
ln -sf ../init.d/sysklogd ${ETCDIR}/rc.d/rc4.d/S10sysklogd
ln -sf ../init.d/network ${ETCDIR}/rc.d/rc4.d/S20network
rc5: files
ln -sf ../init.d/sysklogd ${ETCDIR}/rc.d/rc5.d/S10sysklogd
ln -sf ../init.d/network ${ETCDIR}/rc.d/rc5.d/S20network
rc6: files
ln -sf ../init.d/network ${ETCDIR}/rc.d/rc6.d/K80network
ln -sf ../init.d/sysklogd ${ETCDIR}/rc.d/rc6.d/K90sysklogd
ln -sf ../init.d/sendsignals ${ETCDIR}/rc.d/rc6.d/K92sendsignals
ln -sf ../init.d/swap ${ETCDIR}/rc.d/rc6.d/K94swap
ln -sf ../init.d/mountfs ${ETCDIR}/rc.d/rc6.d/K96mountfs
ln -sf ../init.d/localnet ${ETCDIR}/rc.d/rc6.d/K98localnet
ln -sf ../init.d/reboot ${ETCDIR}/rc.d/rc6.d/S99reboot
uninstall:
rm -rf ${DESTDIR}/lib/services ${DESTDIR}/lib/lsb ${ETCDIR}/rc.d ${ETCDIR}/init.d \
${SBIN}/ifup ${SBIN}/ifdown ${MAN8}/ifup.8 ${MAN8}/ifdown.8 \
${ETCDIR}/sysconfig/rc
.PHONY: all create-dirs install files links rcS rc0 rc1 rc2 rc3 rc4 rc5 rc6 uninstall

74
bootscripts/README Normal file
View File

@ -0,0 +1,74 @@
Network Configuration:
Script Files:
/etc/rc.d/init.d/*
/sbin/ifup
/sbin/ifdown
/lib/lsb/*
Configuration Files:
/etc/sysconfig/ifconfig.*
Note: ifconfig.* files will be processed
in alphanumerical order on boot, and reversed on shutdown.
- IFACE : The interface that is being configured (e.g. eth0)
- SERVICE: Which script to run in services directory.
- ONBOOT : If set to yes, this interface will be started on bootup
/etc/sysconfig/network
- HOSTNAME: Value of the system's hostname (From LFS Book)
This value may also be set in /etc/sysconfig/rc.site
Additional Configuration:
SERVICE ipv4-static:
- IP : Static IP Address
- GATEWAY : Specifies the IP Address of the gateway server
- PREFIX : CIDR prefix of IP Address, defaults to 24 if not set
- PEER : IP Address of peer (for point-to-point connections and tunnels)
- BROADCAST: Broadcast address
SERVICE ipv4-static-route:
- TYPE : network (default type if not specified), default, host or unreachable
- IP : IP Address of target (for network, host and unreachable)
- PREFIX : CIDR prefix of target (for network, host and unreachable)
- GATEWAY: IP Address of gateway to reach target (for network and default)
SetClock configuration:
Configuration Files:
/etc/sysconfig/clock or /etc/sysconfig/rc.site
- UTC: 1 assumes hwclock is in UTC
0 assumes hwclock is in local time
- CLOCKPARAMS: any additional options to be passed to hwclock
CleanFS configuration:
Script Files:
/etc/rc.d/init.d/cleanfs
Configuration Files:
/etc/sysconfig/rc.site
- SKIPTMPCLEAN: skips cleaning of /tmp directory
/etc/sysconfig/createfiles
Each line is parsed, using space as a deliminator.
[NAME] [TYPE] [PERMISSIONS] [USER] [GROUP]
The below fields are currently only used on dev type.
([DEV TYPE] [MAJOR#] [MINOR#])
Name:
File/Directory/Device name
Type:
dir: creates a directory
file: creates a file
dev: creates a device
Permissions:
chmod the created file
User/Group:
chown the created file/dir to this user/group
Dev Type:
char: character [needs MAJOR#, MINOR#]
block: block [needs MAJOR#, MINOR#]
pipe: pipe
Major#:
Used by character and block devices.
Minor#:
Used by character and block devices.

View File

@ -0,0 +1,149 @@
#!/bin/sh
########################################################################
# Begin checkfs
#
# Description : File System Check
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# A. Luebke - luebke@users.sourceforge.net
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
# Based on checkfs script from LFS-3.1 and earlier.
#
# From man fsck
# 0 - No errors
# 1 - File system errors corrected
# 2 - System should be rebooted
# 4 - File system errors left uncorrected
# 8 - Operational error
# 16 - Usage or syntax error
# 32 - Fsck canceled by user request
# 128 - Shared library error
#
#########################################################################
### BEGIN INIT INFO
# Provides: checkfs
# Required-Start: udev swap
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Checks local filesystems before mounting.
# Description: Checks local filesystmes before mounting.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
if [ -f /fastboot ]; then
msg="/fastboot found, will omit "
msg="${msg} file system checks as requested.\n"
log_info_msg "${msg}"
exit 0
fi
log_info_msg "Mounting root file system in read-only mode... "
mount -n -o remount,ro / >/dev/null
if [ ${?} != 0 ]; then
log_failure_msg2
msg="\n\nCannot check root "
msg="${msg}filesystem because it could not be mounted "
msg="${msg}in read-only mode.\n\n"
msg="${msg}After you press Enter, this system will be "
msg="${msg}halted and powered off.\n\n"
log_failure_msg "${msg}"
log_info_msg "Press Enter to continue..."
wait_for_user
/etc/rc.d/init.d/halt stop
else
log_success_msg2
fi
if [ -f /forcefsck ]; then
msg="/forcefsck found, forcing file"
msg="${msg} system checks as requested."
log_success_msg "$msg"
options="-f"
else
options=""
fi
log_info_msg "Checking file systems..."
# Note: -a option used to be -p; but this fails e.g. on fsck.minix
if is_true "$VERBOSE_FSCK"; then
fsck ${options} -a -A -C -T
else
fsck ${options} -a -A -C -T >/dev/null
fi
error_value=${?}
if [ "${error_value}" = 0 ]; then
log_success_msg2
fi
if [ "${error_value}" = 1 ]; then
msg="\nWARNING:\n\nFile system errors "
msg="${msg}were found and have been corrected.\n"
msg="${msg} You may want to double-check that "
msg="${msg}everything was fixed properly."
log_warning_msg "$msg"
fi
if [ "${error_value}" = 2 -o "${error_value}" = 3 ]; then
msg="\nWARNING:\n\nFile system errors "
msg="${msg}were found and have been been "
msg="${msg}corrected, but the nature of the "
msg="${msg}errors require this system to be rebooted.\n\n"
msg="${msg}After you press enter, "
msg="${msg}this system will be rebooted\n\n"
log_failure_msg "$msg"
log_info_msg "Press Enter to continue..."
wait_for_user
reboot -f
fi
if [ "${error_value}" -gt 3 -a "${error_value}" -lt 16 ]; then
msg="\nFAILURE:\n\nFile system errors "
msg="${msg}were encountered that could not be "
msg="${msg}fixed automatically.\nThis system "
msg="${msg}cannot continue to boot and will "
msg="${msg}therefore be halted until those "
msg="${msg}errors are fixed manually by a "
msg="${msg}System Administrator.\n\n"
msg="${msg}After you press Enter, this system will be "
msg="${msg}halted and powered off.\n\n"
log_failure_msg "$msg"
log_info_msg "Press Enter to continue..."
wait_for_user
/etc/rc.d/init.d/halt stop
fi
if [ "${error_value}" -ge 16 ]; then
msg="FAILURE:\n\nUnexpected failure "
msg="${msg}running fsck. Exited with error "
msg="${msg} code: ${error_value}.\n"
log_info_msg $msg
exit ${error_value}
fi
exit 0
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End checkfs

View File

@ -0,0 +1,122 @@
#!/bin/sh
########################################################################
# Begin cleanfs
#
# Description : Clean file system
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: cleanfs
# Required-Start: $local_fs
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Cleans temporary directories early in the boot process.
# Description: Cleans temporary directories /run, /var/lock, and
# optionally, /tmp. cleanfs also creates /run/utmp
# and any files defined in /etc/sysconfig/createfiles.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
# Function to create files/directory on boot.
create_files()
{
# Input to file descriptor 9 and output to stdin (redirection)
exec 9>&0 < /etc/sysconfig/createfiles
while read name type perm usr grp dtype maj min junk
do
# Ignore comments and blank lines.
case "${name}" in
""|\#*) continue ;;
esac
# Ignore existing files.
if [ ! -e "${name}" ]; then
# Create stuff based on its type.
case "${type}" in
dir)
mkdir "${name}"
;;
file)
:> "${name}"
;;
dev)
case "${dtype}" in
char)
mknod "${name}" c ${maj} ${min}
;;
block)
mknod "${name}" b ${maj} ${min}
;;
pipe)
mknod "${name}" p
;;
*)
log_warning_msg "\nUnknown device type: ${dtype}"
;;
esac
;;
*)
log_warning_msg "\nUnknown type: ${type}"
continue
;;
esac
# Set up the permissions, too.
chown ${usr}:${grp} "${name}"
chmod ${perm} "${name}"
fi
done
# Close file descriptor 9 (end redirection)
exec 0>&9 9>&-
return 0
}
case "${1}" in
start)
log_info_msg "Cleaning file systems:"
if [ "${SKIPTMPCLEAN}" = "" ]; then
log_info_msg2 " /tmp"
cd /tmp &&
find . -xdev -mindepth 1 ! -name lost+found -delete || failed=1
fi
> /run/utmp
if grep -q '^utmp:' /etc/group ; then
chmod 664 /run/utmp
chgrp utmp /run/utmp
fi
(exit ${failed})
evaluate_retval
if grep -E -qv '^(#|$)' /etc/sysconfig/createfiles 2>/dev/null; then
log_info_msg "Creating files and directories... "
create_files # Always returns 0
evaluate_retval
fi
exit $failed
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End cleanfs

View File

@ -0,0 +1,107 @@
#!/bin/sh
########################################################################
# Begin console
#
# Description : Sets keymap and screen font
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# Alexander E. Patrakov
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: console
# Required-Start: $local_fs
# Should-Start: udev_retry
# Required-Stop:
# Should-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Sets up a localised console.
# Description: Sets up fonts and language settings for the user's
# local as defined by /etc/sysconfig/console.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
# Native English speakers probably don't have /etc/sysconfig/console at all
[ -r /etc/sysconfig/console ] && . /etc/sysconfig/console
failed=0
case "${1}" in
start)
# See if we need to do anything
if [ -z "${KEYMAP}" ] && [ -z "${KEYMAP_CORRECTIONS}" ] &&
[ -z "${FONT}" ] && [ -z "${LEGACY_CHARSET}" ] &&
! is_true "${UNICODE}"; then
exit 0
fi
# There should be no bogus failures below this line!
log_info_msg "Setting up Linux console..."
# Figure out if a framebuffer console is used
[ -d /sys/class/graphics/fb0 ] && use_fb=1 || use_fb=0
# Figure out the command to set the console into the
# desired mode
is_true "${UNICODE}" &&
MODE_COMMAND="echo -en '\033%G' && kbd_mode -u" ||
MODE_COMMAND="echo -en '\033%@\033(K' && kbd_mode -a"
# On framebuffer consoles, font has to be set for each vt in
# UTF-8 mode. This doesn't hurt in non-UTF-8 mode also.
! is_true "${use_fb}" || [ -z "${FONT}" ] ||
MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}"
# Apply that command to all consoles mentioned in
# /etc/inittab. Important: in the UTF-8 mode this should
# happen before setfont, otherwise a kernel bug will
# show up and the unicode map of the font will not be
# used.
for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab |
grep -o '\btty[[:digit:]]*\b'`
do
openvt -f -w -c ${TTY#tty} -- \
/bin/sh -c "${MODE_COMMAND}" || failed=1
done
# Set the font (if not already set above) and the keymap
[ "${use_fb}" == "1" ] || [ -z "${FONT}" ] || setfont $FONT || failed=1
[ -z "${KEYMAP}" ] ||
loadkeys ${KEYMAP} >/dev/null 2>&1 ||
failed=1
[ -z "${KEYMAP_CORRECTIONS}" ] ||
loadkeys ${KEYMAP_CORRECTIONS} >/dev/null 2>&1 ||
failed=1
# Convert the keymap from $LEGACY_CHARSET to UTF-8
[ -z "$LEGACY_CHARSET" ] ||
dumpkeys -c "$LEGACY_CHARSET" | loadkeys -u >/dev/null 2>&1 ||
failed=1
# If any of the commands above failed, the trap at the
# top would set $failed to 1
( exit $failed )
evaluate_retval
exit $failed
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End console

View File

@ -0,0 +1,43 @@
#!/bin/sh
########################################################################
# Begin halt
#
# Description : Halt Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
# : Pierre Labastie - pierre@linuxfromscratch.org
#
# Version : LFS 7.0
#
# Notes : Update March 24th, 2022: change "stop" to "start".
# Add the $last facility to Required-start
#
########################################################################
### BEGIN INIT INFO
# Provides: halt
# Required-Start: $last
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 0
# Default-Stop:
# Short-Description: Halts the system.
# Description: Halts the System.
# X-LFS-Provided-By: LFS
### END INIT INFO
case "${1}" in
start)
halt -d -f -i -p
;;
*)
echo "Usage: {start}"
exit 1
;;
esac
# End halt

View File

@ -0,0 +1,70 @@
#!/bin/sh
########################################################################
# Begin localnet
#
# Description : Loopback device
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: localnet
# Required-Start: mountvirtfs
# Should-Start: modules
# Required-Stop:
# Should-Stop:
# Default-Start: S
# Default-Stop: 0 6
# Short-Description: Starts the local network.
# Description: Sets the hostname of the machine and starts the
# loopback interface.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network
[ -r /etc/hostname ] && HOSTNAME=`cat /etc/hostname`
case "${1}" in
start)
log_info_msg "Bringing up the loopback interface..."
ip addr add 127.0.0.1/8 label lo dev lo
ip link set lo up
evaluate_retval
log_info_msg "Setting hostname to ${HOSTNAME}..."
hostname ${HOSTNAME}
evaluate_retval
;;
stop)
log_info_msg "Bringing down the loopback interface..."
ip link set lo down
evaluate_retval
;;
restart)
${0} stop
sleep 1
${0} start
;;
status)
echo "Hostname is: $(hostname)"
ip link show lo
;;
*)
echo "Usage: ${0} {start|stop|restart|status}"
exit 1
;;
esac
exit 0
# End localnet

View File

@ -0,0 +1,82 @@
#!/bin/sh
########################################################################
# Begin modules
#
# Description : Module auto-loading script
#
# Authors : Zack Winkles
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: modules
# Required-Start: mountvirtfs
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Loads required modules.
# Description: Loads modules listed in /etc/sysconfig/modules.
# X-LFS-Provided-By: LFS
### END INIT INFO
# Assure that the kernel has module support.
[ -e /proc/modules ] || exit 0
. /lib/lsb/init-functions
case "${1}" in
start)
# Exit if there's no modules file or there are no
# valid entries
[ -r /etc/sysconfig/modules ] || exit 0
grep -E -qv '^($|#)' /etc/sysconfig/modules || exit 0
log_info_msg "Loading modules:"
# Only try to load modules if the user has actually given us
# some modules to load.
while read module args; do
# Ignore comments and blank lines.
case "$module" in
""|"#"*) continue ;;
esac
# Attempt to load the module, passing any arguments provided.
modprobe ${module} ${args} >/dev/null
# Print the module name if successful, otherwise take note.
if [ $? -eq 0 ]; then
log_info_msg2 " ${module}"
else
failedmod="${failedmod} ${module}"
fi
done < /etc/sysconfig/modules
# Print a message about successfully loaded modules on the correct line.
log_success_msg2
# Print a failure message with a list of any modules that
# may have failed to load.
if [ -n "${failedmod}" ]; then
log_failure_msg "Failed to load modules:${failedmod}"
exit 1
fi
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
exit 0
# End modules

View File

@ -0,0 +1,78 @@
#!/bin/sh
########################################################################
# Begin mountfs
#
# Description : File System Mount Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: $local_fs
# Required-Start: udev checkfs
# Should-Start: modules
# Required-Stop: localnet
# Should-Stop:
# Default-Start: S
# Default-Stop: 0 6
# Short-Description: Mounts/unmounts local filesystems defined in /etc/fstab.
# Description: Remounts root filesystem read/write and mounts all
# remaining local filesystems defined in /etc/fstab on
# start. Remounts root filesystem read-only and unmounts
# remaining filesystems on stop.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
log_info_msg "Remounting root file system in read-write mode..."
mount --options remount,rw / >/dev/null
evaluate_retval
# Remove fsck-related file system watermarks.
rm -f /fastboot /forcefsck
# Make sure /dev/pts exists
mkdir -p /dev/pts
# This will mount all filesystems that do not have _netdev in
# their option list. _netdev denotes a network filesystem.
log_info_msg "Mounting remaining file systems..."
failed=0
mount --all --test-opts no_netdev >/dev/null || failed=1
evaluate_retval
exit $failed
;;
stop)
# Don't unmount virtual file systems like /run
log_info_msg "Unmounting all other currently mounted file systems..."
# Ensure any loop devies are removed
losetup -D
umount --all --detach-loop --read-only \
--types notmpfs,nosysfs,nodevtmpfs,noproc,nodevpts >/dev/null
evaluate_retval
# Make sure / is mounted read only (umount bug)
mount --options remount,ro /
# Make all LVM volume groups unavailable, if appropriate
# This fails if swap or / are on an LVM partition
#if [ -x /sbin/vgchange ]; then /sbin/vgchange -an > /dev/null; fi
;;
*)
echo "Usage: ${0} {start|stop}"
exit 1
;;
esac
# End mountfs

View File

@ -0,0 +1,74 @@
#!/bin/sh
########################################################################
# Begin mountvirtfs
#
# Description : Ensure proc, sysfs, run, and dev are mounted
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: mountvirtfs
# Required-Start: $first
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Mounts various special fs needed at start
# Description: Mounts /sys and /proc virtual (kernel) filesystems.
# Mounts /run (tmpfs) and /dev (devtmpfs).
# This is done only if they are not already mounted.
# with the kernel config proposed in the book, dev
# should be automatically mounted by the kernel.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
# Make sure /run is available before logging any messages
if ! mountpoint /run >/dev/null; then
mount /run || failed=1
fi
mkdir -p /run/lock /run/shm
chmod 1777 /run/shm /run/lock
log_info_msg "Mounting virtual file systems: ${INFO}/run"
if ! mountpoint /proc >/dev/null; then
log_info_msg2 " ${INFO}/proc"
mount -o nosuid,noexec,nodev /proc || failed=1
fi
if ! mountpoint /sys >/dev/null; then
log_info_msg2 " ${INFO}/sys"
mount -o nosuid,noexec,nodev /sys || failed=1
fi
if ! mountpoint /dev >/dev/null; then
log_info_msg2 " ${INFO}/dev"
mount -o mode=0755,nosuid /dev || failed=1
fi
ln -sfn /run/shm /dev/shm
(exit ${failed})
evaluate_retval
exit $failed
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End mountvirtfs

View File

@ -0,0 +1,90 @@
#!/bin/sh
########################################################################
# Begin network
#
# Description : Network Control Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: $network
# Required-Start: $local_fs localnet swap
# Should-Start: $syslog firewalld iptables nftables
# Required-Stop: $local_fs localnet swap
# Should-Stop: $syslog firewalld iptables nftables
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts and configures network interfaces.
# Description: Starts and configures network interfaces.
# X-LFS-Provided-By: LFS
### END INIT INFO
case "${1}" in
start)
# if the default route exists, network is already configured
if ip route | grep -q "^default"; then return 0; fi
# Start all network interfaces
for file in /etc/sysconfig/ifconfig.*
do
interface=${file##*/ifconfig.}
# Skip if $file is * (because nothing was found)
if [ "${interface}" = "*" ]; then continue; fi
/sbin/ifup ${interface}
done
;;
stop)
# Unmount any network mounted file systems
umount --all --force --types nfs,cifs,nfs4
# Reverse list
net_files=""
for file in /etc/sysconfig/ifconfig.*
do
net_files="${file} ${net_files}"
done
# Stop all network interfaces
for file in ${net_files}
do
interface=${file##*/ifconfig.}
# Skip if $file is * (because nothing was found)
if [ "${interface}" = "*" ]; then continue; fi
# See if interface exists
if [ ! -e /sys/class/net/$interface ]; then continue; fi
# Is interface UP?
ip link show $interface 2>/dev/null | grep -q "state UP"
if [ $? -ne 0 ]; then continue; fi
/sbin/ifdown ${interface}
done
;;
restart)
${0} stop
sleep 1
${0} start
;;
*)
echo "Usage: ${0} {start|stop|restart}"
exit 1
;;
esac
exit 0
# End network

227
bootscripts/lfs/init.d/rc Normal file
View File

@ -0,0 +1,227 @@
#!/bin/bash
########################################################################
# Begin rc
#
# Description : Main Run Level Control Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# : DJ Lucas - dj@linuxfromscratch.org
# Updates : Bruce Dubbs - bdubbs@linuxfromscratch.org
# : Pierre Labastie - pierre@linuxfromscratch.org
#
# Version : LFS 7.0
#
# Notes : Updates March 24th, 2022: new semantics of S/K files
# - Instead of testing that S scripts were K scripts in the
# previous runlevel, test that they were not S scripts
# - Instead of testing that K scripts were S scripts in the
# previous runlevel, test that they were not K scripts
# - S scripts in runlevel 0 or 6 are now run with
# "script start" (was "script stop" previously).
########################################################################
. /lib/lsb/init-functions
print_error_msg()
{
log_failure_msg
# $i is set when called
MSG="FAILURE:\n\nYou should not be reading this error message.\n\n"
MSG="${MSG}It means that an unforeseen error took place in\n"
MSG="${MSG}${i},\n"
MSG="${MSG}which exited with a return value of ${error_value}.\n"
MSG="${MSG}If you're able to track this error down to a bug in one of\n"
MSG="${MSG}the files provided by the ${DISTRO_MINI} book,\n"
MSG="${MSG}please be so kind to inform us at ${DISTRO_CONTACT}.\n"
log_failure_msg "${MSG}"
log_info_msg "Press Enter to continue..."
wait_for_user
}
check_script_status()
{
# $i is set when called
if [ ! -f ${i} ]; then
log_warning_msg "${i} is not a valid symlink."
SCRIPT_STAT="1"
fi
if [ ! -x ${i} ]; then
log_warning_msg "${i} is not executable, skipping."
SCRIPT_STAT="1"
fi
}
run()
{
if [ -z $interactive ]; then
${1} ${2}
return $?
fi
while true; do
read -p "Run ${1} ${2} (Yes/no/continue)? " -n 1 runit
echo
case ${runit} in
c | C)
interactive=""
${i} ${2}
ret=${?}
break;
;;
n | N)
return 0
;;
y | Y)
${i} ${2}
ret=${?}
break
;;
esac
done
return $ret
}
# Read any local settings/overrides
[ -r /etc/sysconfig/rc.site ] && source /etc/sysconfig/rc.site
DISTRO=${DISTRO:-"Linux From Scratch"}
DISTRO_CONTACT=${DISTRO_CONTACT:-"lfs-dev@lists.linuxfromscratch.org (Registration required)"}
DISTRO_MINI=${DISTRO_MINI:-"LFS"}
IPROMPT=${IPROMPT:-"no"}
# These 3 signals will not cause our script to exit
trap "" INT QUIT TSTP
[ "${1}" != "" ] && runlevel=${1}
if [ "${runlevel}" == "" ]; then
echo "Usage: ${0} <runlevel>" >&2
exit 1
fi
previous=${PREVLEVEL}
[ "${previous}" == "" ] && previous=N
if [ ! -d /etc/rc.d/rc${runlevel}.d ]; then
log_info_msg "/etc/rc.d/rc${runlevel}.d does not exist.\n"
exit 1
fi
if [ "$runlevel" == "6" -o "$runlevel" == "0" ]; then IPROMPT="no"; fi
# Note: In ${LOGLEVEL:-7}, it is ':' 'dash' '7', not minus 7
if [ "$runlevel" == "S" ]; then
[ -r /etc/sysconfig/console ] && source /etc/sysconfig/console
dmesg -n "${LOGLEVEL:-7}"
fi
if [ "${IPROMPT}" == "yes" -a "${runlevel}" == "S" ]; then
# The total length of the distro welcome string, without escape codes
wlen=${wlen:-$(echo "Welcome to ${DISTRO}" | wc -c )}
welcome_message=${welcome_message:-"Welcome to ${INFO}${DISTRO}${NORMAL}"}
# The total length of the interactive string, without escape codes
ilen=${ilen:-$(echo "Press 'I' to enter interactive startup" | wc -c )}
i_message=${i_message:-"Press '${FAILURE}I${NORMAL}' to enter interactive startup"}
# dcol and icol are spaces before the message to center the message
# on screen. itime is the amount of wait time for the user to press a key
wcol=$(( ( ${COLUMNS} - ${wlen} ) / 2 ))
icol=$(( ( ${COLUMNS} - ${ilen} ) / 2 ))
itime=${itime:-"3"}
echo -e "\n\n"
echo -e "\\033[${wcol}G${welcome_message}"
echo -e "\\033[${icol}G${i_message}${NORMAL}"
echo ""
read -t "${itime}" -n 1 interactive 2>&1 > /dev/null
fi
# Make lower case
[ "${interactive}" == "I" ] && interactive="i"
[ "${interactive}" != "i" ] && interactive=""
# Read the state file if it exists from runlevel S
[ -r /run/interactive ] && source /run/interactive
# Stop all services marked as K, except if marked as K in the previous
# runlevel: it is the responsibility of the script to not try to kill
# a non running service
if [ "${previous}" != "N" ]; then
for i in $(ls -v /etc/rc.d/rc${runlevel}.d/K* 2> /dev/null)
do
check_script_status
if [ "${SCRIPT_STAT}" == "1" ]; then
SCRIPT_STAT="0"
continue
fi
suffix=${i#/etc/rc.d/rc${runlevel}.d/K[0-9][0-9]}
[ -e /etc/rc.d/rc${previous}.d/K[0-9][0-9]$suffix ] && continue
run ${i} stop
error_value=${?}
if [ "${error_value}" != "0" ]; then print_error_msg; fi
done
fi
if [ "${previous}" == "N" ]; then export IN_BOOT=1; fi
if [ "$runlevel" == "6" -a -n "${FASTBOOT}" ]; then
touch /fastboot
fi
# Start all services marked as S in this runlevel, except if marked as
# S in the previous runlevel
# it is the responsabily of the script to not try to start an already running
# service
for i in $( ls -v /etc/rc.d/rc${runlevel}.d/S* 2> /dev/null)
do
if [ "${previous}" != "N" ]; then
suffix=${i#/etc/rc.d/rc${runlevel}.d/S[0-9][0-9]}
[ -e /etc/rc.d/rc${previous}.d/S[0-9][0-9]$suffix ] && continue
fi
check_script_status
if [ "${SCRIPT_STAT}" == "1" ]; then
SCRIPT_STAT="0"
continue
fi
run ${i} start
error_value=${?}
if [ "${error_value}" != "0" ]; then print_error_msg; fi
done
# Store interactive variable on switch from runlevel S and remove if not
if [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; then
echo "interactive=\"i\"" > /run/interactive
else
rm -f /run/interactive 2> /dev/null
fi
# Copy the boot log on initial boot only
if [ "${previous}" == "N" -a "${runlevel}" != "S" ]; then
cat $BOOTLOG >> /var/log/boot.log
# Mark the end of boot
echo "--------" >> /var/log/boot.log
# Remove the temporary file
rm -f $BOOTLOG 2> /dev/null
fi
# End rc

View File

@ -0,0 +1,47 @@
#!/bin/sh
########################################################################
# Begin reboot
#
# Description : Reboot Scripts
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Updates : Bruce Dubbs - bdubbs@linuxfromscratch.org
# : Pierre Labastie - pierre@linuxfromscratch.org
#
# Version : LFS 7.0
#
# Notes : Update March 24th, 2022: change "stop" to "start".
# Add the $last facility to Required-start
#
########################################################################
### BEGIN INIT INFO
# Provides: reboot
# Required-Start: $last
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 6
# Default-Stop:
# Short-Description: Reboots the system.
# Description: Reboots the System.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
log_info_msg "Restarting system..."
reboot -d -f -i
;;
*)
echo "Usage: ${0} {start}"
exit 1
;;
esac
# End reboot

View File

@ -0,0 +1,69 @@
#!/bin/sh
########################################################################
# Begin sendsignals
#
# Description : Sendsignals Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: sendsignals
# Required-Start:
# Should-Start:
# Required-Stop: $local_fs swap localnet
# Should-Stop:
# Default-Start:
# Default-Stop: 0 6
# Short-Description: Attempts to kill remaining processes.
# Description: Attempts to kill remaining processes.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
stop)
omit=$(pidof mdmon)
[ -n "$omit" ] && omit="-o $omit"
log_info_msg "Sending all processes the TERM signal..."
killall5 -15 $omit
error_value=${?}
sleep ${KILLDELAY}
if [ "${error_value}" = 0 -o "${error_value}" = 2 ]; then
log_success_msg
else
log_failure_msg
fi
log_info_msg "Sending all processes the KILL signal..."
killall5 -9 $omit
error_value=${?}
sleep ${KILLDELAY}
if [ "${error_value}" = 0 -o "${error_value}" = 2 ]; then
log_success_msg
else
log_failure_msg
fi
;;
*)
echo "Usage: ${0} {stop}"
exit 1
;;
esac
exit 0
# End sendsignals

View File

@ -0,0 +1,63 @@
#!/bin/sh
########################################################################
# Begin setclock
#
# Description : Setting Linux Clock
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Should-Start: modules
# Required-Stop:
# Should-Stop: $syslog
# Default-Start: S
# Default-Stop:
# Short-Description: Stores and restores time from the hardware clock
# Description: On boot, system time is obtained from hwclock. The
# hardware clock can also be set on shutdown.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
[ -r /etc/sysconfig/clock ] && . /etc/sysconfig/clock
case "${UTC}" in
yes|true|1)
CLOCKPARAMS="${CLOCKPARAMS} --utc"
;;
no|false|0)
CLOCKPARAMS="${CLOCKPARAMS} --localtime"
;;
esac
case ${1} in
start)
hwclock --hctosys ${CLOCKPARAMS} >/dev/null
;;
stop)
log_info_msg "Setting hardware clock..."
hwclock --systohc ${CLOCKPARAMS} >/dev/null
evaluate_retval
;;
*)
echo "Usage: ${0} {start|stop}"
exit 1
;;
esac
exit 0

View File

@ -0,0 +1,63 @@
#!/bin/sh
########################################################################
# Begin swap
#
# Description : Swap Control Script
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: swap
# Required-Start: udev
# Should-Start: modules
# Required-Stop: localnet
# Should-Stop: $local_fs
# Default-Start: S
# Default-Stop: 0 6
# Short-Description: Mounts and unmounts swap partitions.
# Description: Mounts and unmounts swap partitions defined in
# /etc/fstab.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
log_info_msg "Activating all swap files/partitions..."
swapon -a
evaluate_retval
;;
stop)
log_info_msg "Deactivating all swap files/partitions..."
swapoff -a
evaluate_retval
;;
restart)
${0} stop
sleep 1
${0} start
;;
status)
log_success_msg "Retrieving swap status."
swapon -s
;;
*)
echo "Usage: ${0} {start|stop|restart|status}"
exit 1
;;
esac
exit 0
# End swap

View File

@ -0,0 +1,54 @@
#!/bin/sh
########################################################################
# Begin sysctl
#
# Description : File uses /etc/sysctl.conf to set kernel runtime
# parameters
#
# Authors : Nathan Coulson (nathan@linuxfromscratch.org)
# Matthew Burgress (matthew@linuxfromscratch.org)
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: sysctl
# Required-Start: mountvirtfs
# Should-Start: console
# Required-Stop:
# Should-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Makes changes to the proc filesystem
# Description: Makes changes to the proc filesystem as defined in
# /etc/sysctl.conf. See 'man sysctl(8)'.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
if [ -f "/etc/sysctl.conf" ]; then
log_info_msg "Setting kernel runtime parameters..."
sysctl -q -p
evaluate_retval
fi
;;
status)
sysctl -a
;;
*)
echo "Usage: ${0} {start|status}"
exit 1
;;
esac
exit 0
# End sysctl

View File

@ -0,0 +1,79 @@
#!/bin/sh
########################################################################
# Begin sysklogd
#
# Description : Sysklogd loader
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: $syslog
# Required-Start: $first localnet
# Should-Start:
# Required-Stop: $local_fs
# Should-Stop: sendsignals
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts kernel and system log daemons.
# Description: Starts kernel and system log daemons.
# /etc/fstab.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
log_info_msg "Starting system log daemon..."
parms=${SYSKLOGD_PARMS-'-m 0'}
start_daemon /sbin/syslogd $parms
evaluate_retval
log_info_msg "Starting kernel log daemon..."
start_daemon /sbin/klogd
evaluate_retval
;;
stop)
log_info_msg "Stopping kernel log daemon..."
killproc /sbin/klogd
evaluate_retval
log_info_msg "Stopping system log daemon..."
killproc /sbin/syslogd
evaluate_retval
;;
reload)
log_info_msg "Reloading system log daemon config file..."
pid=`pidofproc syslogd`
kill -HUP "${pid}"
evaluate_retval
;;
restart)
${0} stop
sleep 1
${0} start
;;
status)
statusproc /sbin/syslogd
statusproc klogd
;;
*)
echo "Usage: ${0} {start|stop|reload|restart|status}"
exit 1
;;
esac
exit 0
# End sysklogd

View File

@ -0,0 +1,69 @@
#!/bin/sh
########################################################################
# Begin scriptname
#
# Description :
#
# Authors :
#
# Version : LFS x.x
#
# Notes :
#
########################################################################
### BEGIN INIT INFO
# Provides: template
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
# X-LFS-Provided-By:
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
log_info_msg "Starting..."
# if it is possible to use start_daemon
start_daemon fully_qualified_path
# if it is not possible to use start_daemon
# (command to start the daemon is not simple enough)
if ! pidofproc daemon_name_as_reported_by_ps >/dev/null; then
command_to_start_the_service
fi
evaluate_retval
;;
stop)
log_info_msg "Stopping..."
# if it is possible to use killproc
killproc fully_qualified_path
# if it is not possible to use killproc
# (the daemon shoudn't be stopped by killing it)
if pidofproc daemon_name_as_reported_by_ps >/dev/null; then
command_to_stop_the_service
fi
evaluate_retval
;;
restart)
${0} stop
sleep 1
${0} start
;;
*)
echo "Usage: ${0} {start|stop|restart}"
exit 1
;;
esac
exit 0
# End scriptname

View File

@ -0,0 +1,76 @@
#!/bin/sh
########################################################################
# Begin udev
#
# Description : Udev cold-plugging script
#
# Authors : Zack Winkles, Alexander E. Patrakov
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: udev $time
# Required-Start: localnet
# Should-Start: modules
# Required-Stop:
# Should-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Populates /dev with device nodes.
# Description: Mounts a tempfs on /dev and starts the udevd daemon.
# Device nodes are created as defined by udev.
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
log_info_msg "Populating /dev with device nodes... "
if ! grep -q '[[:space:]]sysfs' /proc/mounts; then
log_failure_msg2
msg="FAILURE:\n\nUnable to create "
msg="${msg}devices without a SysFS filesystem\n\n"
msg="${msg}After you press Enter, this system "
msg="${msg}will be halted and powered off.\n\n"
log_info_msg "$msg"
log_info_msg "Press Enter to continue..."
wait_for_user
/etc/rc.d/init.d/halt stop
fi
# Start the udev daemon to continually watch for, and act on,
# uevents
/sbin/udevd --daemon
# Now traverse /sys in order to "coldplug" devices that have
# already been discovered
/sbin/udevadm trigger --action=add --type=subsystems
/sbin/udevadm trigger --action=add --type=devices
/sbin/udevadm trigger --action=change --type=devices
# Now wait for udevd to process the uevents we triggered
if ! is_true "$OMIT_UDEV_SETTLE"; then
/sbin/udevadm settle
fi
# If any LVM based partitions are on the system, ensure they
# are activated so they can be used.
if [ -x /sbin/vgchange ]; then /sbin/vgchange -a y >/dev/null; fi
log_success_msg2
;;
*)
echo "Usage ${0} {start}"
exit 1
;;
esac
exit 0
# End udev

View File

@ -0,0 +1,75 @@
#!/bin/sh
########################################################################
# Begin udev_retry
#
# Description : Udev cold-plugging script (retry)
#
# Authors : Alexander E. Patrakov
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
# Bryan Kadzban -
#
# Version : LFS 7.0
#
########################################################################
### BEGIN INIT INFO
# Provides: udev_retry
# Required-Start: udev
# Should-Start: $local_fs cleanfs
# Required-Stop:
# Should-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Replays failed uevents and creates additional devices.
# Description: Replays any failed uevents that were skipped due to
# slow hardware initialization, and creates those needed
# device nodes
# X-LFS-Provided-By: LFS
### END INIT INFO
. /lib/lsb/init-functions
case "${1}" in
start)
log_info_msg "Retrying failed uevents, if any..."
# As of udev-186, the --run option is no longer valid
#rundir=$(/sbin/udevadm info --run)
rundir=/run/udev
# From Debian: "copy the rules generated before / was mounted
# read-write":
for file in ${rundir}/tmp-rules--*; do
dest=${file##*tmp-rules--}
[ "$dest" = '*' ] && break
cat $file >> /etc/udev/rules.d/$dest
rm -f $file
done
# Re-trigger the uevents that may have failed,
# in hope they will succeed now
/bin/sed -e 's/#.*$//' /etc/sysconfig/udev_retry | /bin/grep -v '^$' | \
while read line ; do
for subsystem in $line ; do
/sbin/udevadm trigger --subsystem-match=$subsystem --action=add
done
done
# Now wait for udevd to process the uevents we triggered
if ! is_true "$OMIT_UDEV_RETRY_SETTLE"; then
/sbin/udevadm settle
fi
evaluate_retval
;;
*)
echo "Usage ${0} {start}"
exit 1
;;
esac
exit 0
# End udev_retry

View File

@ -0,0 +1,810 @@
#!/bin/sh
########################################################################
#
# Begin /lib/lsb/init-funtions
#
# Description : Run Level Control Functions
#
# Authors : Gerard Beekmans - gerard@linuxfromscratch.org
# : DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
# Notes : With code based on Matthias Benkmann's simpleinit-msb
# http://winterdrache.de/linux/newboot/index.html
#
# The file should be located in /lib/lsb
#
########################################################################
## Environmental setup
# Setup default values for environment
umask 022
export PATH="/bin:/usr/bin:/sbin:/usr/sbin"
## Set color commands, used via echo
# Please consult `man console_codes for more information
# under the "ECMA-48 Set Graphics Rendition" section
#
# Warning: when switching from a 8bit to a 9bit font,
# the linux console will reinterpret the bold (1;) to
# the top 256 glyphs of the 9bit font. This does
# not affect framebuffer consoles
NORMAL="\\033[0;39m" # Standard console grey
SUCCESS="\\033[1;32m" # Success is green
WARNING="\\033[1;33m" # Warnings are yellow
FAILURE="\\033[1;31m" # Failures are red
INFO="\\033[1;36m" # Information is light cyan
BRACKET="\\033[1;34m" # Brackets are blue
# Use a colored prefix
BMPREFIX=" "
SUCCESS_PREFIX="${SUCCESS} * ${NORMAL} "
FAILURE_PREFIX="${FAILURE}*****${NORMAL} "
WARNING_PREFIX="${WARNING} *** ${NORMAL} "
SKIP_PREFIX="${INFO} S ${NORMAL}"
SUCCESS_SUFFIX="${BRACKET}[${SUCCESS} OK ${BRACKET}]${NORMAL}"
FAILURE_SUFFIX="${BRACKET}[${FAILURE} FAIL ${BRACKET}]${NORMAL}"
WARNING_SUFFIX="${BRACKET}[${WARNING} WARN ${BRACKET}]${NORMAL}"
SKIP_SUFFIX="${BRACKET}[${INFO} SKIP ${BRACKET}]${NORMAL}"
BOOTLOG=/run/bootlog
KILLDELAY=3
SCRIPT_STAT="0"
# Set any user specified environment variables e.g. HEADLESS
[ -r /etc/sysconfig/rc.site ] && . /etc/sysconfig/rc.site
## Screen Dimensions
# Find current screen size
if [ -z "${COLUMNS}" ]; then
COLUMNS=$(stty size)
COLUMNS=${COLUMNS##* }
fi
# When using remote connections, such as a serial port, stty size returns 0
if [ "${COLUMNS}" = "0" ]; then
COLUMNS=80
fi
## Measurements for positioning result messages
COL=$((${COLUMNS} - 8))
WCOL=$((${COL} - 2))
## Set Cursor Position Commands, used via echo
SET_COL="\\033[${COL}G" # at the $COL char
SET_WCOL="\\033[${WCOL}G" # at the $WCOL char
CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char
CURS_ZERO="\\033[0G"
################################################################################
# start_daemon() #
# Usage: start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args...] #
# #
# Purpose: This runs the specified program as a daemon #
# #
# Inputs: -f: (force) run the program even if it is already running. #
# -n nicelevel: specify a nice level. See 'man nice(1)'. #
# -p pidfile: use the specified file to determine PIDs. #
# pathname: the complete path to the specified program #
# args: additional arguments passed to the program (pathname) #
# #
# Return values (as defined by LSB exit codes): #
# 0 - program is running or service is OK #
# 1 - generic or unspecified error #
# 2 - invalid or excessive argument(s) #
# 5 - program is not installed #
################################################################################
start_daemon()
{
local force=""
local nice="0"
local pidfile=""
local pidlist=""
local retval=""
# Process arguments
while true
do
case "${1}" in
-f)
force="1"
shift 1
;;
-n)
nice="${2}"
shift 2
;;
-p)
pidfile="${2}"
shift 2
;;
-*)
return 2
;;
*)
program="${1}"
break
;;
esac
done
# Check for a valid program
if [ ! -e "${program}" ]; then return 5; fi
# Execute
if [ -z "${force}" ]; then
if [ -z "${pidfile}" ]; then
# Determine the pid by discovery
pidlist=`pidofproc "${1}"`
retval="${?}"
else
# The PID file contains the needed PIDs
# Note that by LSB requirement, the path must be given to pidofproc,
# however, it is not used by the current implementation or standard.
pidlist=`pidofproc -p "${pidfile}" "${1}"`
retval="${?}"
fi
# Return a value ONLY
# It is the init script's (or distribution's functions) responsibilty
# to log messages!
case "${retval}" in
0)
# Program is already running correctly, this is a
# successful start.
return 0
;;
1)
# Program is not running, but an invalid pid file exists
# remove the pid file and continue
rm -f "${pidfile}"
;;
3)
# Program is not running and no pidfile exists
# do nothing here, let start_deamon continue.
;;
*)
# Others as returned by status values shall not be interpreted
# and returned as an unspecified error.
return 1
;;
esac
fi
# Do the start!
nice -n "${nice}" "${@}"
}
################################################################################
# killproc() #
# Usage: killproc [-p pidfile] pathname [signal] #
# #
# Purpose: Send control signals to running processes #
# #
# Inputs: -p pidfile, uses the specified pidfile #
# pathname, pathname to the specified program #
# signal, send this signal to pathname #
# #
# Return values (as defined by LSB exit codes): #
# 0 - program (pathname) has stopped/is already stopped or a #
# running program has been sent specified signal and stopped #
# successfully #
# 1 - generic or unspecified error #
# 2 - invalid or excessive argument(s) #
# 5 - program is not installed #
# 7 - program is not running and a signal was supplied #
################################################################################
killproc()
{
local pidfile
local program
local prefix
local progname
local signal="-TERM"
local fallback="-KILL"
local nosig
local pidlist
local retval
local pid
local delay="30"
local piddead
local dtime
# Process arguments
while true; do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
*)
program="${1}"
if [ -n "${2}" ]; then
signal="${2}"
fallback=""
else
nosig=1
fi
# Error on additional arguments
if [ -n "${3}" ]; then
return 2
else
break
fi
;;
esac
done
# Check for a valid program
if [ ! -e "${program}" ]; then return 5; fi
# Check for a valid signal
check_signal "${signal}"
if [ "${?}" -ne "0" ]; then return 2; fi
# Get a list of pids
if [ -z "${pidfile}" ]; then
# determine the pid by discovery
pidlist=`pidofproc "${1}"`
retval="${?}"
else
# The PID file contains the needed PIDs
# Note that by LSB requirement, the path must be given to pidofproc,
# however, it is not used by the current implementation or standard.
pidlist=`pidofproc -p "${pidfile}" "${1}"`
retval="${?}"
fi
# Return a value ONLY
# It is the init script's (or distribution's functions) responsibilty
# to log messages!
case "${retval}" in
0)
# Program is running correctly
# Do nothing here, let killproc continue.
;;
1)
# Program is not running, but an invalid pid file exists
# Remove the pid file.
progname=${program##*/}
if [[ -e "/run/${progname}.pid" ]]; then
pidfile="/run/${progname}.pid"
rm -f "${pidfile}"
fi
# This is only a success if no signal was passed.
if [ -n "${nosig}" ]; then
return 0
else
return 7
fi
;;
3)
# Program is not running and no pidfile exists
# This is only a success if no signal was passed.
if [ -n "${nosig}" ]; then
return 0
else
return 7
fi
;;
*)
# Others as returned by status values shall not be interpreted
# and returned as an unspecified error.
return 1
;;
esac
# Perform different actions for exit signals and control signals
check_sig_type "${signal}"
if [ "${?}" -eq "0" ]; then # Signal is used to terminate the program
# Account for empty pidlist (pid file still exists and no
# signal was given)
if [ "${pidlist}" != "" ]; then
# Kill the list of pids
for pid in ${pidlist}; do
kill -0 "${pid}" 2> /dev/null
if [ "${?}" -ne "0" ]; then
# Process is dead, continue to next and assume all is well
continue
else
kill "${signal}" "${pid}" 2> /dev/null
# Wait up to ${delay}/10 seconds to for "${pid}" to
# terminate in 10ths of a second
while [ "${delay}" -ne "0" ]; do
kill -0 "${pid}" 2> /dev/null || piddead="1"
if [ "${piddead}" = "1" ]; then break; fi
sleep 0.1
delay="$(( ${delay} - 1 ))"
done
# If a fallback is set, and program is still running, then
# use the fallback
if [ -n "${fallback}" -a "${piddead}" != "1" ]; then
kill "${fallback}" "${pid}" 2> /dev/null
sleep 1
# Check again, and fail if still running
kill -0 "${pid}" 2> /dev/null && return 1
fi
fi
done
fi
# Check for and remove stale PID files.
if [ -z "${pidfile}" ]; then
# Find the basename of $program
prefix=`echo "${program}" | sed 's/[^/]*$//'`
progname=`echo "${program}" | sed "s@${prefix}@@"`
if [ -e "/run/${progname}.pid" ]; then
rm -f "/run/${progname}.pid" 2> /dev/null
fi
else
if [ -e "${pidfile}" ]; then rm -f "${pidfile}" 2> /dev/null; fi
fi
# For signals that do not expect a program to exit, simply
# let kill do its job, and evaluate kill's return for value
else # check_sig_type - signal is not used to terminate program
for pid in ${pidlist}; do
kill "${signal}" "${pid}"
if [ "${?}" -ne "0" ]; then return 1; fi
done
fi
}
################################################################################
# pidofproc() #
# Usage: pidofproc [-p pidfile] pathname #
# #
# Purpose: This function returns one or more pid(s) for a particular daemon #
# #
# Inputs: -p pidfile, use the specified pidfile instead of pidof #
# pathname, path to the specified program #
# #
# Return values (as defined by LSB status codes): #
# 0 - Success (PIDs to stdout) #
# 1 - Program is dead, PID file still exists (remaining PIDs output) #
# 3 - Program is not running (no output) #
################################################################################
pidofproc()
{
local pidfile
local program
local prefix
local progname
local pidlist
local lpids
local exitstatus="0"
# Process arguments
while true; do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
*)
program="${1}"
if [ -n "${2}" ]; then
# Too many arguments
# Since this is status, return unknown
return 4
else
break
fi
;;
esac
done
# If a PID file is not specified, try and find one.
if [ -z "${pidfile}" ]; then
# Get the program's basename
prefix=`echo "${program}" | sed 's/[^/]*$//'`
if [ -z "${prefix}" ]; then
progname="${program}"
else
progname=`echo "${program}" | sed "s@${prefix}@@"`
fi
# If a PID file exists with that name, assume that is it.
if [ -e "/run/${progname}.pid" ]; then
pidfile="/run/${progname}.pid"
fi
fi
# If a PID file is set and exists, use it.
if [ -n "${pidfile}" -a -e "${pidfile}" ]; then
# Use the value in the first line of the pidfile
pidlist=`/bin/head -n1 "${pidfile}"`
# This can optionally be written as 'sed 1q' to repalce 'head -n1'
# should LFS move /bin/head to /usr/bin/head
else
# Use pidof
pidlist=`pidof "${program}"`
fi
# Figure out if all listed PIDs are running.
for pid in ${pidlist}; do
kill -0 ${pid} 2> /dev/null
if [ "${?}" -eq "0" ]; then
lpids="${lpids}${pid} "
else
exitstatus="1"
fi
done
if [ -z "${lpids}" -a ! -f "${pidfile}" ]; then
return 3
else
echo "${lpids}"
return "${exitstatus}"
fi
}
################################################################################
# statusproc() #
# Usage: statusproc [-p pidfile] pathname #
# #
# Purpose: This function prints the status of a particular daemon to stdout #
# #
# Inputs: -p pidfile, use the specified pidfile instead of pidof #
# pathname, path to the specified program #
# #
# Return values: #
# 0 - Status printed #
# 1 - Input error. The daemon to check was not specified. #
################################################################################
statusproc()
{
local pidfile
local pidlist
if [ "${#}" = "0" ]; then
echo "Usage: statusproc [-p pidfle] {program}"
exit 1
fi
# Process arguments
while true; do
case "${1}" in
-p)
pidfile="${2}"
shift 2
;;
*)
if [ -n "${2}" ]; then
echo "Too many arguments"
return 1
else
break
fi
;;
esac
done
if [ -n "${pidfile}" ]; then
pidlist=`pidofproc -p "${pidfile}" $@`
else
pidlist=`pidofproc $@`
fi
# Trim trailing blanks
pidlist=`echo "${pidlist}" | sed -r 's/ +$//'`
base="${1##*/}"
if [ -n "${pidlist}" ]; then
/bin/echo -e "${INFO}${base} is running with Process" \
"ID(s) ${pidlist}.${NORMAL}"
else
if [ -n "${base}" -a -e "/run/${base}.pid" ]; then
/bin/echo -e "${WARNING}${1} is not running but" \
"/run/${base}.pid exists.${NORMAL}"
else
if [ -n "${pidfile}" -a -e "${pidfile}" ]; then
/bin/echo -e "${WARNING}${1} is not running" \
"but ${pidfile} exists.${NORMAL}"
else
/bin/echo -e "${INFO}${1} is not running.${NORMAL}"
fi
fi
fi
}
################################################################################
# timespec() #
# #
# Purpose: An internal utility function to format a timestamp #
# a boot log file. Sets the STAMP variable. #
# #
# Return value: Not used #
################################################################################
timespec()
{
STAMP="$(echo `date +"%b %d %T %:z"` `hostname`) "
return 0
}
################################################################################
# log_success_msg() #
# Usage: log_success_msg ["message"] #
# #
# Purpose: Print a successful status message to the screen and #
# a boot log file. #
# #
# Inputs: $@ - Message #
# #
# Return values: Not used #
################################################################################
log_success_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}"
# Strip non-printable characters from log file
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
timespec
/bin/echo -e "${STAMP} ${logmessage} OK" >> ${BOOTLOG}
return 0
}
log_success_msg2()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}"
echo " OK" >> ${BOOTLOG}
return 0
}
################################################################################
# log_failure_msg() #
# Usage: log_failure_msg ["message"] #
# #
# Purpose: Print a failure status message to the screen and #
# a boot log file. #
# #
# Inputs: $@ - Message #
# #
# Return values: Not used #
################################################################################
log_failure_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}"
# Strip non-printable characters from log file
timespec
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
/bin/echo -e "${STAMP} ${logmessage} FAIL" >> ${BOOTLOG}
return 0
}
log_failure_msg2()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}"
echo "FAIL" >> ${BOOTLOG}
return 0
}
################################################################################
# log_warning_msg() #
# Usage: log_warning_msg ["message"] #
# #
# Purpose: Print a warning status message to the screen and #
# a boot log file. #
# #
# Return values: Not used #
################################################################################
log_warning_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${WARNING_PREFIX}${SET_COL}${WARNING_SUFFIX}"
# Strip non-printable characters from log file
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
timespec
/bin/echo -e "${STAMP} ${logmessage} WARN" >> ${BOOTLOG}
return 0
}
log_skip_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${SKIP_PREFIX}${SET_COL}${SKIP_SUFFIX}"
# Strip non-printable characters from log file
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
/bin/echo "SKIP" >> ${BOOTLOG}
return 0
}
################################################################################
# log_info_msg() #
# Usage: log_info_msg message #
# #
# Purpose: Print an information message to the screen and #
# a boot log file. Does not print a trailing newline character. #
# #
# Return values: Not used #
################################################################################
log_info_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
# Strip non-printable characters from log file
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
timespec
/bin/echo -n -e "${STAMP} ${logmessage}" >> ${BOOTLOG}
return 0
}
log_info_msg2()
{
/bin/echo -n -e "${@}"
# Strip non-printable characters from log file
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
/bin/echo -n -e "${logmessage}" >> ${BOOTLOG}
return 0
}
################################################################################
# evaluate_retval() #
# Usage: Evaluate a return value and print success or failure as appropriate #
# #
# Purpose: Convenience function to terminate an info message #
# #
# Return values: Not used #
################################################################################
evaluate_retval()
{
local error_value="${?}"
if [ ${error_value} = 0 ]; then
log_success_msg2
else
log_failure_msg2
fi
}
################################################################################
# check_signal() #
# Usage: check_signal [ -{signal} ] #
# #
# Purpose: Check for a valid signal. This is not defined by any LSB draft, #
# however, it is required to check the signals to determine if the #
# signals chosen are invalid arguments to the other functions. #
# #
# Inputs: Accepts a single string value in the form of -{signal} #
# #
# Return values: #
# 0 - Success (signal is valid #
# 1 - Signal is not valid #
################################################################################
check_signal()
{
local valsig
# Add error handling for invalid signals
valsig=" -ALRM -HUP -INT -KILL -PIPE -POLL -PROF -TERM -USR1 -USR2"
valsig="${valsig} -VTALRM -STKFLT -PWR -WINCH -CHLD -URG -TSTP -TTIN"
valsig="${valsig} -TTOU -STOP -CONT -ABRT -FPE -ILL -QUIT -SEGV -TRAP"
valsig="${valsig} -SYS -EMT -BUS -XCPU -XFSZ -0 -1 -2 -3 -4 -5 -6 -8 -9"
valsig="${valsig} -11 -13 -14 -15 "
echo "${valsig}" | grep -- " ${1} " > /dev/null
if [ "${?}" -eq "0" ]; then
return 0
else
return 1
fi
}
################################################################################
# check_sig_type() #
# Usage: check_signal [ -{signal} | {signal} ] #
# #
# Purpose: Check if signal is a program termination signal or a control signal #
# This is not defined by any LSB draft, however, it is required to #
# check the signals to determine if they are intended to end a #
# program or simply to control it. #
# #
# Inputs: Accepts a single string value in the form or -{signal} or {signal} #
# #
# Return values: #
# 0 - Signal is used for program termination #
# 1 - Signal is used for program control #
################################################################################
check_sig_type()
{
local valsig
# The list of termination signals (limited to generally used items)
valsig=" -ALRM -INT -KILL -TERM -PWR -STOP -ABRT -QUIT -2 -3 -6 -9 -14 -15 "
echo "${valsig}" | grep -- " ${1} " > /dev/null
if [ "${?}" -eq "0" ]; then
return 0
else
return 1
fi
}
################################################################################
# wait_for_user() #
# #
# Purpose: Wait for the user to respond if not a headless system #
# #
################################################################################
wait_for_user()
{
# Wait for the user by default
[ "${HEADLESS=0}" = "0" ] && read ENTER
return 0
}
################################################################################
# is_true() #
# #
# Purpose: Utility to test if a variable is true | yes | 1 #
# #
################################################################################
is_true()
{
[ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ] || [ "$1" = "y" ] ||
[ "$1" = "t" ]
}
# End /lib/lsb/init-functions

View File

@ -0,0 +1,81 @@
#!/bin/sh
########################################################################
# Begin /lib/services/ipv4-static
#
# Description : IPV4 Static Boot Script
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
. /lib/lsb/init-functions
. ${IFCONFIG}
if [ -z "${IP}" ]; then
log_failure_msg "\nIP variable missing from ${IFCONFIG}, cannot continue."
exit 1
fi
if [ -z "${PREFIX}" -a -z "${PEER}" ]; then
log_warning_msg "\nPREFIX variable missing from ${IFCONFIG}, assuming 24."
PREFIX=24
args="${args} ${IP}/${PREFIX}"
elif [ -n "${PREFIX}" -a -n "${PEER}" ]; then
log_failure_msg "\nPREFIX and PEER both specified in ${IFCONFIG}, cannot continue."
exit 1
elif [ -n "${PREFIX}" ]; then
args="${args} ${IP}/${PREFIX}"
elif [ -n "${PEER}" ]; then
args="${args} ${IP} peer ${PEER}"
fi
if [ -n "${LABEL}" ]; then
args="${args} label ${LABEL}"
fi
if [ -n "${BROADCAST}" ]; then
args="${args} broadcast ${BROADCAST}"
fi
case "${2}" in
up)
if [ "$(ip addr show ${1} 2>/dev/null | grep ${IP}/)" = "" ]; then
log_info_msg "Adding IPv4 address ${IP} to the ${1} interface..."
ip addr add ${args} dev ${1}
evaluate_retval
else
log_warning_msg "Cannot add IPv4 address ${IP} to ${1}. Already present."
fi
;;
down)
if [ "$(ip addr show ${1} 2>/dev/null | grep ${IP}/)" != "" ]; then
log_info_msg "Removing IPv4 address ${IP} from the ${1} interface..."
ip addr del ${args} dev ${1}
evaluate_retval
fi
if [ -n "${GATEWAY}" ]; then
# Only remove the gateway if there are no remaining ipv4 addresses
if [ "$(ip addr show ${1} 2>/dev/null | grep 'inet ')" != "" ]; then
log_info_msg "Removing default gateway..."
ip route del default
evaluate_retval
fi
fi
;;
*)
echo "Usage: ${0} [interface] {up|down}"
exit 1
;;
esac
# End /lib/services/ipv4-static

View File

@ -0,0 +1,98 @@
#!/bin/sh
########################################################################
# Begin /lib/services/ipv4-static-route
#
# Description : IPV4 Static Route Script
#
# Authors : Kevin P. Fleming - kpfleming@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
########################################################################
. /lib/lsb/init-functions
. ${IFCONFIG}
case "${TYPE}" in
("" | "network")
need_ip=1
need_gateway=1
;;
("default")
need_gateway=1
args="${args} default"
desc="default"
;;
("host")
need_ip=1
;;
("unreachable")
need_ip=1
args="${args} unreachable"
desc="unreachable "
;;
(*)
log_failure_msg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue."
exit 1
;;
esac
if [ -n "${GATEWAY}" ]; then
MSG="The GATEWAY variable cannot be set in ${IFCONFIG} for static routes.\n"
log_failure_msg "$MSG Use STATIC_GATEWAY only, cannot continue"
exit 1
fi
if [ -n "${need_ip}" ]; then
if [ -z "${IP}" ]; then
log_failure_msg "IP variable missing from ${IFCONFIG}, cannot continue."
exit 1
fi
if [ -z "${PREFIX}" ]; then
log_failure_msg "PREFIX variable missing from ${IFCONFIG}, cannot continue."
exit 1
fi
args="${args} ${IP}/${PREFIX}"
desc="${desc}${IP}/${PREFIX}"
fi
if [ -n "${need_gateway}" ]; then
if [ -z "${STATIC_GATEWAY}" ]; then
log_failure_msg "STATIC_GATEWAY variable missing from ${IFCONFIG}, cannot continue."
exit 1
fi
args="${args} via ${STATIC_GATEWAY}"
fi
if [ -n "${SOURCE}" ]; then
args="${args} src ${SOURCE}"
fi
case "${2}" in
up)
log_info_msg "Adding '${desc}' route to the ${1} interface..."
ip route add ${args} dev ${1}
evaluate_retval
;;
down)
log_info_msg "Removing '${desc}' route from the ${1} interface..."
ip route del ${args} dev ${1}
evaluate_retval
;;
*)
echo "Usage: ${0} [interface] {up|down}"
exit 1
;;
esac
# End /lib/services/ipv4-static-route

100
bootscripts/lfs/sbin/ifdown Normal file
View File

@ -0,0 +1,100 @@
#!/bin/bash
########################################################################
# Begin /sbin/ifdown
#
# Description : Interface Down
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
#
# Version : LFS 7.0
#
# Notes : the IFCONFIG variable is passed to the scripts found
# in the /lib/services directory, to indicate what file the
# service should source to get interface specifications.
#
########################################################################
RELEASE="7.0"
USAGE="Usage: $0 [ -hV ] [--help] [--version] interface"
VERSTR="LFS ifdown, version ${RELEASE}"
while [ $# -gt 0 ]; do
case "$1" in
--help | -h) help="y"; break ;;
--version | -V) echo "${VERSTR}"; exit 0 ;;
-*) echo "ifup: ${1}: invalid option" >&2
echo "${USAGE}" >& 2
exit 2 ;;
*) break ;;
esac
done
if [ -n "$help" ]; then
echo "${VERSTR}"
echo "${USAGE}"
echo
cat << HERE_EOF
ifdown is used to bring down a network interface. The interface
parameter, e.g. eth0 or eth0:2, must match the trailing part of the
interface specifications file, e.g. /etc/sysconfig/ifconfig.eth0:2.
HERE_EOF
exit 0
fi
file=/etc/sysconfig/ifconfig.${1}
# Skip backup files
[ "${file}" = "${file%""~""}" ] || exit 0
. /lib/lsb/init-functions
if [ ! -r "${file}" ]; then
log_warning_msg "${file} is missing or cannot be accessed."
exit 1
fi
. ${file}
if [ "$IFACE" = "" ]; then
log_failure_msg "${file} does not define an interface [IFACE]."
exit 1
fi
# We only need to first service to bring down the interface
S=`echo ${SERVICE} | cut -f1 -d" "`
if ip link show ${IFACE} > /dev/null 2>&1; then
if [ -n "${S}" -a -x "/lib/services/${S}" ]; then
IFCONFIG=${file} /lib/services/${S} ${IFACE} down
else
MSG="Unable to process ${file}. Either "
MSG="${MSG}the SERVICE variable was not set "
MSG="${MSG}or the specified service cannot be executed."
log_failure_msg "$MSG"
exit 1
fi
else
log_warning_msg "Interface ${1} doesn't exist."
fi
# Leave the interface up if there are additional interfaces in the device
link_status=`ip link show ${IFACE} 2>/dev/null`
if [ -n "${link_status}" ]; then
if [ "$(echo "${link_status}" | grep UP)" != "" ]; then
if [ "$(ip addr show ${IFACE} | grep 'inet ')" == "" ]; then
log_info_msg "Bringing down the ${IFACE} interface..."
ip link set ${IFACE} down
evaluate_retval
fi
fi
fi
# End /sbin/ifdown

150
bootscripts/lfs/sbin/ifup Normal file
View File

@ -0,0 +1,150 @@
#!/bin/sh
########################################################################
# Begin /sbin/ifup
#
# Description : Interface Up
#
# Authors : Nathan Coulson - nathan@linuxfromscratch.org
# Kevin P. Fleming - kpfleming@linuxfromscratch.org
# Update : Bruce Dubbs - bdubbs@linuxfromscratch.org
# DJ Lucas - dj@linuxfromscratch.org
#
# Version : LFS 7.7
#
# Notes : The IFCONFIG variable is passed to the SERVICE script
# in the /lib/services directory, to indicate what file the
# service should source to get interface specifications.
#
########################################################################
up()
{
log_info_msg "Bringing up the ${1} interface..."
if ip link show $1 > /dev/null 2>&1; then
link_status=`ip link show $1`
if [ -n "${link_status}" ]; then
if ! echo "${link_status}" | grep -q UP; then
ip link set $1 up
fi
fi
else
log_failure_msg "Interface ${IFACE} doesn't exist."
exit 1
fi
evaluate_retval
}
RELEASE="7.7"
USAGE="Usage: $0 [ -hV ] [--help] [--version] interface"
VERSTR="LFS ifup, version ${RELEASE}"
while [ $# -gt 0 ]; do
case "$1" in
--help | -h) help="y"; break ;;
--version | -V) echo "${VERSTR}"; exit 0 ;;
-*) echo "ifup: ${1}: invalid option" >&2
echo "${USAGE}" >& 2
exit 2 ;;
*) break ;;
esac
done
if [ -n "$help" ]; then
echo "${VERSTR}"
echo "${USAGE}"
echo
cat << HERE_EOF
ifup is used to bring up a network interface. The interface
parameter, e.g. eth0 or eth0:2, must match the trailing part of the
interface specifications file, e.g. /etc/sysconfig/ifconfig.eth0:2.
HERE_EOF
exit 0
fi
file=/etc/sysconfig/ifconfig.${1}
# Skip backup files
[ "${file}" = "${file%""~""}" ] || exit 0
. /lib/lsb/init-functions
if [ ! -r "${file}" ]; then
log_failure_msg "Unable to bring up ${1} interface! ${file} is missing or cannot be accessed."
exit 1
fi
. $file
if [ "$IFACE" = "" ]; then
log_failure_msg "Unable to bring up ${1} interface! ${file} does not define an interface [IFACE]."
exit 1
fi
# Do not process this service if started by boot, and ONBOOT
# is not set to yes
if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then
exit 0
fi
# Bring up the interface
if [ "$VIRTINT" != "yes" ]; then
up ${IFACE}
fi
for S in ${SERVICE}; do
if [ ! -x "/lib/services/${S}" ]; then
MSG="\nUnable to process ${file}. Either "
MSG="${MSG}the SERVICE '${S} was not present "
MSG="${MSG}or cannot be executed."
log_failure_msg "$MSG"
exit 1
fi
done
if [ "${SERVICE}" = "wpa" ]; then log_success_msg; fi
# Create/configure the interface
for S in ${SERVICE}; do
IFCONFIG=${file} /lib/services/${S} ${IFACE} up
done
# Set link up virtual interfaces
if [ "${VIRTINT}" == "yes" ]; then
up ${IFACE}
fi
# Bring up any additional interface components
for I in $INTERFACE_COMPONENTS; do up $I; done
# Set MTU if requested. Check if MTU has a "good" value.
if test -n "${MTU}"; then
if [[ ${MTU} =~ ^[0-9]+$ ]] && [[ $MTU -ge 68 ]] ; then
for I in $IFACE $INTERFACE_COMPONENTS; do
ip link set dev $I mtu $MTU;
done
else
log_info_msg2 "Invalid MTU $MTU"
fi
fi
# Set the route default gateway if requested
if [ -n "${GATEWAY}" ]; then
if ip route | grep -q default; then
log_warning_msg "Gateway already setup; skipping."
else
log_info_msg "Adding default gateway ${GATEWAY} to the ${IFACE} interface..."
ip route add default via ${GATEWAY} dev ${IFACE}
evaluate_retval
fi
fi
# End /sbin/ifup

185
bootscripts/lfs/sbin/ifup.8 Normal file
View File

@ -0,0 +1,185 @@
ifup(8) ifup(8)
NAME
ifup - bring a network interface up
ifdown - take a network interface down
SYNOPSIS
ifup IFACE
ifup -h|--help
ifup -V|--version
ifdown IFACE
ifdown -h|--help
ifdown -V|--version
DESCRIPTION
The ifup and ifdown commands may be used to configure
(or, respectively, deconfigure) a network interface based
on interface definitions in the file
/etc/sysconfig/ifconfig.IFACE.
OPTIONS
A summary of options is included below.
-h, --help
Show summary of options.
-V, --version
Show version information.
EXAMPLES
ifup eth0
Bring up the interface defined in the file
/etc/sysconfig/ifconfig.eth0
ONBOOT=no
IFACE=eth0
SERVICE=ipv4-static
IP=192.168.1.22
GATEWAY=192.168.1.1
PREFIX=24
BROADCAST=192.168.1.255
ifdown eth0:2
Bring down the interface defined in the file
/etc/sysconfig/ifconfig.eth0:2
ONBOOT=no
IFACE=eth0
LABEL=eth0:2
SERVICE=dhcpcd
DHCP_START="--waitip"
DHCP_STOP="-k"
# Set PRINTIP="yes" to have the script print the DHCP IP address
PRINTIP="yes"
# Set PRINTALL="yes" to print the DHCP assigned values for
# IP, SM, DG, and 1st NS.
PRINTALL="no"
ifup br0
Bring up the interface defined in the file
/etc/sysconfig/ifconfig.br0
ONBOOT=yes
IFACE=br0
SERVICE="bridge ipv4-static"
IP=192.168.1.22
GATEWAY=192.168.1.1
PREFIX=24
BROADCAST=192.168.1.255
STP=no # Spanning tree protocol, default no
INTERFACE_COMPONENTS=eth0 # Add to IFACE
IP_FORWARD=true
NOTES
The program does not configure network interfaces direct-
ly. It runs scripts defined by the SERVICE variable in
the network configuration file.
The configuration files must have the following environ-
ment variables set:
IFACE - The interface to configure, e.g. eth0. It must
be available in /sys/class/net.
SERVICE - The service script to run to bring up the inter-
face. Standard services are ipv4-static and
ipv4-static-route. Other services such as dhcp
or bridge may be installed. This value may
be a list of services when the interface is a
compound device such as a bridge.
ONBOOT - If set to 'yes', the specified interface is
configured by the netowrk boot script.
GATEWAY - The default IP address to use for routing if
the destination IP address is not in a static
route or on a local network, e.g., 192.168.1.1.
For secondary IP addresses on an interface, this
parameter should not be specified. If the service
is ipv4-static-route, this parameter must NOT
be set.
STATIC_GATEWAY - The default IP address to use for routing
when setting a static routing address.
INTERFACE_COMPONENTS - A list of component interfaces
only needed for a compound device such as a bridge.
This list is normally a single value, e.g. eth0,
for use with a virtual host such as kvm.
Other paramters that are service specific include:
ipv4-static
IP - The IP address of the interface,
e.g. 192.168.1.2.
PREFIX - The number of bits that specify the network
number of the interface. The default, if not
specified, is 24.
LABEL - The label to be assigned to the interface.
This is normally specified for assigning
additional IP addresses to a network
device. Example: eth0:2 (optional)
BROADCAST - The brodcast address for this interface,
e.g 192.168.1.255. If not specified,
the broadcast address will be calculated
from the IP and PREFIX.
ipv4-static-route
TYPE - The type of route, typically 'default',
'network', 'or host'.
IP - The IP address for a network or host, if the
TYPE is not 'default'.
PREFIX - The prefix for the associated IP address.
STATIC_GATEWAY - The IP address for a network route.
SOURCE - The source IP address to prefer when sending
to the destinations covered by the specified
route. (optional)
dhcp/dhclient
DHCP_START - Optional parameters to pass to the dhcp client
at startup.
DHCP_STOP - Optional paremeters to pass to the dhcp client
at shutdown.
PRINTIP - Flag to print the dhcp address to stdout
PRINTALL - Flag to print all obtained dhcp data to stdout
bridge
IP_FORWARD - An optional flag to enable the system to forward
inbound IP packets received by one interface to
another outbound interface.
STP - Set bridge spanning tree protocol. Default is no.
FILES
/etc/sysconfig/ifconfig.*
definitions of network interfaces
AUTHORS
The ifup/ifdown suite was written by Nathan Coulson
<nathan@linuxfromscratch.org> and Kevin P. Fleming
<kpfleming@linuxfromscratch.org>
and updated by Bruce Dubbs <bdubbs@linuxfromscratch>.
SEE ALSO
ip(8).
IFUP/IFDOWN 8 February 2015 ifup(8)

View File

@ -0,0 +1,31 @@
########################################################################
# Begin /etc/sysconfig/createfiles
#
# Description : Createfiles script config file
#
# Authors :
#
# Version : 00.00
#
# Notes : The syntax of this file is as follows:
# if type is equal to "file" or "dir"
# <filename> <type> <permissions> <user> <group>
# if type is equal to "dev"
# <filename> <type> <permissions> <user> <group> <devtype>
# <major> <minor>
#
# <filename> is the name of the file which is to be created
# <type> is either file, dir, or dev.
# file creates a new file
# dir creates a new directory
# dev creates a new device
# <devtype> is either block, char or pipe
# block creates a block device
# char creates a character deivce
# pipe creates a pipe, this will ignore the <major> and
# <minor> fields
# <major> and <minor> are the major and minor numbers used for
# the device.
########################################################################
# End /etc/sysconfig/createfiles

View File

@ -0,0 +1,18 @@
########################################################################
# Begin /etc/sysconfig/modules
#
# Description : Module auto-loading configuration
#
# Authors :
#
# Version : 00.00
#
# Notes : The syntax of this file is as follows:
# <module> [<arg1> <arg2> ...]
#
# Each module should be on its own line, and any options that you want
# passed to the module should follow it. The line deliminator is either
# a space or a tab.
########################################################################
# End /etc/sysconfig/modules

View File

@ -0,0 +1,92 @@
# rc.site
# Optional parameters for boot scripts.
# Distro Information
# These values, if specified here, override the defaults
#DISTRO="Linux From Scratch" # The distro name
#DISTRO_CONTACT="lfs-dev@lists.linuxfromscratch.org" # Bug report address
#DISTRO_MINI="LFS" # Short name used in filenames for distro config
# Define custom colors used in messages printed to the screen
# Please consult `man console_codes` for more information
# under the "ECMA-48 Set Graphics Rendition" section
#
# Warning: when switching from a 8bit to a 9bit font,
# the linux console will reinterpret the bold (1;) to
# the top 256 glyphs of the 9bit font. This does
# not affect framebuffer consoles
# These values, if specified here, override the defaults
#BRACKET="\\033[1;34m" # Blue
#FAILURE="\\033[1;31m" # Red
#INFO="\\033[1;36m" # Cyan
#NORMAL="\\033[0;39m" # Grey
#SUCCESS="\\033[1;32m" # Green
#WARNING="\\033[1;33m" # Yellow
# Use a colored prefix
# These values, if specified here, override the defaults
#BMPREFIX=" "
#SUCCESS_PREFIX="${SUCCESS} * ${NORMAL} "
#FAILURE_PREFIX="${FAILURE}*****${NORMAL} "
#WARNING_PREFIX="${WARNING} *** ${NORMAL} "
# Manually seet the right edge of message output (characters)
# Useful when resetting console font during boot to override
# automatic screen width detection
#COLUMNS=120
# Interactive startup
#IPROMPT="yes" # Whether to display the interactive boot prompt
#itime="3" # The amount of time (in seconds) to display the prompt
# The total length of the distro welcome string, without escape codes
#wlen=$(echo "Welcome to ${DISTRO}" | wc -c )
#welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}"
# The total length of the interactive string, without escape codes
#ilen=$(echo "Press 'I' to enter interactive startup" | wc -c )
#i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup"
# Set scripts to skip the file system check on reboot
#FASTBOOT=yes
# Skip reading from the console
#HEADLESS=yes
# Write out fsck progress if yes
#VERBOSE_FSCK=no
# Speed up boot without waiting for settle in udev
#OMIT_UDEV_SETTLE=y
# Speed up boot without waiting for settle in udev_retry
#OMIT_UDEV_RETRY_SETTLE=yes
# Skip cleaning /tmp if yes
#SKIPTMPCLEAN=no
# For setclock
#UTC=1
#CLOCKPARAMS=
# For consolelog (Note that the default, 7=debug, is noisy)
#LOGLEVEL=7
# For network
#HOSTNAME=mylfs
# Delay between TERM and KILL signals at shutdown
#KILLDELAY=3
# Optional sysklogd parameters
#SYSKLOGD_PARMS="-m 0"
# Console parameters
#UNICODE=1
#KEYMAP="de-latin1"
#KEYMAP_CORRECTIONS="euro2"
#FONT="lat0-16 -m 8859-15"
#LEGACY_CHARSET=

View File

@ -0,0 +1,19 @@
########################################################################
# Begin /etc/sysconfig/udev_retry
#
# Description : udev_retry script configuration
#
# Authors :
#
# Version : 00.00
#
# Notes : Each subsystem that may need to be re-triggered after mountfs
# runs should be listed in this file. Probable subsystems to be
# listed here are rtc (due to /var/lib/hwclock/adjtime) and sound
# (due to both /var/lib/alsa/asound.state and /usr/sbin/alsactl).
# Entries are whitespace-separated.
########################################################################
rtc
# End /etc/sysconfig/udev_retry