歡迎來到學習啦,本文介紹分析Linux系統rc.sysinit腳本,歡迎您閱讀。
#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
#
# Rerun ourselves through initlog // 通過 /sbin/initlog 命令重新運行自己
if [ -z "$IN_INITLOG" -a -x /sbin/initlog ]; then // 條件是 :如果 IN_INITLOG 變量的值不為空,且 /sbin/initlog 可執行
exec /sbin/initlog -r /etc/rc.d/rc.sysinit // 調用 exec /sbin/initlog ,-r 是表示運行某個程序
fi
######################################################################################################################################################
HOSTNAME=`/bin/hostname` # 取得主機名
HOSTTYPE=`uname -m` # 取得主機類型
unamer=`uname -r` # 取得內核的 release 版本(例如 2.4.9.30-8)
eval version=`echo $unamer | awk -F ‘.‘ ‘{ print "(" $1 " " $2 ")" }‘` # 取得版本號
if [ -f /etc/sysconfig/network ]; then # 如果存在 /etc/sysconfig/network ,則執行該文件。
. /etc/sysconfig/network # network 文件主要控制是否啟用網絡、默認網關、主機名
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then # 如果執行 network 文件後 HOSTNAME 為空或者為 "(none)" ,
HOSTNAME=localhost # 則將主機名設置為 "localhost"
fi
# Mount /proc and /sys (done here so volume labels can work with fsck) # 接下來是掛載 /proc 和 /sys ,這樣 fsck 才能使用卷標
mount -n -t proc /proc /proc # -n 表示不寫 /etc/mtab ,這在 /etc 所在的文件系統為只讀時用。因為此時的/還是只讀的
[ -d /proc/bus/usb ] && mount -n -t usbfs /proc/bus/usb /proc/bus/usb # 如果存在 /proc/bus/usb 目錄則把 /proc/bus/usb 以 usbfs 掛載到 /proc/bus/usb 下
mount -n -t sysfs /sys /sys >/dev/null 2>&1 # 接下來就是把 /sys 目錄以 sysfs 格式掛載到 /sys 目錄下
########################################################################################################################################################
. /etc/init.d/functions # 執行 /etc/init.d/functions 文件,該文件提供了很多有用的函數,具體見 “functions 腳本提供的函數”一文
########################################################################################################################################################
#selinux段相關注釋,鄒立巍([email protected])
# Check SELinux status #檢察selinux狀態
selinuxfs=`awk ‘/ selinuxfs / { print $2 }‘ /proc/mounts` #找到selinux的狀態顯示目錄,默認為/selinux
SELINUX= #將SELINUX變量初始化
if [ -n "$selinuxfs" ] && [ "`cat /proc/self/attr/current`" != "kernel" ]; then
if [ -r $selinuxfs/enforce ] ; then
SELINUX=`cat $selinuxfs/enforce`
else
# assume enforcing if you can‘t read it
SELINUX=1
fi
fi
#以上if語句顯示,當變量selinuxfs的值不為空,且/proc/self/attr/current文件內容不是kernel時(此時說明selinux的狀態被設置為打開),
#檢查/selinux/enforce是否可讀,若可讀,則設置SELINUX變量狀態為/selinux/enforce文件內容。如果不可讀,設置為1。
if [ -x /sbin/restorecon ] && LC_ALL=C fgrep -q " /dev " /proc/mounts ; then
/sbin/restorecon -R /dev 2>/dev/null
fi
#用restorecon命令重新標記/dev目錄的安全上下文
disable_selinux() {
echo "*** Warning -- SELinux is active"
echo "*** Disabling security enforcement for system recovery."
echo "*** Run ‘setenforce 1‘ to reenable."
echo "0" > $selinuxfs/enforce
}
#定義函數disable_selinux(),此函數用來將selinux設置為Permissive狀態,即selinux的調試狀態
relabel_selinux() {
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
chvt 1
fi
#檢查主機是否活動,如果活動則切換到tty1上
echo "
*** Warning -- SELinux relabel is required. ***
*** Disabling security enforcement. ***
*** Relabeling could take a very long time, ***
*** depending on file system size. ***
"
echo "0" > $selinuxfs/enforce #將selinux設置為Permissive狀態,以便重新標記文件的安全上下文
/sbin/fixfiles -F relabel > /dev/null 2>&1 #用fixfile命令重新標記安全上下文
rm -f /.autorelabel #刪除標記時產生的臨時文件
echo "*** Enabling security enforcement. ***"
echo $SELINUX > $selinuxfs/enforce #將selinux設置為enforce狀態
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
chvt 8
fi
#如過主機處於活動狀態,切換到tty8
}
#定義函數relabel_selinux(),此函數用來重新標記所有文件的安全上下文
########################################################################################################################################################
if [ "$HOSTTYPE" != "s390" -a "$HOSTTYPE" != "s390x" ]; then
last=0
for i in `LC_ALL=C grep ‘^[0-9].*respawn:/sbin/mingetty‘ /etc/inittab | sed ‘s/^.* tty\([0-9][0-9]*\).*/\1/g‘`; do
> /dev/tty$i
last=$i
done
if [ $last -gt 0 ]; then
> /dev/tty$((last+1))
> /dev/tty$((last+2))
fi
fi
########################################################################################################################################################
if [ "$CONSOLETYPE" = "vt" -a -x /sbin/setsysfont ]; then # 下面是設置屏幕的默認字體。如果 CONSOLETYPE 變量的值為 vt 且 /sbin/setsysfont 命令可執行
echo -n "Setting default font ($SYSFONT): " # 打印 "setting deafault font xxxx " ,默認字體應該是 xxxx
/sbin/setsysfont # 執行 /sbin/setsysfont
if [ $? -eq 0 ]; then # 如果上述命令執行返回的 exit status 為 0
success # 則調用 success 函數(來自於 functions 腳本),記錄一個成功的事件
else
failure # 否則調用 failure 函數
fi
echo ; echo
fi
########################################################################################################################################################
# Print a text banner. # 下面部分是打印 "welcome to xxxxx" 的標題欄
echo -en $"\t\tWelcome to " # 打印 "Welcom to" ,同時不換行
if LC_ALL=C fgrep -q "Red Hat" /etc/redhat-release ; then # 從 /etc/redhat-release 文件中找出含有 "Red Hat" 的行,如果找到
[ "$BOOTUP" = "color" ] && echo -en "\\033[0;31m" # 則變量 BOOTUP 的值為 color ,並設置輸出字體輸出紅色
echo -en "Red Hat" # 同時打印 "Red Hat" ,接下來打印發行版本(產品)
[ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m" # 如果變量 BOOTUP 的值為 color 則設置輸出字體為白色
PRODUCT=`sed "s/Red Hat \(.*\) release.*/\1/" /etc/redh