很多人抱怨我不玩Windows,好吧,最近被特殊用户逼的不行了,所以玩了两天Windows。
这个主题在网络上还是能找到一些参考资料的,有些洋鬼子甚至写了完整的教程。我也是受到这个教程的启发才做出来自己的这一套玩意的。所有这个主题的教程都详细无比,当然中文的少。因为这套玩意涉及的基础知识确实太多,所以,这里就只讲原理了。
洋鬼子的一个教程如下
标题:Install Windows 7 over PXE from Linux without WAIK
地址:http://www.ultimatedeployment.org/win7pxelinux1.html
先说洋鬼子教程的好处,很系统,很完整. 缺点就一个,照着做是不工作的,这也不能怪他,他是在为他的UDA系统做广告。所以要想他的教程工作他的UDA系统是必不可少的。不过他这广告太实在的,所以琢磨琢磨自己也就都搞出来的。这家伙主要是想炫耀不用WAIK的,不过我觉得吧,WAIK这玩意官方免费,为啥不用?
目标定位:
我有一台Linux服务器,我想让连接在与这台Linux一个局域网里面的机器可以通过网络启动的方式安装Windows 7,并且还想让这些机器在安装之后,能够自行激活。
基本要素的分析:
安装过程需要局域网里面那些要Win7的机器能够从网络启动,这个事情难度不大,启动之后,他们得能从正确的地方启动Win7的安装程序。安装完成以后,当这些机器上网的时候,要自动激活,这个最佳选项基本是用KMS,就是180天的那种,反正是连在内网的机器,180天重新激活,只要不去烦用户,那又有什么关系。
安装的基本原理:
首先是服务器上各种服务的部署:
1. 为了让Windows能从网络安装,特别是Win7,要知道Win7是可以从一个UNC位置来运行安装程序的哦。啥叫UNC?就是你玩文件共享那个功能的时候看到的那些 \\XXXXX\YYYYY 样子的地址,Win7可以允许你把安装的源文件放在这种地方,然后直接执行 \\XXXX\YYYY\Setup.exe 来启动安装程序。因为这个特性的存在,所以,我只要在Linux服务器上装一个Samba,然后利用Samba提供文件共享,把整个Win7安装盘的内容共享出来就好了。貌似要解压ISO?不用,那个ISO在Linux上,可以直接用mount –o loop 的方式挂载的。所以只要共享ISO挂载点就可以了。
2. 然后是,怎么从网络启动,这事叫PXE启动,一个古老到比大多数目前的本科毕业生年纪还大的协议。所谓PXE启动,就是Intel提供了一个PXE Rom,做网卡的厂商就纷纷跟进,这样选择网络启动的时候,就可以和PXE服务器进行通信,来得到启动所需的程序了,当年大批的无盘工作站就是这么玩的。所谓PXE服务器,实际上一般来说是一个 DNS+DHCP+TFTP 的服务器。PXE Rom通过DHCP先获取IP地址,和启动服务器的地址,然后用TFTP的方法从启动服务器获取一个引导程序,这个引导程序的地位实际相当于本地启动的时候的引导扇区或者类似的什么东东。这个引导程序被执行后,就会继续用TFTP方法从PXE服务器装入更多的模块来执行,最终引导完整的操作系统。在这里,我用Linux里面的一个程序,就可以提供DNS+DHCP+TFTP了,就是dnsmasq这个玩意。至于怎么配置dnsmasq,那是很长的话题,网上大量的教程,以及超级详尽的manpage,自己去看就好了。
3. 有了DNS+DHCP+TFTP之后,我还需要PXE的那些引导程序,我用PXELINUX来实现,这是著名的SYSLINUX的变种,仍然是超级详细的wiki和manpange,自己去看细节。
4. 但是PXELinux并不能解决引导Windows的问题,它提供的是一个引导选择菜单,引导Windows安装环境的是以下两个程序之一:pxeboot.com, wdsnbp.com. 所以,我得把pxelinux的引导,传递到Windows的引导程序上。这个就需要配置PXELinux来实现。到这里为止,所有Linux阶段的问题就都解决了。特别提醒的是,Linux文件名区分大小写,而Windows不区分,而pxeboot和wdsnbp的行为略有差别,Linux上得做一些符号链接,来满足Windows程序大小写不分的问题的。具体的可以通过查看tftp的log来搞明白。
Windows安装环境是如何启动的:
基本的工具是WAIK,这玩意可以在M的网站上免费下载。
M对于这个事情,特别是PXE环境下的启动流程有官方说明。我采用的是:
引导程序pxeboot.com,下载bootmgr.exe,下载BCD数据,下载SDI数据,装入安装环境的系统镜像,启动WindowsPE的流程。这个流程在WAIK的官方文档:《Windows 自动安装工具包 (Windows AIK) 用户指南》有详细解释,并且针对启动到WinPE的过程,有一个文章《操作实例:使用 PXE 部署映像》,只要照着做,就好了。
至此,如果你对部署dnsmasq,使用pxelinux,以及生成winpe镜像都有了解,应该能够从网络启动到一个WinPE的CMD窗口了。这就已经可以尝试使用前面部署好的samba共享的Win7镜像来用UNC启动Setup了。如果测试成功,那么就该进行下面的部分,改WinPE镜像,实现自动启动。
如果你愿意,当然可以把UNC写死在WinPE镜像里。不过,我用了更灵活的办法来玩这个游戏。这里有一个有趣的技巧,就是Windows引导时的BCD数据库中的LoadOptionsString这个东东的值,会在引导成功之后,在注册表的
HKLM\System\CurrentControlSet\Control\SystemStartOptions 这个键值里面被读到,当然这个键里面还有其他的内容,不过这已经可以用Windows的命令行工具 REG 和文本处理的FIND工具来进行分析和处理了。所以我并不把UNC写死在WinPE镜像里,而是写死在BCD数据里面,而WinPE镜像里面则读取相应的键值来确定从哪个UNC来读取安装程序。至于WinPE镜像里面怎么读取注册表键值,怎么启动安装程序,可以参考那个洋鬼子教程里面那个不工作的CMD文件。以及M$官方关于winpeshl.exe这个程序的处理流程的说明:这个程序先找sources里的setup.exe,然后处理winpeshl.ini的内容,如果winpeshl.ini不存在的话,那么处理startnet.cmd,并最终启动cmd.exe。
所以,我只要正确的编写一个批处理,读取注册表内容,解析,并按照解析出来的UNC执行setup,就可以了。当然,得自己写个winpeshl.ini来启动这个批处理,以及别忘了预先执行下wpeinit.exe 来启动网络。
这跟写死winpe镜像有啥区别?
这样就可以用一个winpe镜像引导,然后通过修改BCD数据,让引导后的winpe镜像执行不同的安装源上的安装镜像了。例如你有Pro和Ent两个版本的Win7,可以在BCD里面设定数据,显示一个菜单,让用户自己选择安装那个版本,而不用为每一个安装版本都生成一个winpe镜像。
最后说激活,我用的是vlmcsd,效果不错。至于怎么设定,还是,超级详细的manpage。
至于如果你E文看不懂之类的问题,呵呵,那你还是自己找其他办法吧,我这办法不适和你。