apt install grub-imageboot
官方版和netboot版本或者是其他自己的版本都可以自己选址.
mkdir /boot/images
wget http://boot.ipxe.org/ipxe.iso -O /boot/images/ipxe.iso
#wget https://boot.netboot.xyz/ipxe/netboot.xyz.iso -O /boot/images/ipxe.iso
# Update GRUB menu to include this ISO
update-grub2
reboot
#下载内核映像
wget -q http://boot.ipxe.org/ipxe.lkrn -O /boot/ipxe.lkrn
#运行shell脚本
cat>/boot/boot.ipxe<<EOF
shell
EOF
#或者是netboot.xyz, 也可以通过chain --autofree启动自己的脚本地址
cat>/boot/boot.ipxe<<EOF
#!ipxe
cpuid --ext 29 && set arch x86_64 || set arch i686
ifopen
show mac
route
set net0/ip <ip>
set net0/netmask <netmask>
set net0/gateway <gateway>
set dns 1.1.1.1
isset ${ip} || dhcp || config
chain --autofree https://boot.netboot.xyz
EOF
#写入grub自定义脚本,此处的${SUBVOL}定义,是如果/boot是独立分区则需要移除,/boot是直接存放在根分区的情况需要带上.
echo '
if [ `grep -c /boot /etc/fstab ` -ne 1 ];then SUBVOL="/boot";else SUBVOL='';fi
cat <<EOF
menuentry "iPXE boot" {
linux16 ${SUBVOL}/ipxe.lkrn
initrd16 ${SUBVOL}/boot.ipxe
}
EOF' >/etc/grub.d/custom.cfg
chmod 755 /etc/grub.d/custom.cfg
# 更新grub配置
. /etc/os-release
case ${ID} in
centos|fedora)
grub2-mkconfig -o /boot/grub2/grub.cfg
;;
debian|ubuntu)
update-grub
;;
*)
echo "Distribution not supported. Please upgrade grub configuration manually"
esac
#sed -i 's/GRUB_DEFAULT=.*/GRUB_DEFAULT="iPXE boot"/' /etc/default/grub
grub2-set-default "iPXE boot"
grub2-editenv list
参考文章https://www.haiyun.me/archives/1246.html
ipxe默认ZLIB GZIP IMAGE_COMBOOT所以自己编译一下, 编译EFI版本的时候要去掉IMAGE_COMBOOT.
还有通过EMBED预置脚本编译成iso后, 在没有dhcp的机器上也可以进行ipxe引导.
cat>/opt/tftp/boot.ipxe<<EOF
#!ipxe
isset ${ip} || dhcp || config
ifopen
show mac
route
chain --autofree http://你的pxe服务器地址/ipxe.php
EOF
cd /tmp
yum install git mkisofs gcc make xz-devel -y
git clone git://git.ipxe.org/ipxe.git
cd ipxe/src
cat>config/local/general.h<<EOF
#define DOWNLOAD_PROTO_HTTPS
#define IMAGE_COMBOOT
#define CONSOLE_CMD
#define VLAN_CMD
#define IMAGE_ZLIB
#define IMAGE_GZIP
EOF
make EMBED=/opt/tftp/boot.ipxe
cat>config/local/general.h<<EOF
#define DOWNLOAD_PROTO_HTTPS
#define CONSOLE_CMD
#define VLAN_CMD
#define IMAGE_ZLIB
#define IMAGE_GZIP
EOF
make bin-x86_64-efi/{ipxe.efi,snponly.efi} EMBED=/opt/tftp/boot.ipxe
install -p -D -m 0644 bin/{undionly.kpxe,undionly.kkpxe} /opt/tftp/
install -p -D -m 0644 bin-x86_64-efi/{ipxe.efi,snponly.efi} /opt/tftp/
还有 bin/ipxe.iso bin/ipxe.lkrn bin/ipxe.pxe bin/ipxe.usb可以复制一下, 做ipxe网络启动只要一个ipxe.efi和snponly.efi 以及ipxe.kkpxe就够了
最近在写自动装机管理, 等写完了才在github上发现一个项目https://github.com/OneB1t/uefihttpboot
当时要是多留个心, 也不至于后面走了很多弯路.
阅读剩余部分...
最近折腾得比较头大
准备工作先建立一个web服务.
将esxi的iso下载解压并将boot.cfg配置修改好
#自定义内容
esxiurl=http://$sesrver/VMware-VMvisor-Installer-6.5.0.XXXX.x86_64.iso
isoname=VMware_esxi.iso
tmppath=tmp
isocache=esxipath
#-------------------------------------------------------------------------------------
mkdir $isocache $tmppath
wget -c $esxiurl -O $isoname
mount $isoname $tmppath
rsync -az $tmppath/ $isocache/
umount $tmppath
sed -i 's#/##g' $isocache/boot.cfg
sed -i 's/prefix/#prefix/g' $isocache/boot.cfg
sed -i 's/kernelopt/#kernelopt/g' $isocache/boot.cfg
kickstart文件也可以一起丢到esxi的web目录下面
ipxe默认没有开启支持SYSLINUX COMBOOT,需要自己编译进去
yum install git mkisofs gcc make rsync
git clone git://git.ipxe.org/ipxe.git
cd ipxe/src
cat>>config/local/general.h<<EOF
#define DOWNLOAD_PROTO_HTTPS
#define IMAGE_COMBOOT
EOF
make bin/{ipxe.iso,undionly.kkpxe,ipxe.usb} bin-x86_64-efi/ipxe.efi
mkdir ipxe
cp bin/{ipxe.iso,undionly.kkpxe,ipxe.usb} bin-x86_64-efi/ipxe.efi ipxe
编译好的undionly.kkpxe放到tftp目录下, 然后dhcp引导加载
IPXE脚本部分:
#!ipxe
iseq ${platform} efi && goto is_efi ||
kernel {$mirror}/mboot.c32 -c {$mirror}/boot.cfg ks=http://{$server}/kickstart prefix={$mirror} nameserver={$dns} BOOTIF={$mac} ip={$ip} netmask={$netmask} gateway={$gateway} kernelopt=allowLegacyCPU=true
boot
:is_efi
kernel {$mirror}/efi/boot/bootx64.efi -c {$mirror}/boot.cfg ks=http://{$server}/kickstart prefix={$mirror} nameserver={$dns} BOOTIF={$mac} ip={$ip} netmask={$netmask} gateway={$gateway} kernelopt=allowLegacyCPU=true
boot
{$mirror}是esxi的iso解压出来可以http访问的地址
这里特别感谢https://blog.open4j.com/2019/05/30/ipxe-build-embedded-script/ 点破了COMBOOT的问题.