本帖最后由 xxkknn 于 2021-1-18 21:26 编辑
【2020-07-07更新】加入几个针对Windows自动化部署的脚本参考,以及正文加入一个比喻方便理解 【2020-07-07晚再更新】发现部分脚本代码不齐,现在补上了 【2021-01-18更新】补全了被吞的符号+疏漏的内容,修改了一些谬误 我最初对这种技术毫无兴趣,直到某次出差去到某场地部署50台服务器,全百兆内网环境,传统PXE完全玩不转,光是装系统和软件就折腾了整个白天,完事人像一滩淤泥一样,非常人性化; 回来以后痛腚思痛,四处寻求解决办法,最终在本论坛大佬@ 江南一根葱 的启发下,找到了适合自己的解决方案:即—— 利用BitTorrent协议进行P2P同传,借此达到去中心化,消除系统部署时对PXE服务器带宽性能的高度依赖,怎么做到的呢? 首先BT协议需要[文件发布者]根据[要发布的文件]生成一个[种子],下载时客户端根据种子里提供的信息向tracker服务器发送请求,tracker服务器会管理并且分发各个客户端的下载信息,让客户端之间可以相互了解各自的下载详情,并且互相分享各自下载好的部分,充分利用局域网中每一个客户端的带宽;初次分发某个文件时需要服务端做种,等BT服务端的分享率达到1.0+之后,服务端就可以停止做种让其它客户端之间自行传输,这样腾出带宽可以给PXE服务使用; 需要注意一点,P2P传输几乎能跑满所有参与的端口带宽,网络设备可靠性不佳的话慎用 打个比方:将批量下载的行为比作老师分发试卷,传统的Server to client下载就像是老师一个人挨个往下发或者集体上来领,不管需求有多大,一个人一双手能承担的量终究有限,就像服务器的宽带一样; 而P2P式的传输就像老师把试卷全部交给学生,由学生自行扩散传递,充分利用每一双手的同时,老师也可以腾出时间去做其它工作;而且与试卷不同的是,只要不停止做种,数据就可以不断重复地向不同的客户端分享,传输效率极高; 否则的话,以单服务器百兆网12.5MB/S的速率,7G左右的系统+软件包每个客户端就需要传输10分钟左右,仅仅50台机器就要耗费近9个小时,这样的效率实在是太低了;而且即便是千兆环境下,机器多的时候也很容易陷入服务器网络带宽的瓶颈;借用此方案能很大程度改善这个问题,而且实施起来也不难; 接下来进入正篇 需要的工具 以上两者可以用其它同类工具代替,剩下的工具请自行查找;建议搭配HFS使用。 运作过程:客户端PXE网启至PE之后运行批处理,在批处理中利用diskpart分区之后调用Aria2c.exe下载镜像,下载完成之后调用CGI或者imagex、ghost应用镜像 搭建过程:制作torrent种子文件,搭建并启用tracker服务,做种,在PE中放入aria2c、bat脚本并将脚本加入自启动;其实说起来复杂做起来简单,看下面几张截图就明白了 打开选项 注意:图片中有错误,不要勾选“超级做种”,改用其它同类软件时也不要启用相似选项,此选项是为了延长客户端在线时间保持健康度的,勾选此项后会降低客户端下载速度
调用Aria2的bat代码参考 C:\aria2\aria2c.exe C:\种子.torrent--seed-ratio=0 --force-save=true --dir=C:\ 主程序 种子路径 参数 Aria2C常用参数: - --seed-time 做种的持续时间(分钟),为0即不做种,下载完成即执行下一行
- --seed-ratio 分享率,为1则上传量达到100%后停止做种,0则一直做种,在批处理中做种会阻塞执行,在完成之前不会执行下一行代码
- --force-save 保存会话,即便在下载完成后也不删除会话文件,再次启动任务时就不会重新下载而直接进入做种阶段
- --dir 指定保存目录
其它参数可以参考之前提供的官方网站
自行编写批处理时,推荐调用带会话的下载,在下载完成后,再以非阻塞方式调用一次带会话的下载,此时由于会话中保存了已下载完成的信息,本次调用会直接进行上传做种,这样可保证其它客户端的下载速度的同时不阻塞脚本后续的操作;具体可参考7-7更新的批处理PEdownload.bat
补充一点点,现在唯一的缺憾就是PXE阶段不能P2P了,如果连带这块也实现了的话 才算圆满解决差网络环境下的批量部署问题,如果有人知道怎样实现或者有方向的话,希望可以帮忙分享一下或者指个路,感激不尽
【7-7更新部分批处理参考】
PE中调用
- @echo off
- mode con cols=45 lines=10
- cls&&echo 正在查找默认DHCP服务器...
- ping 127.0 -n 6 >nul
- :re
- ping 127.0 -n 3 >nul
- for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|findstr /ic:"DHCP 服务器"') do set ipgate=%%a
- if not defined ipgate goto:re
- set "ipgate=%ipgate: =%"
- echo 默认DHCP服务器:[%ipgate%]
- ::download
- X:\aria2\aria2c.exe "http://%ipgate%/Files/PEdownload.bat" --dir=X:\
- call X:\PEdownload.bat
- exit
复制代码 PEdownload.bat
- ::下载并应用分区脚本
- X:\aria2\aria2c.exe "http://%ipgate%/Files/diskpartMbr.txt" --dir=X:\
- diskpart /s X:\diskpartMbr.txt >NUL 2>NUL
- :re
- ping 127.0.1 -n 3 >nul
- if not exist "C:" (goto:re)
- md C:\Aria2\ && md C:\Windows\
- copy X:\Aria2\aria2c.exe C:\Aria2\
- ::下载种子
- C:\aria2\aria2c.exe "http://%ipgate%/Files/PEFiles.torrent" --dir=C:\ --follow-torrent=false
- ::下载安装系统配置文件
- C:\aria2\aria2c.exe "http://%ipgate%/Files/ISOinstall.ini" --dir=X:\CGI\
- ::下载完成执行下一行
- C:\aria2\aria2c.exe C:\PEFiles.torrent --seed-time=0 --force-save=true --dir=C:\
- ::有选择地下载种子内的文件
- ::C:\aria2\aria2c.exe --select-file=1,2-7 C:\PEFiles.torrent --seed-time=0 --force-save=true --dir=C:\
- ::开始持续做种
- start /min "Seedling" "C:\aria2\aria2c.exe" C:\PEFiles.torrent --seed-ratio=0 --force-save=true --dir=C:\
- echo start /min "Seedling" "C:\aria2\aria2c.exe" C:\PEFiles.torrent --seed-ratio=0 --force-save=true --dir=C:\ > C:\Seedling.bat
- ::安装系统
- X:\CGI\CGI-PLUS.exe X:\CGI\ISOinstall.ini
- ::全部安装完成,检测到断网则自动重启以进入Windows,即可以通过拔掉网线&停用网络设备批量控制机器重启
- :start
- color 27
- echo 正在监测网络状态...
- ping -n 4 %ipgate% | findstr /i "TTL" >NUL 2>NUL && goto start
- color 47
- echo 网络中断
- ping -n 4 %ipgate% | findstr /i "TTL" >NUL 2>NUL && goto start
- echo 网络持续中断,准备重启
- ping -n 3 %ipgate% | findstr /i "TTL" >NUL 2>NUL && goto start
- shutdown -r -t 5
- PECMD shut -r
- echo 5秒内重启! 取消请按任意键!
- pause>nul
- shutdown /a
- exit
复制代码 diskpartMBR.txt(慎用!会清空磁盘,数据丢失概不负责)
- select disk 0
- clean
- convert mbr
- create partition primary
- format quick fs=ntfs label="Windows"
- assign letter="C"
- active
- timeout /t 1
- exit
复制代码 ISOinstall.ini(CGI无人值守配置文件,详细用法参考5大原压缩包内的PDF文档)
- [operation]
- action = restore
- silent = 1
- [source]
- C:\Files\10ltsb2016x64lite.iso|\sources\INSTALL.WIM|1
- [destination]
- DriveLetter=system
- [miscellaneous]
- format = 0
- fixboot=auto
- shutdown=0
复制代码
以上批处理请根据所在环境情况自行改动;另外脚本需要findstr,部分PE可能已精简掉,故在附件中额外提供findstr.exe,放入System32即可
|