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
实验:创建一个自定义服务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
- 启动后查看文件都恢复了,修复成功
[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确实已经清零
红线区域是分区数据,如果46个字节没了也没备份就凉凉了
- 重启后无法进入系统,症状如下
只有一个光标来回闪,说明已经过了第一阶段 - 进入救援模式
chroot /mnt/sysimage/
gurb-install /dev/sda
#万能的命令啊
- 修复后重启成功
四、/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
有时候就算进行上述操作还是会出现如下错误:
这时候需要在内核参数后面加上 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
- 重新启动系统,修复成功
实验:/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
重启修复成功