Boot Loader:Grub
Boot loader是加载核心的重要工具,没有boot loader的话,那么kernel就无法被系统加载。
BISO读完配置后,就会到第一个启动位置去读取MBR去读取boot loader,这个boot loader具有菜单功能,直接加载核心文件及控制权转移的功能等。系统需要有loader才能加载该操作系统的核心。
Linux将boot loader发程序代码运行与配置分成两个阶段(stage)来执行:
.stage 1:执行boot loader的主程序
这个主程序必须安装在MBR,因为MBR太小了,所以MBR只能安装boot loader的最小程序,并没有安装boot loader的配置文件
.stage 2:注程序加载配置文件:
第二阶段透过boot loader加载所有配置文件与相关的环境参数文件(包括文件系统定义与主配置文件menu,lst)
这些配置文件一般都是放置在/boot/grub中,目录下最重要的就是配置文件(menu.lst)以及各种文件系统定义,loader读取完文件系统的定义数据后,就可以识别文件系统并加载核心文件。grub的配置文件,其实应该还menu.lst,在cantos被命名为grub.conf
grub的配置文件/boot/grub/menu.lst与菜单类型
.认识与支持较多的文件系统,并且可以使用grub的主程序直接在文件系统中搜获内核文件
.开机的时候,可以自行编辑与修改开机设定的项目,类似bash的指令模式
.可以动态的搜寻配置文件,而不需要再修改配置文件后重新安装grub。
硬盘与分区在grub中的代号:(hd0,0)
.硬盘代号以小括号()包起来
.硬盘以hd表示后,后面会接一组数字
.以搜寻顺序作为硬盘的编号,而不是按照硬盘电缆的排序
.第一搜寻的硬盘为0号,第二搜寻为1号,以此类推
.每颗硬盘的第一个分区为0,依序类推
/boot/grub/menu.lst配置文件:
deafult=0
如果读秒时间结束前没有动键盘,grub默认使用title项目来开机
timeout=5
开机会进行读秒,如果五秒内没有按键盘,就会使用上面default后面接的那个title
splashimage=(hd0,0)/grub/splash.xpm.gz
开机背景文件
hiddenmenu
这个是开机是否显示选项菜单,如果要就需要注释掉这个
开机读取内核的方式:
1.直接指定核心开机:必须要以grub的硬盘识别方式找出完整的kernel和initrd文件名
2.利用chain loader的方式转交开机控制权:
所谓chain loader(开机管理程序的链接)仅是将控制权交给另一个boot loader,他只是将boot loader的控制权交给了下一个boot loader或MBR内的boot loader而已, 所以通常是不需要检查下一个boot loader的文件系统。
一般来说,chain loader设定两个就够了,一个是预计要前往的boot sector所在的分区,另一个是设定chainloader的分区的boot loader(第一个扇区)上。
initrd的重要性与建立新的initrd文件
它的的主要功能是加载开机过程的重要核心模块,以让开机过程顺利的完成,会需要initrd的原因,是应为核心模块放置于/lib/modules/$(uname -r)/kernel/当中,这些模块就必须要挂载根目录下才能被读取,但内核本身是不有磁盘的驱动程序,当然无法挂载根目录,也就无法读取驱动程序了。
initrd可以将/lib/modules/..内开机必须的模块打包成一个文件,也就是initrd文件,然后开机通过init 13硬件功能将该文件读出来解压,并且initrd在内存中国会仿真出根目录,由于此虚拟(Initial RAM Disk)主要包含磁盘于文件系统的模块与文件系统模块,因此我们的磁盘就可以识别实际磁盘,那就能够进行实际根目录的挂载啦。
一般来说需要initrd的时刻为:
1.根目录所在为SATA,USB或SCIS等接口
2.根目录的文件系统为RAID,LVM等特殊格式
3.根目录所在的文件系统为Linux非认识的文件系统
4.其他必要再核心加载时提供的模块
mkinitrd [-v] [--with=模块名称] initrd 文件名 核心版本
-v:显示mkinitrd的运作过程
---with=模块名称:模块名称指的是模块的名字而已,不需要填写文件名
例如:目前的内核版本ext4文件系统模块为底下的文件名:/lib/modules/$(uname -r)/kernel/fs/ext4/ext4.ko
那就应该写成:--with=ext4就好(省略.ko)
initrd 建立完成,同时内核处理完毕后,我们就可以使用grub来建立选单,如果你的Linux主机本来就使用grub做为loader就不需要重新安装,应为grub会主动的读取配置文件,下面演示安装grub:
grub-install [--root-directory=DIR] INSTALL_DEVICE
--root-directory=DIR
grub-install 是安装grub相关的文件到你的装置上面去等待开机时读取,但还需要设定好配置文件(menu.lst)后,在以grub shell 来安装主程序到MBR或者是boot sector上。
BIOS无法读取大硬盘的问题:
我们的硬盘的容量越来越大,如果你使用的就主板安插大容量的硬盘时,可能由于BIOS或者其他问题导致BIOS无法判断该硬盘的容量,此时你的系统读取可能会有问题。
我们开机的流程讲过,当进入Linux核心功能后,他会主动去侦测整个系统,因此BIOS抓不到的硬件在Linux进入核心反而可能抓到正常使用,如果使用DVD开机安装系统,很多人都会发现,顺利安装后,第一次开机屏幕出现黑压压一片,且只出现grub>字样:
.安装过程是由于使用DVD开机,所以Linux内核加载不是问题,所以可以抓到BIOS抓不到的硬盘
.但是在进入硬盘开机的时候,由于kernel与initrd文件都是透过BIOS的INT 13通道读取的,因此你的kernel与intrd如果放置在BIOS无法判断的扇区,当然无法被系统识别加载。
如何解决这一问题:让kernel与initrd文件放在大硬盘的最前头,由于BIOS至少可以读取到大硬盘的1024磁柱内的数据,那如何让kernel与initrd放置到整颗硬盘的最前面,就是建立/boot独立的分区,
并将/boot放在最前面即可。
为个别选项菜单加上密码
如果公用的计算机,那么为每个选单做个加密防止他人查看你开机密码,如何建立加密密码
grub-md5-crpt
开机过程的问题解决
1.忘记root密码的解决之道
1.重新启动,一定要重新启动
2.开机进入grub选项菜单:(1)在你要进入选单上点'e'进入详细设定;(2)将光标移到kernel上放点e'进入编辑画面;(3)然后进入出现如下的界面处理在kernel 路径后面加上以下内容:single
3.进入单人维护模式,系统就会以root权限直接给你一个shell,此时你就能执行passwd 这个指令重建root的密码。
init配置文件错误
当/etc/inittab这个文件错误的时候,连单用户模式都无法进入,无法用上面的方法救援了。应为init文件无法被执行,那么我们就告诉核心不要执行init,改呼叫bash,可以略过init。
同样是进入grub后,,同样在grub edit下在内核路径后加上以下内容:init=/bin/bash
应为我们指定内核的第一支进程变成了/bin/bash,因此/sbin/init就不会执行了,根据开机流程此时只有根目录被挂载为只读,其他目录都没有被挂载,所以首先是将根目录的权限改为可以读写。
然后使用两个命令 mount -o remount,rw / :将根目录挂载为可以读写;mount -a:参照/etc/fstab的内容挂载文件系统!此时就可以进行其他救援工作,恢复inittab文件。
因文件系统错误无法开机
最容易出错的设定而导致无法顺利开机的步骤,通常就是/etc/fstab这个文件了,尤其是在做Quota操作的时候,容易写错参数,有没有经过mount -a来挂载次测试,就立刻直接重启,造成文件系统问题。
可以以root用户登录,重新挂载文件系统为可读写,就绪救援,造成这种原因除了/etc/fstab编辑错误之外,或者如果你曾经有不正常关机后,也可能导致文件系统不一致的情况,也可能出现相同的问题, 一般用fsck去检测相应的磁盘即可啦,等系统发现错误,并且出现[clear [Y/N]]时,就输入y。
利用chroot切换到另一块硬盘去工作:change root directory
Boot loader是加载核心的重要工具,没有boot loader的话,那么kernel就无法被系统加载。
BISO读完配置后,就会到第一个启动位置去读取MBR去读取boot loader,这个boot loader具有菜单功能,直接加载核心文件及控制权转移的功能等。系统需要有loader才能加载该操作系统的核心。
Linux将boot loader发程序代码运行与配置分成两个阶段(stage)来执行:
.stage 1:执行boot loader的主程序
这个主程序必须安装在MBR,因为MBR太小了,所以MBR只能安装boot loader的最小程序,并没有安装boot loader的配置文件
.stage 2:注程序加载配置文件:
第二阶段透过boot loader加载所有配置文件与相关的环境参数文件(包括文件系统定义与主配置文件menu,lst)
这些配置文件一般都是放置在/boot/grub中,目录下最重要的就是配置文件(menu.lst)以及各种文件系统定义,loader读取完文件系统的定义数据后,就可以识别文件系统并加载核心文件。grub的配置文件,其实应该还menu.lst,在cantos被命名为grub.conf
grub的配置文件/boot/grub/menu.lst与菜单类型
.认识与支持较多的文件系统,并且可以使用grub的主程序直接在文件系统中搜获内核文件
.开机的时候,可以自行编辑与修改开机设定的项目,类似bash的指令模式
.可以动态的搜寻配置文件,而不需要再修改配置文件后重新安装grub。
硬盘与分区在grub中的代号:(hd0,0)
.硬盘代号以小括号()包起来
.硬盘以hd表示后,后面会接一组数字
.以搜寻顺序作为硬盘的编号,而不是按照硬盘电缆的排序
.第一搜寻的硬盘为0号,第二搜寻为1号,以此类推
.每颗硬盘的第一个分区为0,依序类推
/boot/grub/menu.lst配置文件:
deafult=0
如果读秒时间结束前没有动键盘,grub默认使用title项目来开机
timeout=5
开机会进行读秒,如果五秒内没有按键盘,就会使用上面default后面接的那个title
splashimage=(hd0,0)/grub/splash.xpm.gz
开机背景文件
hiddenmenu
这个是开机是否显示选项菜单,如果要就需要注释掉这个
开机读取内核的方式:
1.直接指定核心开机:必须要以grub的硬盘识别方式找出完整的kernel和initrd文件名
2.利用chain loader的方式转交开机控制权:
所谓chain loader(开机管理程序的链接)仅是将控制权交给另一个boot loader,他只是将boot loader的控制权交给了下一个boot loader或MBR内的boot loader而已, 所以通常是不需要检查下一个boot loader的文件系统。
一般来说,chain loader设定两个就够了,一个是预计要前往的boot sector所在的分区,另一个是设定chainloader的分区的boot loader(第一个扇区)上。
initrd的重要性与建立新的initrd文件
它的的主要功能是加载开机过程的重要核心模块,以让开机过程顺利的完成,会需要initrd的原因,是应为核心模块放置于/lib/modules/$(uname -r)/kernel/当中,这些模块就必须要挂载根目录下才能被读取,但内核本身是不有磁盘的驱动程序,当然无法挂载根目录,也就无法读取驱动程序了。
initrd可以将/lib/modules/..内开机必须的模块打包成一个文件,也就是initrd文件,然后开机通过init 13硬件功能将该文件读出来解压,并且initrd在内存中国会仿真出根目录,由于此虚拟(Initial RAM Disk)主要包含磁盘于文件系统的模块与文件系统模块,因此我们的磁盘就可以识别实际磁盘,那就能够进行实际根目录的挂载啦。
一般来说需要initrd的时刻为:
1.根目录所在为SATA,USB或SCIS等接口
2.根目录的文件系统为RAID,LVM等特殊格式
3.根目录所在的文件系统为Linux非认识的文件系统
4.其他必要再核心加载时提供的模块
mkinitrd [-v] [--with=模块名称] initrd 文件名 核心版本
-v:显示mkinitrd的运作过程
---with=模块名称:模块名称指的是模块的名字而已,不需要填写文件名
例如:目前的内核版本ext4文件系统模块为底下的文件名:/lib/modules/$(uname -r)/kernel/fs/ext4/ext4.ko
那就应该写成:--with=ext4就好(省略.ko)
initrd 建立完成,同时内核处理完毕后,我们就可以使用grub来建立选单,如果你的Linux主机本来就使用grub做为loader就不需要重新安装,应为grub会主动的读取配置文件,下面演示安装grub:
grub-install [--root-directory=DIR] INSTALL_DEVICE
--root-directory=DIR
grub-install 是安装grub相关的文件到你的装置上面去等待开机时读取,但还需要设定好配置文件(menu.lst)后,在以grub shell 来安装主程序到MBR或者是boot sector上。
BIOS无法读取大硬盘的问题:
我们的硬盘的容量越来越大,如果你使用的就主板安插大容量的硬盘时,可能由于BIOS或者其他问题导致BIOS无法判断该硬盘的容量,此时你的系统读取可能会有问题。
我们开机的流程讲过,当进入Linux核心功能后,他会主动去侦测整个系统,因此BIOS抓不到的硬件在Linux进入核心反而可能抓到正常使用,如果使用DVD开机安装系统,很多人都会发现,顺利安装后,第一次开机屏幕出现黑压压一片,且只出现grub>字样:
.安装过程是由于使用DVD开机,所以Linux内核加载不是问题,所以可以抓到BIOS抓不到的硬盘
.但是在进入硬盘开机的时候,由于kernel与initrd文件都是透过BIOS的INT 13通道读取的,因此你的kernel与intrd如果放置在BIOS无法判断的扇区,当然无法被系统识别加载。
如何解决这一问题:让kernel与initrd文件放在大硬盘的最前头,由于BIOS至少可以读取到大硬盘的1024磁柱内的数据,那如何让kernel与initrd放置到整颗硬盘的最前面,就是建立/boot独立的分区,
并将/boot放在最前面即可。
为个别选项菜单加上密码
如果公用的计算机,那么为每个选单做个加密防止他人查看你开机密码,如何建立加密密码
grub-md5-crpt
开机过程的问题解决
1.忘记root密码的解决之道
1.重新启动,一定要重新启动
2.开机进入grub选项菜单:(1)在你要进入选单上点'e'进入详细设定;(2)将光标移到kernel上放点e'进入编辑画面;(3)然后进入出现如下的界面处理在kernel 路径后面加上以下内容:single
3.进入单人维护模式,系统就会以root权限直接给你一个shell,此时你就能执行passwd 这个指令重建root的密码。
init配置文件错误
当/etc/inittab这个文件错误的时候,连单用户模式都无法进入,无法用上面的方法救援了。应为init文件无法被执行,那么我们就告诉核心不要执行init,改呼叫bash,可以略过init。
同样是进入grub后,,同样在grub edit下在内核路径后加上以下内容:init=/bin/bash
应为我们指定内核的第一支进程变成了/bin/bash,因此/sbin/init就不会执行了,根据开机流程此时只有根目录被挂载为只读,其他目录都没有被挂载,所以首先是将根目录的权限改为可以读写。
然后使用两个命令 mount -o remount,rw / :将根目录挂载为可以读写;mount -a:参照/etc/fstab的内容挂载文件系统!此时就可以进行其他救援工作,恢复inittab文件。
因文件系统错误无法开机
最容易出错的设定而导致无法顺利开机的步骤,通常就是/etc/fstab这个文件了,尤其是在做Quota操作的时候,容易写错参数,有没有经过mount -a来挂载次测试,就立刻直接重启,造成文件系统问题。
可以以root用户登录,重新挂载文件系统为可读写,就绪救援,造成这种原因除了/etc/fstab编辑错误之外,或者如果你曾经有不正常关机后,也可能导致文件系统不一致的情况,也可能出现相同的问题, 一般用fsck去检测相应的磁盘即可啦,等系统发现错误,并且出现[clear [Y/N]]时,就输入y。
利用chroot切换到另一块硬盘去工作:change root directory
可以暂时将根目录一定到某一个目录下,然后去处理这个问题,最后离开这个目录,该root回到原来的系统当中。
用chroot来切换,以处理你的硬盘问题!
1.用尽任何方法进入一个完整的Linux系统
2.假设有问题的linux磁盘在/dev/sdb1上面,且他的系统排列是:
3. 挂载点 装置文件名
4. / -> /dev/sdb1
5. /var -> /dev/sdb2
6. /home -> /dev/sdb3
/usr -> /sdb5
若是如此的话,那么在我目前的linux底下,我可以建立一个目录,然后可以这么做:
挂载点 装置文件名
/chroot ->/dev/sdb1
/chroot/var->/dev/sdb2
/chroot/home->/dev/sdb3
/chroot/usr -> /dev/sdb5
7.全部挂载往后,再输入 chroot /chroot 你就会发现根目录/变成那个/dev/sdb1的环境。