您的位置:首页 > 运维架构 > Linux

linux 启动错误排查

2017-05-24 18:24 190 查看
--

troubleshooting    排错

winPE   --光盘或u盘启动盘 产生一个PE系统(类似内存的临时系统)

系统排错
rescue 模式 (挽救模式)      类似windows  winPE模式

=========================================================================

问题一:
如果你的linux的root密码忘记了,怎么办?
答案:
使用单用户模式(系统启动级别为1)进行系统修改

在启动系统时,在grub选择界面按e,然后去第二行(也就是kernel开头的那行)再按e,去最后加一个数字1或者single单词。然后回车,按b

进入到1级别系统是不需要登录的,现在就可以password修改新的root密码,再重启用新密码正常登录了

这里也可以把/etc/passwd的第一行第二列的x去掉,然后重启就可以不用密码root登录了,再把x加回去,原密码又生效了(可以用此方法去同桌电脑做坏事)

问题二
如何防止别人用单用户模式进入我的linux系统
答案:
grub加密
方法一:在安装系统时,直接设置

方法二:
安装没有设置,装完也可以再设置
# grub-md5-crypt    --用此命令自定义一个密码,会产生一个密码字符串
Password:
Retype password:
$1$WgBpF/$eWCjkPXtaN6brJXcjeAEw0

# vim /boot/grub/grub.conf   --然后加上password --md5 密码字符串在如下位置
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
password --md5 $1$WgBpF/$eWCjkPXtaN6brJXcjeAEw0
title Red Hat Enterprise Linux (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=a907082e-7fa0-4547-acc1-86fafa58b512 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img

扩展一个小错误
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Enterprise Linux (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=a907082e-7fa0-4547-acc1-86fafa58b512 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
password --md5 $1$WgBpF/$eWCjkPXtaN6brJXcjeAEw0      --加在这里是不能防别人进行单用户的,因为这一行是只能用密码锁住以下的行,所以这里并没有锁着kernel这一行
initrd /initramfs-2.6.32-431.el6.x86_64.img

注意:grub加密可以用rescue破解(因为rescue模式是使用与原系统无关的临时系统)

====================================================================================

排错的一般思路:建议先可以尝试使用单用户排错,如果不行(有些错误甚至会造成单用户模式都进不了),再使用rescue模式(这个模式一定可以进,因为是使用与原系统无关的临时系统)

问题:怎么进入rescue模式
答案:因为我们要产生一个临时系统,所以一定需要系统iso镜像(需要把此iso做成光盘引导或u盘引导或网络引导);或者更简单总结一句话:就是能进入到安装系统第一步界面,选择Rescue installed system

问题:进行rescue模式后如何排错?
答案:一句话:进行这个临时系统后,想办法把原来错误系统挂载到临时系统,按需求进行修改排错

具体挂载实现方法主要有下面两种
方法一:
如果正常情况下,会把你要修复的系统的整个根目录(包含下级所有子目录)mount到临时系统的/mnt/sysimage目录下
chroot /mnt/sysimage  再去修改(或者不chroot)

这是不chroot,在临时系统上修改错误系统的/etc/fstab
vi /mnt/sysimage/etc/fstab      --这里的vi命令是临时系统的

这是chroot,在错误系统里修改它的/etc/fstab
chroot /mnt/sysimage
vi /etc/fstab           --这里的vi是原错误系统的
exit

方法二:
有些情况下,没有mount到/mnt/sysimage
fdisk -l  查看所有分区
然后自己手动建立目录用来挂载排错
例mkdir /aaa     --一定要手动新建的目录,否则不能挂载
mount /dev/sda1 /aaa
在/aaa目录下排错就可以了

====================================================================================

系统简单启动过程:

BIOS(启动顺序)--》读取硬盘mbr--》加载grub--》加载vmlinuz和initramfs--》读inittab--》读fstab---》启动各个服务(按照inittab里定义的级别)--》rc.local--》如果是5级别,启动图形--->系统登录(passwd,shadow)

具体排错实例(mbr丢失如何排错):

mbr(master boot loader主引导记录,在硬盘最前面的512字节)446(启动设备)+64(分区信息)+2(结束位)
mbr丢失,现象:启动时候黑屏,左上角一个光标在闪(或者直接就进入到了第二或第三的启动顺序,由光驱或网络进入了系统安装界面)

最好使用一个虚拟机来做此实验
第一步:
dd if=/dev/sda of=/mbr.bak bs=1 count=512   --备份mbr

第二步:
把备份scp拷到别的机器或者移动存储设备(我这里使用scp拷贝到我的宿主机,过程省略)

第三步:
模拟干掉mbr
dd if=/dev/zero of=/dev/sda bs=1 count=512  --干掉mbr

做完第三步后的现象
fdisk -l  查看不到分区信息

reboot后,系统进不了,黑屏,并且一个光标在闪(BIOS里只有硬盘启动,没有光驱,网络启动的情况下才会这样。否则就进入了第二启动顺序引导)

第四步:
按前面总结的方法:先尝试单用户模式,再使用rescue模式.但现在mbr丢失的现象是grub都看不到,所以也不可能进入单用户模式了,只能使用rescue模式

进入方法(见笔记前面总结)

第五步:
--按完continue后,这里出现了“分区表不可访问,是否重新擦除所有硬盘上的信息"的提示;所以这里按no,进入到了挽救模式;但是这里原系统没有挂载到/mnt/sysimage上,并且fdisk -l查看不到分区,ls /dev/可以看到分区名,但挂载不了;也就是说找不到以前的mbr备份,无法恢复

--注意:rhel6.5里如果按continue,会报找不到disk(因为mbr丢失的原因,其它的错误,选择continue是正常的),无法进入到挽救模式的命令行模式;可以按skip,就可以进入到命令行模式

--所以,mbr备份到U盘这种外接设备,现在就可以挂载进行恢复
dd if=/path/mbr.bak of=/dev/sda
--或者进入带网络的挽救模式,通过网络拷过来进行恢复;但要在临时系统使用scp远程拷过来,因为它本身没有ssh服务,但可以使用scp使用别人的ssh服务。

============================================================================

实践练习:

使用一个硬盘12G以上大小的虚拟机安装排错系统,桥接网络(基于rhel6.5版本):

获取服务器IP:172.16.2.9
安装名:troubleshooting

--如果所有人一起安装可能会较卡,可以同桌间一人安装,(安装完后建议做一个虚拟机快照)然后把安装的虚拟机目录拷给同桌打开
--可以讨论一起排错,可以上网查资料;最终实现登录进系统,安装图形,无错误
--还要要求能够上外网,并能被ssh连接

错误都是讲过的,只有一个点没讲,上网查查这个文件/etc/securetty

如果一个os,没有yum,没有rpm,连gcc这种都没有(表示你没办法源码编译),那么你怎么装包上去?
答案:
rpm --root=/xxx
yum --installroot=/xxx

rm -rf /root/anaconda-ks.cfg
rm -rf /bin/mount
rm -rf /usr/bin/yum
rm -rf /boot/grub/grub.conf
rm -rf /etc/fstab
rm -rf /usr/bin/nautilus
rpm -e --nodeps rpm-4.8.0-37.el6.x86_64
echo "echo 123 |passwd --stdin root &> /dev/null" >> /root/.bash_profile
echo "export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/root/bin" >> /root/.bashrc
sed -i 's/sda/sdb/' /boot/grub/device.map
sed -i '/^export/d' /etc/profile
sed -i '/^host/s/dns//' /etc/nsswitch.conf
chmod o-t /tmp
chmod 000 /
echo "* * * * * root wall 'haha'" >> /etc/crontab
echo "01 * * * * /sbin/init 0" >> /var/spool/cron/root
sed -i '12aport 222' /etc/ssh/sshd_config
echo "TMOUT=30" >> /root/.bashrc
echo "find me @_@" >> /etc/motd
sed -i '/^root/s/bin/in/g' /etc/passwd
sed -i '5asleep 100' /etc/rc.d/init.d/network
sed -i '1s/yes/no/' /etc/sysconfig/network
sed -i '20s/fi/hahahaha/' /etc/profile
mv /lib64/libselinux.so.1 /lib64/libselinux.so.1.bak
echo "/sbin/init 6" >> /etc/rc.local
chattr +i /etc/rc.d/rc.local
chattr +i /etc/passwd
chattr +i /etc/shadow
chmod u-s /usr/bin/passwd
echo "tty2" > /etc/securetty
echo "sshd: all" > /etc/hosts.deny
rm -rf /etc/sysconfig/network-scripts/ifcfg-eth0
dd if=/dev/zero of=/dev/sda1 bs=1 count=1024 seek=1024
rm -rf /root/cobbler.ks
rm -rf /root/*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  错误排查 linux