萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> 分析Linux系統rc.sysinit腳本

分析Linux系統rc.sysinit腳本

  歡迎來到學習啦,本文介紹分析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

copyright © 萬盛學電腦網 all rights reserved