打印

[原创] 【Linux 学习笔记 6】Linux 的启动 (1)LILO

【Linux 学习笔记 6】Linux 的启动 (1)LILO



路漫漫其修远兮,吾将上下而求索
--------屈原. 离骚

这句话是偶以前一直挂在嘴上的。从学生时代就开始念起,每逢遭遇困境,必定唠叨此句,是偶众多favorites之一。

先说说别的。偶在菊花这里发了帖子,询问了关于为什么IBM中文版和英文版不同的原因。结果是自己的中文版确实是另外一个版本。内容自然不同。网上的中文版是和英文版本一致。由此显得这个笔记有点多余。但是,偶不是这么认为的。通过翻译,确实能够抓住进度。虽然慢,但是能够记忆的住。学习Linux,基础极其重要。所以,偶将继续此笔记。看看能否添加一些自己的东西。不悦者可忽略之。

偶最近买了RH5的正版。买了一年的subscription. 还买了VM WORKSTATION的3年的subscrpition.哈哈,既然要好好学,就要做足准备。另外,偶也羞愧的检讨一下周末一点都没有看Linux,全在玩仙剑4. 说实在的,感觉实在一般。好了,言归正传。

第二个Topic一共分为6个部分。
Section 2. 硬盘分布
文件系统综观
一个Linux文件系统包含的文件都是排列在磁盘上或者目录里面的块存储设备上。 就像其他系统一样,Iinux目录可能包含着子目录。和windows不同的是,windows在每个不同的卷标上(比如A,C,等)有着自己分开的文件系统。而一个Linux文件系统是一个有着/目录(也是root目录)的一个单独的树。

你可能会奇怪为什么磁盘分布是对Linux如此重要,毕竟,文件系统只是一棵大树而已。 然而,真正的情况是,每一个块设备,比如硬盘分区,CD-ROM或者软驱都有一个文件系统。 你可以通过挂在不同设备上的文件系统到树的一个挂载点,来建立一个一棵树的文件系统。

一般来说,你通过类似于在根目录/的硬盘分区上挂载文件系统来开始整个挂载的过程。 你可以挂在其他的硬盘分区到/boot,/tmp或者/home。有也可以把软驱的文件系统挂载成/mnt/floppy, CD-ROM的文件系统挂载成/media/cdrom1。 举例来说,你也可以挂在类似于NFS的网络文件系统。 当然啊了,还有其他类型的文件系统,这里只是给你一个初步的概念。当挂载过程真的挂上了一些设备的文件系统, 一般我们就简单的说, 你把设备上的文件系统给挂载了。

现在,假定你已经挂载了根文件系统(/),并且你想挂载一个IDE CD-ROM,/dev/hdd,在挂载点/media/cdrom。这个挂载点必须在你挂载CD-ROM之前就已经存在。 当你挂在CD-ROM的时候,在CD-ROM上的文件和子目录成为/media/cdrom下面的文件和目录。以前在/media/cdrom下面的文件和子目录都将无法看到。虽然它们依旧存在在包含/media/cdrom的那个块设备的物理空间里面。如果CD-ROM被卸载,原始文件将会再次被看到。 你应当注意避免这个问题,不要把文件放在挂载点的下面。
下马是FHS目录的内容:
bin 主要的命令目录
boot 用来启动挂在的静态文件
dev 设备文件
etc 主机特定的系统配置
lib 必须的共享文件库和核心模块
media 为了便携式媒介的挂载点
mnt 临时挂在一个文件系统的挂载点
opt 附加应用程序包
sbin 必要的系统命令
srv 这个系统提供的服务数据
tmp 临时文件
usr 第二个层次
var 可变数据

分区
我们在前面已经学习到了,第一个IDE硬盘叫做/dev/hda,第一个SCSI硬盘叫做/dev/sda。硬盘是以512字节为一扇区进行格式化的。在一个磁盘上的扇区在不移动磁头读取的内容组成内容称为轨道。 一个硬盘通常由若干个磁盘组成。在几个磁盘上的内容,在无需移动读取头就可以读到的数据组成了柱面(cylinder)。硬盘的几何学就是用柱面,轨道(或者磁头)/每柱面和扇区/轨道。

如果2个不同的分区程序对磁盘的物理分配有不同的理解,很有可能就产生一个分区程序报错或者无法认出另外一个分区程序建立的分区。 如果一个硬盘从一个系统搬移到另外一个系统,就会出现这种情况。 ,尤其当BIOS的能力是不同的情况下。你可以看到Linux系统的磁盘构成通过在/proc下的文件系统,比如/proc/ide/hda/geometry。这个就是被类似于fdisk或者parted程序所使用的信息,下面是使用parted分区所得到的信息。

先用cat /proc/ide/hda/geometry 查看(无法在F7里面找到)

然后使用parted /dev/hda

现在注意, parted计算出了1024柱面的位置。柱面1024在旧的系统里面非常重要。因为旧的BIOS仅支持1024柱面里面的启动。这种情况大部分出现在BIOS不支持LBA的请看下面。有3种分区类型: Primary, logical 和extended(扩展)。 分区表格是放在一个硬盘的MBR(Master bootrecord)中。 MBR是在磁盘上的第一个扇区,因此,分区表格不可能非常大。 这也就限定了来一个磁盘上,主分区顶多是4个。当需要超过4个分区的时候,其中一个主分区必须变成一个扩展分区。一个磁盘只能包含一个扩展分区。

一个扩展分区是一个放置逻辑分区的容器。 这个分区的scheme原来是被用于MSDOS和PCDOS来允许PC磁盘被DOS,windows或者LInux使用。

Linux把住分区和扩展分区规定为为1~4,因此,/dev/hda可能有4个主分区,/dev/hda1/dev/hda2/dev/hd3和/dev/hd4。或者它可能有一个主分区/dev/hda1和一个扩展分区,/dev/hda2。如果有逻辑分区存在,他们的号码是从5开始的。因此,/dev/hda的第一个逻辑分区应当是/dev/hda5,即使前面没有没有主分区和扩展分区。

Listing2 显示了用PRINT参数打印出来的结果(从parted里面)。


分配磁盘空间
就像前面提到的一样,Linux文件系统是一个大的单独的树根目录(/)。很容易我们就理解为什么软驱和CD-ROM要挂载,但是,你可能不太理解为什么存储在硬盘上的数据要分开。我们这么做是为了以下理由:
1)启动文件。 有一些文件在启动的时候必须让BIOS或者boot loader能够访问。
2)多个硬盘。 每个硬盘应当被分为一个或者多个分区,每个分区都有一个文件系统,而且应当被挂载在树的某处。
3)可共享文件。 几个系统镜像可以共享类似于执行程序的静态文件。类似于用户目录或者邮件交换池的动态文件也可以给共享。 所以,无论用户在那个网络终端登录,都可以使用相同的文件目录和邮件系统。
4) 可能的溢出。 如果一个文件系统可能装满100%的文件,那么把使用文件和系统文件分开是一个好主意。
5) 磁盘配额。 配额文件限制了磁盘空间,用户或者用户组可以使用的文件系统的空间。
6)只读挂载。 在纪录文件系统出现前,从一个系统崩溃中恢复是需要很长时间的。因此,对于很少改动的文件系统(比如可执行程序)应当被用来只读挂载,因此一旦系统崩溃,我们就不必花费时间在这些文件上面。

除了我们提到的文件系统以外,你也要考虑交换文件的位置。对于一个Linux系统来说,这个是一个,或者多个的特定分区。

做出选择
让我们假定你正在为至少一个硬盘的系统做设置,你想要从这个硬盘启动。 虽然以后也是有可能再次改变分区的尺寸,但是,我们还是多花费一点精力在分区上面。
你的第一个要考虑的是确保你的系统能够启动。一些旧的系统的BIOS只能读取小于1024柱面的磁盘位置。如果你的确是使用的这么一个系统,你就必须创建一个/boot的分区,在这个分区里面有着启动系统的关键文件。 一旦这些关键文件被调取,Linux会从BIOS那里接管对于系统的操作。1024分区也不会产生进一步的影响。如果你要创建/boot分区,一般来说100MB已经足够了。

你下一步要考虑的是交换空间的大小。 一般来说,对于当前内存的价格,交换空间代表着一个非常缓慢的二级内存。 你可能考虑用500MB给一个工作站,1GB空间给server。 使用交换文件确实是可以的,交换空间会更好一点。一般是内存的2倍。

现在我们要谈一下不同点。 对于一个个人电脑和server的可预见性的比较,个人电脑是非常难以预料的。我喜欢的方法是,尤其对与新的用户,分配标准的目录(/usr,/opt,/var,等)。到一个单独的大的分区。这个对于一个新用户来说是很有帮助的。 一个运行图像桌面和一系列开发工具的工作站需要2或者3GB的磁盘空间作为个人用户使用。一些打的开发工具可能需要更多的空间。 我通常都是分配在10GB到20GB每个操作系统,我把剩下的空间来挂载其他的版本的Linux。

Server的工作会比较稳定,如果一个特定文件系统的空间被消耗完毕,会造成一个巨大的灾难。因此,你应当建立多个分区,使用RAID或者logical volume groups来跨接多个硬盘。

你可能也要考虑你的工作负载,是否文件系统被几个系统共享,或者只是使用在一个系统。
无论你实在配置个人电脑还是server,你将会有一些对系统来说很重要的文件。典型的来说,这些包括存储在/etc下面的系统参数,/boot启动文件,/sbin启动文件和系统恢复文件,/root是root用户的目录,/var/lock是存放被锁住的文件,/var/run是存放系统运行的信息,/var/log是存放系统log的信息。 其他文件系统,比如/home是存放用户目录的地方,/usr,/opt,/var/mail或者/var/spool/news可能放在不同的分开的分区,或者网络挂载,这个要根据你的系统需求决定。

Section 3. Boot Managers(启动管理)
在我们深入讨论LILO和GRUB之前,让我们先来复习以下PC是如何启动的。 BIOS是存储在ROM里面,或者EEPROM,或者flashmomery。这种存储器即使没有电,内容也不会丢失。 当PC被开启或者重新启动的时候,BIOS里面的程序被执行。通常,BIOS会执行POST(Power on self test)来坚持机器的硬件。然后,它会调取启动硬盘上的MBR(Master BootRecord)。
在我们以前关于分区的讨论中,MBR是包含了分区表信息,因此,MBR里面分区执行表的尺寸是小于512B的。要注意的是,即使是一张软盘,也是包含了MBR的,虽然这个MBR里面可能只有“Non-bootable disk in Driver A:".BIOS调取这段代码称为启动第一阶段(Stage 1 boot loader)。

标准的硬盘MBR能够被MS DOS, PCDOS所使用。 Windows 操作系统检查分区表来找到在启动硬盘上的主分区, 通常这个主分区被标识为”A“,读取那个分区的第一个扇区的内容,然后把控制权交给读取的代码。 这个新的代码被称作为分区启动代码。 分区启动纪录是另外一个另外一个Stage 1boot loader。 但是,这个可以从分区里面读取几个块。 这个新的代码被称为Stage 2 boot loader。如果在MSDOS中,这个第二步读取可以直接进入剩余的操作系统。 这个就是操作系统能够让他们自己启动起来。

这个系统对于单独一个OS还是能够处理。那么如果你装有几个操作系统,比如WIN98,XP,和3种不同的Linux版本,那么怎么办呢?你可以用一些程序(比如类似于DOS的FDISK程序)来改变活动分区并且重启。 当然了,这个方法非常笨。 进一步来说,一个硬盘只能有4个主分区,标准的MBR只能从其中一个主分区启动。但是,我们的假设的是5个OS,那么怎么办呢?

解决方案就是使用一些特殊的代码,这种代码允许一个用户选择那个操作系统能够启动。 比如:
1. Loadlin, 这个是一个dos的程序, 可以让在一个运行DOS的环境启动Linux分区。
2. OS/2 启动管理, 一个抓装在指定小分区的程序。 这个分区是被标识激活,并且标准的MBR启动会启动这个分区管理程序。 这个程序会显示一个菜单,让用户选择从那个OS启动。
3.一个高智能的启动管理器, 它可以被安装在一个操作系统分区内,并被一个激活的分区引导纪录调取或者被MBR调取。举例来说:BootMagic(Norton 分区程序), LILO(Linux LOader), GRUB (the GRandUnified boot loader)

很明显的是,如果你能够手上有一个程序需要超过512字节来完成启动,那么启动一个逻辑分区几乎就是不可能的,或者启动一个不是启动硬盘上的分区也是不可能的。当然,以上方案都可以被解决只要采用了以下的措施。要么找一个专门的引导分区存放一个引导纪录,或者知道那些文件会在启动时候所需要。

从现在开始,我们会聚焦在LILO和GRUB上,这两个程序被包含在大多数的Linux发布包里。在你安装Linux的时候,应该会让你选择安装哪一个。 它们每个都能和现在大多数硬盘一起工作。记住硬盘技术发展很快,你必须要确保所有的BIOS等都支持该硬盘,不然会丢失大量数据。

LILO和GRUB使用了第二步(Thestage 2 loaders)来让你选择那个操作系统你要启动。 然而, LILO和GRUB是区别很大的。如果你升级一个核心或者让系统发生改变,LILO需要你重新生成一张LILO启动软盘。而GRUB能够完成这个人物只需要编辑一个配置文件。LILO早就出现,GRUB是一个新事物。 原来的GRUB被称作为GRUB 遗留版。 而GRUB2也在开发中。

LILO
LILO,或者称为Linux读取器,是世界上最普遍的Linux启动器之一。 LILO能够安装在你启动硬盘上的MBR中,或者一个分区的分区启动纪录里面。 它也可以装载移动设备里面,比如软盘,CD,或者USB盘。 你可以用软盘或者USB盘来做LILO的实验
在Linux的安装过程中,你会指定安装LILO或者GRUB作为启动管理器。 如果你选择了GRUB,你有可能就没有安装LILO。我们现在假定你已经有了LILO安装包。
在/sbin/lilo里面的"lilo"命令的主要作用,是写一个Stage 1 bootrecord,然后使用在/etc/lilo.conf的配置文件建立一个map文件(/boot/map),。这里还有一些辅助的用法我们等一下再提。 首先,让我们来看看典型的用在双系统启动(windows&Linux)的LILO配置文件。

第一组是通用信息。
在我们这里例子里面,通用信息是:
prompt /* 强制显示一个启动提示×/ timeout=50 /*按照1/10s指定,等待时间选择默认值, 50=5s */ compact /*尝试来 融合读取需求附近的扇区,这样可以加速启动时间,把map做小*/ default=linux /*指定那个OS应当默认读取,如果没有指定,第一个OS就是默认 */ boot=/dev/fd0/*指定了LILO的安装位置,在我们的例子里面,这个是软盘/dev/fd0。如果要安装在第一个硬盘的MBR里面,可以选择boot=/dev/hda。我们的RHEL3系统是安装在/dev/hda11上,因此,我们就要指定boot/dev/hda11。如果这个参数忽略,LILO会尝试使用当前挂载root(/)的设备的启动扇区 */ map=/boot/map /*指定map文件的指定位置,这个map文件是LILO用来提供用户提示,用来读取lilo.conf文件里面每个映像扇区的操作系统 */ install=/boot/boot.b /*指定作为启动扇区的来安装的新文件。 默认是/boot/boot.b, 是LILO默认提供的。 */ message=/boot/message/*指定在启动提示前显示的信息。 这个文件的长度必须小于65535字节。 如果你要显示一副图片做背景,你要找到/boot/message里面所包含的一个图像文件在一些RH系统里面,这个是一个300X200像素的PCX格式文件。在SUSE系统里面,你可能找到一个文件为16色,640X480像素的VGA的位图。在这个例子李曼,你同样可以找到额外的参数。 */ lba32 /*指定了LILO应当使用LBA32模式而不是CHS或者线性扇区来读取 */ password=mypassword/*在这里指定一个口令用来保护镜像。注意这里是用的明文字的方式存储,所以/etc/lilo.conf应当只有root才可以阅读。它不应当是和root的password为同一个口令。这个密码和下一个选项(restricted)通常可以在每个镜像文件里指定,放在全局这里纯粹为了方便。如果被指定单独的Image的密码,它将会覆盖全局密码 */ restricted /*用来和上面的密码一起协同工作。这个密码仅跳出当启动时带有其他参数。你可以让普通用户启动无需输入密码,只有当进入单独用户模式,才需要密码 */
下面的一个区域是区域属性,只适合RHEL3系统(按照例子)
image=/boot/vmlinuz-2.4.21-32.0.1.EL /*指定了这个区域是Linux系统,应当读取一个文件。参数是Linux核心镜像的文件名 */ label=linux /* 这个是一个可选择的选项,你可以用它来代替镜像全名 */ initrd=/boot/initrd-2.4.21-32.0.1.EL.img /*这个是初始化RAM磁盘的名字,这个里面包含了在启动文件系统前,核心所需要的模块 */ read-only /* 指定了启动文件系统的初始化挂载 应当是只读的。 在以后完成检查后,启动步骤会重新挂载一个可读写的 */ append="hdd=ide-scsi root=LABEL=RHEL 3"/*指定了传输给核心的参数。我们这个实验指定了SCSI模拟,所以,应当使用/dev/hdd(在早期的2.4和更早的版本,核心用这个方法来挂载光驱)。 它同时也指定了了有RHEL3标志的分区应当作为root(/) */
最后一个区域是给非linux区域所制定的参数。

other=/dev/hda1 /* 指定了设备的名称,该设备包含了系统引导扇区*/ loader=/boot/chain.b /*指定了读取器。 LILO支持chain.b, 这个帮助从一个分区,启动分区,和其他分区来读取分区引导纪录, /boot/os2_d.b可以用来引导第二个硬盘的OS/2 */ label=WIN-XP /*一个可选项。你可以输入这个来代替全名*/
如果你现在插入一张软盘,我们可以运行lilo命令来创建一个可启动的软盘。注意,lilo有5层,指定参数-v来设定每个层。


我们现在得到LILO的磁盘。如果LILO遇到错误,你可能会看到一个错误的信息。并且启动扇区就不会被写(软盘)。距离,如果我们删除lba32这个选项在/etc/lilo.conf文件里面。我们可能看到在下面列表的问题。这个可以是尝试使用linear(线性)或者lba32的选项。 在这个例子里面,我们可以使用参数-l(对于线性)或者-L(对于LBA32)来完成操作。

当你完成测试你的启动盘,把lilo.conf里面的boot=/dev/fd0这个项目改掉,由此把LILO安装到MBR或者一个分区齐达内噢乖纪录里面。举例来说, boot=/dev/hda会安装LILO到你的第一个硬盘的MBR里面。

你现在应该应该对LILO和它的配置文件有了一个初步的了解。 包括如何来覆盖一些控制文件的选项。 你可以查看man lilo来得到更多的信息。 你可以用grep来查找信息。
rpm -ql lilo | grep ".ps$"

Lilo附属命令:
LILO有几个附属命令:
lilo -q 从map文件里面显示信息
lilo -R 让lilo下次启动的时候,自动启动到指定系统(仅仅在下次有用)。 这条命令对远程控制十分有帮助。
lilo -l 会显示到核心的路径信息
lilo -u 会卸载lilo并恢复以前扇区引导纪录

当用LILO启动一个Linux系统的时候,你可能想要在启动的时候,提供额外的的参数。举例来说,如果你的图像模式在启动后没有出现,你可能需要进入模式3或者进入单独用户模式来修复。 在标识后面的任何你输入的东西都将作为参数传递到核心。举例来说,我们选择RHEL系统,我们输入”linux“。 如果要进入模式3或者单独用户,我们输入linux 3 或者linux single。
必须要记住,如果使用LILO,每次你修改配置文件(/etc/lilo.conf),你都必须运行lilo命令。 如果你增加,移动,或者删除了分区或者任何可能影响到启动的改变,你也需要重新运行lilo命令。

TOP

感谢,好资料

TOP