rc.sysinit启动脚本文件解析
2015-09-18 17:37
381 查看
#!/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 脚本提供的函数”一文
########################################################################################################################################################
# Check SELinux status
selinuxfs=`awk '/ selinuxfs / { print $2 }' /proc/mounts`
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 [ -x /sbin/restorecon ] && LC_ALL=C fgrep -q " /dev " /proc/mounts ; then
/sbin/restorecon -R /dev 2>/dev/null
fi
disable_selinux() {
echo "*** Warning -- SELinux is active"
echo "*** Disabling security enforcement for system recovery."
echo "*** Run 'setenforce 1' to reenable."
echo "0" > $selinuxfs/enforce
}
relabel_selinux() {
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
chvt 1
fi
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
/sbin/fixfiles -F relabel > /dev/null 2>&1
rm -f /.autorelabel
echo "*** Enabling security enforcement. ***"
echo $SELINUX > $selinuxfs/enforce
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
chvt 8
fi
}
########################################################################################################################################################
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/redhat-release`
# 从 /etc/redhat-release 中找出含有 "Red Hat" 且后面若干字符,然后是 "release" 的行,并截取中间部分给 PRODUCT
echo " $PRODUCT"
# 输出变量 PRODUCT 的值(白色)
elif LC_ALL=C fgrep -q "Fedora" /etc/redhat-release ; then
# 如果/etc/redhat-release 中没有 Red Hat 字符串,但有 Fedora ,则执行类似过程
[ "$BOOTUP" = "color" ] && echo -en "\\033[0;31m"
echo -en "Fedora"
[ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
PRODUCT=`sed "s/Fedora \(.*\) release.*/\1/" /etc/redhat-release`
echo " $PRODUCT"
else
# 如果 /etc/redhat-release 中既没有含 Red Hat 也没有含 Fedora 的行,则
PRODUCT=`sed "s/ release.*//g" /etc/redhat-release`
# 找到含有 ‘release' 的行,并把它前面的部分输出,作为 PRODUCT 变量的值并输出
echo "$PRODUCT"
fi
# 补充 :实际效果是 Red Hat 两个字是红色,其他都是白色
########################################################################################################################################################
if [ "$PROMPT" != "no" ]; then
# 如果变量 PROMPT 的值不为 "no" (表示允许交互启动),则
echo -en $"\t\tPress 'I' to enter interactive startup."
# 打印提示信息“Press I to enter interactive startup”,但此时按 I 还未起作用
echo
fi
########################################################################################################################################################
# 注释 :下面部分是设置输出到 console 的日志的详细级别
# Fix console loglevel
# 设置控制台的日志级别
if [ -n "$LOGLEVEL" ]; then # 如果 LOGLEVEL 变量的值不为空
/bin/dmesg -n $LOGLEVEL # 则执行 dmesg ,设置打印到 consoel 的日志的级别为 $LOGLEVEL
fi
########################################################################################################################################################
# 注释 :下面部分是启动 udev 并加载 ide、scsi、network、audio 以及其他类型的设备的模块的部分
[ -x /sbin/start_udev ] && /sbin/start_udev
# 如果 /sbin/start_udev 可执行,则执行它,会在屏幕上显示 “Starting udev ... [OK]”
# Only read this once.
cmdline=$(cat /proc/cmdline)
# 读取 /proc/cmdline ,这是内核启动的时的参数,赋予变量 cmdline
#
# /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 脚本提供的函数”一文
########################################################################################################################################################
# Check SELinux status
selinuxfs=`awk '/ selinuxfs / { print $2 }' /proc/mounts`
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 [ -x /sbin/restorecon ] && LC_ALL=C fgrep -q " /dev " /proc/mounts ; then
/sbin/restorecon -R /dev 2>/dev/null
fi
disable_selinux() {
echo "*** Warning -- SELinux is active"
echo "*** Disabling security enforcement for system recovery."
echo "*** Run 'setenforce 1' to reenable."
echo "0" > $selinuxfs/enforce
}
relabel_selinux() {
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
chvt 1
fi
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
/sbin/fixfiles -F relabel > /dev/null 2>&1
rm -f /.autorelabel
echo "*** Enabling security enforcement. ***"
echo $SELINUX > $selinuxfs/enforce
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
chvt 8
fi
}
########################################################################################################################################################
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/redhat-release`
# 从 /etc/redhat-release 中找出含有 "Red Hat" 且后面若干字符,然后是 "release" 的行,并截取中间部分给 PRODUCT
echo " $PRODUCT"
# 输出变量 PRODUCT 的值(白色)
elif LC_ALL=C fgrep -q "Fedora" /etc/redhat-release ; then
# 如果/etc/redhat-release 中没有 Red Hat 字符串,但有 Fedora ,则执行类似过程
[ "$BOOTUP" = "color" ] && echo -en "\\033[0;31m"
echo -en "Fedora"
[ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
PRODUCT=`sed "s/Fedora \(.*\) release.*/\1/" /etc/redhat-release`
echo " $PRODUCT"
else
# 如果 /etc/redhat-release 中既没有含 Red Hat 也没有含 Fedora 的行,则
PRODUCT=`sed "s/ release.*//g" /etc/redhat-release`
# 找到含有 ‘release' 的行,并把它前面的部分输出,作为 PRODUCT 变量的值并输出
echo "$PRODUCT"
fi
# 补充 :实际效果是 Red Hat 两个字是红色,其他都是白色
########################################################################################################################################################
if [ "$PROMPT" != "no" ]; then
# 如果变量 PROMPT 的值不为 "no" (表示允许交互启动),则
echo -en $"\t\tPress 'I' to enter interactive startup."
# 打印提示信息“Press I to enter interactive startup”,但此时按 I 还未起作用
echo
fi
########################################################################################################################################################
# 注释 :下面部分是设置输出到 console 的日志的详细级别
# Fix console loglevel
# 设置控制台的日志级别
if [ -n "$LOGLEVEL" ]; then # 如果 LOGLEVEL 变量的值不为空
/bin/dmesg -n $LOGLEVEL # 则执行 dmesg ,设置打印到 consoel 的日志的级别为 $LOGLEVEL
fi
########################################################################################################################################################
# 注释 :下面部分是启动 udev 并加载 ide、scsi、network、audio 以及其他类型的设备的模块的部分
[ -x /sbin/start_udev ] && /sbin/start_udev
# 如果 /sbin/start_udev 可执行,则执行它,会在屏幕上显示 “Starting udev ... [OK]”
# Only read this once.
cmdline=$(cat /proc/cmdline)
# 读取 /proc/cmdline ,这是内核启动的时的参数,赋予变量 cmdline
相关文章推荐
- Android-多线程下载
- MySQL5.0不能启动服务及无法找到配置的解决方法今天启动Mysql时,无法启动服务,也有很长一
- 【CCF】出现次数最多的数
- 约战Angular中Promise(2)
- 实现自定义CollectionEditor的Propertygrid的重置功能
- 小K 的农场(farm)题解
- 【笔记】PHP面向对象编程——基本实践(DAY 2)
- mysql报错:could not find settings Either the server service or the configuration file could not be fou
- Oracle 游标疑问
- TextField相关基础用法
- iOS --制作画板 --2
- 关于地图的总结
- 取余与周期函数
- 机器学习筑基
- Samsung手机ClipboardUIManager引起的内存泄漏
- mysql慢查询日志开启
- iOS中的UISearchBar
- 百度搜索优化-如何使搜索结果显示图文
- 黑马程序员-Java基础学习-反射技术
- oracle基本信息