开机
您或许会发现安装完 linux 之后,原来的 Windows 开机画面不见了!那~~ 怎么回去啊?
不知道不紧要啦。当机器开着之后,在您看到 RedHat 的开机选单,移动上下方向键选择您要进入的系统就可以了;如果您这时候按 Ctl+X 键,则会得到 LILO Boot: 的提示(后面我们提到‘单人模式’的时候会用到),然后按 Tab 键,也可以看到开机的各项选择。假如您的系统是按照前面的例子进行安装的话,应该会看到 linux 和 win(您在安装时所取的名称) 这两项。如果要进入 Linux,可以输入 Linux 再 Enter,或直接按 Enter(因为此例中 Linux 被选择为预设系统了);如果您要进入 Windows,可以输入 win 再按 Enter。
tips:如果您原来的系统是 NT 的话,有一个要注意的地方,就是:当增加 linux partition 之后, 原先 NT 看到的 partition number 或许会有所变更,这需要修改 c:/boot.ini 才可以纠正过来。修改的时候,基本上您无需理会各句子前面的号码,将 partition( ) 中的号码换换试试,直到可以开机为止。
刚才提到的 LILO,是 linux 安装在机器上面的系统载入程式,取名于 LInux LOader 的前两个字母的组合。根据我们在安装的时候所选择,目前 LILO 安装在系统的 MBR (Master Boot Record),也就是开机磁碟的第一个 Cylinder 之第一个 Sector 之上。MBR 所存放的 loader,是用来告诉机器在启动之后要载入那个系统,和到哪里载入。除了 LILO 之外,其实我们也有许多其它 loader 可以选择,例如 NT 的 NT Loader、System Commander、Boot Magic、以及国人所写的 spfdisk、等等。假如您已经采用别的 loader 而不是 LILO,那您在安装的时候,就要确定您的 LILO 是装在 /boot partition (所谓的 super block)上面而不是 MBR (后面我会介绍用 NT loader 来载入 Linux 的方法)。无论您用哪个 loader,也不管 LILO 装在 MBR 还是 supper block,在一些新的大容量硬碟上面(通常超过 8G),要注意 /boot 分区所在位置不要超过 1024 磁柱的范围。不过,新的 Linux 启动程式都允许超出这个限制,只需确定磁碟使用 LBA 模式,以及在 LILO 上使用 lba32 选项就可以了(这个以后我们在谈到 LILO 的设定时再说明)。
tips:假如您的 linux 开机分区装在 slave 硬碟之上,开机的时候可能会遇到麻烦,请尽量避免。如果您真的必须如此,可以参考 Juniko 兄的文章:
撰写于邮件 news:3hBdkI$B8w@bbs.kimo.com.tw...
> ※ 引述《NoEMail@NoWay.org (Harrier Knight)》之铭言:
> > lilo 你说了这段话:
> > > 问题解决了...
> > > 就只是linux不可以放在第二个ide上
> > 这是目前 LILO 的限制吧?
>
> 嗯, 我目前是放在第二颗(hdd) IDE 上, boot 也在 hdd 上
>
> 稍微修改一下 lilo.conf
>
> 加入
>
> disk=/dev/hdd
> bios=0x81 # 本来 hdd ,lilo 会读成 0x82, 中间装了两台 Cdrom
> # Why? i don't know, 我试着改成 0x80 也不行, 所以
> # 我猜0x81 指的是第二颗 IDEHD
> # 以此类推, 第四颗 IDEHD 应该改成 0x83, 因为我没有
> # 第四颗 HD, 所以没办法 test
>
> disk=/dev/hda
> bios=0x80 #需不需要设定 /dev/hda 我不是很确定,
> #因为一开始就设了, 也没移除试过
(假如您还不会修改 lilo.conf,那就等日后我们介绍完 vi 和 LILO 的时候再回来不迟。)
有些朋友,在碰到多重系统安装的时候,会觉得有些疑惑,或许只是对 OS loader 不甚了解而已,单纯将安装顺序换成:先 windows 后 linux 就可以了。
为什么?那要知道各 OS 放在 MBR 里面的 loader 能力了。一般的 OS loader,都会提供开机选单,让您选择用什么系统开机,以及开机系统放在硬碟的什么位置上。比 如,linux 的 LILO 就有这个功能:它除了开 linux 之外,还提供一个选单,给您开Windows。但 windows 的 loader 却不然,它的 loader 只能开 windows 而不让您有选单开 linux。(真是不公平哦~~)
而 OS loader 一般都放在 MBR 位置上,也就是第一个 cylinder 的第一个 sector 上面,这样,系统顺利通过 BIOS 之后,就会到这里读入硬碟的开机资讯,也就是载入loader 。在 MBR 上面,每次只能放一个 loader,如果您先放 windows 的 loader,然后放 linux 的,MBR 的 loader 就变成是 LILO,那您就有一个选单来选择开机系统。如果先灌 linux 再 windows,那 MBR 的 loader 是 windows 的,因而没有选单选择,只能进入 windows。
不过,linux 的 LILO,除了放在 MBR 之外,还可以放在 boot 的 partition 上面的第一个 block,也就是所谓的 superblock是也。那您在安装的时候,就要将 LILO 装在 boot 的 partition 上面;或是修改 /etc/lilo.conf ,将 boot=hda 改成boot=hda2 (假设您的 boot partition 是在 hda2 上面),然后再执行 lilo 命令就可以完成。
假如您真的将 LILO 装在 superblock 上面,那您在 MBR 上面的 loader 必须有能力提供选单,而且能够告诉系统到哪里找到 LILO。抱歉,windows 的 loader 都没有这个能力。其它诸如 partition magic 或 spfdisk 之类的 loader,则有这个功能,但前提条件是:您的 LILO 要装在 superblock 上面。
当您在 LILO 选择 linux之后,您会看到一大堆开机过程的报告,有兴趣可以逐行看看(假如您眼睛够快的话)。如果开机过程卡在某些服务上面而等上好几分钟的话,可能您的网路设定不正确,最常见的问题是 /etc/hosts 或 DNS没设定好。为避免这些情况,请确定机器在开机的时候,启动程式能够能连得上指定的伺服器地址。
最终,您会看到 Login: 的提示,如果您的 X window 在安装的时候设定好了,那么登录画面会是图形界面的。这时候您可以用 ‘ root ’进行登录,然后输入您在安装时设定的 root 密码。之后,整个 linux系统就是您的啦!
tips:不过,任何时候,我们都不鼓励直接用 root 登录,因为它的权限太大,会在系统安全上构成威胁。我们通常是用普通用户进行登录(也就是安装的时候所设定的帐号),然后真的碰到系统设定的时候,才用 su 或 sudo 命令切换为 root 身份执行。不过,这里的例子,大部份是教您设定伺服器的,通常都需要 root 来执行,只是日后换到真正的工作系统之后,就请尽量避免用 root 来工作了。
至于机器如何从启动到成功载入,如果我们对这个过程了解的话,相信在日后的管理,或遇到问题的时候会非常有帮助。下面不妨让我们看看 linux 的开机过程和其中的一些选项。
Init & Run Level
系统的初始化步骤粗略如下:
1. 首先,当电源打开之后,机器会首先经过 POST 检查,然后从 CMOS 载入 BIOS,以确定最基本的硬体架构,如时钟和硬碟资讯等。
2. 然后会找到 MBR,载入 boot loader,以确定启动哪一个作业系统。
3. 当作业系统选定之后,LOADER 会告诉机器到那里载入作业系统的核心程式。
tips:关于 LILO 这个开机管理程式,本身的开机提示符号就非常有学问,不妨参考下面这篇录自新闻群组的文章:
"继续颓废" 撰写于邮件 news:41243S$2vw@Terry.Dorm11.NCTU.edu.tw...
> ※ 引述《fllow.bbs@bbs.mgt.ncu.edu.tw (无雨的夏天)》之铭言:
> > 灌完 Redhat 7.3 后, 没有任何错误讯息
> > 重开机后只见 LI 就当机了
> > 请问是何问题.
> > 似乎在哪有见过类似的说明
> > L 后当机
> > LI 后当机
> > LIL 后当机
> > 谢谢..
>
> LILO 启动讯息
>
> 当LILO自行载入时,它会显示LILO一字。在执行某些特定的动作之前或之后会
> 列印每一个字母。如果LILO在某一点失败,则目前为止已印出的字母可用来识
> 别问题。
>
> 请注意,如果发生暂态磁碟问题,则在第一个"L"之后可插入某些十六进位数字。
> 除非LILO在该点停止,产生无限的错误码串流,这种十六进位数字不表示伺服器
> 问题。
>
> [无]
> - 未载入 LILO 的任何部件。 LILO 不是未安装就是其启动区段所在的分割区
> 不在作用中。
>
> L [错误] ...
> - 第一阶段启动载入程式已载入并启动,但是它无法载入第二阶段启动载入程式。
> 二位数字错误码指出问题的类型。 这种状况通常表示媒体失效或几何不符
> (例如,磁碟参数无效)。
>
> LI
> - 第一阶段启动载入程式已能够载入第二阶段启动载入程式,但是无法加以执行。
> 这可能是由于几何不符或是没有执行 map 安装程式而移动 /boot/boot.b所导致。
>
> LIL
> - 第二阶段启动载入程式已启动,但是它无法从映射档载入描述子表格。这通常是
> 由于媒体失效或几何不符所导致。
>
> LIL?
> - 在不正确的位址载入了第二阶段启动载入程式。这通常是由于细微的几何不符或
> 是没有执行 map 安装程式而移动 /boot/boot.b 所导致。
>
> LIL-
> - 描述子表格讹误。这可能是由于几何不符或是没有执行 map 安装程式而移动
> /boot/map 所导致。LILO 已顺利载入 LILO 的所有部件。
4. 当核心程式载入之后,机器基本上就交由核心处理了。核心程式首先要载入档案系统,然后第一个执行的程式就是 init (它是所有程式的 parrent ),init 的第一个动作是找到 /etc/rc.d/rc.sysinit 并执行之。
5. 这个 rc.sysinit 程式首先是执行 /sbin/initlog 并输出 $LOGLEVEL 变数,以决定记录档的信息量。
6. 接着检查 /dev/.devfsd 和 /sbin/devfsd 这两个档案,以决定系统是否使用 devfs 。
7. 然后设定 PATH 环境。
8. 然后检查 /etc/sysconfig/network 档是否存在,然则根据设定档设定网路环境,否则用 localhost 命名系统。
9. 再来是执行 /etc/rc.d/init.d/functions 这只 script ,以提供其后的 shell 程式所使用的一些变数和功能。
10. 然后载入 keymap,按照您安装时指定的键盘资讯来确定您的键盘类型。
11. 执行 /sbin/setsysfont 来设定系统使用的字型。
12. 启动系统的置换(swap)空间。至此,系统之主机名称(hostname)和网域名称(domain),将作为环境变数的依据。
13. 然后 rc.sysinit 会检查 /fsckoptions 这个档是否存在,然则,会改变这个档的中的一个变数值;如果 /forcefsck 档案存在的话,就会在这个变数值前面增加一个旗标,这样会导致后面的步骤强迫系统对档案系统进行检查。
14. 接下来,会检查 /fastboot 是否存在,然则,系统会略过档案系统的检查步骤;否则,系统会对 / ( 也就是 root) 进行一个完整的检查。
15. 之后,系统会执行 mount -t proc /proc /proc 命令,为核心挂载一个特殊的档案系统,它完全建立在记忆体之上。每次关机都会消失,而每次开机才被建立。其中的资料,纯粹是给核心使用的,其中一些设定,会根据系统设定档进行配置。
16. 完成这个动作之后,接下来是对 Plug and Play 设备的检测。如果经过特别设定,还会执行 isapnp 程式来检查 ISA 类型的 PnP 设备。
17. 现在,档案系统的 / 才挂载为完整的读和写模式,并更新 quota 资讯,同时在 / 上面实施 quota 限制。
18. 再来呢,系统会清掉 IN_INITLOG 变数,如果 /etc/HOSTNAME 档不存在,则将 HOSTNAME 的变数值作为该档的内容。
19. 再来是清空 mtab,并将 / 档案系统和 /proc 置于其中。系统通常根据 /etc/fstab 来判定要挂载的档案系统在哪里,而 mtab 是一个档案,算是从 /etc/fstab 提炼出来真正给系统使用的版本吧。
20. 然后,系统会载入一系列的核心模组。一旦完成,除非前面的 /fastboot 存在,否则系统会对 / 之外的所有档案系统进行检查。除了 NFS 之外,所有分区都会完成挂载,并且非 / 分区的 quota 也会打开。
21. 到这里,系统会砍掉一些档案,以清理这次启动,同时也是为下次启动作准备。前面提到的 /fastboot 和档案系统检查选项都会清掉,同时, /var/lock 其下的一些 lock 档也会移除,/var/run 里面的陈旧行程 ID 也会砍掉,更多在 /tmp 里面的 lock 档也会砍光。这样,rc.sysinit 可以说为系统安排好一切了:设定好系统时钟、启用置换空间、载入相应模组、并根据 /etc/sysconfig/desktop 来决定 X 系统使用的视窗管理系统(除非使用者另行设定)。
22. 关于 rc.sysinit 在启动过程中所显示的所有信息,都会存放到 /var/log/dmesg 里面去。
23. 此时,rc.sysinit 已经完成准备工作,并将系统交还 /sbin/init 程式,然后根据 /etc/inittab 选择预设的 run level (这个容后解释),以决定执行哪些服务程式。具体要执行的程式,按照 /etc/rc.d/rcX.d/ ( X 代表不同的 run level 号码)目录里面的 script 内容而定。而最后一个要执行的 script,则是 /etc/rc.d/rc.local 。并执行 /sbin/loglevel 以确定系统的记录等级(级别越高,记录越详细)。
Tips:在 /etc/rc.d/ 目录下的 rc.local,有点像 DOS 里面的 autoexec.bat ,如果您有哪些在开机的时候需要执行的系统设定,可以将命令行,或 script 写在这里。比方说,您在用别台机器 telnet 进来的时候,会看到机器目前的作业系统资讯(这或许对别有用心的人非常有用),您单纯以为修改 /etc/issue.net 的内容就可以解决掉;但发现重新开机之后,档案又复原了。呵~~ 这就是 rc.local 搞的鬼啦:当您修改好 issue.net 之后,还不要忘记修改 rc.loal 这个档,将其中一行 cp -f /etc/issue /etc/issue.net 注解起来。
24. 最后,init 将系统交由 login 程式接管,正式完成开机使命。
以上就是大致的开机流程,其中我省略了许多步骤,如果您有兴趣研究的话,不妨深入追踪一下 /etc/rc.d/rc.sysinit 这个档案。
Tip:有时候您不正常关机,会造成档案损毁的现像,系统在开机的时候会尝试自动修复。如果自动修复不成功,则会停下来要您输入 root 密码,执行 fsck 程式进行手工修复。
您要知道有问题的 partiton 是那一个(几个)?比方说您现在碰到 / 有问题,假设它 在 /dev/hda6 上面,那您就输入:
fsck /dev/hda6
然后要回答许多问题,一直按 y 就是了;如果您不想按 y ,那就输入:
fsck -y /dev/hda6
不过,小心哦:有时候第一个问题可能告诉您一些警告,然后说按 y 进行 cancel,那您就只好第一个按 n,然后逐个按 y 了。
假如您对上面的描述不是很理解,不用担心,尽可略过您不懂的对方,等日后对系统有更充份的了解之后,再回来重拾灵感好了。不过,对开机过程的了解程度,会影像到您日后的系统管理和调整技巧,尤其是在进行除错的时候。建议您最好将开机过程了解透切一些,是绝对有百利而无一害的。
好了,前面提到过 run level 这个词,究竟是什么东东呢?嗯,如果您以前玩过 DOS,为不同游戏设定过不同的开机环境,或许比较容易了解。要不然,您可以简单的认为:run level 就是不同的系统启动配置,不同的 run level 会让系统执行不同的服务和设定,最后获得的环境和功能也不一样。系统每次开机,只能进入其中一个 run level 而已,您可以在 LILO 提示的时候指定要进入哪个 level (或是在启动时看到红色的 RedHat 文字时按 i 键),也可以调整 /etc/inittab 的设定来指定系统的预设 level (号码)。不同的厂商,其 run leve 的号码不太一样,如果以 RedHat 为例,号码所代表的 run level 如下:
* Level 0:关机
* Level 1:单人模式
* Level 2:多人模式,没有网路功能
* Level 3:完整多人模式,文字界面
* Level 4:保留
* Level 5:完整多人模式,图形界面
* Level 6:重新开机
以上这些号码,分别对应不同的系统配置。在 /etc/inittab 档案中,您会找到一行句子如:
id:5:initdefault:
其中的数字 5 所代表的就是系统预设的 run level,这里就是图形界面,当您的系统完成启动之后,您会看到 X window 的登录画面。如果您要将预设界面换成文字模式,那只要将 5 换为 3 就可以,这样下次开机就会进入文字界面;当然,如果您换成 0 的话,那每次启动完毕就会关机,这可不好玩哦~~~
有时候,因为系统的设定错误,或是档案损坏,您可能必须进入单人模式进行一些维护工作。比方说,您的 root 密码忘了,那您可以到 LILO 提示那里(开机选单按 Ctl+X),然后输入:
linux -s
这样启动完成后就会进入 run level 1,这里您是无须登录就具备 root 权限的了,然后您输入 passwd root 就可以重新设定 root 的密码了。不过,这个便利也变成一个系统的安全问题。此时,如何确保您的系统不被外人实体上接触到就显得非常重要了,否则,别人只要重新启动机器就可以为所欲为了。小心小心!如果您想在单人模式中也需要密码检验,那可以修改 /etc/inittab 这个档案,在 si:: sysinit:... 那行句子后面另外增加一行设定:
修改前:
si::sysinit:/etc/rc.d/rc.sysinit
修改后:
si::sysinit:/etc/rc.d/rc.sysinit
~~:S:wait:/sbin/sulogin
不过,这样您就一定不能将 root 密码忘记啰~~~ ^_^
tips:您还可以修改 lilo.conf,加上密码,这样别人选好 LILO 选单之后,只有知道密码才能载入(不过,如果您想要执行远端重开机的话,有麻烦)。这部份留待日后我们谈到 lilo.conf 的时候再介绍吧。不过,有经验的用户,还是知道如何用其它办法进行开机的啦。所以,实体上的安全还是至关重要的。
另外,有些系统预设上并不使用 LILO 而使用另一套名为 GRUB 的开机管理程式来载入核心。要进入单人模式的方法和 LILO 有所不同,基本的步骤如下:
1,移动方向键选择正确的 linux 选单后 按"e"
2,再选择以 kernel 开头的句子(通常为二行),再按"e"
3,并将游标移到该行行尾,并输入一个空白键和" -s"
4,按Enter
5,按"b"就能进入单人模式
如果您已经在一个 run level 里面了,这时候要换到另一个 level 去,除了重新开机之外,您也可以直接用 init 命令来转换,如输入 init 1 就会切换到单人模式去,然后再输入 init 3 就回到多人文字模式去。有机会不妨玩玩看。
那么,究竟不同的 run level 是如何为系统配置出不同的环境呢?如果您有兴趣知道的话,请看看 /etc/rc.d/ 目录下面,分别有着 rcX.d 的子目录,其中的 X 就是不同 run level 的号码了。然后再看看 rcX.d 目录里面的档案,您会发现有两类档案:其一是以 S 开头的,而另外则是以 K 开头的。这些档案都是一些 script,如果以 S 开头的话,那是在进入(Startup)该 level 的时候要执行的,其执行顺序是根据 S 后面的数字来决定,数值越小,越被优先执行。您千万不要随便乱改这些数字哦,因为有些 script 之间是有相依关系的,必须等前面的 script 执行妥当之后,才能执行后面的 script。而那些以 K 开头呢?K 是 Kill 的意思,没错啦,就是在退出该 level 的时候要执行的,顺序也是以数字为依据。
Tips:事实上,不同的 run level 是帮您执行行不同的 daemon 服务程式而已(我们日后再说 daemon )。您可以执行 ntsysv 命令,然后用空白键上下选择哪些 daemon 要在开机的时候执行,哪些不需要。然而,除了 ntsysv 外,更精确的设定工具应该是 chkconfig 这只程式:
chkconfig --level 3 pcmcia on
chkconfig --level 3 pcmcia off
chkconfig --level 3 --del pcmcia
第一个命令是在 run level 3 将 pcmcia 服务打开(也就是设定为 S 开头的服务);第二行则是关闭(也就手设定为 K 开头);第三行则将之删除(没有 S 也没有 K )。透过灵活的组合,您可以轻松的控制各个 run level 所执行的服务程式。建议您 man chkconfig 详细看看它的用法。
不过,并不是所有写在 /etc/rc.d/init.d 的 deamon 都能使用 chkconfig 来设定哦,您必须包含如下两个句子在档案中(缺一不可):
# chkconfig: 2345 80 20
# description: decsription about the daemon
要注意:这两句前面的 ‘ # ’符号不能拿掉哦!第一行的第一堆数字是说要作用于哪些 run level 上面;而中间的数字则是 link 到各 rcX.d 目录后的以 " S " 开头的数字;最后一组数字则是 " K " 开头的数字。第二行可以随便写,关于 daemon 的说明文字就是了。
如果您仔细比较不同的 rcX.d 目录,您会发现它们的 script 数目和顺序都不太一样!没错啦,就是这些不一样才让系统获得不同的配置。不过,如果您再仔细检查这些档案,其实它们都是一些 links (这个我们在介绍档案系统的时候再说),归跟结底,这些 script 都集中放在 /etc/rc.d/init.d/ 目录里面,然后根据不同的 level 而‘分身’在不同的 rcX.d 目录中而已。这个,等我们日后对 script 和 links 有一定了解之后,就比较清楚了。如果您现在不大理解,那没关系,知道不同的 run level 要对应到哪个 rcX.d 目录就好。
关机
除非您不想机器不用的时候还开着(如为了省电),或是进行硬体更换,linux 甚少需要关机的(有些 Linux 跑好几年还好好的呢!)。不过,您知道怎样关机吗?
如果您在安装过程中能够正确设定好 XWindow,并且选择了开机进入 X,或许您还能找到关机的门径(和 windows 和像)。不过,通常来说,除非是天才,在第一次使用 linux 的时候(之前也没 Unix 或 Novell 经验),还真不知道怎么关机哦!(哈哈,指我自己啦~~~ ^_^ 见笑见笑!)
不过,各位根据刚才的 run level 和 init 命令,或许也不难找出关机的办法吧?输入 init 0 就可以了!不过,这其实不是一个正确的关机办法, 如果您输入下面这个指令:
shutdown --help
您会看到好些选项,请看看各项的意思。如果您要立即将机器关掉的话,建议您输入:
shutdown -h now
如果用 r 代替 h 的话,会进行重新启动,不过,您可以用 reboot 这个指令代替,或可以按 ctl+alt+del (这个也不建议使用,更要注意所有资料已回存好和程式都关闭妥当)。
在某些旧系统中,您还必须执行 sync 命令多次,以确定所有资料都回存到硬碟中,才可以进行关机的动作。不过,如果您用 shutdown 或 reboot 命令的话,就不需担心这个了。
tips:关于关机所使用到的一些命令,大家不妨参考 Leo 兄的说明:
From: "leo"
To:
Sent: Sunday, August 12, 2001 8:37 PM
Subject: Hi
其实,常常遇到有人问说,shutdown -r 与 reboot 与 halt 这些指令的关系。
其实 shutdown 指令,只是可以设定讯息,时间等,真正 reboot 之类的动作,
还是呼叫 reboot 来执行的。
而 reboot 指令则不,将会立即 reboot。
halt 也是一样,将会立即关机。
reboot 与 halt 预设都会先执行 sync,(也可强迫不要用 sync,比方 reboot -n)
这两个指令无法送出讯息到 tty.. 等等。
另外还有人问到 poweroff 指令,
其实 halt 指令,预设是会执行 poweroff 的,所以会将电源切掉。
等您已经会得正常的开机和关机之后,我才可以说:您可以放心进行学习了。