美文网首页Linux科技我用 LinuxLinux
Linux内核故障排除(centos6)

Linux内核故障排除(centos6)

作者: Miracle001 | 来源:发表于2017-07-07 23:30 被阅读63次

    一、自定义的服务出错导致系统无法启动,排错;

    Paste_Image.png

    模式1——off——可以用单用户模式解决故障问题
    模式1——testsrv服务不挂载——可以绕过sleep=1000的错误

    解决故障的步骤
    1 重启;
    2 倒计时界面,按a键;
    3 在光标所在行最后,加上1/S/s/single(或关系),进入单用户模式;
    4 vim /etc/rc.d/init.d/testsrv,删除sleep 1000即可;
    5 exit之后,即可进入操作界面;
    
    Paste_Image.png Paste_Image.png

    模式1——on——不能用单用户模式解决故障问题
    内核启动——vmlinuz.. root=/dev/sda2——/sbin/init(系统默认的第一个进程)
    排除故障的思路:更换系统默认的第一个进程

    解决故障的步骤
    1 重启;
    2 倒计时界面,按a键;
    3 在光标所在行最后,加上 init=/bin/bash ;
    4 mount -o remount,rw /  更改只读权限为可读写权限;
    5 chkconfig --level 1 testsrv off  关闭1模式;
      chkconfig testsrv off  默认关闭2345模式;
      或者 
      vim /etc/rc.d/init.d/testsrv  删除sleep 1000即可;
    6 ls /etc/rc.d/rc5.d/testsrv*  检查文件是否以K开头(开机不启动);
    7 exit之后,即可进入操作界面;
    
    Paste_Image.png

    二、grub(3个阶段)故障

    破坏前446字节并恢复
    grub_1阶段_故障——启动界面看不到菜单栏
    硬盘无可引导功能——直接跳过硬盘——进入光盘

    模拟故障
    hexdump -C  -n 512 /dev/sda
    dd if=/dev/zero of=/dev/sda bs=1 count=446
    解决故障
    方法一
    1 重启;
    2 光盘引导,进入救援模式,开启shell进程;
    3 切根:chroot /mnt/sysimage;
    4 grub-install /dev/sda;
    5 sync...;
    6 exit两次;
    
    方法二
    hd0——硬盘:/dev/sda
    hd0,0——硬盘的分区:/dev/sda1
    1 grub 交互式操作
    2 grub> root (hd#,#)  2阶段,指定分区
    3 grub> setup (hd#)  mbr的1阶段,指定硬盘(有依赖性)
      grub> help  查看帮助
    grub-install——无依赖性(建议使用)
    
    Paste_Image.png

    破坏512字节后的4000个字节并恢复
    grub_1.5阶段_故障

    Paste_Image.png
    模拟故障
    hexdump -C  -n 15240 /dev/sda
    dd if=/dev/zero of=/dev/sda bs=1 count=4000 skip=512 seek=512
    解决故障
    1 重启;
    2 光盘引导,进入救援模式,开启shell进程;
    3 切根:chroot /mnt/sysimage;
    4 grub-install /dev/sda;
    5 sync...;
    6 exit两次;
    
    grub-install --root-directory=/ 或者不写  默认装载在根下的/boot/grub
    grub-install --root-directory=testdir 装载在/testdir/boot/grub下
    

    Error 15——2阶段问题

    除了/boot/grub/下的grub.conf和splash.xpm.gz,此目录下的其他文件都删除;
    grub.conf  文本文件,grub-install不会生成,只能手工编写;
    splash.xpm.gz  图形界面的文件
    reboot后,出现2种情况:
    情况1 
    (1) grub-install未修复过/boot/grub/下的文件,/boot/grub下的文件只是备份文件,二阶段的二进制文件存放在扇区里;
    (2) reboot 可以重新启动系统;
    情况2 
    (1) grub-install修复过/boot/grub/下的文件,二阶段的二进制文件存放在/boot/grub/下;
    (2) reboot 出现Error15错误
    解决方法
    1 重启;
    2 进入救援模式,开启shell进程;
    3 切根:chroot /mnt/sysimage;
    4 grub-install /dev/sda;
    5 sync...;
    6 exit两次;
    

    三、grub.conf文件故障

    配置文件:/etc/grub.conf -> ../boot/grub/grub.conf
    defaults=0  先启动第一个title对应的内核系统
    kernel /vmlinuz...与 initrd /initramfs...  这两行不可以对调,原因是先启动内核再加载驱动
    rhgb quite  维护的时候,可以删除,看系统启动过程更加详细
    
    Paste_Image.png

    防止单用户模式破解口令;
    单用户模式破解口令根本原因:更改了系统的内核的文件
    思路:系统的内核文件——设置口令

    1 在hiddenmenu上面加一行设置口令的内容:password fgqcompany;
    2 明文口令不安全——设置加密口令——下面2种情况都可以:
    (1) r!grub-md5-crypt(vim格式命令输入):输入两遍口令即可,注意回车,生成md5口令;
        password --md5 $1$W6ocO/$AAJKVNyrJ4PLrEIK5wTS51
    (2) grub-crypt(命令行输入):输入两遍口令即可,生成sha512加密口令;
        password --encrypted $6$deasqLKO.modQqxo$pzjfo9obXfGHsL8o/0O/1HBQAxRZg93D0vGAJZ8wP/UAeGb4Qj.hSbVpTHXHu.mhdTThaE6UtIFcsodTdJTBT
    3 单用户模式进入,需要按p输入口令才更改启动系统的内核文件;
    
    Paste_Image.png
    Paste_Image.png

    口令忘记,更改口令
    例:到了新公司,登陆口令和grub口令都不知道
    思路:硬盘、光盘和U盘都可以更改口令
    电影大片:在windows或者服务器上,插上U盘破解口令,操控服务器

    1 光盘引导,进入救援模式;(U盘、硬盘也行)
    2 切根:chroot /mnt/sysimage
    3 设置口令 (2种方法都可以)
          passwd 输入两遍口令即可;
          echo fgqcompany|passwd --stdin root 
          ls -l /etc/shadow  查看文件的更改时间,是否成功更改口令
    
    拓展
    4 vim /etc/grub.conf
    5 在initrd下面加一行设置口令的内容:
      password --encrypted $6$deasqLKO.modQqxo$pzjfo9obXfGHsL8o/0O/1HBQAxRZg93D0vGAJZ8wP/UAeGb4Qj.hSbVpTHXHu.mhdTThaE6UtIFcsodTdJTBT
    6 给启动系统设置口令,口令放在哪个title后面,就对那个title起作用;
    
    Paste_Image.png Paste_Image.png

    rd_NO_LUKS——支持对硬盘分区加密
    更改Linux的图形界面
    格式要求:xpm 640×480(分辨率)

    1 自定义图片
          ctrl+alt+a  截图
          win+r:mspaint
          粘贴——裁剪——重新调整大小:640×480(像素)、剪切——新建、粘贴、保存在桌面(命名win.png)
          rz  上传图片文件至Linux
    2 convert工具转换格式(如果无convert,需要安装)
          rpm -qf  `which convert`
          convert -resize 640x480 -colors 14 win.png win.xpm
          file win.xpm
          more win.xpm
    3 压缩      
          mv win.xpm /boot/grub
          gzip win.xpm
          
    4 vim /boot/grub/grub.conf
      splash.xpm.gz更改为win.xpm.gz
    5 reboot
    
    Paste_Image.png Paste_Image.png

    a: 内核参数
    e: 编辑模式,用于编辑菜单
    c: 命令模式,交互式接口
    b: 重新启动
    o: 增加空行 o模式配合e模式一起使用——增加内容
    d: 删除某行
    Esc: 返回

    Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png

    /boot/grub/目录下的文件全部丢失
    故障——同二阶段:Error 15

    模拟故障
    mv /boot/grub/* /app/
    rm -rf /boot/grub/*
    解决方法
    1 重启;
    2 Esc,光盘引导,进入救援模式,开启shell进程;
    3 切根:chroot /mnt/sysimage;
    4 grub-install /dev/sda  生成grub相关文件,不会生成grub.conf文件; 
    5 sync...;
    6 exit两次;
    grub 2阶段修复成功,但是没有生成grub.conf文件,还无法完全启动;
    
    Paste_Image.png

    生成grub.conf文件

    方法一:接着上面步骤4开始做
    5 cd /boot/grub/  可以看到grub文件夹生成
    6 vim /boot/grub/grub.conf
          default=0 
          timeout=3
          hiddenmenu
          title feng linux
              kernel (hd0,0)/vmlinuz...  root=/dev/sda2  (在根下,r!ls /boot/vmlinuz...)
              kernel (hd0,0)/boot/vmlinuz...  root=/dev/sda2  (不在根下)
              initrd /initramfs...  (r!ls /boot/initramfs...)
          ...
          ...
    7 sync..
    8 exit 两次
    
    方法二:grub交互式操作
    1 root (hd0,0) (可以省略)
    2 kerne /vmlinuz...(TAB键补全) root=/dev/sda2
    3 initrd /initramfs...(TAB键补全)
    4 boot
    5 由于是重新启动,所以还要再操作一遍grub.conf文件的生成步骤(1234)
    6 进入操作界面:
      cp /app/* /boot/grub/
      cp /app/splash.xpm.gz /boot/grub/
    
    Paste_Image.png

    删除init并恢复

    模拟故障
    rpm -qf /sbin/init  init文件来自upstart
    mv /sbin/init /root
    菜单可以看见,出现Error 19 
    
    解决方法
    1 重启
    2 倒计时界面,按a——按e,进入编辑模式——再按e,开始编辑:行最后加上 init=/bin/bash ——回车——b重启;
    3 进入bash进程:
      mount -o remount,rw /
      mv /root/init /sbin/
      exit
      手动重启
    4 没有启动成功,原因:selinux标签;
      ll /sbin/init  观察到:移动过程——属性改变
      解决方法:临时禁用SElinux标签;
    5 重启,倒计时界面按a——再按a——光标所在行最后加上 selinux=0
    
    getenforce  查看是否被禁用
    restorecon /sbin/init  恢复标签(如果禁用,不能恢复标签)
    
    Paste_Image.png

    四、删除/boot并恢复

    模拟故障:rm -rf /boot
    Error 15
    思路:恢复文件——kernel文件、虚拟文件、grub相关文件、grub.conf文件

    解决方法
    1 Esc,进入救援模式;
    2 切根 chroot /mnt/sysimage/
    3 mount /dev/sr0 /mnt  内核文件在光盘里,所以要挂载光盘
      cd /mnt; ls -d *;  光盘内核文件(无版本号)在isolinux文件夹里
    4 cp /mnt/isolinux/vmlinuz  /boot  
    5 不能用光盘的虚拟文件,虚拟磁盘文件——安装操作系统生成的——需要手工生成;
      mkinitrd /boot/initramfs.img `uname -r`
    6 grub-install /dev/sda
      sync... ; cd /boot; ls; tree  检查是否安装成功(可省略此步骤)
    7 vim /boot/grub/grub.conf  
          default=0 
          timeout=3
          hiddenmenu
          title fgq linux
              kernel (hd0,0)/vmlinuz  root=/dev/sda2  (r!ls /boot/vmlinuz)
              initrd /initramfs.img  (r!ls /boot/initramfs.img)
          ...
          ...
    8 sync..
    9 exit 两次
    

    五、删除/etc/fstab和/boot并恢复

    模拟故障:mv /etc/fstab /rootrm -rf /boot
    Error 15

    解决方案
    1 Esc,救援模式,进入shell;
    2 判断根在哪个磁盘
          fdisk -l /dev/sda  观察空间大小
          mkdir /mnt/tmp
          mount /dev/sda1 /mnt/tmp  或者 mount /dev/sda2 /mnt/tmp  (一个一个尝试,)
          ls /mnt/tmp  观察到根文件,即是根所在的磁盘;(cd /mnt/tmp;ls)
          umount /dev/sda1  未观察到根文件,即取消挂载,继续尝试;
    3 vi /mnt/tmp/etc/fstab  (vim无法使用)
        /dev/sda2 / ext4 defaults 0 0
        /dev/sda1 /boot ext4 defaults 0 0
        exit---exit
    4 重启后,按Esc,重新进入救援模式;
    5 切根 chroot /mnt/sysimage/
    6 mount /dev/sr0 /mnt  
    7 (1)cp /mnt/isolinux/vmlinuz  /boot = cp images/pxeboot/vmlinuz  /boot
      (2)mkinitrd /boot/initramfs.img `uname -r` 
      (3)rpm -ivh /mnt/Packages/kernel-....rpm --force; ls
      (1)+(2) = (3)
    8 grub-install /dev/sda
    9 vim /boot/grub/grub.conf  
          default=0 
          timeout=3
          hiddenmenu
          title fgq linux
              kernel (hd0,0)/vmlinuz...  root=/dev/sda2  (r!ls /boot/vmlinuz)  (selinux=0 禁用selinux)
              initrd /initramfs-....img  (r!ls /boot/initramfs.img)
          ...
          ...
    10 sync..
    11 exit 两次
    进入操作界面
    12 swapon -s; free  查看swap是否挂载
    13 cp /root/fstab /etc/fstab
    14 mount -a  挂载文件系统
    15 swapon -a  挂载swap
       df  查看是否挂载
    
    Paste_Image.png

    六、网络安装linux(分区是逻辑卷)

    逻辑卷:删除/etc/fstab和/boot并恢复
    模拟故障:mv /etc/fstab /root;rm -rf /boot

    1 Esc,救援模式,进入shell;
        lvs; vgs; ls /dev/VolGroup/lv-home  有逻辑卷,但不能访问
        lvdisply  可以观察到 not available; 
        逻辑卷、文件系统可以正常使用原因:/etc/rc.d/rc.sysinit
    2 lvscan  扫描所有的逻辑卷,可以看到状态;
    3 vgchange -ay  激活逻辑卷,即可使用逻辑卷
    4 mkdir /mnt/rootfs; blkid
      mount /dev/mapper/VolGroup/lv-root /mnt/rootfs
    5 vim /mnt/rootfs/etc/fstab
      r!blkid
    6 exit
    7 重启后(自动挂载根),按Esc,重新进入救援模式;
    8 切根 chroot /mnt/sysimage/
    9 mount /dev/sr0 /mnt  
    10 rpm -ivh /mnt/Packages/kernel-....rpm --force; ls /boot
    11 grub-install /dev/sda(此步骤可以不写,grub文件都存在,只是缺少grub.conf文件,交互式操作创建grub.conf文件也可以)
    12 非交互式操作,创建grub.conf文件:
       vim /boot/grub/grub.conf  
          default=0 
          timeout=3
          hiddenmenu
          title fgq linux
              kernel (hd0,0)/vmlinuz...  root=/dev/VolGroup/lv-root  (r!ls /boot/vmlinuz)  (selinux=0 禁用selinux,这里可以不写,默认禁用)
              initrd /initramfs-....img  (r!ls /boot/initramfs.img)
    13 sync..
    14 exit 两次  reboot
    
    Paste_Image.png
    chmod -R 000 /boot/*
    ll /boot/ /boot/grub/
    变更/boot/下的文件权限,不会导致系统启动不起来;
    
    倒计时界面,按a进入内核文件系统,行最后加上max_loop=100 rhgb quite 回车即可;
    ls /dev/loop*
    cat /proc/cmdline 内核参数
    yum -y install kernel-doc
    内核参数文档: /usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt
    

    七、制作MINI_Linux,放在U盘,启动后自动就有IP,能通信;

    1 准备新磁盘 /dev/sdb 20G (U盘也行)
      echo "- - -" > /sys/class/scsi_host/host2/scan; lsblk  使新增磁盘生效
      fdisk /dev/sdb; n——p——1——+100M; n——p——2——+10G; w 存盘;
      mkfs.ext4 /dev/sdb1
      mkfs.ext4 /dev/sdb2
    
    思路:grub文件,grub.conf文件,/etc/fstab文件,kernel文件,initramfs文件,bash shell文件; 
    
    2 挂载
      mkdir /tmp/boot /tmp/rootfs
      mount /dev/sdb1 /tmp/boot
      mount /dev/sdb2 /tmp/rootfs
    3
      (1)cp /boot/vmlinuz* /boot/initramfs* /tmp/boot/
      (2)grub-install --root-directory=/tmp  /dev/sdb
      (3)vim /tmp/boot/grub.conf
          default=0
          timeout=3
          title mini_linux
              kernel /vmlinuz.xxx root=UUID=/dev/sdb2...(r!blkid) selinux=0 init=/bin/bash(自带IP,init就不写了,或者需要自己手写,第5步:vim /sbin/bash)
              initrd /initramfs.xxx.img
    
    4 运行脚本,复制命令工具
      bash copycmd.sh  脚本内容在下面,可以更改安装目录
      (复制命令:bash/kill/ping/tree/cat/ls/cp/mv/vi/ip/rm/touch/ifconfig/reboot/quit/insmod) 
      insmod功能:加载驱动模块——网络功能
      (insmod /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko  加载网络驱动模块)
      (lsmod | grep e1000)
      tree /tmp/rootfs/  观察是否成功复制命令工具
      (ethtool -i eth0  查看eth0网卡信息)
      (locate e1000.ko  查看eth0网卡驱动文件)
      mkdir /tmp/rootfs/{root,bin,sbin,lib,lib64,var,usr,etc,dev,sys,proc,tmp,home,mnt}
      cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /tmp/rootfs/lib/  复制驱动网卡文件至/lib/目录里
    
    5 新主机上挂载上述所准备的新磁盘 (拔下U盘,插到新主机上)
      (vim /sbin/init)  自动有IP,能通信
      (/bin/bash)
      insmod /lib/e1000.ko
      ifconfig eth0 172.16.0.100/16(设置自己的IP) 
      更改为桥接模式;
      ping 172.16.0.1  可以ping通
    
    复制命令的脚本:copycmd.sh
    #!/bin/bash
    ch_root="/mnt/sysroot"  (/mnt/sysroot更改为自己所要安装的根目录,如:/tmp/rootfs)
    [ ! -d $ch_root ] && mkdir $ch_root
     
    bincopy() {
        if which $1 &>/dev/null; then
    
            local cmd_path=`which --skip-alias $1`
            local bin_dir=`dirname $cmd_path`
            [ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}
            [ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir}
            return 0
        else
            echo "Command not found."
            return 1
        fi
    }
     
    libcopy() {
        local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')
        for loop in $lib_list;do
            local lib_dir=`dirname $loop`
            [ -d ${ch_root}${lib_dir} ] || mkdir -p  ${ch_root}${lib_dir}
            [ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir}
        done
    }
     
     
    read -p "Please input a command: " command
     
    while [ "$command" != "quit" ];do
        if bincopy $command ;then
            libcopy $command
        fi
        read -p "Please input a command or quit: " command
    done
    
    
    思考:网上找Linux源码,从头到尾,自己编译安装;
    

    相关文章

      网友评论

        本文标题:Linux内核故障排除(centos6)

        本文链接:https://www.haomeiwen.com/subject/qeyrhxtx.html