Centos6下救援模式的使用

  • 实验:忘记root密码
  • 实验:为内核制作启动文件
  • 实验:创建一个自定义服务S96serv,添加、修改、删除服务
  • 实验:开启Telnet服务,熟悉xinetd代理服务(超级守护进程)
  • 实验:/boot/grub/grub.conf 文件格式要求
  • 实验:启动过程错误修复
  • 实验:/boot目录下的所有文件丢失



实验:忘记root密码

  • 启动时,在bootloader启动倒计时键盘任意键进入启动项管理页面
  • 按提示输入a,在提示的画面字符串后输入1,代表进入runlevel: 1的单用户模式
  • 无需输入密码,即可进入root账户,此时可以重置root密码

实验:为内核制作启动文件

mkinitrd /boot/initramfs-`uname -r`.img `uname -r`

删除内核启动文件

[root@CentOS6 ~]#cd /boot
[root@CentOS6 /boot]#rm -f initramfs-2.6.32-754.el6.x86_64.img 
[root@CentOS6 /boot]#reboot

重启进入系统失败,开始进入救援模式

chroot /mnt/sysimage/                         #切换根目录
cd /boot                                      #去内核目录下
mkinitrd initnamfs-`uname -r`.img `uname -r`  #创建内核启动文件
exit                                          #退出shell,否则无法重启
reboot

虚拟机中centos7救援模式 centos6.8进入救援模式_root密码


实验:创建一个自定义服务S96serv,添加、修改、删除服务

在/etc/rc.d/init.d目录下,新建服务脚本文件

#!/bin/bash
#chkconfig: - 96 07             # - 表示全部禁止 96是S 07是K
#description: ceshi
.  /etc/init.d/functions
start() {
       touch /var/lock/subsys/testsv
       action "Starting testsv"
}
stop() {
       rm -f /var/lock/subsys/testsv
       action "Stopping testsv"
}
status() {
    if [ -f /var/lock/subsys/testsv ];then
        echo "testsv is running"
    else
        echo "testsv is stopped"
} 

case "$1" in
    start)
            start
            ;;
    stop) 
            stop
            ;;
    restart)
            stop
            start
            ;;
    status)
            status
            ;;
    *)
        echo "Usage: testsv {start|stop|status|restart"
esac

脚本测试结果如下

service testsv start
Starting testsv                                            [  OK  ]
service testsv stop
Stopping testsv                                            [  OK  ]
service testsv restart
Stopping testsv                                            [  OK  ]
Starting testsv                                            [  OK  ]
service testsv status
testsv is running

chkconfig命令添加此服务,查询此服务在各个运行级别的开启、关闭状态是否符合服务脚本文件中的描述

[root@CentOS6 /etc/init.d]#chkconfig --list testsv
service testsv supports chkconfig, but is not referenced in any runlevel (run 'chkconfig --add testsv')
[root@CentOS6 /etc/init.d]#chkconfig --add testsv 
[root@CentOS6 /etc/init.d]#chkconfig --list testsv 
testsv         	0:off	1:off	2:on	3:on	4:on	5:on	6:off

chkconfig修改此服务在运行级别3的状态为off

[root@CentOS6 /etc/init.d]#chkconfig --level 3  testsv off
[root@CentOS6 /etc/init.d]#chkconfig --list testsv 
testsv         	0:off	1:off	2:on	3:off	4:on	5:on	6:off

chkconfig删除此服务

[root@CentOS6 /etc/init.d]#chkconfig --del testsv 
[root@CentOS6 /etc/init.d]#chkconfig --list testsv 
service testsv supports chkconfig, but is not referenced in any runlevel (run 'chkconfig --add testsv')
[root@CentOS6 /etc/init.d]#ls /etc/init.d | grep testsv 
testsv

service命令:手动管理服务

语法:

service service_name start|stop|restart|status,服务开启、关闭、重启、状态查询
service --status-all,查询所有服务的状态

实验:开启Telnet服务,熟悉xinetd代理服务(超级守护进程)

安装telnet以及xinetd服务

yum -y install telnet-server         
#必须安装此服务,否则xinetd不能守护此进程
yum -y install telnet                
yum -y install xinetd

chkconfig --list命令发现telnet服务属于非独立服务,需要修改xinetd服务的配置文件

[root@CentOS6 /etc/init.d]#chkconfig --list
xinetd based services:
	chargen-dgram: 	off
	chargen-stream:	off
	daytime-dgram: 	off
	daytime-stream:	off
	discard-dgram: 	off
	discard-stream:	off
	echo-dgram:    	off
	echo-stream:   	off
	rsync:         	off
	tcpmux-server: 	off
	telnet:        	off
	time-dgram:    	off
	time-stream:   	off

配置/etc/xinetd.d/telnet,将disabled的值由yes改为no,重新执行chkconfig --list命令,发现telnet的状态已经变成yes

service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no
}

重启xinetd服务,此时通过ss -ntlp查看监听端口,发现xinetd正在监听telnet的23端口

[root@CentOS6 /etc/init.d]#service xinetd restart
[root@CentOS6 /etc/init.d]#ss -ntlp
State       Recv-Q Send-Q       Local Address:Port         Peer Address:Port 
users:(("xinetd",2782,5))
LISTEN      0      128              127.0.0.1:631                     *:* 
[root@CentOS6 /etc/init.d]#lsof -i :23
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xinetd  2782 root    5u  IPv6  15073      0t0  TCP *:telnet (LISTEN)

远程telnet登录本机,此时查看tcp端口,发现telnet正在23端口处于连接状态

[root@CentOS6 /etc/init.d]#ss -ntup
Netid State      Recv-Q Send-Q     Local Address:Port       Peer Address:Port 
tcp   ESTAB      0      0           192.168.39.3:23        192.168.39.14:54442  users:(("in.telnetd",2834,0),("in.telnetd",2834,1),("in.telnetd",2834,2))
tcp   ESTAB      0      64          192.168.39.3:22       192.168.39.100:62331  users:(("sshd",2088,3))
[root@CentOS6 /etc/init.d]#lsof -i :23
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xinetd    2782 root    5u  IPv6  15073      0t0  TCP *:telnet (LISTEN)
in.telnet 2834 root    0u  IPv4  16037      0t0  TCP 192.168.39.3:telnet->192.168.39.14:54442 (ESTABLISHED)
in.telnet 2834 root    1u  IPv4  16037      0t0  TCP 192.168.39.3:telnet->192.168.39.14:54442 (ESTABLISHED)
in.telnet 2834 root    2u  IPv4  16037      0t0  TCP 192.168.39.3:telnet->192.168.39.14:54442 (ESTABLISHED)

实验:/boot/grub/grub.conf 文件格式要求

判断kernel行和initrd行可否交换次序:

  • 在/boot/grub/grub.conf文件中复制当前启动菜单选项设置,交换kernel行和initrd行的次序
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64)
        root (hd0,0)
        initrd /initramfs-2.6.32-754.el6.x86_64.img
        kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=20901eea-7a80-4623-81ec-ebb0951c8b80 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
  • 重启系统,进入复制的启动项,发现错误提示:kernel必须在initrd前
  • 开始救援模式
    使用键盘 e 进入编辑

    选中行然后用 d 删除

    使用键盘 o 增加一个空白行

    使用键盘 e 进入编辑

    回车进入目录按 b 重启机器,最终成功启动
  • 由于本次启动属于在grub中临时更改启动项,在系统启动之后,需要及时对/boot/grub/grub.conf文件进行修改,确保今后启动正常

实验:启动过程错误修复

一、仅保留/boot/grub目录下的grub.conf文件

[root@CentOS6 ~]#mv /boot/grub/* /data/
[root@CentOS6 ~]#mv /boot/grub/* /data/

重启后发现系统正常启动,这说明进入stage 2必要的文件只有 /boot/grub/grub.conf 文件,其他文件只是 stage1, stage 1_5, stage 2 的备份文件
二、grub的stage 1 丢失

[root@CentOS6 ~]#mv /boot/grub/* /data/
[root@CentOS6 ~]#mv /boot/grub/* /data/   
#在/boot/grub目录中只保留grub.conf文件
[root@CentOS6 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=446 
#删除磁盘前446字节,即grub的stage 1
446+0 records in                               
446+0 records out
446 bytes (446 B) copied, 0.00317388 s, 141 kB/s
  • 查看磁盘前512字节
[root@CentOS6 ~]#hexdump -C -n 512 /dev/sda
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 20  |............... |
000001c0  21 00 83 9b 1c 7f 00 08  00 00 00 40 1f 00 00 9b  |!..........@....|
000001d0  1d 7f 83 fe ff ff 00 48  1f 00 00 00 35 0c 00 fe  |.......H....5...|
000001e0  ff ff 83 fe ff ff 00 48  54 0c 00 80 1a 06 00 fe  |.......HT.......|
000001f0  ff ff 05 fe ff ff 00 c8  6e 12 00 38 91 06 55 aa  |........n..8..U.|
00000200
#80-aa之间是分区信息,前面446全部为0
  • 重启发现错误

    重启后,BIOS认为/dev/sda不是启动磁盘,于是寻找第二启动介质,所以出现光盘界面,如果没插入光盘,那就是黑屏提示。
  • 救援模式修复
chroot /mnt/sysimage/
grub-install /dev/sda

虚拟机中centos7救援模式 centos6.8进入救援模式_TCP_02

  • 启动后查看文件都恢复了,修复成功
[root@CentOS6 ~]#ls /boot/grub/
device.map     grub.conf         reiserfs_stage1_5  vstafs_stage1_5
e2fs_stage1_5  iso9660_stage1_5  stage1             xfs_stage1_5
fat_stage1_5   jfs_stage1_5      stage2
ffs_stage1_5   minix_stage1_5    ufs2_stage1_5

三、grub的stage 1_5丢失

  • 人为损坏stage1后面的扇区
#除stage1之外的前20个扇区的内容全部清零
dd if=/dev/zero of=/dev/sda bs=1 count=10240 skip=512 seek=512
hexdump -C 512 -n 10240 /dev/sda
#查看/dev/sda磁盘的前10240字节,发现stage1_5确实已经清零

虚拟机中centos7救援模式 centos6.8进入救援模式_linux实验_03


红线区域是分区数据,如果46个字节没了也没备份就凉凉了

  • 重启后无法进入系统,症状如下

    只有一个光标来回闪,说明已经过了第一阶段
  • 进入救援模式
chroot /mnt/sysimage/
gurb-install /dev/sda
#万能的命令啊

虚拟机中centos7救援模式 centos6.8进入救援模式_linux实验_04

  • 修复后重启成功
    四、/boot/grub/grub.conf文件丢失
  • 删除/boot/grub.conf
    当删除/boot/grub/grub.conf文件后,系统无法启动,症状如下:
  • 开始修复:手动输入关键启动参数root, kernel, initrd等关键信息
root (hd0,0)
#根的路径
kernel /vmlinuz-2.6.32-754.e16.x86_64  root=/dev/sda2 
#内核参数,有时候启动不起来后面必须加root路径
initrd /initramfs-2.6.32-754.e16.x86_64.img
#为选定的内核提供额外文件的ramdisk

虚拟机中centos7救援模式 centos6.8进入救援模式_TCP_05


有时候就算进行上述操作还是会出现如下错误:

虚拟机中centos7救援模式 centos6.8进入救援模式_linux实验_06


这时候需要在内核参数后面加上 root=/dev/sda2即可

  • 重启系统,修复成功

五、/boot/grub下的所有文件全部丢失

  • 删除整个grub文件夹
[root@CentOS6 ~]#rm -rf /boot/grub/
  • 重新启动系统此时stage2文件丢失,报错如下图:
  • 进入救援模式
  • 1.先修复grub
chroot /mnt/sysimage/
grub-install /dev/sda
  • 2.手动创建grub.conf文件
default=0
timeout=6
ttile lipenggbin_2.6
kernel /vmlinuz-2.6.32-754.e16.x86_64  root=/dev/sda2 
#内核参数
initrd /initramfs-2.6.32-754.e16.x86_64.img
#为选定的内核提供额外文件的ramdisk

虚拟机中centos7救援模式 centos6.8进入救援模式_TCP_07

  • 重新启动系统,修复成功

实验:/boot目录下的所有文件丢失

前提分析,boot目录下所有文件丢失,需要恢复的文件如下

  • 1. 内核文件
  • 2. 给内核提供额外文件的ramdisk
  • 3. grub stage 2相关文件,即修复grub
  • 4. grub.conf配置文件

进入救援模式

chroot /mnt/sysimage/
#切换根目录
mount /dev/sr0 /mnt
#挂载光盘
cp /mnt/isolinux/vmlinuz /boot/vmlinuz-`unmae-r`
#复制内核文件过来并改回原来的名字
mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
#创建内核需要的额外文件的ramdisk
grub-install  /dev/sda
#修复grub文件引导
vi /boot/grub/grub.conf    #创建grub配置文件
default=0
timeout=8
title lipengbin_6.0
kernel /vmlinuz-2.6.32-754.e16.x86_64  root=/dev/sda2 
#内核参数
initrd /initramfs-2.6.32-754.e16.x86_64.img
#为选定的内核提供额外文件的ramdisk
reboot

重启修复成功

虚拟机中centos7救援模式 centos6.8进入救援模式_虚拟机中centos7救援模式_08