找回密码
 加入我们
搜索
      
查看: 6288|回复: 13

[装机] iPXE iSCSI 无盘安装及引导 Win11/10 连载(下) — Linux + wimboot 篇

[复制链接]
发表于 2024-3-18 10:21 | 显示全部楼层 |阅读模式
本帖最后由 imyz 于 2024-3-19 11:28 编辑

      接(上)。若有与我一样采用 VMware 虚拟机模拟环境的,应该都面临一个局限:假如宿主机是 64 位,不论如何设置,虚拟机都模拟不出 CPU 架构为 i386/x86(32-bit) 的环境,得到的始终是 x86_64,即:64-bit,至少在我的环境中如此。关于这点,可以使用 iPXE 官方给出的检测指令得知,如下图所示:
01.iPXE-CPUID-Result.png
02.iPXE-Client-Config.png

      该局限导致依赖于 ${arch} 这个引用/调用方式的命令始终会指向 x64 文件夹,我在 WDS 篇中提供的菜单脚本 Boot\iPXE\menu.ipxe 尾部那句 chain Boot\${arch}\${bootloader} 实际调用的是 x64 文件夹中的 bootloader,只不过恰好 wdsnbp.com 这个 bootloader 在 WDS 自带的 x86 与 x64 两个文件夹中均默认存在,因此在 WDS 环境中并未返回错误,这是其一;其二:WDS 本身也提供了启动映像选择菜单,若已添加了 x86 或 x64 两种或以上启动映像的,当链式加载 WDS 启动文件进入菜单后还有机会再次进行选择,相当于“掩盖”了上述问题。现在来到了 Linux 环境,以上两个条件均不复存在,该问题避无可避,而我在发(上)篇之前就已经在 Linux 虚拟机中发现了,不过基于上述种种综合考虑后,我最终选择在(下)篇中指出,还望大家别太介意!

      (上)篇的剧透说到“将彻底抛开 M$ 环境而改用 Linux + wimboot”实际是有个前提的,即:必须先按 2022 年 我NUC9 iSCSI帖 的方法,在纯 M$ 环境中定制好支持 iSCSI 的 WinPE.wim 之后,并以此为界一分为二地讲才成立,在将 WinPE.wim 和启动所必须的文件复制到 Linux 之后则再不必涉及 M$ 环境…… 我暂且称之为“一种语言艺术”吧。

      闲话少叙。这篇教程基于操作系统 Debian 12 – Bookworm,当然我的也是一台虚拟机,它所需要的配套服务或软件如下

        * DHCP 服务器:dnsmasq (isc-dhcp-server 亦可)
        * TFTP 服务器:dnsmasq (tftpd-hpa 亦可)
        * iSCSI Target:Windows, Linux 或 NAS 均可

      教程中涉及到的所有用于启动的 iPXE 及 WinPE 文件均位于 Boot 文件夹中,详见以下目录结构:

        /var
        └── ftpd
                 └── Boot
                          ├── iPXE
                          │      ├── Legacy
                          │      │      └── undionly.kpxe
                          │      ├── UEFI
                          │      │      ├── ipxe.efi
                          │      │      └── snponly.efi
                          │      ├── wimboot
                          │      │      ├── wimboot
                          │      │      └── wimboot.i386
                          │      ├── menulinux.ipxe
                          │      ├── sanhook.ipxe
                          │      └── wimboot.ipxe
                          └── WinPE
                                   ├── Images
                                   │      ├── WinPE-iSCSI-zh-CN-x64.wim (请按教程自行定制)
                                   │      └── WinPE-iSCSI-zh-CN-x86.wim (请按教程自行定制)
                                   ├── BCD
                                   └── boot.sdi

      若想直接抄作业的,则请确保自己的文件名称与存放位置与以上完全一致。不过我在教程最后附的下载并不会包括那两个 WinPE-xxx.wim 文件,因为字节数太大既不方便上传也不方便下载,同时大家的网卡型号与驱动不尽相同,所以建议各位按我 NUC9 iSCSI 帖教程定制适合自己的 PE。iPXE 启动文件在(上)篇中已提过;而这次的新面孔:wimboot & wimboot.i386 请参见 iPXE 官网 或直接下载我提供的附件,其中 .i386 那个基本用不上,因为前者是 x64 & x86 通用的,而三个 .ipxe 文件则是命令脚本,可按自己要求编辑,而 wimboot.ipxe 也是这篇新增的;此外,此次新增的 WinPE 文件夹中包含的 BCD 与 boot.sdi 是从纯净的 WinPE 中拷贝出来的必备文件,BCD = Boot Configuration Data,即启动配置数据,而 boot.sdi 则用作内存磁盘(RAMDisk)的设备与路径,参见 微软官网

      为了节省时间这回我又偷了点懒,其一是考虑到 vRouter 网关纯作 NAT,用窗户还是企鹅没差,所以没换;其二是 iPXE Client 在 WDS 环境中已安装好 Win11,而这次的主要目的是为了验证 iSCSI,所以感觉没必要再重新用 Linux 搭个 iSCSI Target 重装一遍 Win11,更何况新装 Win11 开机那下还挺烦人…… 既然不影响模拟结果还能节省宝贵的时间,何乐不为?!所以这回保留了 10.1.1.10 这台 WinServer iSCSI Target,仅将 DHCP + WDS 双双禁用,最终环境拓扑如下图:
03.Topology-Diagram-Linux.png

      由上图可知,核心的 DHCP + TFTP 部署在一台 Debian 12 虚拟机中(10.1.1.20/24),绝对货真价实的 Linux。这个做法也侧面证明如何部署 iSCSI Target 并无限制,Win、Linux、NAS 纯血或混血均可。很自然地,DHCP 和 TFTP 也可以分别部署在不同的服务器中,若配置好 DHCP Relay 中继及防火墙等,还能跨 VLAN,也符合企业级的部署环境,这里不展开。

      在(上)篇发布后不久就有盆友留言催更,不过 WinPE 毕竟是 Windows 亲生的,在 Linux 这里寄人篱下总归是有些不同,本着对教程负责任的态度,我其实一直在尽力找空闲时间进行更全面的测试,包括 x64/x86、UEFI/BIOS、iSCSI 这几项的各种组合,用文字描述太啰嗦,还是看图说话:
04.Full-Test-Matrix.png

      上图测试矩阵的结果恰好也印证了以上所言。在尝试了我认知内的所有组合均失败后,在此不得不遗憾地讲:Linux + wimboot 欲引导支持 iSCSI 无盘 x86 WinPE 暂时无望,而仅能在不启用 iSCSI 方式下完成启动。因此,对 iSCSI 无盘安装 Windows 而言,WDS 目前还是最好的选择。不过对于无 x86 需求的而言,两者可谓互有胜负,所以这又算是一个好消息,否则也不会有这篇(下)。

      在接下来的教程中出现的所有命令以及软件包,均基于 Debian,使用 Ubuntu、CentOS 或其它 Linux 系统的,请注意用各自系统下相应的命令或软件包替换!不过,相同软件的配置文件(.conf) 应当是通用的,但不排除其默认存放路径不同!对此,请参照对应系统的手册或软件使用手册,而不要“生搬硬套”!针对不熟悉甚至有可能是初次接触 Linux 的看官,以下是必须牢记的须知第一条:
道路千…啊tui…… Unix/Linux 是大小写敏感的系统!(上)篇中亦有相应提示。


      须知第二条:
教程中的命令行操作,均须用 root 或具备 sudoer 身份的用户权限,在 Debian 下用提权命令 su 实现,回车后输入 root 密码获取权限。若成功,则命令提示符将从 $ 变为 #,如下图:

05.Shell-su-privilege.png

      还有第三条:
root 权限是 Linux 最高权限,危险性极高。因此请勿在生产环境操作,而是自行搭建测试环境。


      若看过(上)并理解其中内容后应当清楚,实现此次目标最核心的任务是须正确地配置 DHCP 服务器,使其能据客户机的各项参数下发正确的启动文件,所以教程将分别围绕 dnsmasq 和 isc-dhcp-server 这两个主流 DHCP 服务器来讲解其配置方法。在正式进入教程前,为避免可能有初次接触 Linux 的看官,我还是以 dnsmasq 为例先交待下安装、卸载,以及启/停服务这些基本的命令吧,若有猴急的亦可直接移步 2 楼。先看安装与卸载:
  1. apt update        (回车,更新软件源)
  2. apt install dnsmasq        (回车,若有提示 (Y/n) 则键入 Y,回答 Y 不分大小写)
  3. apt remove dnsmasq        (回车,卸载 dnsmasq)
复制代码


      接下来再请看针对服务的启动和停止命令,因为一旦修改配置后,需要重启服务才能生效。还是在 root 下操作:
  1. systemctl start dnsmasq        (start 代表服务“启动”)
  2. systemctl stop dnsmasq        (stop 代表服务“停止”)
  3. systemctl restart dnsmasq        (restart 代表服务“重启”)
  4. systemctl enable dnsmasq        (enable 表示操作系统重启后该服务“自动启动”)
  5. systemctl disable dnsmasq        (disable 即是 enable 的反意词)
  6. systemctl status dnsmasq        (status 表示查看该服务“运行状态”)
复制代码


      dnsmasq 集 DNS、DHCP、TFTP 铁人三项服务于一身,可通过其配置文件按需启/禁其中任何一项服务,加上它似乎广泛地活跃于 OpenWRT、iKuai 这类专用系统中,所以我先来讲它…虽然从语法上我更倾向 isc-dhcp-server ……

      为便于区分章节,照例请各看官移步 2 楼观看教程正文…

评分

参与人数 1邪恶指数 +5 收起 理由
summerq + 5

查看全部评分

 楼主| 发表于 2024-3-18 10:21 | 显示全部楼层

(一)dnsmasq 配置

本帖最后由 imyz 于 2024-3-19 11:42 编辑

      全新安装的 dnsmasq 其配置文件实际上有多个,功能各不相同,这篇教程只用到其中两个最主要的,第一个是 /etc/default/dnsmasq,不带扩展名,而另一个为 /etc/dnsmasq.conf。第一个配置文件可以看作是根配置文件,用于定义其自身运行环境,比如:定义域名、后备配置、指定默认搜索路径等共六大项,此处不深究,再者也不是 dnsmasq 专题教程;而第二个才是此次的主角,我要讲的配置尽在其中。考虑到文件分类,暂且将这个 dnsmasq.conf 如下图所示移至 /etc/dnsmasq.d/ 文件夹中:
  1. mv /etc/dnsmasq.conf /etc/dnsmasq.d/
复制代码

06.DNSMASQ-Config-move.png


      为更清楚地展示各个配置文件在 /etc 文件夹中的具体存放位置,同时考虑到第(二)部分亦有雷同之处,以下又有剧透内容,大家在这里重点关心名称含 dnsmasq 的即可,而其余的在(二)才会用到:

        /etc
       ├── default
       │      ├── dnsmasq
       │      ├── isc-dhcp-server
       │      └── tftpd-hpa
       ├── dhcp
       │      └── dhcpd.conf
       └── dnsmasq.d
                └── dnsmasq.conf

      但是,改变配置文件位置也是有前提的,请使用 root 权限并用 nano 编辑 /etc/default/dnsmasq,并将其中 CONFIG_DIR 这句开头的注释符“#”删除并保存,如下图:
  1. nano /etc/default/dnsmasq
复制代码


      注意下方快捷键提示:Ctrl+O 回车保存,Ctrl+X 退出。若实在不会操作的,也可用我提供的文件覆盖。
07.DNSMASQ-Default-Config.png

      接着便是 /etc/dnsmasq.d/dnsmasq.conf 文件,为便于对照着解释,先将其内容展示如下:
  1. port=0                # 禁 DNS
  2. bogus-priv
  3. interface=ens192
  4. bind-interfaces
  5. no-hosts
  6. dhcp-range=10.1.1.100,10.1.1.200,255.255.255.0,12h
  7. dhcp-option=option:router,10.1.1.1
  8. dhcp-option=option:tftp-server,10.1.1.20
  9. dhcp-match=set:ipxe,175 # iPXE sends a 175 option.
  10. dhcp-option=encap:175, 189, 128      # SAN device 0x80
  11. #dhcp-option=encap:175, 190, imyz     # iSCSI username
  12. #dhcp-option=encap:175, 191, iscsi-target     # iSCSI password
  13. dhcp-match=set:legacybios,option:client-arch,0        # Legacy BIOS
  14. dhcp-match=set:uefix86,option:client-arch,6        # UEFI x86
  15. dhcp-match=set:uefix64,option:client-arch,7        # UEFI x64
  16. dhcp-boot=tag:!ipxe,tag:!legacybios,Boot\iPXE\UEFI\ipxe.efi
  17. dhcp-boot=tag:!ipxe,tag:legacybios,Boot\iPXE\Legacy\undionly.kpxe
  18. dhcp-boot=tag:ipxe,Boot\iPXE\menulinux.ipxe
  19. enable-tftp
  20. tftp-root=/var/ftpd
  21. tftp-unique-root
  22. tftp-no-fail
  23. tftp-no-blocksize
  24. dhcp-authoritative
复制代码


      以上配置第一行 port=0 表示禁用 DNS 功能,因为教程仅涉及 DHCP 与 TFTP 两项功能。需要重点指出的是第 3 行“interface=ens192”,其作用是绑定/监听“ens192”这张网卡。请注意:这句绑定设置“一定不能照抄”!!!请务必使用各自的网卡名称,包括其中 option:router 与 option:tftp-server 对应的 ip 地址。可网卡名称当如何获取呢?我也是找了很久发现 Debian 12 貌似只能使用以下命令:
  1. ip address
复制代码

08.Debian-IP-address-Bind.png

      针对配置中用“#”注释掉的 11 & 12 两行,大家一眼应该看出其为 iSCSI CHAP 认证的用户名与密码。此处不启用这两项的原因在(上)篇中也提到了,因为用 iPXE 的脚本来配置除功效一样外还更灵活。此外,与 M$ DHCP 服务器配置策略不同,dnsmasq 对语句的先后顺序并不敏感,比如,将 menulinux.ipxe 那句放在前或后均不改变执行结果。还有,dhcp-boot=tag:!ipxe,tag:!legacybios… 这句中逗号隔开的前后两个 tag 是“AND 逻辑与”关系,符号“!”为“NOT 逻辑非”。可 tag:ipxe 哪儿来的?

      请看第 9 句 dhcp-match=set:ipxe,175……我粗浅的理解是 dnsmasq 使用该语句设置(set)了一个变量唤作 ipxe,并且该变量与 Option 175 关联绑定;我使用“变量”这一说是与“字符常量”相对应,我感觉 tag="ipxe"(此处 ipxe 代表字符常量)不合理,因为肉眼可见存在多个 set,所以姑且用变量这个假设,而 tag 则像是个数组名,后续语句中 encap:175 的语法是用以拼装 Option 175 字串的。当 iPXE 自举完成后向 DHCP 请求接盘侠时按官方说法会亮出 user-class="iPXE"标记(tag),dnsmasq 在接收到这个请求时发现该 tag 中有个唤作 ipxe 的变量竟然与其同名,区别只是大小写(说好的 Linux 严格区分大小写呢?%#* 我有点快编不下去了…),正好匹配上 tag:ipxe 这句中的 menulinux.ipxe,接盘侠非它莫属了!但等一下,前面拼了半天的 Option 175 不是还闲着没事儿干吗?咱们来看下当事双方的对话记录就清楚了:

iPXE:大姐,您好!您这儿能给说个媳妇儿不!?
dnsmasq:等我看下有合适的没… 欸,这有个 ipxe 不错,和你有夫妻相。
iPXE:这…怎么孩子都 175 了!?
dnsmasq:咋滴,看不上啊?我看你俩挺般配,这孩子还特聪明懂事儿,索性一起打包带走呗。
iPXE:带个孩子不方便,俗话说一分钱一分货嘛!要不您再给找找?我不差钱儿!
dnsmasq:可我这儿也实在没其他了啊!再说就你这条件还想挑三捡四呐?!
iPXE:啥意思?!鸡蛋五毛、一块不卖???
dnsmasq:怎么说话的呐!就你事儿多!爱要要,不要氵衮!
iPXE:…你大…… 人大量!
……

.


      相信这么解释各位看官应该大致能理解其语法了……这也是我前面所说从语法上我更倾向 isc-dhcp-server 的原因。至于其余的相信都较容易理解了,还有,假如偏好用 DHCP Option 名称而非数字代码方式的,如:dhcp-option=option:router…,那么首先查找 dnsmasq 程序位于何处:
  1. find / -name dnsmasq                # 比如我的位于 /usr/sbin/
  2. /usr/sbin/dnsmasq --help dhcp
复制代码


      配置文件虽然有了,但为确保语法正确,在正式启动服务前可用以下命令来检测,若返回“syntax check OK”则表示启动服务过程不会报错,如下图:
  1. sudo dnsmasq –-test
复制代码

09.DNSMASQ-Config-Test.png

      注意:该命令只检测语法,不能检测逻辑或上下文错误!这啥意思呢?打个比方:你正开着车时(别闹)前方突然出现一个人和一个汪星人,撞人还是撞汪星人这两句话从字面上讲就好比“语法”;面对这突如其来的状况你一时间不知所措而向场外亲友电话求助就好比命令检测,但节目限定你在通话全程只能说“[我开车撞人]、[我开车撞汪星人] 两句话的语法是否都对?”仅此一句;场外亲友在经过对包括时政热点与国内外形势等在内的综合要素进行一系列复杂分析判断后答曰“对”就好比 syntax check OK;然而“逻辑”上讲你当时应该刹车,对吧?!

      语法检测通过后,请再一次确认启动所需要的各文件已按此前给出的目录结构保存在 /var/ftpd/Boot/ 中,然后就可以用 systemctl restart dnsmasq 来启动服务。而对于不熟悉 dnsmasq 配置的看官,建议用以下命令将服务器响应客户机的日志实时展示在窗口中,对调试过程会很友好,利于及时发现“逻辑错误”:
  1. journalctl -fu dnsmasq
复制代码

10.journalctl-dnsmasq-monitor.png

      上图中肉眼可辨 dnsmasq 是如何响应 iPXE Client 请求的对话过程,结尾出现的 minint-xxx 客户机名称代表 WinPE 在那一时刻已完成启动。至此,dnsmasq 这部分的讲解就到此结束。假如配置与操作过程无误,这台 Linux 服务器则已具备下发远程无盘启动 WinPE 所必须的文件的能力了。就是这么简单!


      同样地,为便于区分章节,接下来的 isc-dhcp-server + tfptd-hpa 教程则请各看官移步 3 楼…
 楼主| 发表于 2024-3-18 10:21 | 显示全部楼层

(二)isc-dhcp-server + tftpd-hpa 配置

本帖最后由 imyz 于 2024-3-19 11:51 编辑

      基本的安装、卸载、服务启/停等命令与上述 dnsmasq 的一致,仅须用“isc-dhcp-server”替换其中的“dnsmasq”即可,不过,isc-dhcp-server 物如其名,除是个纯 DHCP 服务器外它啥也不是。所以才需要额外安装一个唤作“tftpd-hpa”的作为 TFTP 服务器,基本操作类似,不再赘述。当然大家若有其它更好的平替也是完全可以的,重要的是“内在”。

      在讲 isc-dhcp-server 前,还是先讲下 tftpd-hpa,请注意在“tftp”后面有个“d”,代表 Daemon 守护进程,作为服务器使用。之所以这样提示是因为真有一个不带“d”的作为客户端使用,二者不要搞混了!它的配置文件默认位于 /etc/default/tftpd-hpa,不带扩展名,使用以下命令可查看其内容:
  1. cat /etc/default/tftpd-hpa
复制代码

11.TFTPD-HPA-Default-Config.png

      其中 TFTP_DIRECTORY=”/svr/tftp” 表示客户机需要获取的文件必须保存在该位置,并作为 TFPT 服务的根目录“/”。tftpd-hpa 在安装之后不能像 dnsmasq 和 isc-dhcp-server 直接启动,而是要先为上述 /srv/tftp/ 文件夹授权,因为安装时使用的是 root。据上图中默认配置“TFTP_USERNAME”可知用户名的值为 “tftp”,那么我们先用以下命令来授权:
  1. chown -R tftp:tftp /srv/tftp
  2. #请注意“/srv/tftp”后不要加路径符号“/”。
复制代码


      随后再用此前讲的 systemctl 来 start 或 enable 它,就是这么简单。另外多句嘴,假如已用过 dnsmasq 的 tftp 服务并将相应文件保存在 /var/ftpd/ 中的,那么现在仅须以下一条 ln 链接指令指向该文件夹即可避免重复拷贝文件,以此类推:
  1. ln -s /var/ftpd/Boot /srv/tftp/Boot
复制代码


      在进入 isc-dhcp-server 讲解之前,有必要再交待一件虽不起眼但又挺重要的事。若有看官也看了 WDS 篇的,可以对比下我提供的 .ipxe 命令脚本文件,二者有两个不起眼的差异:路径符风格 与 路径表达形式。Windows 路径符是用反斜杠“\”,并在脚本中使用的是“相对路径”形式;而这回 Linux 的脚本不仅是顺斜杠“/”,同时还使用了“绝对路径”形式。对于熟悉两种系统的看官而言,按理这都是常识,但我为什么不在 1 楼开篇讲而一定要放在(二)中?原因在于 Windows 和 Unix 两种风格书写的 .ipxe 脚本在 dnsmasq 环境中均能正常执行,但在接下来要讲的 isc-dhcp-server + tftpd-hpa 环境则不接受 Windows 风!!!这也是为什么我选择在此处来交待此事,以防细心的看官提问,并且这也是为什么我要分别提供两套附件的原因之一。

      现在正式来到 isc-dhcp-server 配置的讲解环节。与 dnsmasq 一样,isc-dhcp-server 的配置文件也有两个,第一个是 /etc/default/isc-dhcp-server,同样不带扩展名,而另一个 dhcpd.conf 默认存放在 /etc/dhcp/ 文件夹中,具体位置亦可参考(一)部分中剧透的目录结构。下图就是我提供的配置文件中的内容,我们只启用图中高亮的与 IPv4 有关的即可,其中“ens192”的来历就不再赘述:
12.ISC-DHCP-DefaultDir-Config.png

      针对第二个配置文件 dhcpd.conf,为便于解释,先将我提供的文件内容展示如下。对了,iPXE 官网给出的示例就是基于 isc-dhcp-server,请参见:Using ISC dhcpd,不过官网给出的并不是完整的配置。
  1. allow booting;
  2. allow bootp;
  3. option client-arch code 93 = unsigned integer 16;
  4. default-lease-time 600;
  5. max-lease-time 7200;
  6. authoritative;

  7. subnet 10.1.1.0 netmask 255.255.255.0 {
  8.   range dynamic-bootp 10.1.1.100 10.1.1.200;
  9. #  option domain-name-servers 8.8.8.8, 223.5.5.5;
  10. #  option domain-name "your.example.org";
  11.   option routers 10.1.1.1;
  12.   option broadcast-address 10.1.1.255;
  13. #  next-server 10.1.1.20;
  14. #  filename "ipxe.efi";
  15. }

  16. class "iPXEClients" {
  17.   match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
  18.   next-server 10.1.1.20;
  19.   if exists user-class and option user-class = "iPXE" {
  20.     filename = "Boot/iPXE/menulinux.ipxe";
  21.   } elsif option client-arch = 00:00 {
  22.     filename = "Boot/iPXE/Legacy/undionly.kpxe";
  23.   } else {
  24.     filename = "Boot/iPXE/UEFI/ipxe.efi";
  25.   }
  26. }
复制代码


      单从配置语法上看,是不是感觉比 dnsmasq 那堆有条理并且逻辑性强多了?!尤其对我这种 C/C++ 受害者而言一眼就倍感亲切,但各位请特别注意其中 filename 语句中的文件路径的写法与 WDS 和 dnsmasq 配置中正相反,它是按 Unix/Linux 的习惯!!!我最初配置 isc-dhcp-server 时没注意这点,所以花了不少时间排查问题,后来也是在 iPXE config 中发现 filename = BootiPXEmenulinux.ipxe,于是安装了那个不带 “d” 的客户端并用 get 命令才发现是 tftpd-hpa 不支持 Windows 风格的路径,可为啥 isc-dhcp-server 在下发配置时要吃掉路径字符?!细想后猜测概因 isc-dhcp-server 身为纯血 Linux 应用其不屑与 Windows 之流同流合污,所以必除之而后快!!但我至今也没想明白的一点是:在语法检测时你咋不说?!害我白花这许多时间找症结所在…… 不过这里必须得指出,isc-dhcp-server 之所以没报语法错误,也许是它真的能支持“\”,只不过在搭配仅支持“/”的 tftpd-hpa 才表现出那样,但为了尽快出稿,我暂将此事搁置,等时间充裕时再慢慢测试。后来,我又尝试过将 dnsmasq 配置中的路径改成 Unix 习惯的“/”,然而,令人匪夷所思的事情又发生了,请先看以下可以正确工作的配置:

dhcp-boot=tag:!ipxe,tag:!legacybios,Boot/iPXE/UEFI/ipxe.efi
dhcp-boot=tag:!ipxe,tag:legacybios,Boot/iPXE/Legacy/undionly.kpxe
dhcp-boot=tag:ipxe,Boot\iPXE\menulinux.ipxe

      看到没!?下发第一个启动文件那两句使用 Unix 风格没问题,但下发第二个启动文件“menulinux.ipxe”那句却 Windows 风依旧,至少在我的环境中如此。各位若有兴致也可以自己改完再用 journalctl -fu dnsmasq 去跟踪下错误…这从侧面又说明了 dnsmasq 极有可能并非 Linux 亲生…… 但反过来讲,dnsmasq 两种风格都支持也可以说是兼容性更强,这就属于萝卜白菜的问题了,教程也不讨论。但请注意:请牢记每次改配置后须 systemctl restart dnsmasq 才能生效。

      再回到 isc-dhcp-server 配置,其中那个“elsif”并非笔误,切勿写作“elseif”,但写作“else if”则是没问题的。这里再解释下其中 match if substring() 这行,它首先截取 vendor-class-identifier 字串头部 0~8 共 9 个字节并进行匹配,若其为“PXEClient”则表示该客户机为网卡 PXE 方式引导,接着继续检查是否存在 user-class,若有则判断其是否等于“iPXE”…… 这里插播一条:
假如读过 WDS 篇 的,这里请回想下在配置 M$ DHCP 时定义用户类(User Class) 那里当时是手工填写的啥?是不是这就对上了?
—— 插播结束。


      接上文,若 user-class="iPXE" 表示 iPXE 已自举完成并将 user-class 赋值为“iPXE”字符常量,同时正请求 DHCP 下发第二个启动文件,所以服务器响应给它 menulinux.ipxe;否则表示网卡刚开始请求第一个启动文件,那么就跳至 } elsif { 处接着判断 client-arch 是否等于 00(Legacy BIOS),接下来应该一看就懂了,而这个 client-arch 是在第 3 行声明的。

      同样地,为避免犯上述 elseif 这类语法错误,可用与 dnsmasq 类似命令来检测,但参数上却又有小小不同…… 真能整活儿……若无误则会返回下图所示版本号等基本信息,如下图:
  1. sudo dhcpd -t
复制代码

13.ISC-DHCP-Server-Config-Test.png

      接下来无非就是:
  1. systemctl restart tftpd-hpa
  2. systemctl restart isc-dhcp-server
复制代码


      若希望重启后继续生效,则再加以下两句:
  1. systemctl enable tftpd-hpa
  2. systemctl enable isc-dhcp-server
复制代码


      虽然 isc-dhcp-server 的日志不如 dnsmasq 详尽,但同样建议在调试过程中:
  1. journalctl -fu isc-dhcp-server
复制代码


      有可能会有看官问,为什么这里没跟踪 tftpd-hpa 的日志?有兴致的看官一试便知。

      假如配置与操作过程无误,这台 Linux 服务器则已具备下发远程无盘启动 WinPE 所必须的文件的能力了。最后再提醒一下,dnsmasq 与 isc-dhcp-server + tftpd-hpa 为“二选一”,切勿贪心欲鱼与熊掌兼得!假如先启动 dnsmasq 后想切换后者的,建议先 systemctl disable dnsmasq 后再重启服务器,因为我遇到过 tftpd 端口号 69 被占用的情况,但也不是每次。下图即是 isc-dhcp-server + tftpd-hpa 这对组合下 wimboot 加载过程,请注意看路径风格:
14.wimboot-isc-dhcp-WinPE-loading.png

15.iSCSI-WinPE-Started.png

      此至,这次的连载也进入尾声,针对直接跳过(上)篇的看官,有可能还在等待 iPXE 的内容,那么它已包含在 (上)篇 中第(二)部分。因为 iPXE 是 bootloader,属于操作系统启动之前自成一体的独立引导系统,所以不论服务器运行何种操作系统均与 iPXE 无关,而对 iPXE 客户机来讲内容是完全一样的。下图是我提供的 Linux + wimboot 方式下的 iPXE 菜单示例:
16.wimboot-Linux-Boot-Menu.png

      当然还有为各位看官精心准备的必不可少的伴手礼:
https://www.alipan.com/s/U7vczt7nfay
提取码: k8q0


---------- 紧急更正 ----------

      刚才回到家中正准备进行其它测试时,才发现上午分享的那个附件竟然是旧的 Windows 风格的脚本,原因在于此前发现该问题后为证实 dnsmasq 是否两种都兼容,就将 Boot 文件夹完全复制了一份,而在我制作自解压文件时就完全忘记这回事了...... 现在重新打包正确的附件,有劳已下载的看官重新下载正确的。

iPXE-Linux-Updated.exe
https://www.alipan.com/s/f5mFaHn8sUy
提取码: ni53

---------- 更正完毕 ----------


      同样地受云盘商限制将文件用 7-Zip 压制为唤作 iPXE-Linux.exe 的自解压包,解压后将得到 Boot、etc、Driver 三个文件夹和一个 Readme.txt 文件。Driver 中再次提供了 vmxnet3 的驱动,但相比之前 WDS 篇中所附的,其中新增了 Win10 x64 + x86 两个版本的,因为微软官方最后一版支持 x86 的 WinPE 是 WinADK 2004 所提供的,而我这篇中所用的正是用这一版重新定制过的,而 WDS 篇所附驱动是从 Win11 拷贝出来的,不适用于 Win10,在此有必要提醒各位。不过有一说一:iPXE 虽然可使普通电脑亦能 iSCSI 无盘,但目前美中不足是暂不支持 Secure Boot 安全启动。所以,有 Secure Boot 刚需的请绕道如 NUC9 这类主板/网卡自带 iSCSI Configurator 的主机!!!

      近期因琐事较多,教程不得不利用各种碎片时间来拼凑,所以出稿效率不高,(上)也是匆匆发布,事后还得不定期打下“补丁”。好在这篇(下)涉及到的内容不是很多,时间更多是花在测试、截取素材、编排等等,尤其各种测试真的是费时费力,再加上对个别文字表述得加以斟酌以免产生歧义等等,最终造成这篇(下)姗姗来迟,害得催更的看官久等,还望多包涵!!当然,水区在这中间也负有一定的不可推卸的责任……

      回顾 2022 年以来前前后后的 iSCSI 无盘三篇,如今在 iPXE 助力之下,可以讲除 Apple 以及 Unix 外,市面上基于 x86/x64、ARM 指令集的 Windows 和 Linux 包括 ESXi 在内的几大主流操作系统均能实现以 iSCSI 无盘方式进行客户机引导及安装,同时,服务器端亦不局限于或窗户或企鹅阵营,不仅如此,iPXE 本身还支持 http 协议的引导,虽然官网没提 https 但感觉也值得研究下…… 干脆就直接摊牌说吧:局域网已经拦不住 iPXE 了,从此再也不担心市面上哪些机型支不支持 iSCSI,再假以 DNS 甚至通过 internet 无盘引导或安装 OS 也许不再是梦!!!

      欣喜之余,不忘饮水思源,再次致敬 iPXE团队 的无私与辛勤付出!!!
(全文完)
发表于 2024-3-18 16:16 | 显示全部楼层
前排支持  感谢分享。。
发表于 2024-3-18 17:55 | 显示全部楼层
下文终于出现了,辛苦了
 楼主| 发表于 2024-3-18 21:47 | 显示全部楼层
rfven 发表于 2024-3-18 17:55
下文终于出现了,辛苦了

实在不好意思!刚刚发现上午给的附件竟然是旧的。新的链接已在 3 楼同样位置进行了紧急更正!
 楼主| 发表于 2024-3-18 21:47 | 显示全部楼层
姿迷姿乐 发表于 2024-3-18 16:16
前排支持  感谢分享。。

实在不好意思!刚刚发现上午给的附件竟然是旧的。新的链接已在 3 楼同样位置进行了紧急更正!
发表于 2024-9-1 09:47 | 显示全部楼层
imyz 发表于 2024-3-18 10:21
基本的安装、卸载、服务启/停等命令与上述 dnsmasq 的一致,仅须用“isc-dhcp-server”替换其中的“d ...

大佬好,抄作业使用debian12+dnsmasq当无盘服务端,物理机启动PE(2004和Win11 22H2)启动后无法自动连接iscsi目标
微信图片_20240901093649.png
微信图片_20240901094422.png
环境:
服务端:pve 虚拟机:debian12+dnsmasq+pve物理机Linux-iSCSI-Target
客户机:物理机ipxe.usb(uefi)+82599es网卡
麻烦大佬帮忙看下,谢谢!
发表于 2024-9-1 23:41 | 显示全部楼层
ganpiu007505 发表于 2024-9-1 09:47
大佬好,抄作业使用debian12+dnsmasq当无盘服务端,物理机启动PE(2004和Win11 22H2)启动后无法自动连接 ...

微信图片_2024090123330693.png
其他全部按照楼主的内容执行,最后参考ipxe网站(https://ipxe.org/howto/wds_iscsi)解决了,添加上图红行的内容
微信图片_2024090123382245.png
此故障现象为pe启动后无法ping通iscsi Linux Target服务器地址,无挂载的iscsi盘
最后感谢楼主教程。
 楼主| 发表于 2024-9-2 09:52 | 显示全部楼层
ganpiu007505 发表于 2024-9-1 23:41
其他全部按照楼主的内容执行,最后参考ipxe网站(https://ipxe.org/howto/wds_iscsi)解决了,添加上图 ...

哈哈哈哈,没想到半年后还有人在看这个帖,问题最终解决了就好。

另外想了解下 iSCSI 无盘方式在你万兆网络环境下的表现如何?想来应当比千兆的要强不少吧?!我目前还没升万兆,用起来就和原来的机械盘表现差不多。
发表于 2024-9-2 20:09 | 显示全部楼层
imyz 发表于 2024-9-2 09:52
哈哈哈哈,没想到半年后还有人在看这个帖,问题最终解决了就好。

另外想了解下 iSCSI 无盘方式在你万兆 ...

我目前的环境是pve物理机debian上有部署了 targetcli-fb(内核态iscsi服务端,开启了缓存,用户态太慢不建议),单独的双端口的82599网卡做了动态链路聚合,带宽来到了20GE。目前win10 22h2系统盘iqn的lun挂在一个nvme的pcie x1插槽的SSD上,受制于x1的速度800兆,过几天放到x4插槽的SSD上试试,目前在客户端10GE(0客户机目前做不了链路聚合,聚合完就蓝屏)速度下,硬盘响应速度还是非常给力的基本上0.3毫秒到3毫秒,最高不超过16,受制于x1的插槽目前测得的SSD速度读取500MB/s,写入200兆。目前数据虽然不好看,Win10体验非常好,因为开了缓存经常加载的已经在缓存了,在配合上atlas-os-v0.4.0调优,体验非常好。欢迎上万兆的坑,啊哈哈哈。
发表于 2024-9-3 10:00 | 显示全部楼层
我多次观摩大佬神作。ipxe下iSCSI,debian是随便安装。但是win系统,按照我的理解,定制pe完全没必要,直接无忧论坛找个支持网络和iSCSI挂载的pe就行

后面的步骤,本人测试了winntsetup这类安装器,是默认不会给目标系统装上网卡驱动的,各类精简版基本只有一个wim或者esd文件,手工dism++添加上网卡驱动,注册表改启动顺序start=0。

滚动条后提示网卡驱动未签名,f8忽略设备签名后还是会找不到设备。。。也许要拿个完整版系统试试了
 楼主| 发表于 2024-9-3 12:22 | 显示全部楼层
午夜土猪 发表于 2024-9-3 10:00
我多次观摩大佬神作。ipxe下iSCSI,debian是随便安装。但是win系统,按照我的理解,定制pe完全没必要,直接 ...

不敢当啊不敢当。

专就 PE 而言,你的理解是没错的,换句话说,假如我把市面上常见的网卡驱动集齐制成支持 iSCSI 挂载的 PE 分享给大家也就能省去各自定制的环节了。这就看个人喜好了。

而后续的安装步骤,理论上讲,若能解决将 Win 安装到 iSCSI Target 后首次重启时,在 Win 引导阶段能够从 iSCSI Target 中首先加载网卡驱动并进入引导的话,那么安装方式应该就不是问题了,而我现在确实也没找到除采用官方 setup.exe 以外的安装方式。希望有日有大佬能找到,那么安装方式就更灵活了。
发表于 2024-10-20 17:06 | 显示全部楼层
谢谢楼主的教程。
不过我在pve上实验24h2失败了,安装完之后,启动转圈蓝屏和virtio-net自带的iscsi一样
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2024-12-24 11:46 , Processed in 0.018260 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表