• Centos7系统kvm虚机忘记密码进不去, 通过宿主机修改/etc/shadow文件改密码,重启后系统起不来故障排错


    问题描述

    某天, 因为其他项目组交接问题, kvm里面的堡垒机系统用户root密码登录不上,然后他通过宿主机修改/etc/shadow文件修改密码,但是修改完后重启系统后发现kvm宿主机连接不上虚机了, 而且ssh也连接不上, 内部IP都ping不通,然后找到这边看有没有办法不重装系统解决这个问题, 因为是堡垒机, 策略,数据,也没备份, 错误一直卡在下面信息:

    console test
    Connected to domain test
    Escape character is ^]
    
    
    /*
    		初步判断: 
    				1. 可能系统没起来,卡在某一个启动步骤
    				2. 内部网卡分配IP,网卡,网络冲突有问题
    				3. 内部服务因为重启系统,服务之间依赖冲突,导致系统起不来.
    */
    

    解决报错1 Escape character is ^]

    正常一般回车就能进入登录界面,不行的话试下面步骤

    如果出现上面字符串使用 CTRL+Shift+5 CTRL+Shift+]

    1. ERROR Format cannot be specified for unmanaged storage.
      virt-manager 没有找到存储池,创建储存池即可

    2. KVM VNC客户端连接闪退
      使用real vnc或者其它vnc客户端连接kvm闪退,把客户端设置中的ColourLevel值设置为rgb222或full即可

    3. virsh shutdown 无法关闭虚拟机
      使用该命令关闭虚拟机时,KVM是向虚拟机发送一个ACPI的指令,需要虚拟机安装acpid服务:

    4. operation failed: Active console session exists for this domain

    # 方案1
    $ ps aux | grep console
    $ kill -9 <进程号>
    # 方案2
    $ /etc/init.d/libvirt-bin restart
    # 方案3
    $ ps aux | grep kvm
    $ kill 对应的虚拟机进程
    
    小结
    `上面方法试过了,还是卡在这个界面,我开始细问那边改/etc/shadow文件, 问他是怎么改的,我把步骤故障看能不能复现一遍, 我这边重新弄一个Kvm和虚机`
    

    解决报错2 kvm修改虚拟机密码

    安装libguestfs-tools
     yum install libguestfs-tools   
    
    生成新的密码串
    openssl passwd -1 -salt 'root' '123'
    $1$hello$ZwmhCpcG.I1XIfVjdarKc1
    
    # openssl是一个加密工具,-1 是指普通加密;
    # root为key ,123456 才是密码,下面就是是生成的密码串,这样我们只要将这些进行对应的替换掉可以了
    

    当时那边生成密码串时候因为看到别人博客上写的是hello,说这个是key,没想到用户名,也跟着别人写了,下面是那边项目当初生成密码串参考的文档截图

    `建议: 参考网上文档, 如果是你不能肯定成功的操作, 建议先在测试环境或者自己虚拟机,云服务器上做一下看看, 能成功再去生产环境操作`
    
    linux系统的加密密码通畅存储在/etc/shadow文件中
    root:$1$bTPRDWwf$LpjUZmGTHw.hYFccl0/lK.:16804:0:99999:7:::                                                                                    
    bin:*:15937:0:99999:7:::
    daemon:*:15937:0:99999:7:::
    adm:*:15937:0:99999:7:::
    lp:*:15937:0:99999:7:::
    sync:*:15937:0:99999:7:::
    shutdown:*:15937:0:99999:7:::
    
    修改root账户密码
    virt-edit -d centos7 /etc/shadow
    root:$1$bTPRDWwf$LpjUZmGTHw.hYFccl0/lK.:16804:0:99999:7:::
    # 更换为
    root:$1$hello$ZwmhCpcG.I1XIfVjdarKc1:16541:0:99999:7:::
    
    或者在kvm命令行启动界面修改密码

    1.宿主机关掉虚机,然后启动

    [root@kvm-47 ~]# virsh shutdown test1
    [root@kvm-47 ~]# virsh start test1
    

    2.连接虚机

    [root@kvm-47 ~]# virsh console test1
    

    按下小写 e

    3.找到下面位置添加命令行

    4.按下Ctrl+X,以单用户模式启动,输入相关命令修改用户密码

    switch_root:/# mount -o remount,rw /sysroot/
    switch_root:/# chroot /sysroot/
    sh-4.2# passwd root
    Changing password for user root.
    New password: 
    BAD PASSWORD: The password is shorter than 8 characters
    Retype new password: 
    passwd: all authentication tokens updated successfully.
    sh-4.2# touch /.autorelabel
    sh-4.2# exit
    exit
    switch_root:/# reboot
    

    然后我们就会发现密码修改生效了

    小结

    以上操作是我亲测并且成功的操作, 因为那边用户名写错了,然后将写错的加密字符串写到/etc/shadow导致系统一直卡在上面那个信息, 但是这个操作我在我自己服务器上测试系统已经是可以起来的,但他的却不行, 因为他们kvm的虚机都是通过ssh连接的, 没有弄console连接,而如果内部虚拟机网卡,网络冲突有问题的话, ssh也是连接不上的,容易混淆是网络问题连接不上还是系统没起来连接不上 所以我们先让他能console连接, console即便虚拟机网络有问题,没网卡,也可以连接进去,

    解决报错3 Centos 7.x版本console登录

    // 查看宿主机,也有相同的IP地址,因为这块网卡的存在,才能使用ssh远程连接到虚拟机
    

    下面操作仅限centos7,网上很多操作都是centos6的, 6和7是不一样的,切记

    // centos7的kvm虚拟机下执行下面操作
    cp /etc/grub2.cfg /tmp
    grubby --update-kernel=ALL --args="console=ttyS0,115200n8"   ----->  使用命令直接插入
    
    // diff比较
    
    
    // reboot
    
    
    // 宿主机使用virsh console  [虚拟机名字]
    
    w
    // ttys0是终端的名字,和配置时候的参数一致,后面内容为频率(串口的频率,交换机的内容)
    
    `上面操作是需要进入到虚拟机里面执行命令,从而达到修改grub2.cfg, 但我们没法进入系统`
    
    `我们可以将其他虚机生成的可以console的配置, 写到系统起不来的那台虚机上`
    
    `通过上面操作的确是可行的, 系统也进去到登录界面,可以排除系统起不来卡在某一个地方导致没IP连接不上, 是因为内部网卡原因.`
    

    解决报错4 -- root: no shell: Permission denied

    /*
    		因为kvm宿主机上的虚机里面的文件权限被莫名修改了,重启系统导致无法读取,缺少权限,一直卡在登录界面.
    		但是他的那个/etc/shadow,/etc/passwd的用户哪一行拿到其他虚机系统也是可以启动并且登录进去的,权限问题概率很大
    		但如何确定是什么文件,看下面
    		
    		报错信息:
    		-- root: no shell: Permission denied
    */
    
    首先确定这个权限拒绝说明很多文件权限都变了

    前面的shell,我们可以去看下虚拟机/bin,/sbin, /usr/sbin等目录下文件是不是权限变了

    确定/bin/bash权限

    这个文件权限是下面这样, 但是正常这个文件是755的,或者不确定这个文件权限是多少,可以和正常启动的系统文件权限做对比

    [root@kvm-47 ~]# virt-ls -l -d test1 /bin/bash
    -rw-r-xr-x. 1 root root 960392 Aug  3  2016 /bin/bash
    
    当确定这个权限被改了, 说不定其他文件也有很多改了,所以可以看一下/bin/*权限
    [root@kvm-47 ~]# virt-ls -l -d test1 /bin/*
    
    确定/usr/bin/bash权限
    [root@kvm-47 ~]# virt-ls -l -d test1 /usr/bin/bash
    -rwxr-xr-x. 1 root root 960392 Aug  3  2016 /usr/bin/bash
    
    可以初步确定我们遇到的登陆报错是因为/bin/bash权限有问题

    copy-in虚机需要关机

    # 我们可以copy宿主机上正常权限的文件copy到虚机上
    [root@kvm-47 ~]# virt-copy-in -d test1 /bin/bash /bin/
    
    重启虚机
    [root@kvm-47 ~]# virsh reboot test1
    [root@kvm-47 ~]# virsh console test1
    Connected to domain test1
    Escape character is ^]
    
    CentOS Linux 7 (Core)
    Kernel 3.10.0-1127.el7.x86_64 on an x86_64
    
    jumpserver login: root
    密码:
    Last login: Fri Nov  6 14:59:25 on ttyS0
    [root@jumpserver ~]#
    
    # 至此,我们系统虽然登录进来了,没有权限拒绝,但为了防止/bin/bash包不兼容系统,我们更新下
    
    [root@jumpserver ~]# yum update bash
    
    # 重启
    [root@jumpserver ~]# reboot
    
    再次尝试登陆
    # 再次连接,能进去,说明这个问题解决成功
    [root@kvm-47 ~]# virsh console test
    error: failed to get domain 'test'
    error: Domain not found: no domain with matching name 'test'
    
    [root@kvm-47 ~]# virsh console test1
    Connected to domain test1
    Escape character is ^]
    
    CentOS Linux 7 (Core)
    Kernel 3.10.0-1127.el7.x86_64 on an x86_64
    [root@jumpserver ~]# 
    
  • 相关阅读:
    NOIP2013 花匠解题报告
    (3) 深入理解SELinux SEAndroid(第三部分
    (2) 深入理解SELinux SEAndroid(第二部分)
    (1) 深入理解SELinux SEAndroid(第一部分)
    SELinux深入理解
    SELinux策略语言--类型强制(编写TE规则)
    Android 6.0中SELinux的TE简介
    8250_fintek
    run "setprop ctrl.start wpa_supplicant" manually
    AOSP Nougat
  • 原文地址:https://www.cnblogs.com/you-men/p/13952924.html
Copyright © 2020-2023  润新知