文章

【转载】将VPS上的Linux系统重装为Windows系统

  编辑于:2018-12-02
文章目录

前言

有的时候需要在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驱动等操作,一般只需要BalloonNetKVMviostor三个驱动即可。
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/

发表回复