分享
 
 
 

FreeBSD系统启动进程:init

王朝system·作者佚名  2006-11-23
窄屏简体版  字體: |||超大  

在前面的文章里,我们学习了怎么显示和管理运行中的进程。今天,我想描述一下那些进程实际上如何启动的。

当你启动计算机进入FreeBSD时会有很多巧妙的事情发生。在此我无法论及所有的细节,但FreeBSDhandbook极好地解释了引导过程。当你启动你的计算机时,可能会注意到内核对硬件作了检测并在终端上显示了相应的结果。当检测崾保诤嘶崞舳礁鼋蹋航獭?(swapper)和进程1(init)。

负责进程控制初始化的程序是init;没有它,其它的进程无法启动。在引导时,init要做两项重要的工作:首先,它在rc的控制之下装入启动脚本,然后它初始化终端以便使用户可以登录。让我们分别描述这些功能,从rc开始:

whatisrc

rc(8)-commandscriptsforauto-rebootanddaemonstartup

这些脚本实际位于/etc/rc;通常,位于/etc下的这个配置文件对应于手册的第五部分,所以你可以根据手册对配置文件作正确地修改。但是,如果你打:

man5rc

你却会得到以下信息:

Noentryforrcinsection5ofthemanual

这对于上面提到的它位于手册第八部分来说看起来有点古怪,因为这部分手册包含的是系统维护和操作命令,通常它们都是后台进程。让我们进一步来看一下这个文件:

more/etc/rc

#Systemstartupscriptrunbyinitonautoboot

#oraftersingle-user.

#Outputanderrorareredirectedtoconsolebyinit,

#andtheconsoleisthecontrollingterminal.

#Notethatalmostalloftheuser-configurablebehavior

#isnolongerin#thisfile,butratherin/etc/defaults/rc.conf.

#Pleasecheckthatfilefirstbeforecontemplatinganychanges

#here.Ifyoudoneedtochangethisfileforsomereason,we

#wouldliketoknowaboutit.

好,相当清晰;看来对于该文件我们自己是不能乱来的。这里有些相当重要的东西对于正确引导我们的系统所必须的。让我们往后跳,看一些重要的部分来找出启动时实际上都发生了些什么。注意当在引导过程中处理rc脚本时,init会把所有的输出和错误信息记录到终端上。

rc首先做的事之一就是设置路径变量,以使它可以找到你FreeBSD系统上的可执行程序:

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin

然后它会查找/etc/defaults/rc.confand和/etc/rc.conf这两个文件:

#Ifthereisaglobalsystemconfigurationfile,suckitin.

if[-f/etc/defaults/rc.conf];then

./etc/defaults/rc.conf

elif[-f/etc/rc.conf];then

./etc/rc.conf

fi

接着它会作一个文件系统连贯性检查。如果你曾经非正常关闭FreeBSD系统,你会在引导过程中看到它在这一步上发出抱怨的。

echoAutomaticbootinprogress...

fsck-p

假定fsck没有遇到任何问题,它就马上装载你的文件系统:

#Mounteverythingexceptnfsfilesystems.

mount-a-tnonfs

在其它任何进程启动之前,你的CMOS时钟必须调整为内核时钟可以理解的形式:

adjkerntz-i

然后整理var目录,将引导信息写入dmesg.boot:

clean_var(){

if[!-f/var/run/clean_var];then

rm-rf/var/run/*

find/var/spool/lock!-typed-delete

rm-rf/var/spool/uucp/.Temp/*

#Keepacopyofthebootmessagesaround

dmesg>/var/run/dmesg.boot

接着rc会读取以下文件:

/etc/rc.sysctl

/etc/rc.serial

/etc/rc.pccard

/etc/rc.network

/etc/rc.network6

然后复位终端权限:

#Whacktheptypermsbackintoshape.

chflags0/dev/tty[pqrsPQRS]*

chmod666/dev/tty[pqrsPQRS]*

chownroot:wheel/dev/tty[pqrsPQRS]*

并清理自己产生的“垃圾”以及/tmp目录:

#Cleanupleft-overfiles

#Clearing/tmpatboot-timeseemstohavealongtradition.Itdoesn't

#helpinanywayforlong-livingsystems,anditmightaccidentally

#clobberfilesyouwouldratherliketohavepreservedafteracrash

#(ifnotusingmfs/tmpanyway).

#Seealsotheexampleofanothercleanuppolicyin/etc/periodic/daily.

#RemoveXlockfiles,sincetheywillpreventyoufromrestartingX11

#afterasystemcrash.

现在rc准备启动一些后台进程,首先是syslogd和named:

#Startsystemloggingandnameservice.Namedneedstostartbeforesyslogd

#ifyoudon'thavea/etc/resolv.conf.

然后是inetd、cron、lpd、sendmail、sshd和usbd:

#Nowstartupmiscellaneousdaemonsthatdon'tbelonganywhereelse

接着rc将更新motd(每日信息)并执行“uname-m”,这条命令会在屏幕上显示构架类型。

(/etc/rc文件结尾)

当到达/etc/rc的结尾时,rc的工作就完成了。在此我们重新回顾一下:init调用rc脚本,它会读取一些全局的和本地的配置文件以正确装载文件系统并建立系统后台进程可以启动的环境。你的操作系统现在已经启动并运行着,但到此为止,还没有一个用户可以与操作系统实际交互的环境。这就是init第二个重要的功能。

配置文件/etc/ttys将会被读取以决定初始化的终端。不象/etc/rc,该文件可以由超级用户经常编辑以确保让init来初始化所需的终端。

为了理解此文件,我们必须了解在你的FreeBSD系统上有三种类型的终端。以“ttyv”开头后跟一个数字的是虚拟终端;它们都是用户可以获得的物理存在于FreeBSD系统上的终端。缺省情况下,这些虚拟终端中的第一个,或叫“ttyv0”,表示控制台。以“ttyd”开头后跟一个数字的是串行线路或拨号终端;它们是用户用调制解调器远程访问你的FreeBSD系统时可获得的终端。最后一种终端类型就是伪终端或网络终端;它们以“ttyp”开头后跟一个数字或字母,用于通过网络连接访问你的FreeBSD系统。

如果我们用以下命令看此文件:

more/etc/ttys

我们会看到此文件分为三部分,每个部分分别对应这三种类型的终端。同时每个部分还分为四栏,总结为下面的图表:

栏名

含义

name

终端设备的名称

getty

在终端上启动运行的程序,通常为getty。其它项目包括xdm,它用来启动XWindow系统,或none,说明没有程序。

type

对于虚拟终端,对应的类型为cons25。其它通常的值包括伪终端network,调制解调器入口dialup,以及unknown,用于用户试图以无法预定的类型进行连接的终端。

status

它必须是on或off。如果是on,init将运行getty栏指定的程序。如果出现单词“secure”,说明该tty允许root登录;为避免这种情况,可以用单词“insecure”。

让我们从虚拟终端部分开始解释该文件;可以看到它是以设置控制台开始的:

#Ifconsoleismarked"insecure",theninitwillask

#fortherootpasswordwhengoingtosingle-usermode.

console none unknown offsecure

如果在引导过程中fsck命令运行出了问题,init将使你的FreeBSD系统进入单用户模式以使root用户可以修复问题。如果你用insecure代替secure来设置控制台,init将在你可以继续干之前索取口令。

ttyv0 "/usr/libexec/gettyPc" cons25 onsecure

#Virtualterminals

ttyv1 "/usr/libexec/gettyPc" cons25 onsecure

ttyv2 "/usr/libexec/gettyPc" cons25 onsecure

ttyv3 "/usr/libexec/gettyPc" cons25 onsecure

ttyv4 "/usr/libexec/gettyPc" cons25 onsecure

ttyv5 "/usr/libexec/gettyPc" cons25 onsecure

ttyv6 "/usr/libexec/gettyPc" cons25 onsecure

ttyv7 "/usr/libexec/gettyPc" cons25 onsecure

ttyv8 "/usr/X11R6/bin/xdm-nodaemon" xterm offsecure

你可以看到在我的FreeBSD系统上除了控制台以外还有八个虚拟终端;我可以通过按ALT键加一个控制键来访问每个终端。例如ALTF1可访问控制台,ALTF2访问ttyv1,ALTF3访问ttyv2,等等。如果我启动了X会话,那么它可以用ALTF8来访问。如果我把ttyv8上的单词off改为on,那么我可以在引导时得到一个X终端而不是控制台。然后可以继续用我ALT加功能键来访问其它终端。我的所有这些虚拟终端都标为“secure”,说明它们都可接受root登录。你可以有多少个虚拟终端是由你的FreeBSD版本所决定的;如果你希望建立更多虚拟终端,可以读一下这个faq。

现在让我们移到拨号终端:

#Serialterminals

#The'dialup'keywordidentifiesdialinlinestologin,fingerdetc.

ttyd0 "/usr/libexec/gettystd.9600" dialup offsecure

ttyd1 "/usr/libexec/gettystd.9600" dialup offsecure

ttyd2 "/usr/libexec/gettystd.9600" dialup offsecure

ttyd3 "/usr/libexec/gettystd.9600" dialup offsecure

你可以看到我有四个可获得的拨号终端,但它们都被关闭了。如果我想让用户通过调制解调器访问我的FreeBSD系统,我就必须至少打开它们中的一个,还必须决定是否让这些用户可以用root身份登录;如果不,就把单词“secure”改为“insecure”。你是否看到getty栏含有数字9600,它说明数据传输率为9600bps。因为现在很多调制解调器都有更高的速率,我也可以把它改为57600。最后,最好读一下FreeBSDhandbook中的拨号服务部分。

/etc/ttys文件的最后一部分是网络或伪终端。你会看到它们有很多,准确地说是255个,范围从:

#Pseudoterminals

ttyp0nonenetwork

ttySvnonenetwork

且缺省情况下它们都没有被允许。

如果你为了使/etc/ttys更改生效以使init使用这些更改,可以超级用户的身份向init发送一个HUP信号,如:

kill-11

这里前面的-1代表信号1(HUP),而后面1代表进程1(init)。

那么现在,哪个/etc/ttys文件中提到的getty程序继续保持运行呢?man8中对getty的描述如下:

描述

init(8)调用getty程序打开并初始化tty行,读取一个登录名,然后调用login(1)。

所以,init读取/etc/ttys并在每个你在配置文件中设定的终端上启动一个getty进程。getty的工作是监视终端看是否有人试图登录。如果有的话,getty将启动登录程序校验用户的登录名和口令。如果校验合格,登录程序会启动用户的登录命令解释器并把用户置于他们的宿主目录下。当用户具有一个命令解释器后,他们就可以与操作系统交互了。现在它就可以让命令解释器解释用户的输入并确保启动了必要的进程。

当一个用户退出登录时,再次调用init启动其它的getty进程以继续监视终端等待其它的登录尝试。

让我们看一下ps命令的输出来总结一下刚才这次引导的整个过程,FreeBSD4.1缺省已经安装了ps程序。我将用-ax开关以包含系统进程:

ps-ax

PIDTTSTATTIMECOMMAND

0??DLs0:00.01(swapper)

1??ILs0:00.16/sbin/init--

2??DL0:00.02(pagedaemon)

3??DL0:00.00(vmdaemon)

4??DL0:00.02(bufdaemon)

5??DL0:01.02(syncer)

1056??Is0:00.00adjkerntz-i

1187??Ss0:00.08syslogd-s

1206??Is0:00.05inetd-wW

1208??Is0:00.11cron

1622??Ss0:00.02sendmail:acceptingconnectionsonport25(sendmail)

1621v0Ss0:00.12-csh(csh)

1701v0R+0:00.00ps-ax

1699v1Is+0:00.01/usr/libexec/gettyPcttyv1

1619v2Is+0:00.01/usr/libexec/gettyPcttyv2

1618v3Is+0:00.01/usr/libexec/gettyPcttyv3

1617v4Is+0:00.01/usr/libexec/gettyPcttyv4

1616v5Is+0:00.01/usr/libexec/gettyPcttyv5

1615v6Is+0:00.01/usr/libexec/gettyPcttyv6

1614v7Is+0:00.01/usr/libexec/gettyPcttyv7

现在你可以认识很多进程:swapper的PID为0而init的为1。adjkerntz,syslogd,inetd,cron和sendmail都是由rc启动的。当然,我必须在一个命令解释器上运行这个ps命令;在上述情况中,它是从ttyv0上的cshell解释器运行的。getty进程等待虚拟终端1-7上的登录。而在虚拟终端8上则没有运行getty进程,因为该终端在/etc/ttys中被标为了“off”。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有