传统印象下Linux是非常坚不可摧的,具有千年不更新,万年不重启的美名。而随着虚拟化的推进,很多跑在虚拟化上的Linux由于先前基础架构的脆弱,变得适应性“越来越不好”,体现在IP存储如果出现节点故障而且没有冗余线路的保障很容易出现磁盘脱机导致的系统只读,加上LVM固有的习惯使用还会影响到系统在硬盘离线后数据恢复的困难,再者EXT系列的文件系统没有Windows 2008之后所使用的NTFS文件系统的自我修复功能,很多时候会让工作陷入各种深坑不能自拔。
笔者最近遇到一个奇葩的现象,某平台因为IP存储结点故障导致ESXi层长时间无法与外挂(iSCSI)存储通信,其上的虚拟化层Windows 进入到无响应,Linux进入到系统只读,等待外挂存储恢复之后Windows 进入到可对外应答、远程;而Linux进入到可以SSH但是文件系统依旧只读的现象。此时对于Linux只能进行重启,在系统启动环境下进行fsck磁盘检查(此时还可能会有文件缺失现象发生),现在问题来了,平时登陆的时候使用非root账号保证安全,很少操作系统底层,因此用户基本上用不到root账号,而现在重启后需要使用root账号。
Figure 1由于长时间不用,root用户密码已经记不起来,接着就进入到了死循环,Ctrl+D之后继续到这个界面,反反复复无穷尽
有同学想到不是可以用单用户模式吗?
这个笔者也尝试了,因为百度里面搜索到的最多的重置Linux密码技能就是单用户模式,但是进行不了,效果和上图一样,究其原因,详见这篇博文。
单用户模式不通,而我们就是要进入系统,这时候需要更换策略,我们使用systemrescuecd,由于接下来使用的命令是要和虚拟系统架构一致的,因此启动项上面选择光盘版本要留意一下。
登陆之后,使用fdisk -l确认Linux分区,如果是LVM的环境,需要配置和扫描现有虚拟磁盘:
扫描所有卷组 # lvm vgscan –v 激活所有卷组 # lvm vgchange -a y 列出说有逻辑卷 # lvm lvs –all 挂载逻辑卷 # mount /dev/volumegroup/logicalvolume /mountpoint |
接下来配置命令chroot所需要的环境:
root@sysresccd /root % mkdir /mnt/linux ▼示例是非LVM情况挂载 root@sysresccd /root % mount /dev/sda2 /mnt/linux root@sysresccd /root % mount -o bind /proc /mnt/linux/proc root@sysresccd /root % mount -o bind /dev /mnt/linux/dev root@sysresccd /root % mount -o bind /sys /mnt/linux/sys |
使用chroot进行用户切换:
root@sysresccd /root % chroot /mnt/linux /bin/bash |
使用passwd进行root密码重置,此时重置的就是虚拟机系统内的那个Linux系统root密码:
root@sysresccd /root % passwd Changing password for user root. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. |
最后退出systemrescuecd,重新由硬盘引导,在Figure 1标记的图示中输入重置后的密码,使用fsck –y进行磁盘检查,通过之后使用reboot进行系统重启,问题解决。
总结:
在进行密码重置的时候有多种方法,更多的可以参考这里:http://www.linux-magazine.com/Online/Features/Resetting-Passwords-with-SystemRescueCd
其他参考资料:http://docs.slackware.com/howtos:slackware_admin:how_to_chroot_from_media
其他参考资料:http://www.sysresccd.org/Sysresccd-Partitioning-EN-Repairing-a-damaged-Grub
-=EOB=-