继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Linux内核故障排除(centos6)

DIEA
关注TA
已关注
手记 279
粉丝 63
获赞 386

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

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/sda23 initrd /initramfs...(TAB键补全)4 boot5 由于是重新启动,所以还要再操作一遍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---exit4 重启后,按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/sda9 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/fstab14 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.sysinit2 lvscan  扫描所有的逻辑卷,可以看到状态;3 vgchange -ay  激活逻辑卷,即可使用逻辑卷4 mkdir /mnt/rootfs; blkid
  mount /dev/mapper/VolGroup/lv-root /mnt/rootfs5 vim /mnt/rootfs/etc/fstab
  r!blkid6 exit7 重启后(自动挂载根),按Esc,重新进入救援模式;8 切根 chroot /mnt/sysimage/9 mount /dev/sr0 /mnt  
10 rpm -ivh /mnt/Packages/kernel-....rpm --force; ls /boot11 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/rootfs3
  (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.img4 运行脚本,复制命令工具
  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/bashch_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: " commanddone
思考:网上找Linux源码,从头到尾,自己编译安装;



作者:Miracle001
链接:https://www.jianshu.com/p/d309bd07f64e

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP