完整自制尚不方便,还有许多改进的地方.
现在可以达到在单硬盘,无救援模式的情况下安装Winodws.
再也不需要强制要求内存大于镜像包大小了.
本例所给的wget后链接均可用,教程是完整的.
(原文链接:https://moeclub.org/2017/08/31/361/)
环境 DigitalOcean 512M Debian8 x64
目标 Windows Think PC (Windows 7 Embedded)
- 此教程适用于具有以下特征的机器:
- 宿主机提供的VNC
- 能够随意更换内核
- GURB引导启动
- 准备工作:
以下步骤在DigitalOcean上测试成功:
- 制作可用的镜像文件:
- 下载镜像:下载地址个人版,企业版 服务器版
- 提取install.wim文件:解压或挂载都行,提取该文件到’E:install.wim‘.
文件路径sourcesinstall.wim
- 创建一个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
- 在D盘创建一个文件夹’D:MOUNT‘,打开DISM++
点文件–>挂载映像–>点第一个浏览,找到’E:install.wim‘–>点第二个浏览,找到’D:MOUNT‘–>不选中只读模式–>确定 - 在DISM++里进行优化,安装语言包,添加VirtIO驱动等操作
备份下载VirtIO驱动 - 完成后,点文件–>另存为映像–>保存在’D:install.wim‘,等待任务完成
- 点文件–>释放映像–>点第一个浏览,找到’D:install.wim‘–>点第二个浏览,找到’V:‘–>只选中添加引导和格式化–>确定–>在弹出的’引导修复-BIOS’对话框中点击更多–>找到盘符为V的磁盘分区–>确定
- 等待完成,在资源管理器中,在盘符为V的磁盘分区点击右键–>弹出.
如有报错请认真看以上步骤. - 使用gunzip工具压缩打包压缩’D:win.vhd‘
用法:gzip.exe -k9 D:win.vhd
.等待压缩完成.
可点击gunzip for windows下载工具,或使用备份下载链接下载此工具.
解压文件,将’bin‘目录中的文件放置’%WINDIR%/SYSTEM32‘文件夹中,即可方便在命令提示符中使用.
实际上刚刚得到的’D:win.vhd‘就是一个可直接dd的文件. - 上传到可用HTTP直接下载的地方,最好不要包含跳转.
- 更新grub配置文件:
- 下载 Debian netboot mini.iso 到’/boot‘文件夹内.
1wget -qO /boot/mini.iso https://moeclub.org/get-deb-livecd - 在/boot文件夹/子目录内寻找GRUB配置文件.
- 如果GRUB的配置文件为’grub.cfg’:
在文件的末尾添加
123456menuentry "Boot mini" {set isoimage="/boot/mini.iso"loopback loop (hd0,1)$isoimagelinux (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 -- quietinitrd (loop)/initrd.gz} - 如果GRUB的配置文件为’grub.conf’:
- 如果GRUB的配置文件为’grub.cfg’:
- 获取本机的IP,子网掩码,网关并记录下来.
一般控制台最下面有这些参数.
如果没办法获取到这三项参数,可以用以下命令获取.
代码片段摘自 Debian(Ubuntu)网络安装/重装一键脚本
1234567891011121314151617181920212223242526272829303132333435DEFAULTNET="$(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=0for 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}'`doNumTMP="$(ipNum $IPITEM)"eval "arrayNum[$ii]='$NumTMP,$IPITEM'"ii=$[$ii+1]doneecho ${arrayNum[@]} |sed 's/s/ /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: 33[33m$IPv4 33[0m MASK: 33[33m$MASK 33[0m GATE: 33[33m$GATE 33[0m"} || {echo "Error! Not found network config. "} - 进入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
命令可查看硬盘状况
可知DigitalOcean机器的硬盘为’/dev/vda‘ - 接下使用dd命令进行应用镜像,也可以使用自己的镜像.
1wget -qO- https://moeclub.org/get-win7embx86 |gunzip -dc |dd of=/dev/vda - 待完成后,输入reboot命令
就可看到久违的WINDOWS启动界面.按照正常步骤安装. - 安装完成后,如果没有网络,你需要自行完善网络配置.
- 远程桌面服务如果没有意外,我提供的镜像会自动打开.
提示:在安装步骤时鼠标位置不好找,可能不太适应.
请尝试使用空格键
回车键
Tab键
方向键
进行操作.
- 在磁盘管理中,点击’C‘盘,右键选择’扩展卷‘,可以直接’增加‘C盘的空间.
- 后记:
- 你可以在装有Hyper-V的机器上,挂载这个vhd镜像,然后完成安装步骤,优化.
再进行压缩vhd镜像,然后dd安装.可能效果更佳. - 文章只是提供一个思路,和实现的例子.更多期待你们去尝试.
- 提供一些可直接使用的镜像
- Windows Embedded 8.1 x86
1wget -qO- https://moeclub.org/get-win8.1embx86 |gunzip -dc |dd of=/dev/vda