前回紹介したように、
システムの起動、
Fedora Core の起動用スクリプトの構成
Fedora Coreに代表されるRed Hat Linux系のディストリビューションでは、
[kojima@localhost $ ls -F /etc/rc.d/ init.d/ rc* rc.local* rc.sysinit* rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/
Linuxの起動の仕組みについては回を改めて紹介するつもりですが、
[kojima@localhost$ ls -F /etc/rc.d/init.d/ NetworkManager* cups* isdn* nscd* sendmail* NetworkManagerDispatcher* cups-config-daemon* kerneloops* ntpd* setroubleshoot* acpid* dund* killall* ntpdate* single* ... crond* irqbalance* nfslock* saslauthd*
一方、
これらの中から、
必須のファイルシステムのマウント
まずは先頭部分です。
1 #!/bin/bash
2 #
3 # /etc/rc.d/rc.sysinit - run once at boot time
4 #
5 # Taken in part from Miquel van Smoorenburg's bcheckrc.
6 #
7
8 HOSTNAME=`/bin/hostname`
9 HOSTTYPE=`uname -m`
10 unamer=`uname -r`
11
12 set -m
13
14 if [ -f /etc/sysconfig/network ]; then
15 . /etc/sysconfig/network
16 fi
17 if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
18 HOSTNAME=localhost
19 fi
20
21 if [ ! -e /proc/mounts ]; then
22 mount -n -t proc /proc /proc
23 mount -n -t sysfs /sys /sys >/dev/null 2>&1
24 fi
25 if [ ! -d /proc/bus/usb ]; then
26 modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
27 else
28 mount -n -t usbfs /proc/bus/usb /proc/bus/usb
29 fi
30
31 . /etc/init.d/functions
1行目はシェルスクリプトのお約束であるシェバン、/bin/
やuname -m
uname -r
12行目のsetはbashの動作を制御するためのコマンドで、set -m
はジョブ制御(指定したジョブを一時停止したり、
14行目から16行目では/etc/
NETWORKING=yes
HOSTNAME=localhost.localdomain
.
17行目から19行目では、
21行目から24行目では、
25行目から29行目も同様に/proc/
31行目は15行目と同様 .
バナーメッセージの表示
この先の32行目から230行目あたりはセキュリティを強化するSELinuxや、
232 # Print a text banner.
233 echo -en $"\t\tWelcome to "
234 read -r redhat_release 235 if [[ "$redhat_release" =~ "Red Hat" ]]; then
236 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;31m"
237 echo -en "Red Hat"
238 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
239 PRODUCT=`sed "s/Red Hat \(.*\) release.*/\1/" /etc/redhat-release`
240 echo " $PRODUCT"
241 elif [[ "$redhat_release" =~ "Fedora" ]]; then
242 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;34m"
243 echo -en "Fedora"
244 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
245 PRODUCT=`sed "s/Fedora \(.*\) \?release.*/\1/" /etc/redhat-release`
246 echo " $PRODUCT"
247 else
248 PRODUCT=`sed "s/ release.*//g" /etc/redhat-release`
249 echo "$PRODUCT"
250 fi
この部分は/etc/
echo -en "\\033[0;31m"
の部分は、
236行目に見られる$BOOTUPは/etc/
モジュールドライバの読み込み
256行目くらいからは雑多な起動時処理という感じですが、
256 # Fix console loglevel
257 if [ -n "$LOGLEVEL" ]; then
258 /bin/dmesg -n $LOGLEVEL
259 fi
260
261 # Only read this once.
262 cmdline=$(cat /proc/cmdline)
263
264 # Initialize hardware
265 if [ -f /proc/sys/kernel/modprobe ]; then
266 if ! strstr "$cmdline" nomodules && [ -f /proc/modules ] ; then
267 sysctl -w kernel.modprobe="/sbin/modprobe" >/dev/null 2>&1
268 else
269 # We used to set this to NULL, but that causes 'failed to exec' messages"
270 sysctl -w kernel.modprobe="/bin/true" >/dev/null 2>&1
271 fi
272 fi
273
……
290 /sbin/start_udev
291
292 # Load other user-defined modules
293 for file in /etc/sysconfig/modules/*.modules ; do
294 [ -x $file ] && $file
295 done
296
297 # Load modules (for backward compatibility with VARs)
298 if [ -f /etc/rc.modules ]; then
299 /etc/rc.modules
300 fi
256行目から259行目は$LOGLEVEL
という変数が設定されているかを調べて、/bin/
というコマンドを実行します。$LOGLEVEL
という変数も236行目にあった$BOOTUP同様、
/bin/
の-n
オプションはカーネルのログメッセージのうち、
262行目は$( .. )
内のコマンドの結果を$cmdlineという変数に代入する処理で、`cat /proc/
と同じです。/proc/
は起動時にブートローダからカーネルに与えられるパラメータを記録しているファイルで、
264行目以降はモジュールドライバを読み込んで各種ハードウェアを利用可能にするための処理です。267行目で実行しているsysctlコマンドは/procファイルシステム経由でカーネルの動作を変更するコマンドで、
少し飛ばして、
通常はカーネルが自動認識して組み込むモジュールドライバだけで十分なはずですが、
対話モードの確認とrc.sysinitの終了
この後、
826 # Now that we have all of our basic modules loaded and the kernel going,
827 # let's dump the syslog ring somewhere so we can find it later
828 [ -f /var/log/dmesg ] && mv -f /var/log/dmesg /var/log/dmesg.old
829 dmesg -s 131072 > /var/log/dmesg
830
831 # create the crash indicator flag to warn on crashes, offer fsck with timeout
832 touch /.autofsck &> /dev/null
833
834 if [ "$PROMPT" != no ]; then
835 while :; do
836 pid=$(/sbin/pidof getkey)
837 [ -n "$pid" -o -e /var/run/getkey_done ] && break
838 usleep 100000
839 done
840 [ -n "$pid" ] && kill -TERM "$pid" >/dev/null 2>&1
841 fi
842 } &
843 if strstr "$cmdline" confirm ; then
844 touch /var/run/confirm
845 fi
846 if [ "$PROMPT" != "no" ]; then
847 /sbin/getkey i && touch /var/run/confirm
848 touch /var/run/getkey_done
849 fi
850 wait
851 [ "$PROMPT" != no ] && rm -f /var/run/getkey_done
852
853 # Let rhgb know that we're leaving rc.sysinit
854 if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
855 /usr/bin/rhgb-client --sysinit
856 fi
857
このあたりまでにファイルシステムのチェックとマウントが終了し、
828、
832行目では/.autofsckという隠しファイルを作ります。このファイルは、
834行目から851行目はキーボードからの入力をチェックする部分です。今回読んでいるrc.
具体的には847行目の/sbin/
でiが入力されたかを調べ、
シェルスクリプト的に見ると、
最後の853行目から856行目は、
以上、