您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > Linux启动脚本分析
Linux系统脚本分析之rc.sysinit#!/bin/bash##/etc/rc.d/rc.sysinit-runonceatboottime###Rerunourselvesthroughinitlog//通过/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)evalversion=`echo$unamer|awk-F'.''{print($1$2)}'`#取得版本号if[-f/etc/sysconfig/network];then#如果存在/etc/sysconfig/network,则执行该文件。./etc/sysconfig/network#network文件主要控制是否启用网络、默认网关、主机名fiif[-z$HOSTNAME-o$HOSTNAME=(none)];then#如果执行network文件后HOSTNAME为空或者为(none),HOSTNAME=localhost#则将主机名设置为localhostfi#Mount/procand/sys(doneheresovolumelabelscanworkwithfsck)#接下来是挂载/proc和/sys,这样fsck才能使用卷标mount-n-tproc/proc/proc#-n表示不写/etc/mtab,这在/etc所在的文件系统为只读时用。因为此时的/还是只读的[-d/proc/bus/usb]&&mount-n-tusbfs/proc/bus/usb/proc/bus/usb#如果存在/proc/bus/usb目录则把/proc/bus/usb以usbfs挂载到/proc/bus/usb下mount-n-tsysfs/sys/sys/dev/null2&1#接下来就是把/sys目录以sysfs格式挂载到/sys目录下##############################################################################################################./etc/init.d/functions#执行/etc/init.d/functions文件,该文件提供了很多有用的函数,具体见“functions脚本提供的函数”一文###############################################################################################################CheckSELinuxstatusselinuxfs=`awk'/selinuxfs/{print$2}'/proc/mounts`SELINUX=if[-n$selinuxfs]&&[`cat/proc/self/attr/current`!=kernel];thenif[-r$selinuxfs/enforce];thenSELINUX=`cat$selinuxfs/enforce`else#assumeenforcingifyoucan'treaditSELINUX=1fifiif[-x/sbin/restorecon]&&LC_ALL=Cfgrep-q/dev/proc/mounts;then/sbin/restorecon-R/dev2/dev/nullfidisable_selinux(){echo***Warning--SELinuxisactiveecho***Disablingsecurityenforcementforsystemrecovery.echo***Run'setenforce1'toreenable.echo0$selinuxfs/enforce}relabel_selinux(){if[-x/usr/bin/rhgb-client]&&/usr/bin/rhgb-client--ping;thenchvt1fiecho***Warning--SELinuxrelabelisrequired.******Disablingsecurityenforcement.******Relabelingcouldtakeaverylongtime,******dependingonfilesystemsize.***echo0$selinuxfs/enforce/sbin/fixfiles-Frelabel/dev/null2&1rm-f/.autorelabelecho***Enablingsecurityenforcement.***echo$SELINUX$selinuxfs/enforceif[-x/usr/bin/rhgb-client]&&/usr/bin/rhgb-client--ping;thenchvt8fi}##############################################################################################################if[$HOSTTYPE!=s390-a$HOSTTYPE!=s390x];thenlast=0foriin`LC_ALL=Cgrep'^[0-9].*respawn:/sbin/mingetty'/etc/inittab|sed's/^.*tty\([0-9][0-9]*\).*/\1/g'`;do/dev/tty$ilast=$idoneif[$last-gt0];then/dev/tty$((last+1))/dev/tty$((last+2))fifi##############################################################################################################if[$CONSOLETYPE=vt-a-x/sbin/setsysfont];then#下面是设置屏幕的默认字体。如果CONSOLETYPE变量的值为vt且/sbin/setsysfont命令可执行echo-nSettingdefaultfont($SYSFONT):#打印settingdeafaultfontxxxx,默认字体应该是xxxx/sbin/setsysfont#执行/sbin/setsysfontif[$?-eq0];then#如果上述命令执行返回的exitstatus为0success#则调用success函数(来自于functions脚本),记录一个成功的事件elsefailure#否则调用failure函数fiecho;echofi###############################################################################################################Printatextbanner.#下面部分是打印welcometoxxxxx的标题栏echo-en$\t\tWelcometo#打印tabtabWelcomto,同时不换行ifLC_ALL=Cfgrep-qRedHat/etc/redhat-release;then#从/etc/redhat-release文件中找出含有RedHat的行,如果找到[$BOOTUP=color]&&echo-en\\033[0;31m#则变量BOOTUP的值为color,并设置输出字体输出红色echo-enRedHat#同时打印RedHat,接下来打印发行版本(产品)[$BOOTUP=color]&&echo-en\\033[0;39m#如果变量BOOTUP的值为color则设置输出字体为白色PRODUCT=`seds/RedHat\(.*\)release.*/\1//etc/redhat-release`#从/etc/redhat-release中找出含有RedHat且后面若干字符,然后是release的行,并截取中间部分给PRODUCTecho$PRODUCT#输出变量PRODUCT的值(白色)elifLC_ALL=Cfgrep-qFedora/etc/redhat-release;then#如果/etc/redhat-release中没有RedHat字符串,但有Fedora,则执行类似过程[$BOOTUP=color]&&echo-en\\033[0;31mecho-enFedora[$BOOTUP=color]&&echo-en\\033[0;39mPRODUCT=`seds/Fedora\(.*\)release.*/\1//etc/redhat-release`echo$PRODUCTelse#如果/etc/redhat-release中既没有含RedHat也没有含Fedora的行,则PRODUCT=`seds/release.*//g/etc/redhat-release`#找到含有‘release'的行,并把它前面的部分输出,作为PRODUCT变量的值并输出echo$PRODUCTfi#补充:实际效果是RedHat两个字是红色,其他都是白色##############################################################################################################if[$PROMPT!=no];then#如果变量PROMPT的值不为no(表示允许交互启动),则echo-en$\t\tPress'I'toenterinteractivestartup.#打印提示信息“PressItoenterinteractivestartup”,但此时按I还未起作用echofi###############################################################################################################注释:下面部分是设置输出到console的日志的详细级别#Fixconsoleloglevel#设置控制台的日志级别if[-n$LOGLEVEL];then#如果LOGLEVEL变量的值不为空/bin/dmesg-n$LOGLEVEL#则执行dmesg,设置打印到consoel的日志的级别为$LOGLEVELfi###############################################################################################################注释:下面部分是启动udev并加载ide、scsi、network、audio以及其他类型的设备的模块的部分[-x/sbin/start_udev]&&/sbin/start_udev#如果/sbin/start_udev可执行,则执行它,会在屏幕上显示“Startingudev..
本文标题:Linux启动脚本分析
链接地址:https://www.777doc.com/doc-5018183 .html