本文寫于2022年05月01日山憨,閱讀時請注意時效。落筆時syslinux最新版本為6.03冕末,Debian的最新版本為11.3萍歉,本文采用了這兩個版本。
本文的實(shí)驗(yàn)材料較多档桃,建議下載 pxe-debian - github 倉庫到本地枪孩,其中包含了本文實(shí)驗(yàn)所需的所有代碼文件。
前置知識
Debian的手動安裝流程
網(wǎng)絡(luò)配置的基礎(chǔ)知識
大致讀一下SYSLINUX 網(wǎng)站中各個鏈接的所有文檔藻肄,內(nèi)容不多蔑舞,達(dá)到能當(dāng)字典查的程度就行
本文屬于GPU集群管理、使用指南中的一篇嘹屯,前置知識可以參考相應(yīng)內(nèi)容
實(shí)驗(yàn)準(zhǔn)備
一臺裝好Debian 11的虛擬機(jī)(hostname: node18)攻询,不需要提前配置虛擬機(jī),方法參照前置知識中的鏈接
python或者其他http服務(wù)器軟件
提前準(zhǔn)備好pxe-debian文件夾州弟,文件目錄如下钧栖,在
pxe-debian
中執(zhí)行python -m http.server 8000
開啟一個http服務(wù)器
pxe-debian/
├── initpxe.sh
├── init.sh
├── interfaces
├── pxefiles
│ ├── default
│ ├── dhcpd.conf
│ ├── hosts
│ ├── interfaces
│ ├── preseed-vm-20220501.cfg
│ └── uuids
├── README.md
├── resolv.conf
└── sources.list
- 一臺以上空白的虛擬機(jī)作為安裝操作系統(tǒng)的對象,需要提前開啟
系統(tǒng)→主板→啟動順序
中的網(wǎng)絡(luò)啟動并記錄他們的system-uuid婆翔,這一步是為了后續(xù)自動為機(jī)器配置網(wǎng)絡(luò)拯杠。在真實(shí)環(huán)境下一般使用機(jī)器的system-serial-number也就是序列號即可,一般服務(wù)器序列號都會貼在機(jī)器表面比較易得啃奴。virtualbox序列號均為0無法起到區(qū)分機(jī)器的作用所以使用system-uuid潭陪。獲取方法:將Debian安裝鏡像放入虛擬機(jī)光驅(qū),選擇Install進(jìn)入安裝流程最蕾,在選擇鍵盤后面的讀條結(jié)束后依溯,停在Configure the network也就是選擇網(wǎng)卡的界面的時候,按alt + f2
切換到tty2瘟则,輸入命令dmidecode -s system-uuid
即可得到虛擬機(jī)的uuid黎炉。
- 之后修改
pxe-debian/pxefiles/uuids
與實(shí)際匹配即可,本文使用了node08
node10
node20
作為待安裝操作系統(tǒng)的節(jié)點(diǎn)
初始化PXE服務(wù)器節(jié)點(diǎn)環(huán)境
在剛安裝好操作系統(tǒng)的node18
醋拧,執(zhí)行wget http://192.168.56.1:8000/init.sh
下載配置網(wǎng)絡(luò)環(huán)境和軟件源的腳本拜隧,這個腳本是GPU集群管理、使用指南中配置網(wǎng)絡(luò)環(huán)境趁仙、軟件源步驟的自動化洪添,其內(nèi)容如下:
#!/bin/bash
fileserver='http://192.168.56.1:8000'
stamp=$(date +%Y%m%d%H%M%S).$(whoami)
sed -i '/#PermitRootLogin/i PermitRootLogin yes' /etc/ssh/sshd_config
systemctl restart sshd
mv /etc/network/interfaces /etc/network/interfaces.${stamp}
wget -P /etc/network/ ${fileserver}/interfaces
mv /etc/resolv.conf /etc/resolv.conf.${stamp}
wget -P /etc/ ${fileserver}/resolv.conf
ifdown --all
ifup --all
mv /etc/apt/sources.list /etc/apt/sources.list.${stamp}
wget -P /etc/apt/ ${fileserver}/sources.list
apt update
下載完成后,執(zhí)行bash -x init.sh
運(yùn)行腳本雀费,-x
參數(shù)可以顯示即將執(zhí)行的命令干奢。
搭建PXE服務(wù)器
注意:本文選擇了Debian Installation Guide中推薦的isc-dhcp-server和tftpd-hpa提供dhcp和tftp服務(wù)。我還嘗試過dnsmasq但是在機(jī)房環(huán)境會出問題所以放棄了盏袄,如果有讀者成功可以交流一下經(jīng)驗(yàn)忿峻。
接著上面的腳本之后執(zhí)行wget http://192.168.56.1:8000/initpxe.sh
下載配置PXE服務(wù)器的腳本薄啥,其內(nèi)容如下:
#!/bin/bash
apt install -y isc-dhcp-server tftpd-hpa
fileserver='http://192.168.56.1:8000/pxefiles'
mkdir pxe/
cd pxe/
wget --no-check-certificate https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.gz
tar -zxf syslinux-6.03.tar.gz
wget https://mirrors.ustc.edu.cn/debian/dists/bullseye/main/installer-amd64/current/images/netboot/netboot.tar.gz
mkdir netboot
tar -zxf netboot.tar.gz -C netboot/
mkdir -p /srv/tftp/lib/
mkdir -p /srv/tftp/pxelinux.cfg/
mkdir -p /srv/www/debian11/
cp syslinux-6.03/bios/com32/elflink/ldlinux/ldlinux.c32 /srv/tftp/
cp syslinux-6.03/bios/com32/libutil/libutil.c32 /srv/tftp/lib/
cp syslinux-6.03/bios/com32/menu/menu.c32 /srv/tftp/lib/
cp syslinux-6.03/bios/core/lpxelinux.0 /srv/tftp/
cp netboot/version.info /srv/www/debian11/
cp netboot/debian-installer/amd64/initrd.gz /srv/www/debian11/
cp netboot/debian-installer/amd64/linux /srv/www/debian11/
wget -P /srv/tftp/pxelinux.cfg/ ${fileserver}/default
wget -P /srv/www/ ${fileserver}/hosts
wget -P /srv/www/ ${fileserver}/interfaces
wget -P /srv/www/ ${fileserver}/preseed-vm-20220501.cfg
wget -P /srv/www/ ${fileserver}/uuids
sed -i 's/INTERFACESv4=""/INTERFACESv4="enp0s3"/' /etc/default/isc-dhcp-server
mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.$(date +%Y%m%d%H%M%S).$(whoami)
wget -P /etc/dhcp/ ${fileserver}/dhcpd.conf
systemctl restart isc-dhcp-server tftpd-hpa
可以看到內(nèi)容大部分是在復(fù)制文件,腳本執(zhí)行完成后逛尚,使用tree /srv/
查看文件結(jié)構(gòu)如下垄惧,沒有tree可以用apt裝一個
root@node18:~# tree /srv/
/srv/
├── tftp
│ ├── ldlinux.c32
│ ├── lib
│ │ ├── libutil.c32
│ │ └── menu.c32
│ ├── lpxelinux.0
│ └── pxelinux.cfg
│ └── default
└── www
├── debian11
│ ├── initrd.gz
│ ├── linux
│ └── version.info
├── hosts
├── interfaces
├── preseed-vm-20220501.cfg
└── uuids
5 directories, 12 files
各文件的用途
這一部分簡單介紹/srv/
目錄中文件的用途,建議通讀PXELINUX網(wǎng)站中的所有內(nèi)容以獲得syslinux绰寞、pxelinux的全面了解到逊。本文還參考了Debian Installation Guide的相關(guān)章節(jié)(4.5、5.3滤钱、附錄B)觉壶。
其中/srv/tftp/
目錄中除/pxelinux.cfg/default
意外其他都是syslinux的文件,不需要修改件缸,default文件是pxelinux的boot界面文件铜靶,截圖如下,下一節(jié)將介紹如何使用他炊。/pxelinux.cfg/default/
文件中的語句也比較好理解争剿,這里不做過多說明,有需求的用戶可以自行修改痊末。
/www/debian11/
中的文件是linux內(nèi)核和initial ram disk和一個用來標(biāo)識版本的文本文件蚕苇。
/www/hosts
/www/interfaces
是每個服務(wù)器相同的網(wǎng)絡(luò)配置文件,當(dāng)集群中具有不同結(jié)構(gòu)的網(wǎng)卡時舌胶,interfaces文件可以適當(dāng)冗余捆蜀,比如我在機(jī)房環(huán)境中使用的interfaces如下:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eno1
iface eno1 inet static
address 172.20.137.1fakenodeid/24
gateway 172.20.137.1
dns-servers 8.8.8.8 114.114.114.114
auto ens10f0
iface ens10f0 inet static
address 12.12.12.1fakenodeid/24
auto ens10f1
iface ens10f1 inet static
address 13.13.13.1fakenodeid/24
auto enp6s0f0
iface enp6s0f0 inet static
address 12.12.12.1fakenodeid/24
auto enp6s0f1
iface enp6s0f1 inet static
address 13.13.13.1fakenodeid/24
其中eno1是每臺機(jī)器都同名的千兆網(wǎng)卡疮丛,而一部分服務(wù)器的兩張萬兆網(wǎng)卡名字是ens10f0
ens10f1
幔嫂,另一部分機(jī)器是enp6s0f0
enp6s0f1
,這里多寫的部分在名字不匹配時不會生效誊薄,從而可以用一個配置文件完成所有機(jī)器的網(wǎng)絡(luò)配置履恩。改網(wǎng)卡名字的操作我不會,有會的讀者可以交流一下呢蔫。
/www/uuids/
中記錄了機(jī)器的uuid和hostname的對應(yīng)情況切心,讀者可以根據(jù)實(shí)際情況修改。機(jī)房環(huán)境一般使用dmidecode -s system-serial-number
獲取序列號或者直接從機(jī)器貼的標(biāo)簽上手抄片吊。
/www/preseed-vm-20220501.cfg/
是Debian安裝過程的預(yù)置文件绽昏,寫法參考bullseye preseed 。文件最后late-command部分就是shell腳本俏脊,替換掉了配置文件中的fakehost占位符全谤,完成了網(wǎng)絡(luò)的配置和軟件源的配置。如果讀者有其他需求比如需要預(yù)裝git爷贫、tree等軟件都可以直接寫在這里认然。需要注意安裝后的操作系統(tǒng)的根目錄是/target/
补憾,而in-target
命令的執(zhí)行目錄是在/target/root/
中,而不帶這一前綴的命令執(zhí)行目錄在/root/
卷员。
/ # 系統(tǒng)當(dāng)前的根目錄盈匾,在內(nèi)存中
├── bin
├── ...
├── root # 普通命令執(zhí)行的位置
├── ...
└── target # 系統(tǒng)重啟后的根目錄 ‘/’
├── bin
├── ...
├── root # in-target命令執(zhí)行的位置
└── ...
這里的/target/
在Debian手動安裝過程中會在磁盤分區(qū)步驟結(jié)束后出現(xiàn),就是把硬盤掛載到了這個文件夾毕骡∠鞫可以在安裝時在下圖磁盤分區(qū)寫入后切換到tty2通過ls看到硬盤里的根目錄。
使用方法
建議同時開三個shell挺峡。
前兩個分別執(zhí)行journalctl -fu isc-dhcp-server
和journalctl -fu tftpd-hpa
來跟蹤dhcp和tftp的日志葵孤。
接著在/srv/www/
文件夾中執(zhí)行python3 -m http.server 80
運(yùn)行http服務(wù)。
最后啟動需要安裝操作系統(tǒng)的虛擬機(jī)橱赠,在virtualbox啟動界面按f12
選擇啟動介質(zhì)為lan
尤仍,默認(rèn)等待3秒后進(jìn)入自動安裝。
歡迎交流
由于本文涉及的內(nèi)容過多狭姨,導(dǎo)致我很難把握寫作的分寸宰啦,其中不夠詳細(xì)/過多冗余的部分還希望讀者能夠幫忙指出。
思路總結(jié)
最開始知道PXE是以前用CentOS的時候饼拍,想要給機(jī)房機(jī)器批量安裝操作系統(tǒng)赡模,當(dāng)時看到一篇很好的step-by-step教程kickstart批量安裝CentOS7_咖喱姬姬的博客-CSDN博客,雖然沒看到SYSLINUX的官方文檔师抄,但是因?yàn)榧t帽的文檔寫的非常詳細(xì)漓柑,反復(fù)實(shí)驗(yàn)后還是照貓畫虎的把自動安裝實(shí)現(xiàn)了。
后來CentOS變陣叨吮,服務(wù)器改用Debian辆布。而Debian的官方文檔就不夠詳細(xì),在搭建的過程中總是會出現(xiàn)各種莫名的錯誤茶鉴,各種想法都只能靠自己的實(shí)驗(yàn)驗(yàn)證锋玲,網(wǎng)上也沒有一篇比較全面準(zhǔn)確的教程。
最后通讀了SYSLINUX的所有文檔涵叮,加上當(dāng)時通過Arch Linux了解到了Linux安裝的底層其實(shí)就是一個“在內(nèi)存中加載一個小型操作系統(tǒng)→將硬盤掛載到/target/
→將文件從軟件源服務(wù)器安裝到硬盤”的過程惭蹂。加上debian netboot文件給的目錄過于復(fù)雜不夠清晰,最后采取了自己寫pxelinux.cfg/default
配置文件的方法割粮。