记一次故障处理

前因

一台虚拟机的磁盘因存储的问题出现了异常,需要修复。而因为不知道虚拟机的密码,无法进入虚拟机内部查看具体问题。

处理过程

关闭目标虚拟机

关闭虚拟机并备份系统磁盘文件。

挂载虚拟机系统盘

通过guestmount命令,将虚拟机的系统磁盘文件挂载到本地目录:

1
guestmount --rw -a disk -m /dev/sda3 /opt/instance_mount_dir

如果系统磁盘文件的根分区不在第三分区的话会返回提示现有的分区,重新选择相应的分区进行挂载

注入新密码

mount功后,进入挂载目录。此即虚拟机的系统盘文件,使用以下命令生成新密码:

1
echo "centos" | openssl passwd -1 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 32) -stdin

即以”centos”为虚拟机新的密码,生成这个密码加密后的字符。同时备份虚拟机中原有的/etc/shadow文件:

1
rsync -avz /opt/instance_mount_dir/etc/shadow /opt/etc_shadow

(使用rsync命令可以避免造成权限问题)

修改虚拟机的/etc/shadow,用新root密码替换旧root密码

umout挂载目录

1
fusermount -u /opt/instance_mount_dir/

or

1
umount /opt/instance_mount_dir/

启动虚拟机

使用”centos”密码登录后,执行fsck命令,一直按”yes”至完成检查,将虚拟机关闭

恢复虚拟机

重复3、4步骤,使用之前备份的/etc/shadow文件替换虚拟机内部的/etc/shadow

再次启动虚拟机

此时的虚拟机已恢复,可以使用原有的密码登录