Linux Init Script로 배포하는 곳마다 다르며, 지속적으로 변화 중인 것 같아 간단히 기록한다.
아래와 같이 간단히 동작부분을 확인만 하자
#! /bin/sh
##
# DIET-PC master initialisation script
# Copyright (C) 2002-2013 Paul A Whittaker
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
[ -f /etc/profile ] && . /etc/profile
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
umask 022
notify ()
{
# To aid degugging, you might wish to uncomment the sleep command, to give
# you a chance to press the key and see errors before they scroll
# off.
#busybox sleep 3
echo -e "${HL_ON}$*${HL_OFF}"
case "$HAVE_SPLASH" in
TRUE)
## 숫자변수를 1씩 증가
NOTIFY_COUNT=$(($NOTIFY_COUNT + 1))
echo "show $((65535 * $NOTIFY_COUNT / $NOTIFY_TOTAL))" >>/proc/splash
;;
esac
}
busybox mount /proc
# If the console is a VT, we can use ANSI escapes to do highlighting. "tty"
# doesn't work until /dev is mounted, so use console=xxx in /proc/cmdline to
# determine this.
case "`busybox sed -e 's/^.*\' /etc/rc /etc/rc.d/* /usr/etc/rc.d/* /usr/local/etc/rc.d/* | busybox wc -l`-1))
else
HAVE_SPLASH=
fi
notify 'Mounting core filesystems'
ROOTDEV=`busybox sed -e 's/^.*\'; then
# If root is read-only and it is not prohibited by a "no_root_union"
# kernel parameter, try to mount a new root as a union of the original
# (read-only) root filesystem and a tmpfs (read-write) filesystem.
busybox mkdir -m 0755 /tmp/.overlay
busybox modprobe -q unionfs
busybox grep -qv '\' /proc/cmdline && busybox mount \
-t unionfs -o dirs=/tmp/.overlay=rw:/=ro none /mnt
##
if [ $? -eq 0 ]; then
cd /mnt
busybox pivot_root . ./oldroot
busybox umount /oldroot/proc 2>/dev/null
busybox mount /proc
else
# If not mounted already (via a kernel feature), mount a writable
# tmpfs /dev.
busybox awk 'BEGIN {n=0} $2 == "/dev" {n=1} END {exit n}' \
/proc/mounts && busybox mount -t tmpfs -o \
nr_blocks=256,nr_inodes=1024,mode=0755 none /dev
# If the root filesystem is still read-only, try to remount it
# read-write. Remounts don't seem to work reliably when using the
# Busybox mount applet, so only use it as a last resort.
mount -o remount,rw / 2>/dev/null || busybox mount -o remount,rw /
if [ $? -ne 0 ]; then
# If still no-go, there is no point in continuing - let the
# operator try to fix it and then reboot.
echo 'Root filesystem is not writable, please fix!'
[ "$LOCKDOWN" ] && busybox sleep 10 || busybox sulogin
exec reboot -ifd
fi
fi
fi
fi
busybox mount /sys 2>/dev/null
busybox mkdir -p /dev/pts
busybox mount /dev/pts 2>/dev/null
busybox mkdir -p /dev/shm
busybox mount /dev/shm 2>/dev/null
notify 'Initializing busybox'
busybox --install -s
# Remove any residual junk from /var/run.
rm -f /var/run/* 2>/dev/null
notify 'Initializing /dev'
ln -sf "$ROOTDEV" /dev/root 2>/dev/null
ln -snf /proc/self/fd /dev/fd
ln -sf /proc/self/fd/0 /dev/stdin
ln -sf /proc/self/fd/1 /dev/stdout
ln -sf /proc/self/fd/2 /dev/stderr
ln -sf /proc/kcore /dev/core
echo '/sbin/mdev' >/proc/sys/kernel/hotplug
mdev -s
if [ "$LOCKDOWN" ]; then
# Remove root's password hash, thereby preventing root login and su to root.
sed -i -e 's/^root:[^:]\+:/root:*:/' /etc/shadow
# Turn off console login.
sed -i -e '/^logn:/d' /etc/inittab
kill -HUP 1
# Set TCP wrappers to deny by default.
echo 'ALL: ALL' >/etc/hosts.deny
# Remove the setuid bit from busybox, to prevent use of setuid-root applets.
chmod u-s /bin/busybox
# Prevent unprivileged users from running an X11 terminal emulator.
XTERM=`which xterm`
[ "$XTERM" ] && chmod 700 "$XTERM"
fi
notify 'Initializing modules'
mkdir -p /lib/modules/`uname -r`
depmod -a
# If an eth0 hint has been provided via the boot loader or via
# /etc/modprobe.conf, use it now, in case there are multiple PCI NICs.
[ "$eth0" ] && modprobe -q `echo $eth0 | tr , ' '`
modprobe -q eth0
# Forceload some difficult modules that will otherwise neither coldplug nor
# hotplug.
modprobe -q parport
modprobe -q ppp
modprobe -q tun
modprobe -q floppy
modprobe -q loop
# Coldplug all platform, PCI, PCMCIA and USB devices initially found (in that
# order).
for BUS in platform pci pcmcia usb; do
if [ -d /sys/bus/$BUS/devices ]; then
notify "Initializing $BUS devices"
cat /sys/bus/$BUS/devices/*/modalias 2>/dev/null | while read MODULE; \
do
modprobe -q $MODULE
done
fi
done
# Some last resorts, needed only in the event that bus coldplugging has not
# initialised the necessary device.
modprobe -q ide-generic
modprobe -q scsi_hostadapter
modprobe -q sound-slot-0
# Attempt to mount the legacy usb device filesystem if a USB host controller is
# now online.
mount /proc/bus/usb 2>/dev/null
# Set a provisional hostname.
if [ "`hostname`" = '(none)' ]; then
# First try the contents of /etc/hostname, then the name of the special
# non-localhost loopback address.
HN=`cat /etc/hostname 2>/dev/null` || HN=`checkhostname -n 127.0.1.1`
# Failing that, check all local MAC addresses against /etc/ethers. If
# there is a match, set the hostname from the hostname field of the first
# matching entry.
if [ $? -ne 0 -a -f /etc/ethers ]; then
HN=`/sbin/ifconfig -a | awk 'BEGIN {printf "{IGNORECASE=1}\n"} \
/HWaddr/ {printf "$1 == \"%s\" {print $2; exit}\n", $NF}' | \
awk -f - /etc/ethers`
fi
# As a last resort, derive a hostname from the MAC address of a local
# network interface.
[ "$HN" ] || HN=`ifconfig -a | awk '/HWaddr/ {printf "X%s\n", $NF; exit}' \
| tr -d :`
# Use what we have.
[ "$HN" ] && hostname "$HN"
fi
####
## 아래의 Shell script는 /etc/network를 자동으로 proc를 정보기반으로 생성해준다.
## /etc/network 와 /etc/network/if-up.d 비롯하여 관련 directory 생성
## /proc/net/dev 정보를 바탕으로 IFACE (e.g eth0) 를 얻어 IFMETHOD 값을 설정
##
notify 'Initializing network'
mkdir -p /etc/network
(cd /etc/network; mkdir -p if-up.d if-down.d if-pre-up.d if-post-down.d)
if [ ! -f /etc/network/interfaces ]; then
notify 'Network not configured - using DHCP'
tail -n +3 /proc/net/dev | cut -f1 -d: | while read IFACE; do
case "$IFACE" in
lo)
IFMETHOD='loopback'
;;
sit*)
IFMETHOD='manual'
;;
*)
IFMETHOD='dhcp'
;;
esac
echo "auto $IFACE" >>/etc/network/interfaces
echo "iface $IFACE inet $IFMETHOD" >>/etc/network/interfaces
done
fi
ifup -a
if [ -x /bin/ifplugd -a -x /etc/ifplugd/ifplugd.action ]; then
for IFACE in `netstat -r | awk '/^[0-9]/ {print $NF}'`; do
ifplugd -i "$IFACE" -p -q
done
fi
if [ ! -s /etc/hosts.allow ]; then
# In the absence of an explicit configuration, set TCP wrappers to grant
# access to clients on any local subnet or with the same DNS domain name
# suffix.
ifconfig | grep '\>/etc/hosts.allow
NETWORK=
eval `ipcalc -n $ADDR 2>/dev/null`
[ "$NETWORK" ] && echo "ALL: $NETWORK/$MASK" >>/etc/hosts.allow
done
fi
# Check reverse lookups on all active non-loopback interfaces (now that we
# (possibly) have DNS).
HN=
for IPADDR in `ifconfig | grep 'inet addr:[0-9.]\+' | sed -e \
's/^.*inet addr:\([0-9.]\+\).*$/\1/' | grep -v '^127\.'`; do
HN=`checkhostname -n "$IPADDR" | cut -f1 -d.`
[ "$HN" ] && break
done
if [ "$HN" ]; then
# Any hostname found via reverse lookup will be considered more
# authoritative than the provisional hostname (N.B. a hostname set by
# /sbin/udhcpc-helper from DHCP results is provisional). If you don't
# want this behaviour, comment out everything except the "else" clause of
# this "if" statement (including if, else, and fi lines).
hostname "$HN"
else
# If there is no better hostname, endorse the provisional one by adding
# an /etc/hosts entry for it using a local IP address.
sed -i -e '/\<'"`hostname`"\$/d /etc/hosts
echo -e "${IPADDR:-127.0.1.1}\t`hostname`" >>/etc/hosts
fi
# If possible, set the system clock at this point. Fsck needs this for
# scheduled checks, and loggers need it for meaningful timestamps. Change -u
# to -l if you want your system clock to keep local time rather than UTC time.
# NTP synchronisation might be slow, but we can't background this, as it might
# be our last hope of getting a plausible clock setting (before fsck etc).
if [ -c /dev/rtc ]; then
notify 'Setting time from hardware clock'
if [ "`hwclock -u -r | egrep -w '(1970|2000)'`" ]; then
notify 'Sanity check failed - ignoring data from hardware clock'
else
hwclock -u -s
fi
if checkhostname -q ${timeserver:-timeserver}; then
notify 'Synchronising clock with network time server'
ntpd -n -q -p ${timeserver:-timeserver}
hwclock -u -w
ntpd -p ${timeserver:-timeserver}
fi
fi
notify 'Mounting all filesystems'
# We might have portmap (IPV4 only) or rpcbind (IPV4+IPV6) or neither.
portmap 2>/dev/null || rpcbind 2>/dev/null || true
# If you reference a network block device (/dev/nbd0 etc al) in /etc/fstab,
# you must prepare it for use here, e.g.
#nbd-client myserver 2000 /dev/nbd0 -persist >/dev/null 2>&1
# Scan for RAID arrays and try to assemble all that are found. Only start
# fully intact arrays.
if [ "`which mdadm`" ]; then
if [ ! -e /etc/mdadm.conf ]; then
echo 'MAILADDR root' >/etc/mdadm.conf
mdadm --examine --brief --scan --config=partitions >>/etc/mdadm.conf
fi
mdadm --assemble --scan --no-degraded --auto=yes
mdadm --monitor --scan --daemonise --pid-file=/var/run/mdmonitor.pid
fi
# Scan for LVM volume groups and activate all that are found.
if [ "`which lvm`" ]; then
rm -f /etc/lvm/cache/.cache
lvm pvscan
lvm vgscan
lvm vgchange -ay
fi
fsck -aCRAT
case $? in
0|1)
;;
2|3)
exec reboot -ifd
;;
*)
echo 'Fsck failed ... need help!'
[ "$LOCKDOWN" ] && sleep 10 || sulogin
exec reboot -ifd
;;
esac
mount -a 2>/dev/null
if [ $? -ne 0 ]; then
# The kernel might have been too slow to load the necessary modules during
# the first attempt, so wait a moment and then retry.
sleep 2
mount -a 2>/dev/null
fi
swapon -a 2>/dev/null
# Logging chews up a little memory but is a valuable debugging aid.
notify 'Starting loggers'
if checkhostname -q ${logserver:-logserver}; then
syslogd -m 0 -R ${logserver:-logserver}
else
syslogd -m 0 -C
fi
klogd
# Start crond (if available).
if [ -x /sbin/crond ]; then
notify 'Starting cron'
mkdir -p /var/spool/cron/crontabs
chmod 1733 /var/spool/cron/crontabs
crond
fi
notify 'Starting power management'
# If CPU frequency scaling is available, install a demand-driven governor
# to reduce power consumption and heat output when high CPU performance is not
# needed.
for CPU in /sys/devices/system/cpu/cpu*; do
if [ -f $CPU/cpufreq/scaling_governor ]; then
echo 'conservative' >$CPU/cpufreq/scaling_governor 2>/dev/null
if [ "`cat $CPU/cpufreq/scaling_governor`" != 'conservative' ]; then
echo 'ondemand' >$CPU/cpufreq/scaling_governor 2>/dev/null
fi
fi
done
# Set a 30 minute idle spin-down on all hard disks.
for DISK in /dev/hd? /dev/sd?; do
[ "$DISK" = 'hd?' -o "$DISK" = 'sd?' ] && continue
hdparm -S 241 $DISK >/dev/null 2>&1
done
if [ -f /etc/sysctl.conf ]; then
notify 'Adjusting kernel parameters'
sysctl -e -p
fi
# If you want to force canonicalization of files in /usr/etc or /usr/local/etc,
# uncomment the following "if". This will delete everything in /etc that
# previously got copied from /usr/etc and /usr/local/etc, and thereby force
# them to be copied again. This is the only way to ensure that package removal
# doesn't leave config file remnants, but may prove very confusing to users,
# who will most likely expect the /etc copies to be authoritative and
# persistent.
#if [ -s /etc/shadowfiles ]; then
# (
# cd /etc
# sed -e "s/'/'\"'\"'/g" -e "s/^/rm -f '/" -e "s/\$/'/" shadowfiles | sh
# )
#fi
# Since packages installed in /usr and /usr/local can't directly own files in
# /etc, we will non-destructively merge /usr/etc and /usr/local/etc into /etc.
# If the root filesystem is persistent or has a persistent layer, pre-existing
# copies in /etc will supercede the installation defaults in /usr[/etc].
# Otherwise, changes will be lost when the system is rebooted, and permanent
# changes can only occur by modifiying the /usr/[local/]etc master copies.
for PKG_ROOT in /usr /usr/local; do
if [ -d $PKG_ROOT/etc ]; then
(
cd $PKG_ROOT/etc
find . -type f -print
find . -print | cpio -d -p /etc 2>/dev/null
)
fi
done > /etc/shadowfiles
# Initialise optional packages.
#
# Rather than executing rc.d files (which would have significant fork and exec
# overheads), we source them and run the functions and/or aliases they define.
# This is fast, but also fragile, because a syntax error in any rc.d file will
# kill this script. On a persistent root filesystem, we have no way of knowing
# whether or not configure actions have already occurred, so the rc.d scripts
# must be "replay-safe" and should avoid unnecessary reconfiguration.
ls /etc/rc.d | while read SVC; do
. /etc/rc.d/$SVC
eval ${SVC}_configure
logger -t 'rc' -p daemon.info "$SVC configured"
eval ${SVC}_start
logger -t 'rc' -p daemon.info "$SVC started"
done
# Display an active interface summary just before the login prompt appears, so
# that the IP address(es) in use remain visible on the console as long as
# possible.
ifconfig | awk 'BEGIN {i=""} $0 !~ /^[[:blank:]]/ && $0 != "" {i=$1}
$2 ~ /^addr:/ {print i; print $0}'
[ "$HAVE_SPLASH" ] && echo 'show 65535' >>/proc/splash
http://dietpc.org/downloads/source/common/diet-pc/initscript/etc/rc