第二十章、启动流程、模块管理与 Loader
最近升级日期:2009/09/14

大标题的图示启动过程的问题解决

很多时候,我们可能因为做了某些配置,或者是因为不正常关机 (例如未经通知的停电等等) 而导致系统的 filesystem 错乱,此时,Linux 可能无法顺利启动成功,那怎么办呢?难道要重灌?当然不需要啦! 进入 run level 1 (单人维护模式) 去处理处理,应该就 OK 的啦!底下我们就来谈一谈如何处理几个常见的问题!


小标题的图示忘记 root 口令的解决之道

大家都知道鸟哥的记忆力不佳,容易忘东忘西的,那如果连 root 的口令都忘记了,怎么办? 其实在 Linux 环境中 root 口令忘记时还是可以救回来的!只要能够进入并且挂载 / , 然后重新配置一下 root 的口令,就救回来啦!这是因为启动流程中,若强制核心进入 runlevel 1 时, 默认是不需要口令即可取得一个 root 的 shell 来救援的。整个动作有点像这样:

  1. 重新启动!一定要重新启动!怎么重开都没关系;

  2. 在启动进入 grub 菜单后, (1)在你要进入的菜单上面点 'e' 进入详细配置; (2)将光棒移动到 kernel 上方并点 'e' 进入编辑画面; (3)然后出现如下画面来处理:
    grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet single
    
    重点就是那个特殊字体的咚咚啦!按下 [enter] 再按下 b 就能够启动进入单人维护模式了。

  3. 进入单人维护模式后,系统会以 root 的权限直接给你一个 shell ,此时你就能够运行『 passwd 』这个命令来重建 root 的口令啦!然后直接『 init 5 』就可以切换成为 X 窗口介面罗!就是这么简单。

小标题的图示init 配置档错误

前一个 root 口令挽救的方法其实可以用在很多地方,唯一一个无法挽救的情况,那就是 /etc/inittab 这个文件配置错误导致的无法启动!根据启动流程,我们知道 runlevel 0~6 都会读取 /etc/inittab 配置档, 因此你使用 single mode (runlevel 1) 当然也是要读取 /etc/inittab 来进行启动的。那既然无法进入单人维护模式, 就表示这题无解罗?非也非也,既然默认的 init 无法运行,那我们就告诉核心不要运行 init ,改呼叫 bash 啊! 可以略过 init 吗?可以的,同样在启动进入 grub 后,同样在 grub edit 的情况下这样做:

grub edit> kernel /vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet init=/bin/bash

因为我们指定了核心呼叫的第一支程序 (init) 变成 /bin/bash,因此 /sbin/init 就不会被运行。 又根据启动流程的说明,我们知道此时虽然可以利用 root 取得 bash 来工作,但此时 (1)除了根目录外,其他的目录都没有被挂载; (2)根目录被挂载成为唯读状态。因此我们还需要进行一些动作才行!如下所示:

直接进入 bash 的环境
图 4.2.1、 略过 init 的程序,直接进入 bash shell

鸟哥仅下达两个命令,『 mount -o remount,rw / 』用途是将根目录重新挂载成为可读写,至於『 mount -a 』则是参考 /etc/fstab 的内容重新挂载文件系统! 此时你又可以启动进行救援的工作了!只是救援完毕后,你得要使用『 reboot 』重新启动一次才行!


小标题的图示BIOS 磁碟对应的问题 (device.map)

由於目前硬盘很便宜啊,所以很多朋友就想说:『那我能不能将 Windows 安装在 /dev/hda 而 Linux 安装在 /dev/hdb , 然后调整 BIOS 的启动装置顺序,如此则两套系统各有各的 loader 安装在个别硬盘的 MBR 当中了!』。 这个想法非常好,如此一来两者就不会互相干扰,因为每颗磁碟的 MBR 个别有不同操作系统的 loader 嘛! 问题是,grub 对磁碟的装置代号使用的是侦测到的顺序啊! 也就是说,你调整了 BIOS 磁碟启动顺序后,你的 menu.lst 内的装置代号就可能会对应到错误的磁碟上了!啊!真想哭!

没关系的,我们可以透过 /boot/grub/device.map 这个文件来写死每个装置对 grub 磁碟代号的对应喔! 举例来说,鸟哥的这个文件内容如下:

[root@www ~]# cat /boot/grub/device.map
(fd0)   /dev/fd0
(hd0)   /dev/hda

如果你不清楚如何处理的话,也可以利用 grub-install 的功能喔!例如:

[root@www ~]# grub-install --recheck /dev/hda1

这样 device.map 就会主动的被升级了!这样了解乎?


小标题的图示因文件系统错误而无法启动

如果因为配置错误导致无法启动时,要怎么办啊?这就更简单了!最容易出错的配置而导致无法顺利启动的步骤,通常就是 /etc/fstab 这个文件了,尤其是使用者在实作 Quota 时,最容易写错参数, 又没有经过 mount -a 来测试挂载,就立刻直接重新启动,真要命!无法启动成功怎么办? 这种情况的问题大多如下面的画面所示:

文件系统错误的示意图
图 4.4.1、 文件系统错误的示意图

看到最后两行,他说可以输入 root 的口令继续加以救援喔!那请输入 root 的口令来取得 bash 并以 mount -o remount,rw / 将根目录挂载成可读写后,继续处理吧!其实会造成上述画面可能的原因除了 /etc/fstab 编辑错误之外,如果你曾经不正常关机后,也可能导致文件系统不一致 (Inconsistent) 的情况, 也有可能会出现相同的问题啊!如果是磁区错乱的情况,请看到上图中的第二行处, fsck 告知其实是 /dev/md0 出错, 此时你就应该要利用 fsck 去检测 /dev/md0 才是!等到系统发现错误,并且出现『clear [Y/N]』时,输入『 y 』吧!

这个 fsck 的过程可能会很长,而且如果你的 partition 上面的 filesystem 有过多的数据损毁时, 即使 fsck 完成后,可能因为伤到系统槽,导致某些关键系统文件数据的损毁,那么依旧是无法进入 Linux 的。此时,就好就是将系统当中的重要数据复制出来,然后重新安装,并且检验一下, 是否实体硬盘有损伤的现象才好!不过一般来说,不太可能会这样啦~ 通常都是 fsck 处理完毕后,就能够顺利再次进入 Linux 了。


小标题的图示利用 chroot 切换到另一颗硬盘工作

仔细检查一下,你的 Linux 里面应该会有一个名为 chroot 的命令才对!这是啥? 这是『 change root directory 』的意思啦!意思就是说,可以暂时将根目录移动到某个目录下, 然后去处理某个问题,最后再离开该 root 而回到原本的系统当中。

举例来说,补习班中心最容易有两三个 Linux 系统在同一个主机上面,假设我的第一个 Linux 无法进入了,那么我可以使用第二个 Linux 启动,然后在第二个 Linux 系统下将第一个 Linux 挂载起来, 最后用 chroot 变换到第一个 Linux ,就能够进入到第一个 Linux 的环境当中去处理工作了。

你同样也可以将你的 Linux 硬盘拔到另一个 Linux 主机上面去,然后用这个 chroot 来切换, 以处理你的硬盘问题啊!那怎么做啊?粉简单啦!

  1. 用尽任何方法,进入一个完整的 Linux 系统 ( run level 3 或 5 );

  2. 假设有问题的 Linux 磁碟在 /dev/hdb1 上面,且他整个系统的排列是:
    	挂载点   装置档名
    	/     → /dev/hdb1
    	/var  → /dev/hdb2
    	/home → /dev/hdb3
    	/usr  → /dev/hdb5
    若如此的话,那么在我目前的这个 Linux 底下,我可以创建一个目录,然后可以这样做:
    	挂载点           装置档名
    	/chroot/      → /dev/hdb1
    	/chroot/var/  → /dev/hdb2
    	/chroot/home/ → /dev/hdb3
    	/chroot/usr/  → /dev/hdb5
  3. 全部挂载完毕后,再输入『 chroot /chroot 』嘿嘿!你就会发现,怎么根目录 (/) 变成那个 /dev/hdb1 的环境啦!这样说明,了了吗? ^_^

 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室