Pxe Dnsmasq
nginx:HTTP服务器
dnsmasq:充当DNS、tftp、dhcp服务器
apt install -y nginx dnsmasq
root@pxe:~# egrep -v '^#|^$' /etc/dnsmasq.conf
server=114.114.114.144
dhcp-range=172.16.2.50,172.16.2.150,255.255.255.0,12h
dhcp-boot=ubuntu/1804/x86_64/pxelinux.0
enable-tftp
tftp-root=/var/ftpd
log-queries
log-dhcp
说明:
dhcp-range指定的范围要与部署dnsmasq的服务器处于一个网段中。
root@pxe:~# mkdir -pv /var/ftpd
root@pxe:~# mkdir -pv /var/www/html/{ubuntu,centos}/{x86_64,aarch_64}
root@pxe:~# mount ubuntu-18.04.5-server-amd64.iso /var/www/html/ubuntu/x86_64/
root@pxe:~# cat /var/www/html/ubuntu/ks.cfg
#Generated by Kickstart Configurator
#platform=AMD64 or Intel EM64T
#System language
lang en_US
#Language modules to install
langsupport en_US
#System keyboard
keyboard us
#System mouse
mouse
#System timezone
timezone Asia/Shanghai
#Root password
rootpw --iscrypted $1$randoma$h0gKBphJeu7P27YUe6rSU/
#Initial user
user inspur --fullname "inspur" --iscrypted --password $1$randoma$h0gKBphJeu7P27YUe6rSU/
#Reboot after installation
reboot
#Use text mode install
#text
#Install OS instead of upgrade
#install
#Use Web installation
url --url http://172.16.2.30/ubuntu/x86_64/
#System bootloader configuration
bootloader --location=mbr
#Clear the Master Boot Record
zerombr yes
#Partition clearing information
clearpart --all --initlabel
#Disk partitioning information
part / --fstype ext4 --size 1 --grow --asprimary
#System authorization infomation
auth --useshadow --enablemd5
#Network information
#network --bootproto=dhcp --device=eth0
#Firewall configuration
firewall --disabled
#Do not configure the X Window System
skipx
%packages
openssh-server
openssh-client
net-tools
curl
%post
#curl -o /root/installationytungsingle_offline.tar.gz http://192.168.209.32/installationytungsingle_offline.tar.gz
#tar -zxvf /root/installationytungsingle_offline.tar.gz -C /root
#cd /root/installationytungsingle_offline
#bash install.sh
mkdir -p /root/.ssh ||true
cat >> /root/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbi3APCvlgZ0Wtp+FAwfIbPKsMudJkvQbsk2SNcmCczRGxWUwe8kFVixrJrw4WYNLUvZZzuAUEEIf8MCU4kFHXmLhM8DNAK4DCSOBEv3tkqRH2LK7vlV8M71rogu9Whw/40hPo6LUZOxrEqKtBdE9XHLeU8+dSHg/vExVzHgdkG+prQK/LH746FFLitzgchu0SkpPzPhy67R+a3A/p3GjJnZHQWf4J8ahZrIHBMwVyPqnfOyy0C8NM9zp/WqeQyY6gKT4PF+8uTABtkRp4LD1x8iM4yPe4+odXoJAsICGc04zkmC6yPvggskmL6fqPaSwwFvQamBY2E5gPwB8l7AQP
EOF
chmod 600 /root/.ssh/authorized_keys
ks文件可以使用system-config-kickstart工具进行生成。注意:尽量在相同的操作系统(发行版、版本)上进行生成,例如CentOS6的ks要使用CentOS6系统上生成;CentOS7的ks要使用CentOS7系统上生成;Ubuntu1804的ks要使用Ubuntu1804的系统生成。不能通用。
解压放至网络引导启动的根路径下:
可以从如下途径获取pxelinux BootLoader:
从iso安装光盘中(ISOROOT/install/netboot)获取(推荐,最不容易出错,下面的其他方式都可能有版本不兼容问题)
从netboot安装包(netboot.tar.gz)中获取:Ubuntu系统Netboot Images下载
从syslinux安装包(syslinux-6.03.zip)中获取:获取syslinux安装包
经测试,下载的netboot有问题,改用iso中的netboot就没有问题。
root@pxe:~# mkdir -pv /var/ftpd/ubuntu/1804/{x86_64,arm64}
mkdir: created directory '/var/ftpd/ubuntu'
mkdir: created directory '/var/ftpd/ubuntu/1804'
mkdir: created directory '/var/ftpd/ubuntu/1804/x86_64'
mkdir: created directory '/var/ftpd/ubuntu/1804/arm64'
root@pxe:~# cp -rfa /var/www/html/ubuntu/x86_64/install/netboot/* /var/ftpd/ubuntu/1804/x86_64
root@pxe:~# tree /var/ftpd/ubuntu/1804/x86_64
/var/ftpd/ubuntu/1804/x86_64
├── ldlinux.c32 -> ubuntu-installer/amd64/boot-screens/ldlinux.c32
├── pxelinux.0 -> ubuntu-installer/amd64/pxelinux.0
├── pxelinux.cfg -> ubuntu-installer/amd64/pxelinux.cfg
├── ubuntu-installer
│ └── amd64
│ ├── boot-screens
│ │ ├── adtxt.cfg
│ │ ├── exithelp.cfg
│ │ ├── f10.txt
│ │ ├── f1.txt
│ │ ├── f2.txt
│ │ ├── f3.txt
│ │ ├── f4.txt
│ │ ├── f5.txt
│ │ ├── f6.txt
│ │ ├── f7.txt
│ │ ├── f8.txt
│ │ ├── f9.txt
│ │ ├── ldlinux.c32
│ │ ├── libcom32.c32
│ │ ├── libutil.c32
│ │ ├── menu.cfg
│ │ ├── prompt.cfg
│ │ ├── rqtxt.cfg
│ │ ├── splash.png
│ │ ├── stdmenu.cfg
│ │ ├── syslinux.cfg
│ │ ├── txt.cfg
│ │ └── vesamenu.c32
│ ├── initrd.gz
│ ├── linux
│ ├── pxelinux.0
│ └── pxelinux.cfg
│ └── default -> ../boot-screens/syslinux.cfg
└── version.info
5 directories, 30 files
root@pxe:~# vim /var/ftpd/ubuntu/1804/x86_64/pxelinux.cfg/default
root@pxe:~# cat /var/ftpd/ubuntu/1804/x86_64/pxelinux.cfg/default
# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
path ubuntu-installer/amd64/boot-screens/
include ubuntu-installer/amd64/boot-screens/menu.cfg # 引入其他配置,是菜单的总入口
default ubuntu-installer/amd64/boot-screens/vesamenu.c32 # 指定启动菜单
prompt 0
timeout 50
timeout 由0修改为50。
root@pxe:~# cat /var/ftpd/ubuntu/1804/x86_64/ubuntu-installer/amd64/boot-screens/txt.cfg
default install
label install
menu label ^Install
menu default
kernel ubuntu-installer/amd64/linux
#append vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet
append ks=http://172.16.2.30/ubuntu/ks.cfg vga=788 initrd=ubuntu-installer/amd64/initrd.gz live-installer/net-image=http://172.16.2.30/ubuntu/x86_64/install/filesystem.squashfs clock-setup/ntp=false ip=dhcp ksdevice=bootif --- quiet
label cli
menu label ^Command-line install
kernel ubuntu-installer/amd64/linux
append tasks=standard pkgsel/language-pack-patterns= pkgsel/install-language-support=false vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet
原生的netboot目录下,通过include指定将多个pxelinux的配置文件组合在一起。我们也可以只提取我们关心的信息。形成自己的目录结构。这样文件数量比较少,比较简单 。
cd /var/ftpd/ubuntu/1804/x86_64
mkdir pxelinux.cfg
cp -rf /var/www/html/ubuntu/x86_64/install/netboot/ubuntu-installer/amd64/{initrd.gz,linux,pxelinux.0} .
cp -rf /var/www/html/ubuntu/x86_64/install/netboot/ubuntu-installer/amd64/boot-screens/ldlinux.c32 .
cp -rf /var/www/html/ubuntu/x86_64/install/netboot/ubuntu-installer/amd64/boot-screens/syslinux.cfg pxelinux.cfg/default
root@pxe:/var/ftpd/ubuntu/1804/x86_64# tree /var/ftpd/ubuntu/1804/x86_64
/var/ftpd/ubuntu/1804/x86_64
├── initrd.gz
├── ldlinux.c32
├── linux
├── pxelinux.0
└── pxelinux.cfg
└── default
1 directory, 5 files
Pxelinux配置文件修改如下:
root@pxe:~# cat /var/ftpd/ubuntu/1804/x86_64/pxelinux.cfg/default
# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
default install
label install
menu label ^Install
menu default
kernel linux
append ks=http://172.16.2.30/ubuntu/ks.cfg vga=788 initrd=initrd.gz live-installer/net-image=http://172.16.2.30/ubuntu/x86_64/install/filesystem.squashfs clock-setup/ntp=false ip=dhcp ksdevice=bootif --- quiet
prompt 0
timeout 1
配置文件注意点:
- ks参数指定kickstart配置文件。而ks文件中指定如何读取安装介质,例如cdrom、硬盘、ftp、http等。
live-installer/net-image=filesystem.squashfs配置是必须的。filesystem.squashfs是一个只读文件系统。貌似从Ubuntu12.04开始,Pxe安装Ubuntu就需要指定这个文件,否则会报错。(个人理解:在这个文件系统中,运行anaconda程序读取ks文件。)- if=dhcp,指定pxe启动临时系统是自动获取IP。可以手动配置:ip=10.12.190.183 netmask=255.255.255.0 gateway=10.12.13.254 dns=202.106.0.20
- ksdevice= 是为了指定使用哪块网卡,因为机器有多块网卡,无人值守会卡在这里。ksdevice=eth0
如果要进入启动菜单,则:
root@pxe:/var/ftpd/ubuntu/1804/x86_64# cp ubuntu-installer/amd64/boot-screens/vesamenu.c32 .
root@pxe:/var/ftpd/ubuntu/1804/x86_64# cp ubuntu-installer/amd64/boot-screens/libcom32.c32 .
root@pxe:/var/ftpd/ubuntu/1804/x86_64# cp ubuntu-installer/amd64/boot-screens/libutil.c32 .
# vesamenu.c32会依赖libcom32.c32、libutil.c32。
# 配置文件中配置启动菜单:default指令
root@pxe:/var/ftpd/ubuntu/1804/x86_64# cat pxelinux.cfg/default
# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
default vesamenu.c32
#menu background splash.png
menu color title * #FFFFFFFF *
MENU TITLE INSPUR OS INSTALLER
label install
menu label ^Install
menu default
kernel linux
append ks=http://172.16.2.30/ubuntu/ks.cfg vga=788 initrd=initrd.gz live-installer/net-image=http://172.16.2.30/ubuntu/x86_64/install/filesystem.squashfs clock-setup/ntp=false ip=dhcp ksdevice=bootif --- quiet
prompt 0
timeout 50
UEFI和Legacy模式PXE安装操作系统原理一致,不同模式安装仅有启动文件不同,UEFI模式下获取对应的启动文件即可。
pxe文件获取(UEFI)模式:
1. 执行mount /dev/cdrom /mnt命令将光盘挂载至/mnt目录下 2. 执行cd /mnt/EFI/BOOT/命令进入光盘启动文件目录下 3. 执行cp BOOTX64.EFI grub.cfg grubx64.efi /var/lib/tftpboot/ cp /mnt/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/命令将相关启动文件复制到tftp服务根目录下 4. 执行vim /var/lib/tftpboot/grub.cfg命令编辑grub.cfg文件
# CENTOS
mount /dev/cdrom /mnt
cd /mnt/EFI/BOOT/
cp BOOTX64.EFI grub.cfg grubx64.efi /var/lib/tftpboot/
cp /mnt/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/
vim /var/lib/tftpboot/grub.cfg
set default="0"
set timeout=3
menuentry 'Install CentOS Linux 8.0.1905' {
linuxefi /vmlinuz ip=dhcp ks=http://PXE源服务器IP地址/ks.cfg
initrdefi /initrd.img
}
dhcp服务中要将dhcp-boot=ubuntu/1804/x86_64/pxelinux.0修改为BOOTX64.EFI
# Ubuntu
root@pve02:~/pxeboot/html/ubuntu/x86_64# cp -rfa EFI/BOOT/{BOOTx64.EFI,grubx64.efi} /root/pxeboot/files/ftpd/UEFI/Ubuntu/1804/x86_64/
cp -rf /root/pxeboot/html/ubuntu/x86_64/boot/grub/grub.cfg UEFI/
root@pve02:~/pxeboot/html/ubuntu/x86_64# cp -rfa install/netboot/ubuntu-installer/amd64/{initrd.gz,linux} /root/pxeboot/files/ftpd/UEFI/Ubuntu/1804/x86_64/
参考:https://support.huawei.com/enterprise/zh/knowledge/EKB1100052627
https://blog.csdn.net/qq_44839276/article/details/123528872
https://www.cnblogs.com/lixuebin/p/10814282.html
https://www.jianshu.com/p/631e57ce38f1?from=singlemessage
Legacy模式使用pxelinux.0引导;UEFI模式使用BOOTAA64.EFI(ARM架构引导文件),x86架构为(BOOTX64.EFI)引导。
对于内核文件和initrd文件是不区分Legacy模式和UEFI模式的。
mkdir -pv {UEFI,Legacy}/{Ubuntu,CentOS,UOS,KylinOS}
mkdir -pv {UEFI,Legacy}/Ubuntu/{1804,2004}/{x86_64,aarch_64}
mkdir -pv {UEFI,Legacy}/CentOS/{76,79}/{x86_64,aarch_64}
mkdir -pv {UEFI,Legacy}/UOS/v20/{x86_64,aarch_64}
mkdir -pv {UEFI,Legacy}/KylinOS/v10/{x86_64,aarch_64}
mkdir -pv Ubuntu/{1804,2004}/{x86_64,aarch_64}/{UEFI,Legacy}
mkdir -pv CentOS/{76,79}/{x86_64,aarch_64}/{UEFI,Legacy}
mkdir -pv UOS/v20/{x86_64,aarch_64}/{UEFI,Legacy}
mkdir -pv KylinOS/v10/{x86_64,aarch_64}/{UEFI,Legacy}
https://blog.51cto.com/u_14783669/2993435
https://blog.csdn.net/weixin_46243964/article/details/119650128
https://www.docin.com/p-2246823087.html
Ubuntu20.04:
PXE 批量安装 Ubuntu 20.04-automated installation
https://blog.bwcxtech.com/posts/4b16559e
PXE网络启动提示no default or ui configuration directive问题解决
cobbler:
https://www.cnblogs.com/f-ck-need-u/p/7347883.html
https://blog.csdn.net/weixin_40228200/article/details/123222782
https://blog.csdn.net/weixin_46108954/article/details/105869201
https://os.51cto.com/article/694341.html
BIOS/UEFI与BootLoader:BootLoader是由固件(BIOS 或 UEFI)启动的软件。
1、https://wiki.archlinux.org/title/Arch_boot_process#System_initialization
2、https://wiki.archlinux.org/title/Syslinux#BIOS_Systems