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,沒想到用戶名,也跟着別人寫了,下面是那邊項目當初生成密碼串參考的文檔截圖

2

`建議: 參考網上文檔, 如果是你不能肯定成功的操作, 建議先在測試環境或者自己虛擬機,雲服務器上做一下看看, 能成功再去生產環境操作`
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 ~]#