參考文檔:
http://labalec.fr/erwan/?page_id=958
https://ipxe.org/docs
Tiny PXE Server是一款小巧而功能強大的網(wǎng)絡系統(tǒng)啟動軟件,支持DHCP/TFTP/HTTP/BINL/DNS等多個協(xié)議,支持grub4dos,pxelinux,ipxe等多個引導器,支持從PXE/gPXE/IPXE啟動,支持http協(xié)議啟動或傳輸文件。
Tiny PXE Server下載地址:http://erwan.labalec.fr/tinypxeserver/pxesrv.zip
下載解壓后直接運行pxesrv.exe,點擊”Online“即可運行服務端,終止運行點擊”Offline“。
說明:
ProxyDhcp:是Dhcp代理服務
勾選:在局域網(wǎng)已有Dhcp服務的情況下,建議勾選,不會與現(xiàn)有Dhcp服務沖突,但它能傳遞Next-Server等選項,傳統(tǒng)Dhcp服務不一定能傳遞參數(shù)和選項;
不勾選:如果局域網(wǎng)沒有Dhcp服務,可使用此軟件的Dhcp服務,就不勾選,客戶端會得到該軟件分配的IP。
HTTPd:開啟本機的httpd服務,即web服務,可通過httpd服務來啟動系統(tǒng),瀏覽器可訪問。
SMB:文件共享協(xié)議,勾選并啟動后主機會把當前目錄下的files目錄共享出去,共享名為PXE,可通過命令:net share查看主機共享出去的目錄,如:
C:\Users\wzy>net share 共享名 資源 注解 ------------------------------------------------------------------------------- C$ C:\ 默認共享 D$ D:\ 默認共享 E$ E:\ 默認共享 IPC$ 遠程 IPC ADMIN$ C:\Windows 遠程管理 PXE E:\pxe網(wǎng)絡啟動\pxesrv\files 命令成功完成。
Option:有多個Option項,在不啟動ProxyDhcp時,它會讓主機充當DHCP服務器,分配IP地址及這些選項都能生效,啟動ProxyDhcp時,這里設(shè)定的ip地址/子網(wǎng)/DNS等選項被忽略,由主Dhcp來分配,其它選項(比如Next-server)可以被分配。
Boot File:啟動文件,可選擇files目錄下的各種啟動文件,默認ipxe.pxe適合BIOS/UEFI等多種啟動,在有些情況下也有選擇pxelinux.0等的,一般保持默認。
Filename if user-class=gPXE or iPXE:選擇ipxe或gpxe啟動菜單文件,默認menu.ipxe,在files目錄下,可以根據(jù)這個模板生成自己的菜單文件。
More:更多選項(略)
TFTP服務:面板上沒有體現(xiàn)的服務,其實Tftp服務是pxe啟動的根本,運行這個軟件時,Tftp服務自動啟動。沒有tftp服務,就沒有pxe在啟動之初下載文件的能力,Httpd或Smb服務雖然能下載文件,但客戶端pxe沒有啟動前是不能使用的;
Tftp服務適合傳輸小文件,大文件傳輸太慢,舊的pxe僅基于tftp來傳輸,不適合安裝大系統(tǒng);
檢測服務啟動是否成功,在命令行下運行,可以看到UDP:69端口在偵聽:
C:\Users\wzy>netstat -an | find '69'
UDP 172.16.6.36:69 *:*
Tftpboot目錄:即Tftp服務啟動的根目錄,它存放pxe啟動文件和菜單文件,在軟件里這個目錄是files目錄,我們可以在files下創(chuàng)建各系統(tǒng)的子目錄,但目錄結(jié)構(gòu)要與menu.ipxe啟動菜單內(nèi)核和安裝包文件對應一致。
日志:在軟件面板中上部,有一塊區(qū)域顯示日志,客戶端啟動時獲取IP,下載文件,執(zhí)行啟動等都會有日志顯示在上面,這里可以在出錯時給我們分析排除錯誤很大的幫助。
這個菜單文件才是重點,系統(tǒng)提供了多個菜單文件,擴展名為.ipxe的都是,但它并非只能叫這個擴展名,.txt或者別的擴展名也是可以的,只要它是純文件文件,符合ipxe的語法規(guī)則就可以。
具體的ipxe語法和案例可參考:https://ipxe.org/官方的文檔。
我們打開一個menu.ipxe的文檔來看看:
#!ipxe #set boot-url http://${proxydhcp}/next-server set boot-url http://${next-server} set iscsi-server ${next-server} set iqn iqn.2008-08.com.starwindsoftware:target1 set iscsi-target iscsi:${iscsi-server}::::${iqn} set nfs-server ${next-server} set cifs-server //${next-server} # Setup some basic convenience variables set menu-timeout 5000 set submenu-timeout ${menu-timeout} # Ensure we have menu-default set to something isset ${menu-default} || set menu-default exit ######## MAIN MENU ################### :start menu Welcome to iPXE's Boot Menu item item --gap -- ------------------------- Utilities ------------------------------ #item bootsan Boot On San (${iscsi-target}) item bootaoe Boot On AOE (e0.0) #item iscsi setup, sanhook or sanboot iscsi item iscsi Boot On San item pxelinux pxelinux item grub4dos grub4dos item grub2 grub2 #item grub_cd boot to dvd (via grub4dos) #item grub_startrom boot to startrom.0 (via grub4dos) item grub_floppy boot floppy (via grub4dos) item grub_hd0 boot to hd0 (via grub4dos) item hdt hdt #item netbootme Netboot.Me #item undi_dos undi_dos item disk_util Disk Utilities item winpe Live Systemes item linux Install Linux Distros item --gap -- ------------------------------ Advanced --------------------------------- item config Configure settings item shell Enter iPXE shell item reboot Reboot item exit Exit (boot local disk) choose --default exit --timeout 30000 target && goto ${target} ########## UTILITY ITEMS #################### :shell echo Type exit to get the back to the menu shell set menu-timeout 0 goto start :failed echo Booting failed, dropping to shell goto shell :reboot reboot :exit exit :cancel echo You cancelled the menu, dropping you to a shell :config config goto start :back set submenu-timeout 0 clear submenu-default goto start ......
整個菜單文件篇幅太大,我們后面省略,它有一級、二級、三級等多級菜單,很多小系統(tǒng)工具我們平時用不上,我們能根據(jù)模板編寫一級菜單就基本夠用了。
#!ipxe
這行是必須的,就像Linux的腳本文件前面的 #!/bin/bash 一樣,類似于指定命令解釋程序。
除了首行#號有特殊意義,后面的#都表示注釋
set boot-url http://${next-server} set iscsi-server ${next-server} set iqn iqn.2008-08.com.starwindsoftware:target1 set iscsi-target iscsi:${iscsi-server}::::${iqn} set nfs-server ${next-server} set cifs-server //${next-server} # Setup some basic convenience variables set menu-timeout 5000 set submenu-timeout ${menu-timeout} # Ensure we have menu-default set to something isset ${menu-default} || set menu-default exit
設(shè)置變量:一般把全局變量定義在前面,作用于下面所有啟動項。
語法:set <變量名> <變量值>
$<變量名>:調(diào)用前面已經(jīng)定義過的變量
${next-server}:是指調(diào)用在Tiny pxe server面板上指定的next-server值,通常我們把它指定為pxesrv本機
isset ${menu-default} || set menu-default exit:||表示執(zhí)行前面的命令,如果前面執(zhí)行結(jié)果為假,則執(zhí)行后面的命令,
案例:
1.安裝windows7
2.安裝windows10
3.啟動再生龍系統(tǒng)
4.啟動Debian10的系統(tǒng)安裝
實現(xiàn):
######## MAIN MENU ################### :start menu Welcome to iPXE's Boot Menu item item --gap -- ------------------------- Utilities ------------------------------ item win7 Install Windows 7 item win10 Install Windows 10 item winpe Winpe item clonezilla Boot clonezilla item debian Install Debian 10 item --gap -- ------------------------------ Advanced --------------------------------- item --key r reboot [R] Reboot the Computer item --key x exit [X] Exit (boot local disk) choose --default exit --timeout 60000 target && goto ${target}
:(冒號):這個冒號表示一段代碼,到下一個冒號前,這段代碼都是一個整體,會按照順序執(zhí)行,除非遇到goto跳轉(zhuǎn)到其它冒號的代碼段。
item:item [執(zhí)行代碼段名稱] [代碼段執(zhí)行功能描述]
表示一個標題項,比如一個啟動菜單項,一行一個標題,item和它后面的一個單詞不顯示,item后面第二個單詞之后的會顯示在屏幕上,比如item win7 Install windows 7,這行僅顯示”Install windows 7“,后面要有:win7代碼段,否則選擇它也執(zhí)行不了。
item --gap:此行用于分割一行,后面的內(nèi)容顯示在屏幕上,但它不能作為菜單項可選擇,即調(diào)整光標時,它將跳過此行不能被選擇。
item --key:item --key <快捷鍵字符> <執(zhí)行代碼段名稱> [代碼段執(zhí)行功能描述]
item --key這行菜單可定義快捷鍵,即不將光標移動到此行,直接按一個快捷鍵就會立即執(zhí)行。
choose --default: choose --default <執(zhí)行代碼段名稱> --timeout <時間毫秒> target && goto ${target}
choose --default exit --timeout 60000 target && goto ${target},設(shè)置exit為默認選擇項,可以修改成默認從硬盤啟動或者重啟皆可,&&表示執(zhí)行前面的時間到期,就執(zhí)行后面的語句。
這里才是真正要執(zhí)行的命令,代碼段以:(冒號)開頭,至下一個:(冒號)前截止,或者遇到goto跳轉(zhuǎn)到其它代碼段。
########## UTILITY ITEMS #################### #執(zhí)行錯誤返回到開始菜單項 :failed echo Booting failed, dropping to shell goto start :reboot reboot :exit exit :win7 kernel ${next-server}/wimboot || goto failed initrd ${next-server}/windows7/boot/bcd bcd || goto failed initrd ${next-server}/windows7/boot/boot.sdi boot.sdi || goto failed #windows的boot.wim最好是用微軟工具生成的winpe啟動文件,win10的也一樣,在此不贅述 initrd ${next-server}/windows7/sources/boot.wim boot.wim || goto failed boot || goto failed goto start :win10 kernel ${next-server}/wimboot || goto failed initrd ${next-server}/windows10/boot/bcd bcd || goto failed initrd ${next-server}/windows10/boot/boot.sdi boot.sdi || goto failed initrd ${next-server}/windows10/sources/boot.wim boot.wim || goto failed boot || goto failed goto start :winpe sanboot --no-describe ${boot-url}/images/winpe.iso || goto failed goto start :clonezilla initrd ${boot-url}/_ISO/clonezilla/live/initrd.img || goto failed kernel ${boot-url}/_ISO/clonezilla/live/vmlinuz boot=live config noswap nolocales edd=on nomodeset vga=788 nosplash noprompt fetch=${boot-url}/_ISO/clonezilla/live/filesystem.squashfs || goto failed boot || goto failed goto start :debian cpuid --ext 29 && set arch amd64 || set arch i386 #sanboot http://ftp.fr.debian.org/debian/dists/Debian9.1/main/installer-amd64/current/images/netboot/mini.iso sanboot ${boot-url}/images/debian-10.7.0-amd64-netinst.iso || goto failed boot || goto failed goto start
上面的代碼,每一個啟動菜單項對應一段執(zhí)行代碼,每行命令執(zhí)行都帶了 || goto failed代碼,可省略,但有它出錯了它可以返回主菜單;
kernel:調(diào)用內(nèi)核
initrd:調(diào)用img
sanboot:調(diào)用iso文件
以上啟動過程中調(diào)用的文件,也可以調(diào)用httpd服務或者smb服務上的文件來啟動,大文件不適合tftp服務來調(diào)用,速度非常慢,httpd和smb傳輸文件非???,所以代碼段執(zhí)行的文件調(diào)用本例中我們都采用httpd路徑來調(diào)取。
在files目錄下創(chuàng)建,首先進入這個目錄,在此用命令來創(chuàng)建,win的命令與linux有點類似
創(chuàng)建目錄:
cd pxesrv\files
#創(chuàng)建windows7/10及其下的boot和sources子目錄
#創(chuàng)建_ISO及其下的clonezilla子目錄
mkdir windows7\boot,windows7\sources,windows10\boot,windows10\sources,_ISO\clonezilla
拷貝或解壓win的啟動內(nèi)核文件和安裝包,x為光盤驅(qū)動符號:
# windows7內(nèi)核及wim安裝包,加載win7的iso到x盤 copy x:\boot\bcd pxesrv\files\windows7\bootcopy x:\boot\boot.sdi pxesrv\files\windows7\bootcopy x:\sources\boot.wim pxesrv\files\windows7\sources # windows10內(nèi)核及wim安裝包,加載win10的iso到x盤 copy x:\boot\bcd pxesrv\files\windows10\bootcopy x:\boot\boot.sdi pxesrv\files\windows10\bootcopy x:\sources\boot.wim pxesrv\files\windows10\sources
復制iso光盤鏡像文件到指定路徑,images存放iso文件:
copy e:\iso\winpe.iso pxesrv\files\images
copy e:\iso\debian-10.7.0-amd64-netinst.iso pxesrv\files\images
查下結(jié)果:
E:\pxe網(wǎng)絡啟動>tree /f pxesrv\files\windows7 ├─boot │ bcd │ boot.sdi │ └─sources boot.wim E:\pxe網(wǎng)絡啟動>tree /f pxesrv\files\windows10 ├─boot │ bcd │ boot.sdi │ └─sources boot.wim E:\pxe網(wǎng)絡啟動>tree /f pxesrv\files\images E:\PXE網(wǎng)絡啟動\PXESRV\FILES\IMAGES debian-10.7.0-amd64-netinst.iso winpe.iso 沒有子文件夾
結(jié)果目標文件與menu.ipxe的路徑一致。
啟動服務端:
啟動客戶端:
客戶端啟動過程:
#!ipxe set boot-url http://${next-server} # Setup some basic convenience variables set menu-timeout 5000 # Ensure we have menu-default set to something isset ${menu-default} || set menu-default exit ######## MAIN MENU ################### :start menu Welcome to iPXE's Boot Menu item item --gap -- ------------------------- Utilities ------------------------------ item win7 Install Windows 7 item win10 Install Windows 10 item winpe Winpe item clonezilla Boot clonezilla item debian Install Debian 10 item --gap -- ------------------------------ Advanced --------------------------------- item --key r reboot [R] Reboot the Computer item --key x exit [X] Exit (boot local disk) choose --default exit --timeout 60000 target && goto ${target} ########## UTILITY ITEMS #################### :failed echo Booting failed, dropping to shell goto start :reboot reboot :exit exit :win7 kernel ${next-server}/wimboot || goto failed initrd ${next-server}/windows7/boot/bcd bcd || goto failed initrd ${next-server}/windows7/boot/boot.sdi boot.sdi || goto failed #windows的boot.wim最好是用微軟工具生成的winpe啟動文件,win10的也一樣,在此不贅述 initrd ${next-server}/windows7/sources/boot.wim boot.wim || goto failed boot || goto failed goto start :win10 kernel ${next-server}/wimboot || goto failed initrd ${next-server}/windows10/boot/bcd bcd || goto failed initrd ${next-server}/windows10/boot/boot.sdi boot.sdi || goto failed initrd ${next-server}/windows10/sources/boot.wim boot.wim || goto failed boot || goto failed goto start :winpe sanboot --no-describe ${boot-url}/images/winpe.iso || goto failed goto start :clonezilla initrd ${boot-url}/_ISO/clonezilla/live/initrd.img || goto failed kernel ${boot-url}/_ISO/clonezilla/live/vmlinuz boot=live config noswap nolocales edd=on nomodeset vga=788 nosplash noprompt fetch=${boot-url}/_ISO/clonezilla/live/filesystem.squashfs || goto failed boot || goto failed goto start :debian cpuid --ext 29 && set arch amd64 || set arch i386 #sanboot http://ftp.fr.debian.org/debian/dists/Debian9.1/main/installer-amd64/current/images/netboot/mini.iso sanboot ${boot-url}/images/debian-10.7.0-amd64-netinst.iso || goto failed boot || goto failed goto start
聯(lián)系客服