2/27/2016

Linux RC Script 와 /etc/network/interfaces 분석

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