私人定制-linux系统和grub启动流程中问题及解决方案

系统的启动流程;

    POST加电自检–>Boot Sequence(BIOS)–>Boot Loader(MBR)–>kernel(Ramdisk)–>rootfs–>switchroot–>/sbin/init–>/etc/inittab /etc/init.d/*.conf–>设定默认启动级别–>系统初始化脚本–>关闭或启动对应级别下的服务–>启动终端 

    grub:Grand Unified Bootloader

        grub 0.x:grub legacy

        grub 1.x:grub2

        grub legacy:

            stage1:mbr

            stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统

            stage2:磁盘分区/boot/grub/

    blob.png

    grub的配置文件:/etc/grub.conf–>/boot/grub/grub.conf

    blob.png

    stage2及内核通常放置于一个基本磁盘分区上:

    1.提供启动菜单,并提供交互式接口

        a.内核参数

        b.编辑模式,用于编辑菜单

        c.命令模式,交互式接口

    2.加载用户选择的内核或操作系统

        允许传递参数给内核

        可以藏菜单启动项

    3.为菜单提供了保护机制

        为编辑启动菜单进行认证

        为启用内核或操作系统进行认证

    如何获取设备

   (hd#,#)

    hd#:磁盘编号,用数字表示,从0开始编号

    #:分区编号,用数字表示,从0开始编号

    grub的命令行接口

        help:获取帮助列表

        help keyword:详细帮助信息

        find(hd#,#) /path/to/somefile

        root (hd#,#)

        kernel /path/to/kernel_file:设定本次启动时用到的内核文件;额外还可以添加许多内核使用的cmdline参数

           如:init=/path/to/init ,selinux=0

        initrd /path/to/initramfs_file:设定为选定的内核提供额外的ramdisk

        boot:引导启动选定的内核         

   手动在grub命令行接口启动系统:

       当系统中的grub文件损坏时,除了对文件进行编辑操作进行修复,我们也可以通过COMMAND Line的模式自己手动进行grub的配置

       grub>root(hd#,#)

       grub>kernel /vmlinuz-version-release ro root=/dev/device

       grub>initrd /initramfs-version-release.img

       grub>boot

    blob.png

       配置文件:

       /etc/grub/grub.conf

       配置项:

       Default=#:设定默认启动的菜单项,菜单项(title)编号从0开始

       Timeout=#:指定菜单项等待用户选择的时长

       Splashimage=(hd#,#)/path/to/xpm_pic_file:指明菜单背景图片文件路径

       Hiddenmenu:隐藏菜单

password [–md5] STRING:菜单编辑认证

       title TITLE:定义菜单项“标题”,可出现多次

       root (hd#,#):grub查找stage2及kernel文件所在设备分区,即’grub’的根

       kernel /path/to/vmlinuz_file[parameters]:启动的内核,为grub的根

       initrd /path/to/initramfd_file:内核匹配的ramfs文件

       password [–md5] STRING:启动选定的内核或操作系统式进行认证

     blob.png

    blob.png

  grub-md5-crypt命令:

    该命令可以是用简单的加密算法md5对明文进行加密

    blob.png

进入单用户模式:

1.  编辑grub菜单(选定要编辑的title,而后使用e命令);

2.  在选定的kernel后附加

1,s,S,single

3.  在kernel所在行,键入b命令

  安装grub:

     1.grub-install

       grub-install –root-directory=dir /dev/disk

    blob.png

     2.grub

       grub>root(hd#,#)

       grub>setup(hd#)

  blob.png

  SITUATION ONE:

    当系统启动stage1过程出现问题,即MBR上前446个字节出现问题,系统不能正确读取数据,导致系统无法正常启动,解决方案:

    blob.png

    首先挂载光盘

    blob.png

    由于系统无法读取MBR,所以直接进入光盘启动界面,选择救援模式

    切换当前的根至系统实际的根分区上:chroot /mnt/sysimage

    blob.png 

    使用命令grub-install /dev/device 来修复受损的MBR,然后重启系统

    blob.png

    出现这个画面表示系统已经能够成功启动了,只需要等待系统扫描完成就可以了。

    

    SITUATION TWO

    在系统进行MBR引导启动时,如果在stage1.5阶段出现问题时,即MBR扇区第一个512字节读取完后,后面的数据遭到了损坏,无法读取,系统也无法启动,这是我们可以进行如下的操作将系统恢复正常:

    blob.png

    可以看到,512字节(55 aa)之后的数据都被擦出了,然后重启系统

    blob.png

    同样系统启动不了,因为破坏了stage1.5,从而系统无法获取/boot分区挂载的相关数据信息

    blob.png

    同样,我们选择光盘的救援模式,进入之后,查看下挂载情况,切换根,同样使用grub-install命令加上要修复的磁盘,进行修复,修复完成后重启系统

    SITUATION THREE

    当系统在执行stage2过程中出现问题,如/boot下grub的配置文件配置错误或者误删了,我们可以除了通过使用光盘挂载来恢复系统,也可以使用网络中的主机进行修复,具体步骤如下:

    

    blob.png

    如果有网络源,我们可以通过配置IP,选择通过网络上的某台主机来恢复

    blob.png

    选择网卡设备,设置IP地址,如果是通过dhcp服务自动获取IP,就不需要设置IP,直接通过dhcp服务获取

    blob.png

    blob.png

    另开启一个终端,可以查看ip获取情况

    blob.png

    通过df命令,我们可以看到系统的根分区被挂载在/mnt/sysimage上,当前我们是在光盘的根目录下,所以我们要切换至系统实际的根目录下,使用命令chroot /mnt/sysimage,然后我们可以通过使用远程拷贝命令:scp remote:/boot/* /boot/ 将受损的文件替换掉,但要注意,我们远程链接的主机的操作系统应该和我们当前主机的操作系统一致。

 

   SITUATION FOUR
  预想一个更严重的情况,当我们删除了/boot分区,破坏扇区,然后将/etc/fstab文件也删除了,这种情况下,我们的系统根本就不可能起的来了

    blob.png

    此时,我们进去救援模式,此时系统提示已经找不到任何分区,无法识别分区

    blob.png

  进入bash,使用df查看到没有系统的分区,可以使用fdisk查看到硬盘分区情况

   blob.png

  创建目录,然后将进行挂载,然后切换根,创建/etc/fstab文件,将最根本的两个分区挂载信息写入该文件中/boot和/ ,然后重启系统 

    blob.png

   重启系统后,可以自动挂载分区,这时我们需要安装kernel包,因为之前我们删了/boot目录,挂载光盘,安装kernel包,然后重启

    blob.png

  再次进入救援模式,使用grub-install –root-directory=/mnt/sysimage /dev/sda3 ,如果使用了chroot切换了根目录,那么可以不指定root-directory,因为,我们现在已经位于boot的父目录上,root-directory指定的是boot的父目录,然后编写boot/grub/grub.conf文件,如下:

    blob.png 

  重启系统:

    blob.png

    SITUATION FIVE

    当然有些情况下,我们系统的使用的并不是常规的磁盘分区,而是采用的逻辑卷进行分区,安装操作系统,这时,如果上述的某个stage过程出现问题,导致系统无法正常启动,我们也可以通过如下的操作,来修复我们的系统

    当系统不能正常启动时,我们应先挂载光盘,然后进入rescue救援模式,这边我们以最坏的情况做演示,如图所示,blob.png

    现在系统已经无法正确识别分区,使用df命令,我们也无法看到系统中的逻辑卷,也无从得知卷组,逻辑卷名称,这时我们需要先对磁盘进行扫描lvscan,来获取具体有哪些逻辑卷,然后我们可以使用vgchange -ay来激活这些逻辑卷,然后再使用lvscan扫描,这时我们可以看到这些逻辑卷的状态由inactive变为active

    blob.png

    然后我们需要创建对应的目录进行挂载,然后将逻辑卷挂载到创建的目录上

    blob.png

    ,然后“切换”根,不是cd,进入到系统上的根目录下,我们创建/etc/fstab文件,将最重要的两个分区写入文件中,/boot 和 / ,然后重启系统,重启之后,系统就能够识别到挂载的分区,然后我们就可以对照上述的情况,采取对应的操作来使系统恢复正常。

    blob.png

    使用rpm命令修复受损的内核

    blob.png

    使用grub-install 命令修复受损的grub,然后创建grub.conf文件,将相应的配置信息写进文件中

   blob.png

  重启,系统就可以正常运作了

   blob.png

 在原有系统的基础上,做一个微型linux

    1.先准备一块新硬盘

   blob.png

  2.使用echo ‘- – -’ > /sys/class/scsi_host/host0/scan

   blob.png 

  3.对硬盘进行分区,进行格式化,然后分别挂载到对应目录下

        blob.png

         blob.png

   4.安装grub  grub-install –root-directory=/mnt /dev/sdd

        blob.png

   5.编辑grub.conf文件

        vim /mnt/boot/grub/grub.conf

        blob.png

   6.复制内核及initramfs文件

        blob.png

  7.配置fstab文件

    blob.png

 8.复制相关命令

        blob.png

  9.重开个虚拟机,以该硬盘作为启动盘,开启系统

        blob.png

     

       

  Linux:单内核设计,但充分借鉴了微内核体系的设计的优点,为内核引入了模块化机制

内核的组成部分:

  kernel:内核核心,一般为bzimage,通常位于/boot目录。名称为vmlinuz-version-release

  kernel object:内核对象,即内核模块,一般放置于/lib/modules/version-release/

  内核核心与内核模块版本一定要严格匹配;

  []:N

  [M]:modules

  [*]:Y,直接编译至内核核心

内核:动态装载和卸载

      ramdisk:辅助性文件,并非必须,取决于内核是否能直接驱动rootfs所在的设备

      目标设备驱动,例如SCSI设备的驱动

      逻辑设备驱动,例如LVM设备的驱动

      文件系统,例如xfs文件系统

      ramdisk:是一个简装的根文件系统;

 

  内核信息查看:

      uname命令:print system information

         -r:内核的发行好

         -n:显示主机名  

  模块信息获取

  lsmod:显示的内核来自于/proc/modules

  modinfo命令:显示单个内核模块文件的信息

  modinfo [-F field] [-k kernel] [modulename|filename…]

      -F field 仅显示指定字段信息

      -n 显示文件路径

  modprode : add and remove modules from the linux kernel

     格式:modprobe [-r] module_name

           模块的动态装载 modprobe module_name

           动态卸载 modprobe –r module_name

   depmod命令:Generate modules.dep and mod files

     内核模块依赖关系文件及系统信息的生成工具

模块的装载和卸载的另一组命令

   insmod:

   insmod [filename] [module options…]

       Filename 模块文件的文件路径

   rmmod:

       rmmod [module_name]

ramdisk文件管理

   (1)mkinitrd命令

      为当前使用中的内核重新制作ramdisk文件

      mkinitrd [option] [<initrd-image>] <kernel-version>

      –with=<module> 除了默认的模块之外需要装载至initramfs中的模块

      –preload=<module> initramfs所提供的模块需要预先装载的模块  

      实例:mkinitrd /boot/initramfs-$(uname -r).img  $(uname -r)

   (2)dracut命令

      low level tool generating an initramfs image

      dracut [option…] [<image>] [<kernel version>] 

      dracut /boot/initramfs-$(uname -r).img $(uname -r)

 

内核信息输出的伪文件系统

   /proc 内核状态和统计信息的输出接口;同时,还提供一个配置接口/proc/sys

blob.png

     参数:

       只读:信息输出 例如/proc/#/*

       可写:可接受用户指定一个“新值”来实现对内合谋功能或特性的配置 /proc/sys

       /proc/sys:

       net/ipv4/ip_forward 相当于net.ipv4.ip_forward

(1)sysctl命令:专用于查看或设置/proc/sys目录下的参数的值

     sysctl [options] [variable[=value]]

     查看:

     #sysctl –a

     #sysctl variable

     #cat /proc/sys/path/to/some_kernel_file

     修改:

     #sysctl –w variable=value

(2)文件系统命令(cat echo)

     查看

     # cat /proc/sys/path/to/some_kernel_file

     设定

     #echo “value” > /proc/sys/path/to/some_kernel_file

blob.png

     注意:上述两种方式的设定仅当前运行内核有效

    (3)配置文件 /etc/sysctl.conf   /etc/sysctl.d/*.conf

         sysctl –p [/path/to/config_file]立即生效

    blob.png

内核参数

    net.ipv4.ip_forward 报文核心转发功能

    vm.drop_caches 回收内存  /proc/sys/vm/drop_caches丢弃caches  

    kernel.hostname

    net.ipv4.Icmp_echo_ignore_all 禁止其他主机ping

   

/sys目录

    sysfs:输出内核识别的各硬件设备的相关属性,也有内核对硬件特性的可设置参数,对此写参数的修改,即可定制这些硬件的工作特性

    udev:通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件

    udev:是用户空间程序 专用工具devadmin hotplug

    udev:为设备创建设备文件时,会读取事先定义好的的规则文件,一般在/etc/udev/rules.d/目录下,以及在/usr/lib/udev/rules.d/目录下


编译内核-定制个人LINUX      

    step1: 从官网上选择一个内核版本下载至本地系统中

    step2: 对下载到的包进行解压缩,指定解压的路径至:/usr/src下,tar xvf linux-*.gz -C /usr/src 

    blob.png

    step3:  拷贝一个配置文件的模板至解压缩的目录下,以.config命名

    step4: 使用make menuconfig命令进行个人定制,选择自己所需要的功能组件,对于那些不需要的功能,我们可以选择不加载到模块或者内存中,使用空格键进行选择,M表示加载到模块中,*表示加载到内存中,我们也可以自己设定kernel的名称

  blob.png    

    blob.png   

     blob.png

  step5:make -j #   

        #:指明处理器核心总数,推荐使用并行编译,加快编译速度

        lscup可以查看cpu数量:

    blob.png

    blob.png


    step6:编译完成后,模块安装

        make modules_install 

    blob.png

   安装之后,我们可以看到/lib/modules文件下,多了一个模块,这就是我们刚刚编译安装的模块

    blob.png 

    进入到目录中,我们可以找到自己个人定制的一些功能模块

    blob.png


    step7:安装内核对应文件

    blob.png

    blob.png

    安装完成后,在/boot目录下,就多了一个刚编译的内核核心

    查看/boot/grub2/grub.cfg,可以看到新的内核信息已经写入到该文件中,之后重启系统就可以看到增加了一个新的内核

    blob.png

    选择新编译的内核,启动

    blob.png

    系统正常启动

    blob.png

    至此,个人定制linux系统制作完成

  


原创文章,作者:Stupid_L,如若转载,请注明出处:http://www.178linux.com/45867