文章目录
前言
有的时候需要在VPS上使用WINDOWS系统,但是商家没有提供内置模板,这个时候就需要自己手动安装一个Windows系统了。注意,大部分商家都是不允许你安装Windows的,如果违反TOS,可能会导致服务器被封。
准备工作
确认VPS:
宿主机提供的VNC
能够随意更换内核
GURB引导启动
通常来说,KVM虚拟化的VPS可以,OVZ虚拟化的VPS不可以。
确认相关工具:
下载一个Windows的原版镜像:msdn.itellyou.cn
下载VirtIO驱动:VirtIO
DISM++:chuyu.me
GUNZIP:gunzip,解压文件,将bin
目录中的文件放置%WINDIR%/SYSTEM32
文件夹中,即可方便在命令提示符中使用。
制作镜像
1.提取install.wim文件:解压或挂载都行,提取该文件到E:\install.wim
。
2.创建一个vhd虚拟磁盘:
示例:盘符为’V‘,路径为’D:\win.vhd‘,大小为5120M.
以管理员身份打开命令提示符,然后输入: diskpart CREATE VDISK FILE=”D:\win.vhd” TYPE=FIXED MAXIMUM=5120 SELECT VDISK FILE=”D:\win.vhd” ATTACH VDISK CLEAN CREATE PARTITION PRIMARY FORMAT FS=NTFS QUICK ASSIGN LETTER=V
3.在D盘创建一个文件夹’D:\MOUNT‘,打开DISM++
点文件–>挂载映像–>点第一个浏览,找到’E:\install.wim‘–>点第二个浏览,找到’D:\MOUNT‘–>不选中只读模式–>确定
4.在DISM++里进行优化,安装语言包,添加VirtIO驱动等操作,一般只需要Balloon
,NetKVM
,viostor
三个驱动即可。
5.完成后,点文件–>另存为映像–>保存在’D:\install.wim‘,等待任务完成
6.点文件–>释放映像–>点第一个浏览,找到’D:\install.wim‘–>点第二个浏览,找到’V:\‘–>只选中添加引导和格式化–>确定–>在弹出的’引导修复-BIOS’对话框中点击更多–>找到盘符为V的磁盘分区–>确定
7.等待完成,在资源管理器中,在盘符为V的磁盘分区点击右键–>弹出
8.使用gunzip工具压缩打包压缩’D:\win.vhd‘
用法:gzip.exe -k9 D:\win.vhd.等待压缩完成
实际上刚刚得到的’D:\win.vhd‘就是一个可直接dd的文件
9.上传到可用HTTP直接下载的地方,最好不要包含跳转
VPS
更新grub
1.下载 Debian netboot mini.iso 到/boot
文件夹内
wget -qO /boot/mini.iso https://moeclub.org/get-deb-livecd
2.在/boot文件夹的子目录内寻找GRUB配置文件
如果GRUB的配置文件为grub.cfg
:
在文件的末尾添加
menuentry "Boot mini" { set isoimage="/boot/mini.iso" loopback loop (hd0,1)$isoimage linux (loop)/linux auto=true LANG=en_US.UTF-8 KEYTABLE=us netcfg/dhcp_options="Configure network manually" netcfg/dhcp_failed=note netcfg/get_nameservers=8.8.8.8 hostname=MoeClub domain=MoeClub.org -- quiet initrd (loop)/initrd.gz }
如果不好添加,就直接用echo的方式,简单暴力:
echo -ne 'menuentry "Boot mini" {\n\tset isoimage="/boot/mini.iso"\n\tloopback loop (hd0,1)$isoimage\n\tlinux (loop)/linux auto=true LANG=en_US.UTF-8 KEYTABLE=us netcfg/dhcp_options="Configure network manually" netcfg/dhcp_failed=note netcfg/get_nameservers=8.8.8.8 hostname=MoeClub domain=MoeClub.org -- quiet\n\tinitrd (loop)/initrd.gz\n\t}\n\n' >>/boot/grub/grub.cfg
如果GRUB的配置文件为grub.conf
:
#自行修改对应的部分.
3.获取本机的IP,子网掩码,网关并记录下来.
一般控制台最下面有这些参数.
如果没办法获取到这三项参数,可以用以下命令获取.
代码片段摘自 Debian(Ubuntu)网络安装/重装一键脚本
DEFAULTNET="$(ip route show |grep -o 'default via [0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.*' |head -n1 |sed 's/proto.*\|onlink.*//g' |awk '{print $NF}')" [ -n "$DEFAULTNET" ] && IPSUB="$(ip addr |grep ''${DEFAULTNET}'' |grep 'global' |grep 'brd' |head -n1 |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}/[0-9]\{1,2\}')" IPv4="$(echo -n "$IPSUB" |cut -d'/' -f1)" NETSUB="$(echo -n "$IPSUB" |grep -o '/[0-9]\{1,2\}')" GATE="$(ip route show |grep -o 'default via [0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' |head -n1 |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}')" [ -n "$NETSUB" ] && MASK="$(echo -n '128.0.0.0/1,192.0.0.0/2,224.0.0.0/3,240.0.0.0/4,248.0.0.0/5,252.0.0.0/6,254.0.0.0/7,255.0.0.0/8,255.128.0.0/9,255.192.0.0/10,255.224.0.0/11,255.240.0.0/12,255.248.0.0/13,255.252.0.0/14,255.254.0.0/15,255.255.0.0/16,255.255.128.0/17,255.255.192.0/18,255.255.224.0/19,255.255.240.0/20,255.255.248.0/21,255.255.252.0/22,255.255.254.0/23,255.255.255.0/24,255.255.255.128/25,255.255.255.192/26,255.255.255.224/27,255.255.255.240/28,255.255.255.248/29,255.255.255.252/30,255.255.255.254/31,255.255.255.255/32' |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}'${NETSUB}'' |cut -d'/' -f1)" [ -n "$GATE" ] && [ -n "$MASK" ] && [ -n "$IPv4" ] || { ipNum() { local IFS='.' read ip1 ip2 ip3 ip4 <<<"$1" echo $((ip1*(1<<24)+ip2*(1<<16)+ip3*(1<<8)+ip4)) } SelectMax(){ ii=0 for IPITEM in `route -n |awk -v OUT=$1 '{print $OUT}' |grep '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}'` do NumTMP="$(ipNum $IPITEM)" eval "arrayNum[$ii]='$NumTMP,$IPITEM'" ii=$[$ii+1] done echo ${arrayNum[@]} |sed 's/\s/\n/g' |sort -n -k 1 -t ',' |tail -n1 |cut -d',' -f2 } [[ -z $IPv4 ]] && IPv4="$(ifconfig |grep 'Bcast' |head -n1 |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' |head -n1)" [[ -z $GATE ]] && GATE="$(SelectMax 2)" [[ -z $MASK ]] && MASK="$(SelectMax 3)" } PubIPv4="$(wget -qO- checkip.amazonaws.com)" [ -n "$IPv4" ] && [ -n "$PubIPv4" ] && { [ "$IPv4" != "$PubIPv4" ] && IPv4="$(echo "$IPv4; $PubIPv4")" } [ -n "$GATE" ] && [ -n "$MASK" ] && [ -n "$IPv4" ] && { echo -e "IPv4:\t3[33m$IPv43[0m\nMASK:\t3[33m$MASK3[0m\nGATE:\t3[33m$GATE3[0m" } || { echo "Error! Not found network config. " }
4.进入VNC界面,然后在SSH终端输入重启命令.
在VNC界面中可以看到启动菜单,选择Boot mini
安装WINDOWS镜像
此时进入Debian的安装界面,注意对话框顶部.
如果出现的是
Download debconf preconfiguration file
请按两次ESC键,选择倒数第二个:
Execute a shell
选中Continue
,并按回车
如果出现的是
Configure the network
请按要求填入网络参数,等待出现
Download debconf preconfiguration file
按两次ESC键,选择倒数第二个:
Execute a shell
选中Continue
,并按回车
使用ls /dev
命令可查看硬盘状况
接下使用dd
命令进行应用镜像,也可以使用自己的镜像.
wget -qO- https://moeclub.org/get-win7embx86 |gunzip -dc |dd of=/dev/vda
待完成后,输入reboot
命令
就可看到久违的WINDOWS启动界面.按照正常步骤安装
安装完成后,如果没有网络,你需要自行完善网络配置
远程桌面服务如果没有意外,我提供的镜像会自动打开
提示:在安装步骤时鼠标位置不好找,可能不太适应
请尝试使用空格键回车键Tab键方向键进行操作
在磁盘管理中,点击’C‘盘,右键选择’扩展卷‘,可以直接’增加‘C盘的空间
后记:
你可以在装有Hyper-V的机器上,挂载这个vhd镜像,然后完成安装步骤,优化
再进行压缩vhd镜像,然后dd安装.可能效果更佳
文章只是提供一个思路,和实现的例子.更多期待你们去尝试
补充:
按照上文制作的DD包,仅仅是能够开机,但是如果你的VNC不够给力的话,你甚至无法登录进入系统(需要发送ctrl+alt+del解锁)
在Windows上关闭Ctrl+Alt+Del登陆
相关注册表项应该有如下几项(没有该键值就新建):
RegKey=”HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System“ Value=”DisableCAD“ Type=”REG_DWORD“ Data=”1”
值为 1 是关闭
值为 0 是打开
注册表开启远程桌面服务和3389端口
最近在做DD镜像,需要强制开启远程桌面服务(mstsc.exe)和3389端口.
详细注册表项如下:
打开远程桌面服务. RegKey=”HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server“ Value=”fDenyTSConnections“ Type=”REG_DWORD“ Data=”0” 设置远程桌面端口(16进制值表示d3d:3389). RegKey=”HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp“ Value=”PortNumber“ Type=”REG_DWORD“ Data=”d3d“ RegKey=”HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp“ Value=”PortNumber“ Type=”REG_DWORD“ Data=”d3d” 不验证用户级别. RegKey=”HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp“ Value=”UserAuthentication“ Type=”REG_DWORD“ Data=”0” 新建防火墙规则:打开3389端口. RegKey=”HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules“ Value=”{33893389-3389-3389-3389-338933893389}“ Type=”REG_SZ“ Data=”v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|LPort=3389|Name=3389|”
这样就可以通过批处理方式或者注册表文件方式开启远程桌面服务(mstsc.exe).
Windows通过注册表禁用或开启服务项
在Windows操作系统中,服务项一般在以下注册表项中:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
在注册表中禁用Windows Update服务为例:
我们都知道Windows Update的服务名称为wuauserv.
定位到注册表项:
RegKey=”HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv“ Value=”Start“ Type=”REG_DWORD“ Data=”4″ 将”Start“的值改为4,就表示禁用这项服务.
数字意义说明:
1=自动(延迟启动)
2=自动
3=手动
4=禁用
[ Windows ] 通过修改注册表禁用UAC提示
禁用UAC
定位到注册表项:
RegKey=”HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System“ Value=”ConsentPromptBehaviorAdmin“ Type=”REG_DWORD“ Data=”0″ Value=”EnableLUA“ Type=”REG_DWORD“ Data=”0″ Value=”PromptOnSecureDesktop“ Type=”REG_DWORD“ Data=”0″
开启UAC
RegKey=”HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System“ Value=”ConsentPromptBehaviorAdmin“ Type=”REG_DWORD“ Data=”5″ Value=”EnableLUA“ Type=”REG_DWORD“ Data=”1″ Value=”PromptOnSecureDesktop“ Type=”REG_DWORD“ Data=”1″
[ Windows ] unattend.xml 自动应答文件示例
自动应答文件存放路径:%WINDIR%/Panther/unattemd.xml
<?xml version="1.0" encoding="utf-8"?> <unattend xmlns="urn:schemas-microsoft-com:unattend"> <settings pass="oobeSystem"> <component name="Microsoft-Windows-International-Core" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <InputLocale>007f:00000804</InputLocale> <SystemLocale>zh-CN</SystemLocale> <UILanguage>zh-CN</UILanguage> <UILanguageFallback>zh-CN</UILanguageFallback> <UserLocale>zh-CN</UserLocale> </component> <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <TimeZone>China Standard Time</TimeZone> <AutoLogon> <Enabled>true</Enabled> <LogonCount>9999999</LogonCount> <Username>Administrator</Username> <Password> <PlainText>false</PlainText> <Value>VgBpAGMAZQByAFAAYQBzAHMAdwBvAHIAZAA=</Value> </Password> </AutoLogon> <OOBE> <HideEULAPage>true</HideEULAPage> <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> <NetworkLocation>Work</NetworkLocation> <ProtectYourPC>3</ProtectYourPC> <SkipMachineOOBE>true</SkipMachineOOBE> <SkipUserOOBE>true</SkipUserOOBE> </OOBE> <UserAccounts> <AdministratorPassword> <PlainText>false</PlainText> <Value>VgBpAGMAZQByAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAUABhAHMAcwB3AG8AcgBkAA==</Value> </AdministratorPassword> </UserAccounts> </component> </settings> <settings pass="specialize"> <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ComputerName>MoeClub</ComputerName> </component> <component name="Microsoft-Windows-Deployment" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <RunSynchronous> <RunSynchronousCommand wcm:action="add"> <Order>1</Order> <Path>net user Administrator /active:Yes</Path> <WillReboot>Never</WillReboot> </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Order>2</Order> <Path>net user Administrator /comment:"MoeClub.org"</Path> <WillReboot>Never</WillReboot> </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Order>3</Order> <Path>net user Administrator /fullname:"MoeClub"</Path> <WillReboot>Never</WillReboot> </RunSynchronousCommand> </RunSynchronous> </component> </settings> <settings pass="windowsPE"> <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SetupUILanguage> <UILanguage>zh-CN</UILanguage> </SetupUILanguage> </component> <component name="Microsoft-Windows-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <ImageInstall> <OSImage> <WillShowUI>OnError</WillShowUI> <InstallFrom> <MetaData wcm:action="add"> <Key>/IMAGE/NAME</Key> <Value>Windows Embedded Standard</Value> </MetaData> </InstallFrom> </OSImage> </ImageInstall> <UserData> <AcceptEula>true</AcceptEula> <ProductKey> <Key></Key> </ProductKey> </UserData> </component> </settings> </unattend>
原文链接:https://moeclub.org/2017/08/31/361/
参考链接:https://moeclub.org/2017/11/19/483/