Linux系统rc.sysinit文件详解
- 格式:docx
- 大小:49.98 KB
- 文档页数:35
init rc 条件判断init rc 是一个在 Linux 系统中使用的脚本文件,它负责初始化系统的各个服务和设置。
在 init rc 文件中,条件判断是一种常见的语法,用于根据不同的条件执行不同的操作。
本文将围绕 init rc 条件判断展开,介绍其语法和用法,并通过实例进行解析和说明。
一、条件判断语法在 init rc 文件中,条件判断主要通过 if、elif、else 和 fi 关键字来实现。
其基本语法如下:if [ condition ]thencommand1command2...elif [ condition ]thencommand3command4...elsecommand5command6...fi其中 condition 是一个条件表达式,可以使用比较操作符(如 -eq、-ne、-lt、-gt、-le、-ge)和逻辑操作符(如 -a、-o、!)进行组合。
command1、command2 等表示在条件满足时需要执行的命令。
二、条件判断实例下面通过几个实例来演示 init rc 条件判断的用法。
1. 判断一个变量是否为空:if [ -z "$var" ]thenecho "变量 var 为空"elseecho "变量 var 不为空"fi其中 -z 表示判断字符串是否为空,"$var" 表示要判断的变量。
2. 判断两个变量是否相等:if [ "$var1" == "$var2" ]thenecho "变量 var1 和 var2 相等"elseecho "变量 var1 和 var2 不相等"fi这里使用了双等号来判断两个变量是否相等。
3. 判断一个文件是否存在:if [ -e "/path/to/file" ]thenecho "文件存在"elseecho "文件不存在"fi其中 -e 表示判断文件是否存在。
Linux引导及配置文件加载过程解读文章分类:操作系统??本文包括3部分内容1、 Linux的引导过程2、 Linux 的运行级别3、 /etc/inittab与/etc/rc.d/ 与/etc/rc.d/init.d的关系关键词:Linux引导过程、运行级别、inittab与 init.d 与 rc.d一、 Linux的引导过程系统加电之后,首先进行的硬件自检,然后是bootloader对系统的初始化,加载内核。
内核被加载到内存中之后,就开始执行我们的系统设置了。
一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化。
从这里开始,内核就能够挂装根文件系统(这个过程类似于Windows识别并存取C盘的过程)。
内核挂装了根文件系统,并已初始化所有的设备驱动程序和数据结构等之后,就通过启动一个叫init的用户级程序,完成引导进程。
二、运行级别(run level)Init进程是系统启动之后的第一个用户进程,所以它的pid(进程编号)始终为1。
init 进程上来首先做的事是去读取/etc/目录下 inittab文件中initdefault id值,这个值称为运行级别(run-level)。
它决定了系统启动之后运行于什么级别。
运行级别决定了系统启动的绝大部分行为和目的。
这个级别从0到 6 ,具有不同的功能。
不同的运行级定义如下:# 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)# 1 - 单用户模式# 2 - 多用户,没有 NFS# 3 - 完全多用户模式(标准的运行级)# 4 –系统保留的# 5 - X11 (x window)# 6 - 重新启动(千万不要把initdefault 设置为6,否则将一直在重启)三、 /etc/rc.d/与/etc/rc.d/init.d的关系先解释一下init.d。
这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。
linuxrc原理
Linuxrc 是 Linux 系统中的一个前期启动脚本,负责在系统引导期间加载一些基本的系统服务以及进行一些初始化工作。
Linuxrc 的原理如下:
1. Linuxrc 在系统启动过程中会被 initramfs 这个临时文件系统调用执行。
initramfs 是一个初始化 RAM 文件系统,其目的是在系统引导期间提供必要的文件和脚本以便进行操作系统的加载和初始化。
2. 在引导过程中,initramfs 会将包含 Linuxrc 脚本的 init 脚本作为启动脚本来执行。
通过执行 Linuxrc,系统可以进行一些必要的初始化操作,如加载 kernel 模块、挂载根文件系统、设置网络等。
3. Linuxrc 会根据系统启动参数和配置文件的设置来决定需要加载的模块和服务。
可以通过命令行选项或者配置文件来指定加载的模块、服务以及一些初始化参数。
4. Linuxrc 执行完成后,它将转交给真正的 init 进程来接管系统的初始化工作。
init 进程会根据系统配置文件的设置来继续执行系统初始化过程,启动各个进程,并最终启动用户空间的环境。
总之,Linuxrc 是系统引导期间执行的一个脚本,它通过加载必要的模块和服务以及进行一些初始化工作来为系统的正常启
动做准备。
它起到了连接引导阶段和用户空间初始化的桥梁作用。
busybox linuxrc 参数Busybox是一个开源工具集,它提供了用于管理嵌入式Linux系统的各种实用工具。
其中的一个工具是linuxrc,它是一个初始化脚本,负责在Linux系统启动过程中进行一些必要的初始化操作。
linuxrc脚本可以接受一些参数,这些参数可以用来自定义系统的启动行为。
下面是一些常用的busybox linuxrc参数及其功能:1. root:这个参数用来指定系统的根文件系统所在的设备。
例如,可以使用root=/dev/sda1来指定根文件系统在第一个SATA硬盘上的第一个分区。
2. init:这个参数用来指定系统的init程序的路径。
init程序是Linux系统中的第一个进程,它负责启动所有其他进程。
可以使用init=/sbin/init来指定系统的init 程序路径。
3. console:这个参数用来指定系统的控制台设备。
控制台设备是用户与系统进行交互的主要终端。
可以使用console=/dev/ttyS0来指定系统的串口控制台设备。
4. ip:这个参数用来指定系统的IP地址。
可以使用ip=192.168.0.100来指定系统的IP地址为192.168.0.100。
5. netmask:这个参数用来指定系统的子网掩码。
子网掩码用于划分网络中的主机和网络地址。
可以使用netmask=255.255.255.0来指定系统的子网掩码为255.255.255.0。
通过在linuxrc脚本中设置这些参数,可以在系统启动时自定义文件系统、设备和网络配置。
这对于嵌入式系统开发人员来说非常有用,可以根据实际需求来定制系统的启动行为,提高系统的灵活性和适应性。
Busybox的linuxrc参数提供了一种简单而有效的方式来配置嵌入式Linux系统的启动过程。
rc.local介绍(linux启动系列之⼀)linux有⾃⼰⼀套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘。
本⽂中假设inittab中设置的init tree为:/etc/rc.d/rc0.d/etc/rc.d/rc1.d/etc/rc.d/rc2.d/etc/rc.d/rc3.d/etc/rc.d/rc4.d/etc/rc.d/rc5.d/etc/rc.d/rc6.d/etc/rc.d/init.d⽬录1. 关于linux的启动2. 关于rc.d3. 启动脚本⽰例4. 关于rc.local5. 关于bash启动脚本6. 关于开机程序的⾃动启动1. 关于linux的启动init是所有进程的顶层init读取/etc/inittab,执⾏rc.sysinit脚本(注意⽂件名是不⼀定的,有些unix甚⾄会将语句直接写在inittab中)rc.sysinit脚本作了很多⼯作:init $PATHconfig networkstart swap functionset hostnamecheck root file system, repair if neededcheck root space....rc.sysinit根据inittab执⾏rc?.d脚本linux是多⽤户系统,getty是多⽤户与单⽤户的分⽔岭在getty之前运⾏的是系统脚本2. 关于rc.d所有启动脚本放置在 /etc/rc.d/init.d下rc?.d中放置的是init.d中脚本的链接,命名格式是:S{number}{name}K{number}{name}S开始的⽂件向脚本传递start参数K开始的⽂件向脚本传递stop参数number决定执⾏的顺序3. 启动脚本⽰例这是⼀个⽤来启动httpd的 /etc/rc.d/init.d/apache 脚本:代码:#!/bin/bash......可以看出他接受start,stop,restart,status参数然后可以这样建⽴rc?.d的链接:代码:cd /etc/rc.d/init.d &&ln -sf ../init.d/apache ../rc0.d/K28apache &&ln -sf ../init.d/apache ../rc1.d/K28apache &&ln -sf ../init.d/apache ../rc2.d/K28apache &&ln -sf ../init.d/apache ../rc3.d/S32apache &&ln -sf ../init.d/apache ../rc4.d/S32apache &&ln -sf ../init.d/apache ../rc5.d/S32apache &&ln -sf ../init.d/apache ../rc6.d/K28apache4. 关于rc.local经常使⽤的 rc.local 则完全是习惯问题,不是标准。
嵌入式linux启动时运行的inittab文件嵌入式系统下的linux启动配置文件,不同与普通的PC linux启动配置,启动相关文件与文件的内容也要少得多。
嵌入式系统下的linux启动过程一般是:1 在bootloader中制定各种要求传给linux内核的参数,制作ramdisk或ramfs 文件系统,并在开机后首先mount上,该文件系统主要负责包含启动运行的配置文件,嵌入式系统主要是/etc/inittab和/etc/rc文件;2 在init进程启动后,进程首先执行/etc/inittab文件,该文件语法下面介绍,一般包括三项内容就可以启动。
其中主要的一项内容就是::sysinit:/etc/rc,目的是制定初始化要执行的脚本配置文件,在/etc/rc中则主要是配置系统;另一项内容是::respawn:-/usr/sbin/xxx,xxx一般为shell,最后一个重要的项是::shutdown:/bin/umount -a -r接下来的部分为转载/kernel_32/archive/2009/02/03/3860756.aspx首先介绍点背景知识,关于inittab的:init 进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务,启动打印服务等。
Solaris中init进程的主要任务是按照inittab 文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init 进程也称为系统初始化进程。
下面具体说明inittab文件的格式。
inittab文件中每一记录都从新的一行开始,每个记录项最多可有512个字符,每一项的格式通常如下:id:rstate:action:process,下面分别解释。
1.id字段是最多4个字符的字符串,用来唯一标志表项。
2.rstate(run state)字段定义该记录项被调用时的运行级别,rstate可以由一个或多个运行级别构成,也可以是空,空则代表运行级别0~6。
在Linux中,“rc”文件是指系统启动时运行脚本的一种,通常用于执行一些必要的启动任务和设置。
以下是“rc”文件的语法:
1. 定义脚本名称:在“rc”文件中,需要定义脚本的名称,该名称应该与脚本文件名相同,例如“rc.d”中的“rc”。
2. 写脚本:在“rc”文件中,需要编写脚本来执行必要的启动任务和设置。
这些脚本通常会根据系统启动的顺序和需要进行编写。
3. 定义脚本的运行时间:在“rc”文件中,可以定义脚本在系统启动的哪个阶段运行,例如在系统引导之后立即运行,或者在系统完全启动之后运行。
4. 脚本的执行:在系统启动时,Linux会按照脚本名称前的数字顺序依次执行这些脚本。
可以通过修改脚本名称前数字的大小来调整脚本的执行顺序。
总之,“rc”文件是Linux系统中非常重要的一类脚本文件,用于执行一些必要的启动任务和设置。
编写这些文件需要对Linux系统有一定的了解和对脚本语言的熟练掌握。
linux中init命令的详细解释linxu下的init命令是进程初始化工具。
下面由店铺为大家整理了linux的init命令的详细解释的相关知识,希望对大家有帮助!一、linux中的init命令的详细解释init命令init命令是Linux下的进程初始化工具,init进程是所有Linux的进程的父进程,它的进程号为1。
init命令是Linux操作系统中不可缺少的程序之一,init进程是Linux内核引导运行的,是系统中的第一个进程。
语法init(选项)(参数)选项-b:不执行相关脚本而直接进入单用户模式;-s:切换到单用户模式。
参数运行等级:指定Linux系统要切换到的运行等级。
二、linux中的init命令的详解实例几个常用的命令查看系统进程命令:ps -ef | head查看init的配置文件:more /etc/inittab查看系统当前运行的级别:runlevel运行级别到底什么是运行级呢?简单的说,运行级就是操作系统当前正在运行的功能级别。
这个级别从0到6 ,具有不同的功能。
你也可以在/etc/inittab中查看它的英文介绍。
#0 停机(千万不能把initdefault 设置为0)#1 单用户模式#2 多用户,没有 NFS(和级别3相似,会停止部分服务)#3 完全多用户模式#4 没有用到#5 x11(Xwindow)#6 重新启动(千万不要把initdefault 设置为6)三、linux的init命令的六种模式简介6种模式中有两种是系统内定的:0:停止系统运行。
init 0〈回车〉相当于 halt〈回车〉。
6:重启系统。
init 6〈回车〉相当于 reboot〈回车〉。
如果你了解/etc/inittab文件,就千万不要把0设为缺省登录模式,否则你的Linux的运行就只能两点一线了——开机←→停机,或者是开机←→重启的无限循环。
linux启动顺序讲解⼀、简单介绍RHEL开机时的先后顺序BIOS —> MBR —> Kernel —> init1、当电脑⼀打开电源时电脑就会进⼊BIOS(BIOS的⼯作主要是检测⼀些硬件设备);2、检测完后会进⼊MBR也就是boot loader(MBR位于硬盘的第⼀个扇区总共512bytes,其中前446bytes⾥⾯的编码是在选择引导分区也就是决定要由哪个分区来引导);3、载⼊系统的Kernel(核⼼),在Kernel⾥主要是载⼊电脑设备的驱动程序,以便可以控制电脑上的设备,并且以只读⽅式来挂载根⽬录,也就是⼀开始只能读取到根⽬录所对应的那个分区,所以/etc、/bin、/sbin、/dev、/lib这五个⽬录必须同根⽬录在⼀个分区中;4、最后启动init这个程序,所以init这个程序的进程编号为1,是Linux中第⼀个执⾏的程序;init这个程序会根据Run level来执⾏以下这些程序:·/etc/rc.d/rc.sysinit;·/etc/rc.d/rc 和etc/rc.d/rc?.d/·/etc/rc.d/rc.local·如果有适当的图形界⾯管理程序⼆、BIOS初始化时主要的三个任务BIOS(B asic I nput/O utput S ystem)1、电脑周边设备的检测,加电⾃检POST (Power on self test);2、BIOS会选择要由哪⼀个设备来开机,例如:软盘启动、光盘启动、⽹络启动、最常见的从硬盘启动;3、选择好由哪个设备开机后,就开始读取这个设备的MBR 引导扇区;三、介绍Boot Loader中的主要⼯作1、Boot Loader可以安装在两个地⽅:·安装在硬盘的MBR中;·当有时候MBR中被其他开机管理程序占⽤就可以将Boot Loader 安装在硬盘中的其中⼀个分区的引导扇区上,;2、Boot Loader的程序码分为两个阶段:(1)Boot Loader第⼀阶段的程序码⾮常⼩,只有446bytes,可以存⼊在MBR或是某⼀个分区的引导扇区⾥,(2)Boot Loader第⼀阶段的程序码是从boot 分区来载⼊的,就是说Boot Loader 第⼆阶段程序码存放在/boot 这个分区中;3、下⾯来看三个Boot Loader 的开机流程范例,如在⼀块硬盘中安装了两个系统分别为:windows 2003 和Red hat linux当电脑开机后,会先载⼊MBR通过第⼀阶段程序码来载⼊第⼆阶段程序码,进⼊GRUB开机菜单这⾥选择哪个系统就会载⼊相应的核⼼;四、介绍GRUB和grub.conf 这个配置⽂件的内容其实从MBR载⼊Boot Loader开始,载⼊Kernel,载⼊init这些程序之间都是由GRUB这个多重开机管理程序所负责的。
/etc/rc.d/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 文件主要控制是否启用网络、默认网关、主机名fiif [ -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/null2>&1 # 接下来就是把/sys 目录以sysfs 格式挂载到/sys 目录下################################################ ################################################ ################################################ ########. /etc/init.d/functions # 执行/etc/init.d/functions 文件,该文件提供了很多有用的函数,具体见“functions 脚本提供的函数”一文################################################ ################################################ ################################################ ######### Check SELinux statusselinuxfs=`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# assume enforcing if you can't read itSELINUX=1fifiif [ -x /sbin/restorecon ] && LC_ALL=C fgrep -q " /dev " /proc/mounts ; then /sbin/restorecon -R /dev 2>/dev/nullfidisable_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 ; thenchvt 1fiecho "*** 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>&1rm -f /.autorelabelecho "*** Enabling security enforcement. ***"echo $SELINUX > $selinuxfs/enforceif [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; thenchvt 8fi}################################################ ################################################ ################################################ ########if [ "$HOSTTYPE" != "s390" -a "$HOSTTYPE" != "s390x" ]; thenlast=0for 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$ilast=$idoneif [ $last -gt 0 ]; then> /dev/tty$((last+1))> /dev/tty$((last+2))fifi################################################ ################################################################################################ ########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/setsysfontif [ $? -eq 0 ]; then # 如果上述命令执行返回的exit status 为0success # 则调用success 函数(来自于functions 脚本),记录一个成功的事件elsefailure # 否则调用failure 函数fiecho ; echofi################################################ ################################################ ################################################ ######### Print a text banner. # 下面部分是打印"welcome to xxxxx" 的标题栏echo -en $"\t\tWelcome to " # 打印"<tab><tab>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" 的行,并截取中间部分给PRODUCTecho " $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 还未起作用echofi################################################ ################################################ ################################################ ######### 注释:下面部分是设置输出到console 的日志的详细级别# Fix console loglevel # 设置控制台的日志级别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 可执行,则执行它,会在屏幕上显示“Starting udev ... [OK]”# Only read this once.cmdline=$(cat /proc/cmdline) # 读取/proc/cmdline ,这是内核启动的时的参数,赋予变量cmdline# Initialize hardware # 下面初始化硬件if [ -f /proc/sys/kernel/modprobe ]; then # 如果/proc/sys/kernel/modprobe 文件存在(该文件告诉内核用什么命令来加载模块),则if ! strstr "$cmdline" nomodules && [ -f /proc/modules ] ; then # 如果$cmdline 变量的值含有nomodules ,且存在/proc/modules 文件,则sysctl -w kernel.modprobe="/sbin/modprobe" >/dev/null 2>&1 # 使用sysctl 设置kernel.modprobe 为/sbin/modprobe 命令sysctl -w kernel.hotplug="/sbin/hotplug" >/dev/null2>&1 # 使用sysctl 设置kernel.hotplug 为/sbin/hotplug 命令else # 如果不存在/proc/sys/kernel/modprobe 文件,则# We used to set this to NULL, but that causes 'failed to exec' messages"sysctl -w kernel.modprobe="/bin/true" >/dev/null 2>&1 # 使用sysctl 设置kernel.modprobe 为/bin/truesysctl -w kernel.hotplug="/bin/true" >/dev/null 2>&1 # kernel.hotplug 也一样fifi################################################ ################################################ ################################################ ######### 注释:下面开始真正的加载各种类型的设备的驱动# 首先是找出那些模块需要被加载,并把模块名按类分别放到ide、scsi、network、audio、other 5个变量中echo -n $"Initializing hardware... " # 打印"initalizing hardware.." (不换行),并开始初始化硬件ide="" # 下面这些变量都是为了存储的型号,格式为" <module1> <module2><module3> ..."scsi=""network=""audio=""other=""eval `kmodule | while read devtype mod ; do # 从kmodule 命令的输出一次读入两个变量devtype (设备类型)和mod(模块名)case "$devtype" in # 根据devtype 做出适当的选择"IDE") ide="$ide$mod" # 如果devtype 的值为IDE ,则把mod 加入到现有的ide 变量的值中echo"ide=\"$ide"\";; # 输出"ide=" 然后是变量ide 的值"SCSI") scsi="$scsi$mod" # 如果devtype 的值为SCSI ,则把mod 变量的值加入到scsi 变量的值中echo"scsi=\"$scsi"\";; # 输出"scsi=" 再输出$scsi"NETWORK") network="$network$mod" # 下面的NETWORK 和AUDIO 也一样echo "network=\"$network"\";;"AUDIO") audio="$audio $mod"echo "audio=\"$audio"\";;*) other="$other$mod" # 如果是属于other 类型的则把模块名$mod 加入到other 变量的值列表中echo "other=\"$other"\";;esacdone`load_module () { # 定义一个函数名为load_moduleLC_ALL=C fgrep -xq "$1" /etc/hotplug/blacklist 2>/dev/null || modprobe $1 >/dev/null 2>&1 # 在/etc/hotplug/blacklist 文件中查找是否有指定的模块,如果没有,}# 再用modprobe 加载指定的模块# IDE # 下面开始加载所有IDE 类型的设备的模块for module in $ide ; do # 从ide 变量中每次取出1个值,赋予变量moduleload_module $module # 再用load_module 函数加载它。