清除openstack导出的qcow2格式的Windows16镜像的管理员密码
由于公司使用的openstack版本太老,无法使用cloudbase-init传递元数据修改win16镜像的管理员密码,所以琢磨其它办法,搞了一个星期。
原理:使用kpartx挂载镜像,然后使用chntpw清空密码,并修改cloudbase-init配置文件里的重置密码选项。
准备环境
系统:centos7.5 磁盘80G(转换win16镜像由qcow2为raw时,占了40G磁盘)
kvm 相关环境(使用win16镜像跑一个虚拟机测试administrator密码是否清除)
kpartx 及其他软件包(映射raw格式的镜像)
chntpw 修改win16镜像的administrator密码
一、安装kvm相关环境
1.检测是否支持KVM
1 cat /proc/cpuinfo | egrep 'vmx|svm'
2、安装相关软件包
qemu-kvm
主要的KVM程序包python-virtinst
创建虚拟机所需要的命令行工具和程序库virt-manager
GUI虚拟机管理工具virt-top
虚拟机统计命令virt-viewer
GUI连接程序,连接到已配置好的虚拟机libvirt
C语言工具包,提供libvirt服务libvirt-client
为虚拟客户机提供的C语言工具包virt-install
基于libvirt服务的虚拟机创建命令bridge-utils
创建和管理桥接设备的工具
1 yum -y install qemu-kvm libvirt python-virtinst virt-install virt-manager virt-top virt-viewer libvirt-client bridge-utils 2 # 重启宿主机,以便加载 kvm 模块 4 reboot 5 # 查看KVM模块是否被正确加载 6 [root@localhost opt]# lsmod | grep kvm 7 kvm_intel 174841 0 8 kvm 578518 1 kvm_intel 9 irqbypass 13503 1 kvm 11 # 开启kvm服务,并且设置其开机自动启动 12 systemctl start libvirtd 13 systemctl enable libvirtd
二、安装kpartx 及其他软件包
yum install kpartx ntfs-3g libguestfs-winsupport libguestfs-tools libguestfs
三、安装chntpw
wget https://ftp.nluug.nl/pub/os/Linux/distr/pclinuxos/pclinuxos/apt/pclinuxos/64bit/RPMS.x86_64/chntpw-0.99.6-2pclos2017.x86_64.rpm rpm -ivh chntpw-0.99.6-2pclos2017.x86_64.rpm
四、上传win16镜像修改密码
1.上传openstack导出的 ecs-windows2016_std-x64-20231025.qcow2 镜像
1 [root@localhost ~]# ll -lh /opt/
2 -rw-r--r-- 1 root root 7.4G Oct 14 19:05 ecs-windows2016_std-x64-20231025.qcow2
2.把win16镜像由qcow2 转 raw
# kpartx 可以映射 raw 格式镜像,无法映射 qcow2 格式镜像,所以先转换格式
qemu-img convert -f qcow2 -O raw ecs-windows2016_std-x64-20231025.qcow2 ecs-windows2016_std-x64-20231025.raw
# 转换后的raw格式文件相当于把qcow2镜像解压了,占了40G空间,所以虚拟机的磁盘空间要准备大一点 [root@localhost ~]# ll -lh /opt/ -rw-r--r-- 1 root root 7.4G Oct 14 19:05 ecs-windows2016_std-x64-20231025.qcow2 -rw-r--r-- 1 root root 40G Oct 15 00:11 ecs-windows2016_std-x64-20231025.raw
3.映射 win2016镜像
[root@localhost opt]# kpartx -av ecs-windows2016_std-x64-20231025.raw
add map loop1p1 (253:0): 0 1024000 linear /dev/loop1 2048
add map loop1p2 (253:1): 0 82857984 linear /dev/loop1 1026048
4.挂载win16系统的C盘,一般C盘在loop0p2下面
mount /dev/mapper/loop0p2 /mnt/
5.进入C盘,备份win16系统的用户密码文件
[root@localhost opt]# cd /mnt/Windows/System32/config [root@localhost config]# cp SAM SAM.bak
6.清空windows的administrator管理员密码
[root@localhost config]# chntpw SAM chntpw version 0.99.6 110511 , (c) Petter N Hagen Hive <SAM> name (from header): <\SystemRoot\System32\Config\SAM> ROOT KEY at offset: 0x001020 * Subkey indexing type is: 686c <lh> File size 65536 [10000] bytes, containing 8 pages (+ 1 headerpage) Used for data: 329/28096 blocks/bytes, unused: 37/12608 blocks/bytes. * SAM policy limits: Failed logins before lockout is: 5 Minimum password length : 8 Password history count : 8 | RID -|---------- Username ------------| Admin? |- Lock? --| | 01f4 | Administrator | ADMIN | *BLANK* | | 03ea | cloudbase-init | ADMIN | | | 01f7 | DefaultAccount | | dis/lock | | 01f5 | Guest | | dis/lock | ---------------------> SYSKEY CHECK <----------------------- SYSTEM SecureBoot : -1 -> Not Set (not installed, good!) SAM Account\F : 0 -> off SECURITY PolSecretEncryptionKey: -1 -> Not Set (OK if this is NT4) Syskey not installed! RID : 0500 [01f4] Username: Administrator # 确认修改的管理员 fullname: comment : ¡¡:(ݩn7 homedir : User is member of 1 groups: 00000220 = Administrators (which has 2 members) Account bits: 0x0210 = [ ] Disabled | [ ] Homedir req. | [ ] Passwd not req. | [ ] Temp. duplicate | [X] Normal account | [ ] NMS account | [ ] Domain trust ac | [ ] Wks trust act. | [ ] Srv trust act | [X] Pwd don't expir | [ ] Auto lockout | [ ] (unknown 0x08) | [ ] (unknown 0x10) | [ ] (unknown 0x20) | [ ] (unknown 0x40) | Failed login count: 0, while max tries is: 5 Total login count: 88 ** No NT MD4 hash found. This user probably has a BLANK password! ** No LANMAN hash found either. Sorry, cannot change. Try login with no password! - - - - User Edit Menu: 1 - Clear (blank) user password 2 - Edit (set new) user password (careful with this on XP or Vista) 3 - Promote user (make user an administrator) (4 - Unlock and enable user account) [seems unlocked already] q - Quit editing user, back to user select Select: [q] > 1 # 选择1 清空密码 Password cleared! Hives that have changed: # Name 0 <SAM> Write hive files? (y/n) [n] : y # 将修改写入配置文件 0 <SAM> - OK
五.取消cloudbase-init 的重设密码
1.进入clodbase-init配置文件目录
[root@localhost config]# cd /mnt/Program\ Files/Cloudbase\ Solutions/Cloudbase-Init/conf/ [root@localhost conf]# ls cloudbase-init.conf cloudbase-init.conf.bak cloudbase-init-unattend.conf Unattend.xml
2.注释掉cloudbase-init.conf配置文件里的username、groups、inject_user_password三行
[root@localhost conf]# head cloudbase-init.conf [DEFAULT] #username=Administrator #groups=Administrators #inject_user_password=true
重点说明:
inject_user_password 这个配置选项用来在openstack里创建实例时使用cloudbase-init通过元数据设置密码
如果没有使用元数据提供密码,则cloudbase-init会设置一个随机密码,这个随机密码就会覆盖掉上面chntpw工具清空的administrator管理员密码。
所以只用chntpw清空了密码后,在openstack里创建虚拟机后administrator账号登录提示一直密码错误,原来是被cloudbase-init设置了一个随机密码。
这一步卡了3、4天,然后在cloudbase-init官网和一个博客里发现了这个配置的详细说明。
如果没有提供密码就设置一个随机密码
cloudbase-init官方文档链接https://cloudbase-init.readthedocs.io/en/latest/config.html
3. 卸载镜像
umount /mnt/
4.取消映射
kpartx -dv ecs-windows2016_std-x64-20231025.raw
5.raw转qcow2
qemu-img convert -f raw -O qcow2 ecs-windows2016_std-x64-20231025.raw ecs-windows2016_std-x64-20231025_admin_pass.qcow2
转换后的qcow2有17G,需要进行压缩
[root@localhost opt]# ll -lh -rw-r--r-- 1 root root 17G Oct 15 02:18 ecs-windows2016_std-x64-20231025_admin_pass.qcow2 -rw-r--r-- 1 root root 7.4G Oct 14 19:05 ecs-windows2016_std-x64-20231025.qcow2 -rw-r--r-- 1 root root 40G Oct 15 02:02 ecs-windows2016_std-x64-20231025.raw
6.压缩win2016镜像
qemu-img convert -c -O qcow2 ecs-windows2016_std-x64-20231025_admin_pass.qcow2 ecs-windows2016_std-x64-20231025_admin_pass_new.qcow2
压缩后只有7.4G
[root@localhost opt]# ll -lh total 46G -rw-r--r-- 1 root root 7.4G Oct 15 00:24 ecs-windows2016_std-x64-20231025_admin_pass_new.qcow2 -rw-r--r-- 1 root root 17G Oct 15 02:18 ecs-windows2016_std-x64-20231025_admin_pass.qcow2 -rw-r--r-- 1 root root 7.4G Oct 14 19:05 ecs-windows2016_std-x64-20231025.qcow2 -rw-r--r-- 1 root root 40G Oct 15 02:02 ecs-windows2016_std-x64-20231025.raw
六、测试
1.使用kvm创建虚拟机
# 创建windows虚拟机 virt-install --name win16 \ --virt-type kvm \ --ram 8048 \ --import \ --disk path=/opt/ecs-windows2016_std-x64-20231025_admin_pass.qcow2 \ --network bridge=virbr0 \ --graphics vnc,listen=0.0.0.0 \ --noautoconsole
2.使用VNCviewer连接windows测试
3.使用administrator登录win16,如果不需要密码,则成功
4.使用openstack创建虚拟机测试win16镜像运行了cloudbase-init初始化,再使用administrator登录系统,不需要密码则成功
参考文档
CentOS7安装KVM虚拟机详解 handbook (wangchujiang.com)
OpenStack 镜像修改密码_windows raw 重置密码-CSDN博客