windows7操作系统在公有云和私有云中都是用户比较常用的操作系统,但目前第三方win7的Openstack镜像不是很多,Cloudbase提供Windows Server 2012r2镜像下载,创建自定义的win7镜像已成为必做的功课。下面介绍在CentOS系统下基于qemu和vrit-manager制作win7镜像。
Openstack Windows系列镜像下载传送门:《 Openstack Windows系列镜像分享【附下载链接】》
一、镜像及工具准备
Windows 7安装光盘镜像:ed2k://|file|cn_windows_7_ultimate_x64_dvd_x15-66043.iso|3341268992|7DD7FA757CE6D2DB78B6901F81A6907A|/
VirtIO驱动镜像:virtio-win-0.1-94.iso http://pan.baidu.com/s/1pKL6btp PW:pxth
Activate链接:http://pan.baidu.com/s/1qYyJADe PW:5vj4
Cloudbase-Init:https://cloudbase.it/downloads/CloudbaseInitSetup_Stable_x64.msi
说明:VirtIO驱动版本已经更新,windows最新版本是0.1.133,但与当前window7 64位操作系统不兼容,只有0.1-94这个版本兼容、破解工具也是如此,普通的Oem7F7.exe无法完成破解。
二、镜像制作
1、镜像操作系统安装
(1)、CentOS操作系统中需要安装virt-manager等工具
1 |
yum install virt-manager qemu-imag qemu-kvm |
(2)、创建20G的镜像文件
1 |
qemu-img create -f qcow2 windows7.qcow2 20G |
(3)、执行virt-install设置镜像配置,网卡、磁盘需要设置成virtio类型
1 2 3 4 5 6 7 |
# virt-install --connect qemu:///system \ --name windows7.qcow2 --ram 2048 --vcpus 2 \ --network network=default,model=virtio \ --disk path=/root/image/windows7.qcow2,format=qcow2,device=disk,bus=virtio \ --cdrom /root/image/cn_windows_7_ultimate_x64_dvd_x15-66043.iso \ --disk path=/root/image/virtio-win-0.1-94.iso,device=cdrom \ --vnc --os-type windows --os-variant win7 |
此时会弹出virt-viewer,但虚拟机没有进入安装程序,并提步中示“No bootable device”错误,这是因为没有指定光盘启动的原因,按Ctrl+C结束当前进程,下面从第4步中会从virt-manager中简单配置。
(4)、利用virt-manager图形化工具进行定制
1 |
# virt-manager |
弹出virt-manager管理界面,如下
双击winds7.qcow2的KVM虚拟机,弹出virt-viewer,还是提示错误,点击设置按钮,如下
图形化显示我们virt-install的配置项,为使接下来配置生效,此时需要关机操作,点击Virtual Machine–>Shut Down–>Force Off。
设置Boot Options从window7的安装光盘启动,
重新开机,进入熟悉的win7安装操作系统界面
傻瓜式操作下一步,安装操作系统,同意许可,自定义安装,直到出现找不到的安装位置界面,如下:
因为没有加载硬件驱动,系统无法识别硬盘,故找不到安装位置,这时需要安装VirtIO的驱动,选择加载驱动程序,如下
选择64位的硬盘驱动Red Hat VirtIO SCSI controller驱动,安装即可,之后就会出现安装位置。
后面操作系统安装和实际安装一样,安装完成后,会自动重启,设置账户及密码,进入桌面系统。此时,虚拟机还需要安装网卡等驱动,在设备管理器中更新驱动程序,选择VirtIO驱动位置更新即可。
2、镜像配置
(1)破解
然后开始利用破解工具破解即可,破解工具可以通过FTP或HTTP下载到虚拟机,也可以通过加载光盘方式,下面介绍光盘加载文件方式,将所有文件拷贝到目录tools,将tools做成ISO镜像,
1 |
# mkisofs -o tools.iso tools/ |
虚拟机关机,在virt-manager中弹出VirtIO驱动,加载上tools.iso即可,重新开机,安装软件即可。
破解完成后需要进行镜像配置,配置工作主要有:
(2)、允许远程桌面访问
设置防火墙,设置入站规则,打开TCP3389端口,或直接关闭防火墙。
(3)、允许ICMP
不然无法ping通该虚拟机设置的浮动IP。
(4)、安装cloudbase-init
Cloudbase-Init 是类似 Cloud-Init 可以用于Windows的云初始化程序,支持OpenStack、Amazon EC2、OpenNebula和Ubuntu MAAS等多种云平台,同样也支持多个window操作系统镜像。在Openstack虚拟机镜像中安装Cloudbase-Init,能够从OpenStack元数据服务(http://169.254.169.254)中获取信息,进而能够设置主机名、初始化密码、配置网络、配置SSH、磁盘扩展(根据云主机的flavor的磁盘大小动态扩展虚拟机磁盘大小)和执行配置脚本(PowerShell脚本)等等。
以下为安装过程,
安装到在这里时会产生有默认的管理员用户Admin,如果不存在该用户,Cloudbase-Init会在初始化阶段自动创建(临时帐号也可以被删除),并基于该用户进行配置管理,如果在上面安装操作系统时,创建了Admin用户,这用户的密码会被更改,所以这里的Username最好是跟系统默认管理员帐号不同(但帐号不同创建虚拟机时会自动创建Admin帐号,如果选择相同账户不想重新安装Cloudbase-Init ,并且还希望新建虚拟机拥有固定的密码,请看“Cloudbase-init禁用修改密码配置”的配置)。
3、Cloudbase-init禁用密码修改
如果安装操作系统时创建默认管理员账户(比如名称为Cloud)与安装Cloudbase-Init 时Username账户(比如为Admin)不同,基于该镜像创建虚拟机会在配置完成后自动创建一个用于Cloudbase-init配置的管理员账户Admin,用户还不知道这个账户的登录密码,真让人感觉莫名其妙,如下图:
另外,如果安装操作系统时创建默认管理员账户是Admin,并且安装Cloudbase-Init 时Username也选择了Admin,安装Cloudbase-Init后,后面基于该win7镜像初始化虚拟机时就会出现管理员Admin密码(镜像安装操作系统)被修改的情况,虽然每次可以通过“nova get-password 实例名称 密钥文件”找回密码,但实际上不是很方便,会出现用户不知道密码而无法登录虚拟机的现象。
下面提供两种方式取消修改密码的功能。
a)方法一: 修改Cloudbase-Init的配置文件
在镜像中,找到Cloudbase-Init的配置文件目录:C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf,修改cloudbase-init.conf和cloudbase-init-unattend.conf,删除username、groups、inject_user_password配置项,并在首行插入plugins配置项,内容如下:
1 |
plugins=cloudbaseinit.plugins.common.mtu.MTUPlugin,cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin, cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin, cloudbaseinit.plugins.common.sshpublickeys.SetUserSSHPublicKeysPlugin, cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin, cloudbaseinit.plugins.common.userdata.UserDataPlugin |
配置文件截图如下:
b) 方法二:修改Python源码
插件为Python编写,在C:\program files\cloudbase solutions\cloudbase-init\python\lib\site-packages\cloudbaseinit\plugins\common\setuserpassword.py中,注释掉修改修改密码的相应代码即可,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
def _set_password(self, service, osutils, user_name, shared_data): if service.can_update_password and not service.is_password_changed(): LOG.info('Updating password is not required.') return None password, injected = self._get_password(service, shared_data) if not password: return None # LOG.debug('Generating a random user password') # maximum_length = osutils.get_maximum_password_length() # password = osutils.generate_random_password( # maximum_length) osutils.set_user_password(user_name, password) # self._change_logon_behaviour(user_name, password_injected=injected) return password |
保存文件。
Cloudbase-init完成配置后,需要重启机器进行系统配置,如下:
配置,完成后关机,镜像制作完毕。
4、备注
(1)、强烈建议安装Cloudbase-Init,并且系统默认账户与Cloudbase-Init 的配置账户相同(统一成Admin管理员),为避免管理员用户密码被修改,建议采用修改Cloud-init的配置文件的方法(源码修改时py换行格式容易出错)。磁盘自动扩展真的非常棒,重新调整虚拟机大小时磁盘自动扩容依然有效!
(2)、cloudbase-init的配置只在首次安装并重启生效,卸载后重新安装,并更改配置不会生效(貌似没有再次进行系统配置)。
三、验证操作
可以压缩虚拟机镜像磁盘:
1 |
# qemu-img convert -c -p -O qcow2 win7.qcow2 win7-zip.qcow2 |
其中,-c表示使用压缩,-p表示执行过程中显示进度,-O指定输出格式
转换成raw格式,创建openstack镜像。
1 2 |
# qemu-img convert -f qcow2 -O raw windows7.qcow2 windows7.raw # openstack image create win7.raw --file windows7.raw --disk-format raw --container-format bare --public |
然后可以基于该镜像创建虚拟机了。
四、参考文档
https://docs.openstack.org/image-guide/windows-image.html
http://foolishfish.blog.51cto.com/3822001/1618447
http://120.92.9.196:8080/manual_kec_v16151320161205164206/_book/firewallsetting.html
http://yunlzheng.github.io/2015/02/10/openstack-create-windows-images/
code
more code
~~~~