PXE批量安裝Debian操作系統(tǒng)并自動(dòng)配置網(wǎng)絡(luò)環(huán)境、軟件源

本文寫于2022年05月01日,閱讀時(shí)請注意時(shí)效。落筆時(shí)syslinux最新版本為6.03,Debian的最新版本為11.3,本文采用了這兩個(gè)版本。

本文的實(shí)驗(yàn)材料較多,建議下載 pxe-debian - github 倉庫到本地,其中包含了本文實(shí)驗(yàn)所需的所有代碼文件。

前置知識

  • Debian的手動(dòng)安裝流程

  • 網(wǎng)絡(luò)配置的基礎(chǔ)知識

  • 大致讀一下SYSLINUX 網(wǎng)站中各個(gè)鏈接的所有文檔,內(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開啟一個(gè)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)→主板→啟動(dòng)順序中的網(wǎng)絡(luò)啟動(dòng)并記錄他們的system-uuid,這一步是為了后續(xù)自動(dòng)為機(jī)器配置網(wǎng)絡(luò)。在真實(shí)環(huán)境下一般使用機(jī)器的system-serial-number也就是序列號即可,一般服務(wù)器序列號都會(huì)貼在機(jī)器表面比較易得。virtualbox序列號均為0無法起到區(qū)分機(jī)器的作用所以使用system-uuid。獲取方法:將Debian安裝鏡像放入虛擬機(jī)光驅(qū),選擇Install進(jìn)入安裝流程,在選擇鍵盤后面的讀條結(jié)束后,停在Configure the network也就是選擇網(wǎng)卡的界面的時(shí)候,按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)境和軟件源的腳本,這個(gè)腳本是GPU集群管理、使用指南中配置網(wǎng)絡(luò)環(huán)境、軟件源步驟的自動(dòng)化,其內(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)境會(huì)出問題所以放棄了,如果有讀者成功可以交流一下經(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裝一個(gè)

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/文件中的語句也比較好理解,這里不做過多說明,有需求的用戶可以自行修改。

bootmenu

/www/debian11/中的文件是linux內(nèi)核和initial ram disk和一個(gè)用來標(biāo)識版本的文本文件。

/www/hosts /www/interfaces是每個(gè)服務(wù)器相同的網(wǎng)絡(luò)配置文件,當(dāng)集群中具有不同結(jié)構(gòu)的網(wǎng)卡時(shí),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,這里多寫的部分在名字不匹配時(shí)不會(huì)生效,從而可以用一個(gè)配置文件完成所有機(jī)器的網(wǎng)絡(luò)配置。改網(wǎng)卡名字的操作我不會(huì),有會(huì)的讀者可以交流一下。

/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手動(dòng)安裝過程中會(huì)在磁盤分區(qū)步驟結(jié)束后出現(xiàn),就是把硬盤掛載到了這個(gè)文件夾??梢栽诎惭b時(shí)在下圖磁盤分區(qū)寫入后切換到tty2通過ls看到硬盤里的根目錄。

寫入磁盤分區(qū)

使用方法

建議同時(shí)開三個(gè)shell。

前兩個(gè)分別執(zhí)行journalctl -fu isc-dhcp-serverjournalctl -fu tftpd-hpa來跟蹤dhcp和tftp的日志。

接著在/srv/www/文件夾中執(zhí)行python3 -m http.server 80運(yùn)行http服務(wù)。

最后啟動(dòng)需要安裝操作系統(tǒng)的虛擬機(jī),在virtualbox啟動(dòng)界面按f12選擇啟動(dòng)介質(zhì)為lan,默認(rèn)等待3秒后進(jìn)入自動(dòng)安裝。

歡迎交流

由于本文涉及的內(nèi)容過多,導(dǎo)致我很難把握寫作的分寸,其中不夠詳細(xì)/過多冗余的部分還希望讀者能夠幫忙指出。

思路總結(jié)

最開始知道PXE是以前用CentOS的時(shí)候,想要給機(jī)房機(jī)器批量安裝操作系統(tǒng),當(dāng)時(shí)看到一篇很好的step-by-step教程kickstart批量安裝CentOS7_咖喱姬姬的博客-CSDN博客,雖然沒看到SYSLINUX的官方文檔,但是因?yàn)榧t帽的文檔寫的非常詳細(xì),反復(fù)實(shí)驗(yàn)后還是照貓畫虎的把自動(dòng)安裝實(shí)現(xiàn)了。

后來CentOS變陣,服務(wù)器改用Debian。而Debian的官方文檔就不夠詳細(xì),在搭建的過程中總是會(huì)出現(xiàn)各種莫名的錯(cuò)誤,各種想法都只能靠自己的實(shí)驗(yàn)驗(yàn)證,網(wǎng)上也沒有一篇比較全面準(zhǔn)確的教程。

最后通讀了SYSLINUX的所有文檔,加上當(dāng)時(shí)通過Arch Linux了解到了Linux安裝的底層其實(shí)就是一個(gè)“在內(nèi)存中加載一個(gè)小型操作系統(tǒng)→將硬盤掛載到/target/→將文件從軟件源服務(wù)器安裝到硬盤”的過程。加上debian netboot文件給的目錄過于復(fù)雜不夠清晰,最后采取了自己寫pxelinux.cfg/default配置文件的方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容