调试环境

虚拟机一个,选择VMware个人免费版,这个版本不能直接设置UEFI启动,但是可以修改虚拟机的配置文件添加配置,在虚拟机存放目录里面一个后缀是 vmx 的文件,添加下面配置,默认是没有这个选项的,直接添加到末尾就可以。虚拟机多余的磁盘声卡全部删除,然后只留下一张网卡用来启动。

firmware = "efi"

启动Arch

根据Arch官方的教程,很容易就能引导起来,tftp服务器只是用来加载内核和微码镜像,rootfs 并没有使用tftp传输,因此启动完之后,会让你选择 http/nbd/nfs 其中的一种方式加载rootfs。

另外还有一个问题,把 dnsmasq 直接绑定在物理网卡上面,DHCP 始终无法正常工作,需要创建一个网卡,然后把物理网卡桥接到刚刚创建的网卡上面,然后将 dnsmasq 的 DHCP 监听端口绑定到这个桥接网卡上。最后还需要手动给网卡配置 IP 地址,就是网关的地址192.168.100.1

# disable dns server
port=0

# enable tftp server
enable-tftp
tftp-root=/srv/tftp

interface=br0
bind-interfaces
dhcp-range=lan,192.168.100.100,192.168.100.120,255.255.255.0,12h
dhcp-boot=/arch/boot/syslinux/lpxelinux.0
dhcp-option-force=209,boot/syslinux/archiso.cfg
dhcp-option-force=210,/arch/
dhcp-option-force=option:tftp-server,192.168.100.1
dhcp-option=option:router, 192.168.100.1

关于选项中代码和别名的对照表可以执行命令dnsmasq --help dhcp获取到,其中 209 是config-file,210 是 path-prefix这两个是pxelinux自身的参数。

自定义引导

PXE 是由Intel设计的可以通过网络启动操作系统的一套协议,工作原理就是在DHCP协议里面附带启动系统需要的引导文件和启动参数,文件传输用的是 TFTP。syslinux 是一个系统引导软件项目,功能和 Grub 差不多,能从不同的磁盘上面启动引导操作系统,pxelinux 是syslinux里面的一个工具,是符合 Intel PXE规范的ROM,功能也是引导操作系统。Archios文件里面就包含了 pxelinux。配置方面主要是 pxelinux.0 的路径,配置文件的路径和路径前缀,设置在 dnsmasq 配置文件里面 DHCP 参数 209和 210。lpxelinux.0 是添加了 http/ftp 的版本,能直接加载 http/ftp 资源,这样子更加的灵活。比较麻烦的是各种文件的存放路径,不过我自己编写配置文件引导 ArchLinux并没有成功,内核能顺利加载,但是 RootFS 没法挂载。加载 ArchLinux 的配置:

LABEL arch64_http
    MENU LABEL Arch Linux x86_64
    LINUX cdrom/arch/boot/x86_64/vmlinuz
    INITRD cdrom/arch/boot/intel_ucode.img,cdrom/arch/boot/amd_ucode.img,cdrom/arch/boot/x86_64/archiso.img
    APPEND archisobasedir=arch archiso_http_srv=http://192.168.100.1/cdrom/

安装

ArchLinux 可以直接从软件仓库获取 syslinux,安装的文件在/usr/lib/syslinux目录下面,有四个文件夹:bios/diag/efi32/efi64,diag文件夹下面是诊断工具,其他三个文件夹看名字就知道如何工作。

制作一个Win10 PE

1. 下载ADK

微软官网,下载ADK和PE加载项,安装的时候一直下一步,在安装ADK的时候,只需要选择部署功能,其他都去掉。

2. 生成 PE 系统

在软件菜单 Windows Kits 目录下面找到“部署映像工具环境”,打开,执行下面命令,会在目标文件夹生成一个 PE 系统需要的文件。

copype amd64 D:\Win10PE

3. 打包生成 IOS 文件

执行命令生成 IOS 文件,这个文件就是网上各种装机工具的蓝本,不过打开只有一个 CMD 窗口什么都没有,微软也提供了定制的教程:WinPE:装载和自定义

MakeWinPEMedia /ISO D:\Win10PE D:\Win10PE\Win10PE.iso

4. 使用 pxelinux 引导

添加配置,然后启动没什么问题,如果在虚拟机里面启动,需要先把虚拟机类型设定成Windows。使用 pxelinux 引导,这个文件需要先读取到内存里面,因此传输速度决定了加载的时间,要安装完整的系统都是先启动一个 PE,然后在服务端挂载相应的原厂镜像,最后通过NFS或者Samba进行完整安装。这里面使用的是 memdisk 这个工具,也是 syslinux 项目的一部分,直接加载 img 或者 iso文件然后模拟成硬盘,不过这个工具只能在 bios模式下面使用。

LABEL Win10PE_x64
    MENU LABEL Windows 10 PE
    KERNEL memdisk
    INITRD http://192.168.100.1/Win10PE.iso
    APPEND iso raw

UEFI 启动

上面启动方式是 bios,启动uefi固件则很玄学,各种错误,然后就各种试错,最后发现如果只有一个菜单的话,使用VMware启动虚拟机就不显示菜单了,而且还要设置提示信息。能启动之后。

pxe-prompt="Press F8 or Enter key for PXE menu.", 5
pxe-service=x86PC, "BIOS-1", syslinux/bios/lpxelinux.0
pxe-service=x86PC, "BIOS-2", "syslinux/bios/lpxelinux.0"
pxe-service=7, "EFI-1", syslinux/efi64/syslinux.efi
pxe-service=7, "EFI-2", syslinux/efi64/syslinux.efi

在 uefi 模式下面不能使用 memdisk 直接挂载 iso 文件启动,事实上我并没有寻找到 pxelinux 在 uefi 模式下面启动 Windows 的例子,可能是我不会也可能是官方就没支持。所以在 uefi 模式下面使用 ipxe 替换 pxelinux。

官方下载的二进制文件默认进入的 shell ,这样子并不是很方便,我们需要重新编译文件,把启动脚本嵌入进去。脚本内容:

#!ipxe
dhcp
chain http://192.168.100.1/boot.ipxe

编译 ipxe.efi文件

git clone https://github.com/ipxe/ipxe.git && cd ipxe/src
make bin-x86_64-efi/ipxe.efi EMBED=../../init.ipxe

最后编写启动脚本,这里主要是要注意大小写的问题,文件是存放在Linux系统上面的,然后网上的 PE 系统制作时候基本都使用 Windows系统,造成了在 Windows上面文件能正常找到,在Linux上挂载的时候因为文件名大小写问题找不到文件。

#!ipxe
kernel wimboot
initrd -n BCD win10/Boot/BCD BCD
initrd -n boot.sdi win10/Boot/boot.sdi boot.sdi
initrd -n boot.wim win10/sources/boot.wim boot.wim
boot

最后测试,在物理机上面能顺利启动,在 VMware 里面,卡在 Windows logo 界面。总的来说,如果使用 bios 启动,那么就用 pexlinux 来引导,如果是 uefi,就使用 ipxe 来引导,不过这是个人喜好。

不是网管却经常需要干安装系统的活的我,最后我还是找了一个U盘,刻录WePE,在里面放了比较常用的镜像,PXE还是太麻烦了。