/etc/rc.d/rc.sysinit
腳本來源:Fedora 11
HOSTNAME=`/bin/hostname` //使用命令獲取主機名
set -m
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi //若存在該腳本且為規則文件則運行之
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
#若HOSTNAME變量字符長度0或為(none)則設定為localhost
if [ ! -e /proc/mounts ]; then
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
#若/proc/mounts 存在,則掛載proc目錄 與sysfs目錄(不寫入/etc/mtab)
if [ ! -d /proc/bus/usb ]; then
modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
else
mount -n -t usbfs /proc/bus/usb /proc/bus/usb
fi
#若/proc/bus/usb目錄存在,加載usbcore模塊,並且以usbfs掛載/proc/bus/usb
#否在直接掛載以上目錄
. /etc/init.d/functions //執行函數庫腳本
PLYMOUTH=
[ -x /usr/bin/plymouth ] && PLYMOUTH=yes
#如果plymouth存在且有執行權限,設定PLYMOUTH變量
接下來是檢查和修改Selinux狀態,www.britepic.org以及設定selinux的幾個函數
##由於雞與蛋的問題,該函數需要執行兩次
init_crypto()函數:
#接下來是按照系統的版本打印一個啟動的歡迎信息:
# Print a text banner.
echo -en $""t"tWelcome to "
…………
…………
# Fix console loglevel
if [ -n "$LOGLEVEL" ]; then
/bin/dmesg -n $LOGLEVEL
fi
#打印相應日志級別的啟動信息
cmdline=$(cat /proc/cmdline) #獲取一行信息(來自GRUB文件menu.lst)
# Initialize hardware 初始化硬件
if [ -f /proc/sys/kernel/modprobe ]; then
if ! strstr "$cmdline" nomodules && [ -f /proc/modules ] ; then
sysctl -w kernel.modprobe="/sbin/modprobe" >/dev/null 2>&1
else
# We used to set this to NULL, but that causes 'failed to exec' messages"
sysctl -w kernel.modprobe="/bin/true" >/dev/null 2>&1
fi
fi
touch /dev/.in_sysinit >/dev/null 2>&1
#若cmdline變量裡面沒有包含”nomodules”字符串,則設置內核參數指定modporbe的位置,否則設置為true程序。
# Set default affinity
if [ -x /bin/taskset ]; then
…………
…………
#設置默認親緣關系? 返回一個數值告知使用了哪個CPU?
# Load other user-defined modules
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
#執行用戶自定義模塊配置文件
Load modules (for backward compatibility with VARs)
if [ -f /etc/rc.modules ]; then
/etc/rc.modules
fi
mount -n /dev/pts >/dev/null 2>&1
[ -n "$SELINUX_STATE" ] && restorecon /dev/pts >/dev/null 2>&1
#加載模塊?
# Configure kernel parameters
update_boot_stage Rckernelparam //通知圖形啟動現在的啟動狀態
sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1
#設定內核參數
# Set the hostname.
update_boot_stage RChostname
action $"Setting hostname ${HOSTNAME}: " hostname ${HOSTNAME}
#設定內核參數
{ rmmod scsi_wait_scan ; modprobe scsi_wait_scan ; rmmod scsi_wait_scan ; } >/dev/null 2>&1 //設定等待存儲設備
# Start any MD RAID arrays that haven't been started yet
[ -f /etc/mdadm.conf -a -x /sbin/mdadm ] && /sbin/mdadm -As --auto=yes –run
#啟動尚未啟動的RAID設備
# Device mapper & related initialization
if ! __fgrep "device-mapper" /proc/devices >/dev/null 2>&1 ; then
…………
…………
#設備映射以及相關設置
ipaddr=
if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
ipaddr=$(ip addr show to 0.0.0.0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
for ip in $ipaddr ; do
HOSTNAME=
eval $(ipcalc -h $ipaddr 2>/dev/null)
[ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; }
done
fi
從設置好的IP地址獲取主機名,從DHCP服務器獲取。
接下來的一大段代碼用來以只讀方式掛載根目錄,以及SELinux需要的一些操作:relable等,掛載本地文件系統,更新quota,初始化偽隨機數生成器。
# Configure machine if necessary.
if [ -f /.unconfigured ]; then
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
………………
………………
………………
#如果根目錄下存在那個文件的話,把一些系統設置全部重設(管理員密碼,網絡設定,鍵盤布局等……)
# Configure machine if necessary.
if [ -f /.unconfigured ]; then
#讀取系統設定重新設定主機名。
# Reread in network configuration data.
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
…………
#清理根目錄下的一些文件,清理/var目錄
# Clean up /var.
rm -rf /var/lock/cvs/* /var/run/screen/*
#清理/tmp目錄,把一些鎖文件和其它的一些臨時文件刪除。
[ -n "$SELINUX_STATE" ] && restorecon /tmp
…………
#創建ICE目錄。
# Make ICE directory
mkdir -m 1777 -p /tmp/.ICE-unix >/dev/null 2>&1
#啟動交換分區,從fstab讀取
# Start up swapping.
update_boot_stage Rcswap
#創建系統崩潰標記,創建文件使下次啟動自動檢查文件系統。
# create the crash indicator flag to warn on crashes, offer fsck with timeout
touch /.autofsck &> /dev/null
#讓rhgb知道腳本已經執行完成,根已經讀寫掛載。
# Let rhgb know that we're leaving rc.sysinit
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
/usr/bin/rhgb-client --sysinit
fi
寫好了一會了,一直沒時間深入查看,有很多地方還是理解的不是很透徹。望批評指正!