第20章 开机流程、模块管理与Loader
Linux系统开机流程:
1.加载BIOS的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置;
2.读取并执行第一个开机装置内MBR的boot Loader(亦即是grub,spfdisk等程序);
3.依据boot loader的设定加载Kernel,Kernel会开始侦测硬件与加载驱动程序;
4.在硬件驱动成功后,Kernel会主动呼叫init程序,而init会开始侦测硬件与加载驱动程序;
5.init执行 /etc/rc.d/rc.sysinit 文件来准备软件执行的作业环境;
6.init 执行 run-level 的各个服务之启动(script方式);
7.init执行 /etc/rc.d/rc.local 文件;
8.init 执行终端机仿真程序 mingetty 来启动 login 程序,最后就等待用户登录
boot loader的主要功能如下:提供选项(用户可以选择不同开机项目)
载入核心文件(直接指向可开机的程序区段来开始操作系统)
转交其他loader:将开机管理功能转交其他loader
最终,boot loader还有一个功能:加载kernel 文件
虚拟文件系统(Initial RAM Disk)在Linux系统开机过程中很重要(当开机时无法挂载根目录),它一般使用的文件名为 /boot/initrd
第一支程序 init 及配置文件 /etc/inittab 与runlevel
Run level的执行等级(依据有无网络与有无X Window划分)
0 - halt(系统直接关机) |
1 - single user mode(单人维护模式,用在系统出问题时的维护) |
2 - Multi-user,without NFS(类似底下的runlevel3,但无NFS服务) |
3 - Full multi-user mode(完整含有网络功能的纯文本模式) |
4 - unused(系统保留) |
5 - X11(与 runlevel3类似,但加载使用 X Window) |
6 - reboot (重新启动) |
/etc/inittab 的内容与语法
1.设定项目:最多四个字符
3.init的动作项目,如下——
其实,这一部分真的很重要,可是太多了…………(⊙o⊙)…
用户自定义开机自启动程序
将它写入 /etc/rc.d/rc.local ,然后就会开机自动加载额
根据 /etc/inittab 设定,加载终端机或X-Window 接口
系统默认会加载六个终端机,最后会执行 /etc/X11/prefdm-nodaemon 来启动X Window
模块对应文件: /etc/modprobe.conf
Run level 的切换
设置成为开机默认的 run level 的话,需要修改 /etc/inittab 内的设定项目
如果只是暂时变更系统的 run level,则使用 init[0-6] 来进行
-----------------------------------------------------------------------------------
核心与核心模块
核心与核心模块的放置位置:
核心: /boot/vmlinuz 或 /boot/vmlinuz-version
核心解压缩所需RAM Disk: /boot/initrd (/boot/initrd-version)
核心模块: /lib/modules/version/kernel 或 /lib/modules/$(uname-r)/kernel
核心原始码: /usr/src/linux(需要安装,默认不安装)
核心模块与相依性:检查模块相依性主要依靠/lib/modules/$(uname-r)/modules.dep文件,可以用depmod建立这个文件:
使用 lsmod 可以查看到系统加载的模块(名称、大小、是否被其他模块使用)
使用 modinfo 可以检查在核心内的模块详情,还可以查看某个模块的文件
加载/移除模块可以用 modprobe,(推荐)
加载模块也可以用insmod,不过后面需要接完整的文件名
移除模块也可以用rmmod,不过后面需要接完整的文件名
------------------------------------------------------------------------------------------------
Boot Loader:Grub
grub是目前普遍的Linux开机管理程序
硬盘和分区在grub里面是从0开始计数的
grub可以隐藏一些分区
initrd能够提供开机过程中最重要的模块……以下情况下需要initrd:
*根目录所在磁盘为 SATA、USB或 SCSI等连接接口
*根目录所在文件系统为LVM、RAID等特殊格式
*根目录所在文件系统为非传统Linux认识的文件系统
*其他必须要在核心加载时提供的模块
如果要重新创建新的 initrd档案,可以使用 mkinitrd
grub安装过程:下载必要文件
然后去找要安装的文件,不过记得因为boot是独立出来的,所以一定不要在目录前面加/boot
开机以后,进入开机界面的grub是可以在线编辑的哦……如果grub出错导致无法正常开机,我们可以修改grub来开机。实在连grub也打不开的话,可以用含有grub的CD来开机。
核心功能中的vga设定:调整分辨率
BIOS无法读取大容量硬盘的解决方法:
让kernel和initrd文件放在大硬盘的最前面。详见
http://orgs.man.ac.uk/documentation/grub/grub_toc.html#SEC_Contents
为个别开机选项加密码:
加密你的密码:使用 grub-md5-crypt
如果要防止别人破解你的 menu.lst,就只能把加密的密码提出来,然后再要加密的账户处锁定了。
------------------------------------------------------------------------------------------------
开机过程的问题解决
忘记root密码:
1.重新启动,2.开机进入grub选项后点击两次 'e',出现下列界面按下[enter]+b 进入单人维护模式
3.系统会以root的权限给你一个shell,此时执行passwd指令重设root密码
init配置文件错误:
不读取init文件,调用 /bin/bash来跳过错误的 init配置文件
此后还要下达两个指令
mount -o remount,rw/ 将根目录重新挂载成为可读写
mount -a 参考 /etc/fstab 的内容重新挂载文件系统
BIOS 磁盘对应的问题(device.map)
如果调整BIOS磁盘开机顺序,那么menu.lst内的装置代号就可能对应到错误的磁盘上,此时可以到 /boot/grub/device.map 里面把装置对应的磁盘代号写死,也可以用grub install更新 device.map
因文件系统错误而无法开机
一般都是因为 /etc/fstab 文件的错误,此时可以输入root密码将根目录改为可擦写。如果是因为曾经不正常关机,可能会要检查 /dev/md0