10

IPXE+netboot+ISCSI 网络启动

 2 years ago
source link: https://hkvision.cn/2019/10/15/ipxe-netboot-iscsi-%E7%BD%91%E7%BB%9C%E5%90%AF%E5%8A%A8/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文为原创文章,转载注明出处,欢迎关注网站https://hkvision.cn

接上一篇文章Esxi+NAS+Openwrt,这篇文章我们来讲无盘启动

读了上篇文章的童鞋知道我是有NAS的,为了存储管理方便,服务器的硬盘我做了RAID6然后整个给了NAS做数据盘(ESXI直通),ESXI和NAS还有Openwrt的系统都是安装在U盘上的,因此如果我想继续安装其他的虚拟机的话,就必须在NAS上划ISCSI出来,并且需要PXE进行引导。

话说我一开始只知道PXE,后来在b站上看到了一个视频,知道了IPXE这个东西,看了他操作一遍,再结合网上的一堆零碎的教程,终于我自己实现了,这玩意真的是难者不会,会者不难。

简单的理解,IPXE是PXE的加强版

ISCSI

网上有很多介绍,那些专业化的词语我就不说了(也不会说),就简单来说,ISCSI是指在服务器上划出来一个空间(通常用一个文件表示),将此空间以磁盘的形式(注意不是目录)提供给客户端使用。对于客户端而言就仿佛是添加了一块硬盘一样,同样可以进行格式化,分区等操作,毫无问题,并且可以通过在服务器端的修改,动态的扩展和缩小磁盘大小。无盘启动就是将操作系统安装在了ISCSI中。

贴一张网上的图片,个人觉得还是很形象的

  1. 向DHCP服务器发送请求,请求自己的IP地址(这是肯定的,不然之后网络启动啥的就无从谈起了),注意这一步同样请求到了tftp服务器的所在位置
  2. DHCP服务器应答,除了IP地址外,同样包含tftp服务器的位置
  3. 向tftp服务器请求网络启动的启动镜像
  4. tftp服务器回复镜像,使用镜像进行网启
  5. 根据镜像配置,向有操作系统安装文件的服务器请求相关文件
  6. 安装操作系统

下面我们来解答一些疑问

  • 首先是tftp的配置,这里tftp服务器的地址是由DHCP服务器提供的,需要在DHCP服务器开启相关配置,等于DHCP服务器多传了一段信息,在正常的DHCP中这段信息是会被忽略掉的,只有在网络启动的时候才会被使用。OpenWRT和群晖的DHCP均可开启tftp。
  • tftp服务器需要放一些什么?tftp服务器需要放PXE的相关文件,意思就是说,网启的时候会首先去读这个启动镜像来加载IPXE的启动程序,进入IPXE的启动流程中
  • IPXE的配置需要我做什么?如果是看了b站的那个视频的话,其实很简单,你需要在menu.ipxe,boot.ipxe.cfg这些文件里面配置好你的ISCSI位置,操作系统安装文件的位置这两大位置,然后用IPXE的语法设计一套菜单出来(你可以用网上那些牛人写的菜单,但是他们的菜单只考虑了单ISCSI的情况,或者根本没有ISCSI,只是安装的时候进行网启)。菜单的设计也不难,首先是需要选择ISCSI的位置,然后选择是要安装系统还是直接启动,安装系统的话选择好安装的系统版本,就可以了。
  • 安装操作系统的时候,安装文件放哪?安装文件需要你建站,要么建一个web站,用http进行传输,要么也可以试试ftp站,ftp协议进行传输。怎么建web站和ftp站网上有很多教程,群晖的话更简单,web station界面化建站,ftp直接开启,都是可以的。
  • ISCSI呢?ISCSI仅仅是提供一块硬盘位置,群晖里面提前弄好,然后在IPXE里面配置好就行了。

安装后的再次启动

再次启动的话直接选择好ISCSI位置,直接boot就行

附上我的IPXE菜单配置

#!ipxe

# Variables are specified in boot.ipxe.cfg

# Some menu defaults
# set menu-timeout 0 if no client-specific settings found
isset ${menu-timeout} || set menu-timeout 0
set submenu-timeout ${menu-timeout}
isset ${menu-default} || set menu-default exit

# Figure out if client is 64-bit capable
cpuid --ext 29 && set arch x64 || set arch x86
cpuid --ext 29 && set archl amd64 || set archl i386

###################### SAN,ISCSI SELECTION ##########################
:san-choose
menu Choose the ISCSI target
item ubuntu1              ubuntu1(ipxe.ubuntu1)
item --gap --             ------------------------- Advanced options -------------------------------
item shell                Drop to iPXE shell
item reboot               Reboot computer
item --key x exit         Exit iPXE and continue BIOS boot               
choose --timeout ${menu-timeout} --default ${menu-default} selected || goto cancel
set menu-timeout 0
goto ${selected}

:ubuntu1
set iscsi-suffix ipxe.ubuntu1
set iscsi-name ubuntu-18.04-desktop
goto install-boot

####################### Install or Boot #############################
:install-boot
menu Install or direct boot ?
item install              install
item boot                 boot
item custom-back          Back to top menu
iseq ${menu-default} install-boot && isset ${submenu-default} && goto menu-install-boot-timed ||
choose selected && goto ${selected} || goto san-choose
:menu-install-boot-timed
choose --timeout ${submenu-timeout} --default ${submenu-default} selected && goto ${selected} || goto san-choose

:boot
echo Booting ${iscsi-name} from iSCSI for ${initiator-iqn}
set root-path ${base-iscsi}:${iscsi-suffix}
set keep-san 1
sanboot ${root-path} || goto failed
goto san-choose

:custom-back
set submenu-timeout 0
clear submenu-default
goto san-choose

###################### Install ######################################
:install
menu The system image(iso)
item ubuntu18.04          Install Ubuntu 18.04 desktop (ubuntu-18.04.1-desktop-amd64)
item custom-back          Back to top menu
iseq ${menu-default} install && isset ${submenu-default} && goto menu-cinstall-timed ||
choose selected && goto ${selected} || goto san-choose
:menu-cinstall-timed
choose --timeout ${submenu-timeout} --default ${submenu-default} selected && goto ${selected} || goto san-choose

:ubuntu18.04
echo Starting Ubuntu 18.04 ${archl} installer for ${initiator-iqn}
set root-path ${base-iscsi}:${iscsi-suffix}
set base-url ${sanboot-url}ubuntu
set keep-san 1
sanhook ${root-path} || goto failed
kernel ${base-url}/ubuntu-18.04.1-desktop-amd64/install/netboot/ubuntu-installer/amd64/linux
initrd ${base-url}/ubuntu-18.04.1-desktop-amd64/install/netboot/ubuntu-installer/amd64/initrd.gz
imgargs linux auto=true DEBCONF_DEBUG=5 partman-iscsi/login/address=${iscsi-server} partman-iscsi/login/targets=${base-iqn}:${iscsi-suffix}
boot || goto failed
goto san-choose

目前暂时只实现了Ubuntu的,根据IPXE的官网,Linux系统与Ubuntu类似,FreeBSD应该也没问题,Windows系统需要用WinPE(微软官方的PE制作工具)

2019/10/24更新

用了一个新的方法做WinPE,做完了然后我就没测试了,搞的太累了不想折腾。Unix like蛮好的,反正咱不缺Windows主机


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK