解锁硬盘限制!50块钱的中兴CT321G2小主机用ipxe无盘启动windows

2024-04-29 18:01:11 47点赞 214收藏 47评论

先说原因,在家里用apple tv串流到电脑上玩游戏,发现蓝牙连接手柄没有震动功能,手柄直连电脑是可以震动功能的,玩地平线时试过那个手柄震动功能之后,就再也回不去了,于是想找个便宜的方案曲线救国,海鲜市场50块钱淘了这个小主机,x86/64构架,只有2g内存和4g硬盘,可玩性不高,但是cpu跟j1900差不多,usb口也很丰富,4个USB2.0+2个USB3.0接口,完全可以做书房电脑主机的usb延伸,顺便还可以跑点小程序也是没问题的。

解锁硬盘限制!50块钱的中兴CT321G2小主机用ipxe无盘启动windows解锁硬盘限制!50块钱的中兴CT321G2小主机用ipxe无盘启动windows

找了个usb串流软件只能在windows下用,所以我准备装一个windows,但是4G硬盘存储太拉跨,装windows是完全不够用,也考虑过windows to go安装到u盘里,而windows to go对u盘的要求挺高,最便宜的价格都要100多了,已经超出了小主机的价格,完全无法接受,所以想到了用iscsi无盘启动的方式,经过几天的折腾,最终完美启动。

要准备的文件

1.wimboot:用来启动windows pe

2.ipxe:这个要自己编译,因为要嵌入自己的脚本

3.windows镜像

4.u盘:用rufus等工具把windows镜像写入u盘。如果不想用u盘也可以把镜像挂载到群晖共享文件夹,在windowspe里用net use命令挂载镜像所在的文件夹,执行setup.exe启动,这里为了省事直接用了u盘。

需要的文件可以自己下载编译,也可以用我编译好的版本和镜像,但是注意6111端口号要和我的一样。

(wimboot、编译好的ipxe、windows镜像、我写的ipxe启动脚本)的下载链接:

https://pan.baidu.com/s/1Lb69OU13pGFt-ff78TSGpA?pwd=1234 提取码: 1234

https://url95.ctfile.com/d/44827295-61067476-560716?p=4681 (访问密码: 4681)

0 遇到的坑

0.0 windows的版本

唯一能成功安装的windows版本是windows 1607,在这之前之后的版本都不行,不要问我怎么知道的😭。

本来想讨巧在其他电脑上直接把windows装到iscsi硬盘直接给小主机使用,但是发现用DISM命令直接从windows镜像提取文件再写入iscsi硬盘的方式在网启的时候会报错( inaccessible boot device)。

后来直接用U盘安装发现错误一样,最终确定是镜像的问题,下次折腾再试试DISM命令直接写入ISCSI硬盘。

0.1 群晖的iscsi格式:

我在群晖部署的iscsi硬盘是一个target映射一个lun:

sanboot iscsi:${next-server}::::iqn.2000-01.com.synology:diskstation.Target-win10

这种死活连接不上,这种::::冒号之间不填都是默认值,第三个冒号后面是LUN的编号,看网上的文章在使用sanboot命令时都是用的默认值,但是经过我的试验使用把LUN的编号改成1才启动成功

sanboot iscsi:${next-server}:::1:iqn.2000-01.com.synology:diskstation.Target-win10

这里第三个冒号后面的是LUN ID,如果不填默认是0,看来群晖的LUN映射编号是从1开始的。

0.2 群晖iscsi初次登录的权限问题

如果群晖的iscsi target设置了权限的话,在第一次执行sanboot时会连接失败(can not open SAN device),这个要在群晖SAN管理器中的iscsi target页面等待小主机执行sanboot,执行sanboot后在群晖的san manager的iscsi页面会看到连接过来的客户端IP,这个时候点括号里的create new host,然后给这个客户端设置LUN的可读写权限,再次重启小主机进行引导就能连接成功了。

解锁硬盘限制!50块钱的中兴CT321G2小主机用ipxe无盘启动windows

0.3 ipxe的编译

如果使用我编译好的ipxe就不用看了,要自己编译的话,首先要开个ubuntu虚拟机或者ubuntu docker环境来编译,在macos、windows下是编译不了的,或者说要配置复杂的交叉编译命令,最好还是开个虚拟机方便一点。关于编译命令,官网上说的编译依赖有点过时,经过试验我安装了如下依赖:

sudo apt install git sudo apt install git-core #不装这个编译时会出现文件找不到 sudo apt install liblzma-dev #不装会出现lzma.h错误 sudo apt install gcc sudo apt install make sudo apt install mtools #DOS命令模拟器 sudo apt install mkisofs #不生成ISO不需要 sudo apt install syslinux #不生成ISO不需要

在src目录下建立一个链式脚本chain.ipxe,内容如下:

#!ipxe dhcp chain http://${next-server}:6111/boot.ipxe

${next-server}:6111是我在群晖webstation上放的更完整的引导脚本,${next-server}变量是dhcp服务器返回的下一个服务器的地址,这个在 配置软路由 章节会提到如何设置,现在开始编译:

cd src make clean make bin-x86_64-efi/ipxe.efi EMBED=chain.ipxe mkdir -p myipxe/64 cp bin-x86_64-efi/ipxe.efi myipxe/64

src/myipxe/64目录下找到ipxe.efi,拷贝到群晖websation的目录下,用浏览器确保http://群晖ip:6111/ipxe.efi可以正常访问。

这个时候小主机使用网络引导时就可以使用ipxe执行http://群晖ip:61111/boot.ipxe中的命令了。

0.4 网口问题

这个主机的网卡是realtek 8168,速率是10/100/1000Mbps自适应的,进入系统后网络接口显示的是100Mbps,折腾后发现是网线问题,换了根网线后,协商速率变成1000Mbps了,不过内网librespeed跑了下,最大只能跑满500Mbps左右,只能跑一半的速度,一般来说也够了。

解锁硬盘限制!50块钱的中兴CT321G2小主机用ipxe无盘启动windows

1 安装步骤

1.0 网络引导流程图

先看完整pxe网络引导流程图:

解锁硬盘限制!50块钱的中兴CT321G2小主机用ipxe无盘启动windows

1.0 BIOS选项设置

0.BIOS的密码:zte-ct
1.BIOS启动顺序改为网络优先
2.IDE配置修改为IDE->AHCI,原先是AMDAHCI
3.启动类型改为uefi启动或者dual boot type
4.pxe boot capability改为uefi:ipv4

ps:如果bios改坏了变砖,可以把机子拆开把电池扣下来放电就还原回去了~

1.1 配置软路由

首先要配置软路由的dhcp服务器,让dhcp服务器告诉网卡tftp服务器的地址和要获取的引导文件名字,我的软路由系统是iStoreOS(基于openwrt),在网络->DHCP/DNS->PXE/TFTP设置,添加ipxe的信息:

解锁硬盘限制!50块钱的中兴CT321G2小主机用ipxe无盘启动windows

填入群晖的ip地址,名称,和引导固件的文件名:

解锁硬盘限制!50块钱的中兴CT321G2小主机用ipxe无盘启动windows

填这个的目的是让dhcp服务器告诉网卡下一步到哪里里去下载引导文件。

其他软路由类似,一些硬路由也有这个功能,如果没有的话,替代方案是关闭路由器上的DHCP服务,并打开群晖的DHCP服务,用群晖来实现给内网提供ip地址服务。
注意如果要用群晖的dhcp服务,就必须关闭路由器上的dhcp服务,因为整个内网只能有一个dhcp服务器,如果有多个dhcp服务会造成内网ip地址混乱。

1.2 在群晖上配置tftp服务

如果软路由支持开启tftp服务也可以将引导固件放在软路由上,但是为了方便我将文件都统一存放在群晖上方便管理。

打开群晖页面,在控制面板->文件服务->高级设置->tftp,勾上启用tftp服务,并设置根文件夹:

解锁硬盘限制!50块钱的中兴CT321G2小主机用ipxe无盘启动windows

然后把ipxe.efi放到/web/tftp目录下(见前面的编译方法)。
前面提到ipxe.efi内嵌了自己写的脚本,脚本中用chain命令链式启动了一个新的脚本:

chain http://${next-server}:6111/boot.ipxe

为什么要这样做呢?因为将引导脚本内嵌到ipxe.efi中的,不方便修改,所以内嵌脚本中直接链式启动一个新的脚本灵活一点。另外前面有提到我发现ipxe.efi启动时似乎会隐式执行autoexec.ipxe脚本,但是我在官网上没有找到使用说明,就没继续折腾了,后面的朋友可以试试这个方法,如果行得通可以省去ipxe.efi的编译过程,直接使用官网release原版。

1.3 在群晖web station服务上建立一个http服务,端口号设置为脚本里的6111

群晖上打开Web Station->网页服务,选择本机脚本语言网站:

image.pngimage.png

名称描述随便填,目录选择web/www,自己要在相应位置创建目录:

image.pngimage.pngimage.pngimage.png

然后在网络门户新增一个门户:

image.pngimage.png

在web/www/目录下随便放个文件用http协议访问下,能读取到就没问题了。

1.4 制作windows pe(windows预执行环境)

这一步的目的是为了能进入windows安装程序的命令行界面启动U盘上的windows镜像,但不是真的要使用这些文件来安装windows。所以我做了个最简单的windows pe。
挂载windows镜像,把以下文件按对应目录的方式拷贝到群晖的6111端口的web服务根目录中:

boot/bcd boot/bcd.sdi sources/boot.wim

在把前面下载的wimboot也放到目录中,最终web服务根目录如下:

wimboot boot/bcd boot/bcd.sdi sources/boot.wim

到这里一个最最最简单的可以用ipxe启动的pe预安装环境就配置好了。

1.5 boot.ipxe启动脚本

我从网上找了些脚本,做了修改,只实现了两个功能,从iscsi磁盘引导,和进入前面制作好的windows pe环境,内容如下:

#!ipxe #下面这个3000是菜单等待时间代表3秒, set menu-timeout 3000 set menu-default WINDOWS isset ${ip} || dhcp set initiator-iqn iqn.${product}:${mac:hexhyp} :start menu iPXE Boot Menu item --gap -- --------------------------------- WIN -------------------------------- item WINDOWS BOOT WINDOWS(ISCSI) item --gap -- ---------------------------- Advanced options ------------------------ item --key p pe PE system -- p item --key s shell shell -- s item --key r reboot reboot computer -- r item --key x exit Exit iPXE and continue BIOS boot -- x item --gap -- item --gap -- ------------------------------- systeminfo --------------------------- item --gap -- DHCP Server: ${dhcp-server} item --gap -- IP: ${ip} item --gap -- MAC: ${mac} item --gap -- netmask: ${netmask} item --gap -- Gateway: ${gateway} item --gap -- DNS: ${dns} item --gap -- UUID: ${uuid} item --gap -- initiator-iqn: ${initiator-iqn} choose --timeout ${menu-timeout} --default ${menu-default} selected goto ${selected} :reboot reboot :exit exit :shell shell goto start :WINDOWS chain /mac/${mac:hexhyp} || goto install :pe sanhook iscsi:${next-server}:::1:iqn.2000-01.com.synology:diskstation.Target-win10 || goto shell kernel wimboot initrd http://${next-server}:6111/boot/bcd BCD initrd http://${next-server}:6111/boot/boot.sdi boot.sdi initrd http://${next-server}:6111/sources/boot.wim boot.wim boot

把boot.ipxe放到web根目录下,然后就小主机就可以开机了。

1.6 安装windows

先把安装u盘插到usb口,开机后最终会执行boot.ipxe,就可以看到一个菜单项,第一次要选择第二项:PE System菜单,进入pe环境,注意这个pe环境不像网上的windows pe系统那么完整,它本质上只能进入windows安装界面的第一步,如果真的点install会失败(因为文件不全),我只是用它来进入命令行界面(选择repair computer->trouble shooting,找到命令行选项):

image.pngimage.png

把前面提到的windows镜像用rufus写到u盘里后插入u盘,在命令行中用dir的方式切换到u盘的目录,dir c:,dir d:这样一个一个的试,然后cd /d c: 切换过去,执行setup.exe就可以直接启动u盘上的安装程序了。

1.7 直接启动iscsi磁盘上的windows

我的boot.ipxe脚本启动windows是按照mac地址来启动不同的iscsi磁盘,
要在web根目录下的创建一个文件/mac/xx-xx-xx-xx-xx-xx这也是一个引导脚本,内容如下:

#!ipxe set keep-san 1 sanboot iscsi:${next-server}:::1:iqn.2000-01.com.synology:diskstation.Target-win10 boot

我是为了方便一个脚本引导多台主机这样写的,如果不需要网络引导多台电脑的话,可以把这几行代码直接写到boot.ipxe中,修改如下:

:WINDOWS set keep-san 1 sanboot iscsi:${next-server}:::1:iqn.2000-01.com.synology:diskstation.Target-win10 boot

到这里,启动的时候选择BOOT WINDOWS(ISCSI)菜单,就可以直接进入windows界面了。

最终效果图

刚安装完成时CPU几乎满载,原版windows装好后会运行一堆有得没得的程序,等一段时间后自然会降下来,最好还是找几个windows优化工具关闭一些不需要的服务。

image.pngimage.png

装好后马上关闭系统的虚拟内存,因为如果通过无盘启动windows的话,虚拟内存的页面文件是建立在群晖iscsi硬盘上的,多多少少会影响运行速度。

image.pngimage.png

这小主机能装windows,50块钱的价格就值回来了,你也可以装个linux跑点小服务啥的,其他玩法大家就自由发挥了~

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
47评论

  • 精彩
  • 最新
  • 大佬,你好, 请教一下, 成功进入pe之后安装win10 最好需要重启, 重启不就又进入网络启动了吗, 这样的话岂不是安装失败了? 需要怎么处理一下呢;

    另外先用虚拟盘安装好win10(就是你文章中提供的1607英文版本)在虚拟机内可以成功启动, 但是附加到iscsi内就无法成功启动了, 能进系统启动, 转圈圈, 然后蓝屏报 inaccessible boot device
    反复尝试安装了多次, 都是无法成功启动系统, 请教一下有什么调整建议吗。
    谢谢。

    校验提示文案

    提交
  • 折腾的成本远大于这50块😂

    校验提示文案

    提交
    是的 [喜极而泣]

    校验提示文案

    提交
    享受折腾过程 😂

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • 干货满满

    校验提示文案

    提交
    谢谢

    校验提示文案

    提交
    收起所有回复
  • 无盘系统个人折腾太难了,我有群晖试过好几次都失败了,楼主耐心不错 [鼓掌]

    校验提示文案

    提交
    是的,我最开始也失败了,还研究了ipxe的代码,专门编了个debug模式看日志,反复折腾观察,才把群晖的脉把准了 [喜极而泣] ,最后装系统换了7 8个镜像,这玩意只能说照着资料整都要折腾很久,不过一旦弄通,就get到新技能了

    校验提示文案

    提交
    我后来考虑了下升级兼容性能等问题还是放弃了无盘系统,不方便升级win系统,换硬件可能不兼容,太依赖网络配合,还是用了一块小硬盘装win系统,数据装群晖iscsi硬盘里,后续准备用esxi挂载群晖的nfs做伪无盘系统

    校验提示文案

    提交
    还有4条回复
    收起所有回复
  • 大佬牛逼 值得学习。 一直想在家装无盘

    校验提示文案

    提交
    嗯,可以试试,有问题可以多交流

    校验提示文案

    提交
    收起所有回复
  • 2+4g能装openwrt么?

    校验提示文案

    提交
    装openwrt就不用网络引导了,4g够了,但是网口只有一个,可以加个usb网卡插在小主机前端的usb3.0口上

    校验提示文案

    提交
    openwrt有1G硬盘就够用了。

    校验提示文案

    提交
    收起所有回复
  • 我有一台2+16的z8350小主机。。。。努努力可以塞下Windows

    校验提示文案

    提交
    嗯嗯,这个应该可以

    校验提示文案

    提交
    收起所有回复
  • 大佬牛逼,我根本看不懂

    校验提示文案

    提交
    [小眼睛]

    校验提示文案

    提交
    收起所有回复
  • 牛逼啊,那运行程序是跑的群晖的cpu还是小主机的呢?

    校验提示文案

    提交
    这个自然是小主机的了,群晖只是虚拟了个硬盘给小主机用

    校验提示文案

    提交
    j1800能干啥啊?下载机的话arm不是更省电吗?

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 去年买了2个,都直接挂u盘安装了win7 问题cpu太弱,不知道能干啥

    校验提示文案

    提交
    装个Linux,跑个青龙脚本啥的还是没问题的

    校验提示文案

    提交
    收起所有回复
  • 好厉害

    校验提示文案

    提交
    谢谢

    校验提示文案

    提交
    收起所有回复
  • 这个厉害了

    校验提示文案

    提交
    谢谢 [皱眉]

    校验提示文案

    提交
    收起所有回复
  • 4G简版win10够了

    校验提示文案

    提交
    我没试过什么精简版,阉割的功能上总会有点缺失,另外这个说的4g实际上只有3.7g,还真不一定够

    校验提示文案

    提交
    收起所有回复
  • csdn各种vip以后,感觉一堆程序猿跑到值得买上来写教程了

    校验提示文案

    提交
    [脸红]

    校验提示文案

    提交
    收起所有回复
  • 有一个不带g2的机器,就是ct321,4g内存32g固态,d2550的cpu,能买吗?

    校验提示文案

    提交
    这个cpu弱点硬盘大点,看价格和需求了

    校验提示文案

    提交
    收起所有回复
  • 你把硬盘里某个东西删掉后,这个东西理论上还在硬盘里,只不过他所在的分区就会被标记为可删掉

    校验提示文案

    提交
  • 一点不想折腾

    校验提示文案

    提交
  • 14

    校验提示文案

    提交
  • [张小草_笑] 为了50块钱,尽情的折腾。看起来有点复杂。

    校验提示文案

    提交
  • 直接做数播了

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章

先生请出山

Ta还没有介绍自己

关注 打赏
最新文章 热门文章
214
扫一下,分享更方便,购买更轻松