Boot Loader:认识操作系统的文件格式,并据以加载核心到主存储器执行。LILO(早期)、grub(现在主流)、spfdisk(台湾)
BIOS:(Basic Input Output System)"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
CMOS:(Complementary Metal Oxide Semiconductor),互补金属氧化物半导体,常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的RAM芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。
PnP设置:(plugin and play)PNP是由Microsoft提出的,意思是系统自动侦测周边设备和板卡并自动安装设备驱动程序,做到插上就能用,无须人工干预,是Windows自带的一项技术。
MBR:(master boot record)主要启动记录区,每个开机装置的第一个启动扇区
INT 13:直接通过控制磁盘控制器来访问磁盘,但这样就要涉及许多的硬件细节,如是OS们都借助于BIOS的int 13h中断例程来访问磁盘.
SATA:(Serial Advanced Technology Attachment),是由Intel、IBM、Dell、APT、Maxtor和Seagate公司共同提出的硬盘接口规范。
IDE:(Integrated Drive Electronics)即“电子集成驱动器”,俗称PATA并口。
/boot/vmlinuz or /boot/vmlinuz-verson ----核心档案
/lib/modules ----模块的放置位置(驱动程序多以模块的方式存在,/lib和/必须在同一分区)
/boot/initrd or /boot/initrd-verson ----虚拟文件系统 ,能够透过boot loader加载到内存仿真成一个根目录,该文件系统还可提供一直程序加载开机过程需要的核心模块(驱动程序)
/etc/inittab ----/sbin/init的配置文件,包含runlevel等设定项目
/etc/rc.d/rc.sysinit ----这个脚本在加载各项系统服务前设定好系统环境(不同的发行版可能会不同)【1-12】
/etc/rc.d/rc.local ----用户自定义的开机启动脚本
/etc/sysconfig/ ----开机过程涉及到的配置文件
/etc/sysconfig/modules/ ----用户自定义加载的模块的位置
/etc/modprobe.conf ----对应自定义模块的配置文件(系统发现驱动程序错误时我们才需要手动处理),更多信息:man modprobe.conf
/boot/vmlinuz or /boot/vmlinuz-verson ----..核心
/boot/initrd or /boot/initrd-verson ----..核心解压缩需要借助的虚拟文件系统
/lib/modules/version/kernel or /lib/modles/$(username -r)/kernel
/usr/src/linux ----核心原始码,预设不会安装
/proc/verson ----核心版本
/proc/sys/kernel ----系统核心功能
1 . linux的开机流程分析
1.1开机流程一览【1-0】
1.2BIOS,boot loader与kenel载入
1.1.1BIOS,开机自测与MBR
1.1.2Boot Loader的主要功能
注意:每个文件系统(扇区)都会保留一个boot sector(启动扇区)提供给操作系统安装boot loader,如果一个系统安装在A分区,那么MBR和A分区的boot loader中都会保存一份boot loader.【1-1】
一:提供选单
二:载入核心档案
三:转交其它loader
【开机管理程序的选单功能与控制权转交功能示意图 1-2】
1.1.3加载核心侦测硬件与initrd的功能
注意:linux将核心解压缩到主存储器后开始接管BIOS后的工作,利用核心的功能侦测驱动周边装置。核心会重新侦测一遍硬件,不一定会用到BIOS侦测的硬件信息。
# ls --format=single-column -F /boot ----观察与核心相关的文件【1-3】
【 BIOS与boot loader及核心加载流程示意图 1-4】
1.现将/boot/initrd复制到/tmp/initrd中,等待解压缩
# mkdir /tmp/initrd
# cp /boot/initrd-2.6.18-92.el5.img /tmp/initrd/
# cd /tmp/initrd
# file initrd-2.6.18-92.el5.img ----查看该文件的格式,发现时gzip压缩格式
2.将上述档案解压缩
# mv initrd-2.6.18-92.el5.img initrd-2.6.18-92.el5.gz ----改成文件名改为.gz结尾,这样一来解压缩软件就可以识别了
# gzip -d initrd-2.6.18-92.el5.gz ----解压缩
# file initrd-2.6.18-92.el5 ----查看该档案的类型信息,发现是cpio指令压缩成的
3.用cpio指令解压缩
# cpio -ivcdu < initrd-2.6.18-92.el5 ;ll ---解压换个文档看看虚拟恩建系统是什么样子的【1-5】
4.观察init档案内重要的执行项目
# cat /tmp/initrd/init ----【1-6】
1.3第一支程序Init及配置文件/etc/inittab与runlevel
1.3.1Run level:执行等级有哪些【1-7】
# cat /etc/inittab ----【1-8,9】
【1-10 inittab的档案语法】
1.3.2init的处理流程和简单设置方法【1-11】
1.4init处理系统初始化流程(/ec/rc.d/rc.sysinit)
# cat /etc/rc.d/rc.sysinit ----查看各种服务启动之前系统的的初始化工作【1-12】
1.5启动系统服务与相关启动配置文件(/etc/rc.d/rc N & /etc/sysconfig)
# ll /etc/rc5.d/ ----观察run level为5时系统服务的启动情况(可以观察一下/etc/init.d/rc这个脚本)
1.6用户自定义开机启动程序(/etc/rc.d/rc.local)
注意:一种比较麻烦的方法是将自定义的脚本放到/etc/init.d/下,然后在/etc/rc5.d/下建立连结档,下面给出通常的简单的方式
# vim /etc/rc.d/rc.local ----该文档由/etc/rc.d/rc.sysinit在系统初始化时调用
1.7根据/etc/inittab之设定,加载终端机或x-windows接口【1-14】
1.8开机过程会用到的主要配置文件:/etc/modprobe.conf,/etc/sysconfig/*
1.8.1关于模块:/etc/modprobe.conf【1-15】
1.8.2/etc/sysconfig/*【 1-16 几个重要配置文件介绍】
1.9Runlevel的切换:runlevel,init
注意:# init 0 ----实现关机;# init 6实现重启
# renlevel ----查看主机目前的run level
# init 3 ----暂时切换run level为3(如果想在下次开机时依然生效需要修改/etc/inittab)
# runlevel ----查看变化
2 .核心与核心模块
/boot/vmlinuz or /boot/vmlinuz-verson ----..核心
/boot/initrd or /boot/initrd-verson ----..核心解压缩需要借助的虚拟文件系统
/lib/modules/version/kernel or /lib/modles/$(username -r)/kernel
/usr/src/linux ----核心原始码,预设不会安装
/proc/verson ----核心版本
/proc/sys/kernel ----系统核心功能
/lib/moduels/$(uname -r)/modules.dep ----记录了核心支持的模块的各项相依相
2.1核心模块与相依性:depmod
# ll /lib/moduels/$(uname -r)/kernel ----查看核心目下的子目录【1-18】
depmod 建立核心模块相依性档案的指令【1-19】
案例一:假设做好了一个网卡驱动程序a.ko,更新核心相依性
# cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net ----将驱动模块放入相应的文件夹中(系统给了特殊定义的文件夹)
# depmod ----该指令会将使之前做好的程序移动到标准放置目录,并依据相关目录的定义将所有模块捉出来分析,最后将分析的结果写入/lib/moduels/$(uname - r)/modules.dep文档中
2.2核心模块的观察:lsmod,modinfo
# lsmod ----查看目前核心加载的全部模块,显示格式(模块名称 模块大小 被谁使用)【1-20】
# modinfo mi ----查看模块mi的详细信息,可以看到这个模块的来源以及模块的说明,该指令还可以查看模块的档案(需要完整档名)
2.3核心模块的加载与移除:insmod,modprobe,rmmod
insmod 手动加载模块指令,要求后面跟模块(建议使用modprobe,会主动检查模块依赖性)
# insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko ---手动载这个文件系统相关的模块,后面必须是(不会自动检查模块的依赖性)
# lsmod | grep cifs ----看看是否手动载入成功
rmmod 手动移除模块,如果有依赖问题将无法移除【1-22】
# rmmod cifs ----将刚刚加载的模块移除
modprobe 取代insmod和rmmod,自动解决依赖问题
# modprobe cifs ---- 加载cifs文件系统模块(不需要完整的档名,因为完整文件名记录在/lib/mudules/`uname -r`/modules.dep,而该指令会自动搜寻这个文件)【1-23】
# modprobe -r cifs ----移除这个模块
案例一:手动加载vfat这二个模块,然后观察vfat依赖的模块
# modprobe vfat ----加载模块
# lsmod | grep vfat ----观察发现是fat
2.4核心模块的额外参数设定:/etc/modprobe.conf
案例一:两个网络卡使用同意该模块,设置额外的模块参数防止冲突
# vi /etc/modprobe.conf
alias eth0 ne ----eth0网卡使用ne这个模块
alias eth1 ne ----eth1网卡也使用这个模块
options eth0 io=0x300 irq=5 ----强制指定io基地址和中断请求
options eth1 io=0x320 irq=7
注:查看系统资源配置信息
# cat /proc/interrupts ---- 列出正在使用的IRQ(共16条IRQ请求线)中断资源
# cat /proc/ioports ----列出正在使用的io端口地址
# cat /proc/dma ----列出正在使用的dma(直接存储器存取,DMA0-7)通道
3 .Boot loaler:Grub
3.1boot loader的两个stage
stage1:执行MBR或者boot loader中的最小主程序(只有446bytes的存储空间,只有最小主程序存储在里面)
stage2:主程序加载配置文件(一般来说都在/boot/下面)
# ls -l /boot/grub ----查看与grub有关的配置文件【1-24】
3.2grub的配置文件/boot/grub/menu.lst与选单类型:磁盘代号,menu.lst
注意:grub是目前应用最广泛的开机管理程序,它的特点:【1-25】
3.2.1硬盘与分割槽在grub中的代号【1-26】
案例:假设系统中只有一颗sata硬盘,该硬盘的第一个逻辑分割槽在Linux与grub当中的代号和档名【1-27】
档名:/dev/sda5 grub中的代号:(hd0,4)
3.2.2/boot/grub/menu.lst配置文件
# vim /boot/grub/menu.lst ----看看grub的配置文件【1-28,29】
3.2.2.1选单中提供的两种开机方式
第一种:直接指定核心开机(以/boot独立分区的情形为例)
# vim /boot/grub/menu.lst
title CentOS(2.6.18-92.el5) ---- 设置这个选单的标题
root (hda0,0) ----root指核心档案所在的分区而不是根目录所在分区,这里指的是第一块硬盘的第一个分区(/boot在/dev/hda1为独立分区)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite ----指出核心档名和根目录挂载的分区(/1指的是/dev/hda2),rhgb指色彩显示,quite是安静模式
initrd /intrd-2.6.18-92.el5.img ----这里指出虚拟文件系统的档名
或者
title CentOS(2.6.18-92.el5)
kernel (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite
initrd (hda0,0) /intrd-2.6.18-92.el5.img
注:/boot独立分区和非独立分区各给出一个案例【1-30】
第二种:利用chain loader转角控制权的方式
# vim /boot/grub/menu.lst
title windows partition ----该案例针对装在/dev/hda1上的windows
root (hd0,0) ----指出chain loader在第一块硬盘的第一个分割槽内
chainloader +1 ----在这个分区的第一个扇区(即boot loader的位置)
改进(该分区需要设定为激活状态)
title windows partition
hide (hd0,4) ----隐藏/dev/hda5上的linux
rootnoverity (hd0,0) ----grub默认检查激活状态,我们设定不检查这个分区
chainloader +1
makeactive ----设定此分区为开机碟
3.3initrd的重要性与建立新的initrd档案:mkinitrd
注意:initrd未必会被用到,只有当核心不具备某种驱动以识别某些类型的文件系统是才需要,比如驱动在IDE接口的硬盘中就不需要,因为核心具备相关驱动【1-31】
mkinitrd 重置initrd文件的指令【1-32】
案例一
# mkinitrd -v initrd_$(uname -r) $(uname -r) ----以默认方式建立一个新的initrd档案,指定核心的版本并显示运作过程
# ll initrd_* ----可以看看这个档案建立好了没【1-33】
案例二
# mkinitrd -v --with=8139too initrd_vbirdtest $(uname -r) ----创建时添加8139too这个模块 ,意味着载入虚拟文件系统时会载入这个模块
3.4测试与安装grub:grub-install,grub sheel
grub-install 安装grub配置文件的指令【1-34】
案例一:将grub安装在目前系统的MBR下,系统所在磁盘为/dev/hda
# grub-install /dev/hda ---查看/boot/grub下回发先文件已经被更新了
案例二:将grub安装在某个指定分区的Boot sector内(假设/dev/hda3),注意grub可以安装在该系统所挂载的任何一个分区的boot sector内,不妨假设为/home挂载的位置
# ggrub-install --root-directory=/home /dev/hda3
# ll /home/boot/grub/ ---- 观察安装进来没有
案例三:编辑三个开机选项【1-35】
# vim /boot/grub/menu.lst
default=0 ----第一个选单为默认选单
timeout=30 ----设置等待30秒
splashimage=(hd0,0)/grub/splash.xpm.gz ----选单背景图片的位置
#hidenmenu ----读秒期间显示完整的选单画面(预设隐藏)
title CentOS(2.6.18-92.el5)
root (hd0,0) ----root指核心档案所在的分区而不是根目录所在分区,这里指的是第一块硬盘的第一个分区(/boot在/dev/hda1为独立分区)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite ----指出核心档名和根目录挂载的分区
initrd /initrd-2.6.18-92.el5.img ----虚拟文件系统的档名
title /dev/hda1 boot sector <=====================本例中的第一个新增选单(使用/dev/hda1中的boot loader)
root (hd0,0)
chainloader +1 ----第一个扇区
title MBR loader <=========================新增第二个选单(重新读取MBR中的boot loader)
root (hd0) ----用整颗硬盘的代号表示MBR
chainloader +1
title single use mode <========================新增第三个选单(强制进入单人维护模式)
root (hd0,0) ----root指核心档案所在的分区而不是根目录所在分区,这里指的是第一块硬盘的第一个分区(/boot在/dev/hda1为独立分区)
kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite single ----指出核心档名和根目录挂载的分区、单人维护模式
initrd /initrd-2.6.18-92.el5.img ----虚拟文件系统的档名
grub sheel 安装grub主程序到boot loader的工具
1.几个常用指令
grub> root (hdx,x) 选中含有grub目录的分区(/boot/grub/所在的分区)
grub> find /boot/grub/stage1 ----看看能否找到安装信息档案
grub> find /boot/vmlinuz ----看看能否找到核心文件
grub> setup (hdx,x) ---将grub安装在该分区上的boot sector
grub> setup (hdx) ----将grub装在相应硬盘的MBR上
grub> quit ----离开grub sheel
2.几个案例
案例一
# grub ---进入grub sheel
grub> root (hd0,0) ----/boot/grub在hda1中,grub能分辨出该分割槽的文件系统
grub> find /boot/grub/stage1 ----看看有没有grub主程序,会显示装置的档名
grub> find /boot/vmlinuz-2.6.18-92.el5 ----搜寻核心(/boot不独立分区) or find /boot/vmlinuz-2.6.18-92.el5 ----搜寻核心(/boot独立分区)
grub> setup (hd0) ----将主程序安装到MBR
grub> setup (hd0,0) ----在/dev/hda1的boot sector中 也安装一份
grub>quit ----退出grub sheel,安装好的grub主程序会读取/(hd0,0)/gurb/menu.lst这个配置文件
3.5开机前的额外功能修改
注意:遇到开机问题时可以尝试在选单阶段重新编辑选单,但是如果grub也故障的话就应该尝试外部挂载方式启动了
3.6关于核心功能中的vga设定(修改终端分辨率)
# grep ‘FRAMEBUFFER_CONSOLE‘ /boot/config-2.6.18-92.el5 ----查看核心是否支持终端分辨率的修改
CONFIG_FRAMEBUFFER_CONSOLE=y ----这一行后面为y表示支持,如果被注释或者n表示不支持
# vim /boot/grub/menu.lst
title CentOS(2.6.18-92.el5)
kernel (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790 ----分辨率设置依据表【1-36】
initrd (hda0,0) /intrd-2.6.18-92.el5.img
3.7BIOS无法读取大硬盘的问题
原因:BIOD无法正确识别大硬盘中kernel和initrd存储的实际位置
解决方法一(系统安装前):根据BIOS至少能够读取1024磁柱以内的数据,分区时将/boot独立分区且先分出这个分区给/boot (推荐)
解决方法二(系统安装后):简单一点直接重灌,即重新制作一个分区挂载/boot,保证这个新的/boot挂载的分区在1024转以内 (推荐)
解决方法三(后):用光驱开机,借助grub的可编写能力进入linux
解决方法四:直接将硬盘的信息写到BIOS
3.8为个别选单加上密码:gurb-md5-crypt
# grub-md5-crypt ----通过这个指令得到一个对密码字串加密后的md5值,$.....(以$开头,以 . 结尾)
# vim /boot/grub/menu.lst ---编辑grub配置文件对选单加密
title CentOS(2.6.18-92.el5)
password --md5 $....... ----这一行具备加密的作用,注意一定是在title底下第一行,这种方式可以通过编辑模式计入选单修改选单破解
kernel (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790 ----分辨率设置依据表【1-36】
initrd (hda0,0) /intrd-2.6.18-92.el5.img
升级 (用户想进入编辑模式的话就要输入密码)
default=0 ----第一个选单为默认选单
timeout=30 ----设置等待30秒
password --md5 $....... ----放在整体设置处
splashimage=(hd0,0)/grub/splash.xpm.gz ----选单背景图片的位置
#hidenmenu ----读秒期间显示完整的选单画面(预设隐藏)
title CentOS(2.6.18-92.el5)
lock ----在选单中增加lock字段
kernel (hda0,0) /vmlinuz-2.6.18-92.el5 ro root=LABEL=/1 rhgb quite vga=790 ----分辨率设置依据表【1-36】
initrd (hda0,0) /intrd-2.6.18-92.el5.img
4 .开机过程中的问题解决
4.1忘记root密码的解决之道
第一步:重启
第二步:开机进入grub选单
第三步:选择一个进入详细设定,移动到kernel那一行,e进入编辑状态
grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quite single
第四步:【ENTER】,b,这时进入单人维护模式并得到一个sheel
第五步:# passwd ----重置root的密码
第六步:# init 5 ----进入x窗口模式
4.2init配置文件错误(/etc/inittab损坏)
第一步:重启
第二步:开机进入grub编辑状态
第三步:grub> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quite init=/bin/bash ----因为执行init时,任何开机模式都需要读取/etc/inittab文件,因此我们将实际的init替换为/bin/bash,从而掠过文件系统直接进入bash sheel
第四步:【ENTER】,b,这时一个sheel工作
第五步:# mount -o remount,rw / ----因为根目录在开机阶段是以只读的方式挂载的,因此我们重新以可擦写状态挂载
# mount -a ----根据/etc/fstab的内容进行重新挂载文件系统测试
第六步:此时可以进行救援了(修改/etc/inittab)
第七步:重启
4.3BIOS磁盘对应的问题(device.map),两个系统分别安装在两颗磁盘
注意:此时BIOS依据设定获得第一个可开机的装置,并读取boot loader,即grub,但grub中对磁盘的记录代号是依据侦测的顺序编写的,可能不对应BIOS的指定
# vim /boot/grub/device.map ----写死装置的对应
(fd0) /dev/fd0
(hd0) /dev/hda
或者
# grub-install --recheck /dev/hda1 ----device.map会被主动更新
4.4因文件系统错误而无法开机
【文件系统错误示意图 1-37】
Give root passwd for maintenance
(or type Control-D to continue):****** ----输入密码取得bash
# mount -o remount,rw / ----将根目录重新挂载为可读写状态
# fsck /dev/md0 ----做quota时出错的话用fsck进行检测
clear[Y/N]y ----清理错误
4.5利用chroot切换到另一颗硬盘工作
第一步:进入一个正常的linux系统(cd/u盘/硬盘)
第二步:将故障的linux所在的分区全对应原来分区挂载的位置部进行如下挂载
# mount /dev/hdb1 /chroot/
# mount /dev/hdb2 /chroot/var
# mount /dev/hdb3 /chroot/home
# mount /dev/hdb4 /chroot/usr
# chroot /chroot ----更换根目录
5.重点回顾【1-38】
6.本章习题
模拟题一:利用救援光盘来处理系统错误导致的无法开机的问题
第一步:利用光盘开机,进入救援模式侦测
boot:linux rescue ----进入救援模式的侦测,按下F5就可以看到输入的选项
第二步:进行类似装机的基本设置,之后救援光盘会将侦测到的centos整合成一个chroot等待处理
第三步:chroot /mnt/sysimage ----进入侦测到的出问题的系统,这是会得到一个sheel
第四步:# df ----查看出错的系统是否被正确地挂载了
第五步:对系统进行修复
简答题:【1-39,40】
原文:http://www.cnblogs.com/eli01/p/3559675.html