您现在的位置: 万盛学电脑网 >> 操作系统 >> Linux教程 >> 正文

分析Linux系统rc.sysinit脚本

作者:佚名    责任编辑:admin    更新时间:2022-06-22

  欢迎来到学习啦,本文介绍分析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