PXE (preboot execute environment,预启动执行环境) 是由 Intel 公司设计的协议,工作在Client/Server模式。它可以使计算机通过网络启动。当计算机引导时,BIOS 把 PXE client 调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。除了可以通过网络直接运行操作系统外,也可以用于通过网络来将系统安装到本地。
PXE client是需要安装Linux的计算机,TFTP Server、DHCP Server及HTTPD Server部署在PXE Server端。Bootstrap文件、配置文件以及Linux根文件系统都放置在Linux Server上TFTP服务器的根目录下,而配置文件及系统内核部署在HTTPD server目录。
PXE服务器需要的服务: PXE+DHCP+TFTP+HTTP+NFS
DHCP服务:为客户端分配IP地址,定位启动引导文件;
TFTP服务:提供网卡启动引导程序、系统内核文件及initrd镜像文件下载;
FTP服务(或http/nfs):提供系统镜像的安装源及应答文件下载;
客户端机应具备的条件:
网卡必须支持PXE协议(现在大多数的网卡都已支持);
主板BIOS支持从网络启动。
实验环境如下所示:
PXE Server:ubuntu-18.04.2-desktop 64位操作系统,IP:192.168.31.45(它作为整个引导过程的服务端——同时充当DHCP服务端、TFTP服务端和HTTP服务端。)。pxe网口为enps1s0.
PXE Client:ubuntu-18.04.2-desktop 64位操作系统,BIOS设置为从网络启动
注意:PXE Server和PXE Client 在同一个局域网内。
安装DHCP,TFTP,HTTP,PXE, NFS 服务(本文档中命令均以root身份执行!避免权限不够的问题)
sudo apt-get update
sudo apt-get install -y isc-dhcp-server tftpd-hpa nfs-kernel-server apache2
注意:如果提示E: 无法定位软件包,执行此命令apt-get update。对应的服务可以选择一次性安装完成,也可以选择分开安装。
在isc-dhcp-server中指定dhcp的网络接口名字
sudo vi /etc/default/isc-dhcp-server
INTERFACESv4="enp1s0" # 指定的网络接口名字
INTERFACESv6="enp1s0"
在dhcpd.conf中指定
sudo vi /etc/dhcp/dhcpd.conf #在文件末尾添加即可
subnet 192.168.31.0 netmask 255.255.255.0 { #定义网络地址和子网掩码
range 192.168.31.50 192.168.31.240; #指定IP地址池的范围(起始和截止IP)
option subnet-mask 255.255.255.0; #子网掩码 可不修改
option routers 192.168.31.1; #网关IP地址
option broadcast-address 255.255.255.0; #广播地址
next-server 192.168.31.45; #server的静态IP
filename "pxelinux.0"; # 指定启动文件的名称
}
systemctl restart isc-dhcp-server #重启dhcp服务
systemctl enable isc-dhcp-server #设置为开机自启动
systemctl status isc-dhcp-server #查看dhcp服务的状态
vi /etc/default/tftpd-hpa
#使用默认设置即可
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
systemctl restart tftpd-hpa #重启tftp服务
systemctl enable tftpd-hpa #tftp服务设置为开机自启动
systemctl status tftpd-hpa #查看tftp服务
systemctl restart apache2 #重启http服务
systemctl enable apache2 #tftp服务设置为开机自启动务
systemctl status apache2
vi /etc/network/interfaces
auto enp1s0
iface enp1s0 inet static
address 192.168.31.45
netmask 255.255.255.0
gateway 192.168.31.1
dns-nameserver 8.8.8.8
ifconfig enp1s0 down
systemctl restart networking #重启网络
mkdir /var/www/html/ubuntu
sudo vi /etc/exports
/var/lib/tftpboot/ubuntu/ *(ro,async,no_root_squash,no_subtree_check)
systemctl restart nfs-kernel-server #重启nfs服务
systemctl enable nfs-kernel-server
systemctl status nfs-kernel-server
下载 netboot http://cdimage.ubuntu.com/netboot/,选择合适的镜像,下载其中的netboot.tar.gz,解压到~/netboot下。
sudo mkdir /var/lib/tftpboot/pxelinux.cfg
mkdir netboot ##在netboot.tar.gz当前目录创建netboot文件夹
tar -xzvf netboot.tar.gz -C netboot
#把这4个文件拷贝到tftp的目录下
cd netboot/ubuntu-installer/amd64/boot-screens
cp ldlinux.c32 libcom32.c32 libutil.c32 vesamenu.c32 /var/lib/tftpboot/
切换目录至netboot下
sudo cp netboot/ubuntu-installer/amd64/pxelinux.0 /var/lib/tftpboot/
cp -rf /var/www/html/ubuntu/ /var/lib/tftpboot/
vi /var/lib/tftpboot/pxelinux.cfg/default
chmod 777 /var/lib/tftpboot/pxelinux.cfg/default
DEFAULT vesamenu.c32
TIMEOUT 20
PROMPT 0
NOESCAPE 1
LABEL Install Ubuntu 18.04 Desktop
MENU LABEL Install Ubuntu 18.04 Desktop
kernel ubuntu/casper/vmlinuz
append boot=casper automatic-ubiquity netboot=nfs nfsroot=192.168.31.45:/var/lib/tftpboot/ubuntu/ initrd=ubuntu/casper/initrd url=http://192.168.31.45/preseed.seed auto=true priority=critical interface=auto netcfg/no_default_route=true quiet splash net.ifnames=0 biosdevname=0 systemd.mask=tmp.mount
ENDTEXT
若出现进入紧急状态;在/var/lib/tftpboot/pxelinux.cfg/default中加入红色字体 systemd.mask=tmp.mount即可。
下载镜像
在http://releases.ubuntu.com/选择合适镜像下载。也可以选择其他的下载地址下载ubuntu-18.04.2-desktop的镜像文件。
挂载
我的镜像文件放在了 /media目录下
chmod 777 /media
chmod 777 /mnt
sudo mount /media/ubuntu-18.04.2-desktop-amd64.iso /mnt/
sudo cp -r /mnt/* /var/www/html/ubuntu/
sudo cp -r /mnt/.disk /var/www/html/ubuntu/
touch /var/www/html/preseed.seed
chmod 777 /var/www/html/preseed.seed
需要注意时区的设置,看是否会出现乱码,若出现,建议使用其他时区,或者读者可以使用自己的preseed文件
vi /var/www/html/preseed.seed
d-i debian-installer/locale string en_US #暂时不能修改成中文,会出现时间乱码
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/toggle select No toggling
d-i keyboard-configuration/layoutcode string us
d-i keyboard-configuration/variantcode string
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string 192.168.31.106 #pxe服务器的ip地址
d-i time/zone string Asia/Shanghai #注意时间是否会出现乱序
d-i clock-setup/utc boolean true
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string 192.168.31.106
# minimal install (the only one not working!) 设置系统最小化安装
ubiquity ubiquity/minimal_install boolean true
d-i mirror/country string manual
d-i mirror/http/hostname string 192.168.31.106
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string
d-i live-installer/net-image string http://192.168.31.106/ubuntu/casper/filesystem.squashfs
#设置fenqu
d-i partman-basicfilesystems/choose_label string gpt
d-i partman-basicfilesystems/default_label string gpt
d-i partman-partitioning/choose_label string gpt
d-i partman-partitioning/default_label string gpt
d-i partman/choose_label string gpt
d-i partman/default_label string gpt
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular
d-i partman-auto/expert_recipe select \
boot-root :: \
1 1 1 free \
$bios_boot{ } \
method{ biosgrub } \
. \
100000 80 100000 ext4 \
$bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
. \
102 60 1000 linux-swap \
method{ swap } format{ } \
. \
1000000 100% 10000000 ext4 \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /home } \
.
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select Finish partitioning and write changes to disk
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/default_filesystem string ext4
d-i passwd/make-user boolean true
d-i passwd/user-fullname string MK
d-i passwd/username string mk
d-i passwd/user-password password 123456
d-i passwd/user-password-again password 123456
d-i passwd/user-uid string
d-i user-setup/allow-password-weak boolean false
d-i user-setup/encrypt-home boolean false
d-i passwd/user-default-groups string sudo adm cdrom dialout lpadmin plugdev sambashare
d-i debian-installer/allow_unauthenticated string false
$SNIPPET('preseed_apt_repo_config')
tasksel tasksel/first multiselect standard
d-i pkgsel/include string ntp ssh wget
d-i grub-installer/only_debian boolean true
d-i finish-install/reboot_in_progress note