zoukankan      html  css  js  c++  java
  • linux rc.sysinit文件详解

    /etc/rc.d/rc.sysinit 系统初始化脚本的任务
    1.激活udev和selinux
    2、根据/etc/sysctl.conf文件设定内核参数
    3、设定系统时钟
    4、装载键盘映射
    5、启用交换分区
    6、设置主机名
    7、根文件系统检测,并以读写方式重新挂载
    8、激活raid和LVM设备
    9、启用磁盘配额
    10、根据/etc/fstab检查并挂载其他文件系统
    11、清理过期的锁和PID文件
    #!/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 $" Welcome 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 $" Press '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
  • 相关阅读:
    SpringBoot使用SpringSession和redis解决session共享问题(nginx反向代理)
    centos7中安装和配置nginx和keepalived
    定位
    css
    css美化
    html5
    列表,表格,媒体元素
    表单
    一期测试错题修改
    字符串
  • 原文地址:https://www.cnblogs.com/sysk/p/4778984.html
Copyright © 2011-2022 走看看