Openeuler搭建PXE 批量装机环境(uefi启动)

一、PXE 简介

PXE(Preboot Execution Environment,预启动执行环境)是一种由 Intel 公司开发的技术,它允许计算机通过网络接口卡(NIC)从网络服务器启动操作系统或其他软件,而无需依赖本地存储设备。

二、PXE工作流程

图片来自网络
在这里插入图片描述

  1. 客户端启动:计算机启动时,如果BIOS或UEFI配置为从网络启动(PXE启动),PXE客户端(通常集成在网卡的ROM或UEFI固件中)将被激活。
  2. DHCP请求:PXE客户端向网络发送DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)请求,以获取IP地址和其他网络配置信息。
  3. DHCP响应:DHCP服务器接收到请求后,分配一个IP地址给PXE客户端,并返回启动相关的信息,包括TFTP服务器的地址和启动文件名(如pxelinux.0,uefi模式启动不需要pxelinux.0)。
  4. TFTP引导文件下载:PXE客户端使用TFTP(Trivial File Transfer Protocol,简单文件传输协议)从TFTP服务器下载引导文件。
  5. 执行引导文件:下载完成后,PXE客户端执行引导文件,这通常是一个小型的引导加载程序,它能够进一步下载并加载操作系统内核和必要的初始化文件系统。
  6. 加载操作系统:引导加载程序从网络(通过TFTP、HTTP、FTP或其他协议)下载操作系统内核和initramfs(Linux的初始化ramdisk)或启动其他必要的组件。
  7. 启动操作系统:一旦内核和initramfs加载完成,PXE客户端将加载并启动操作系统,由ks应答文件自动安装,并从HTTP(NFS或者FTP)下载安装包

ks文件,即Kickstart文件,是一种基于Red Hat Enterprise Linux(RHEL)、CentOS和Fedora等发行版的自动化安装配置文件。

三、安装服务端

使用openeuler作为pxe服务端,使用ctyunos作为客户端,实验环境使用vmware虚拟机。

openeuler下载地址: https://www.openeuler.org/zh/download/archive/
ctyunos下载地址: https://repo.ctyun.cn/#/product/mirrorWarehouseDetails?name=ctyunos-23.01&activeName=GetISO

  1. 服务端软件安装
# yum -y install httpd tftp dhcp xinetd
  • httpd 负责传输安装包
  • tftp 负责传输引导和内核文件
  • dhcp 负责为客户端分配地址,并指定tftp服务器地址
  • xinetd 动态管理tftp的软件
  1. 配置文件修改
    2.1. 修改tftp配置文件

    # cat  /etc/xinetd.d/tftp 
    # default: off
    # description: The tftp server serves files using the trivial file transfer \
    #	protocol.  The tftp protocol is often used to boot diskless \
    #	workstations, download configuration files to network-aware printers, \
    #	and to start the installation process for some operating systems.
    service tftp
    {
    	socket_type		= dgram
    	protocol		= udp
    	wait			= yes
    	user			= root
    	server			= /usr/sbin/in.tftpd
    	server_args		= -s /var/lib/tftpboot
    	disable			= no		# 默认是禁用,需要修改成no,启用它
    	per_source		= 11
    	cps			= 100 2
    	flags			= IPv4
    }
    

    2.2. 修改dhcp配置文件

    [root@192 ~]# cat  /etc/dhcp/dhcpd.conf 
    ddns-update-style interim;
    ignore client-updates;
    next-server 192.168.0.138;		#指定tftp地址
    
    filename "";			# 指定UEFI启动文件 tftp路径(后续将修改)
    
    subnet 192.168.0.0 netmask 255.255.255.0 {
      option subnet-mask 255.255.255.0;
      range 192.168.0.100 192.168.0.200;		# 设置地址池
      option domain-name-servers 192.168.0.138;
      option routers 192.168.0.138;
      default-lease-time 600;
      max-lease-time 7200;
    }
    
  2. 挂在光盘,将启动和引导文件放到tftp目录
    3.1. 挂载光盘

    # ls /dev/sr0
    /dev/sr0
    [root@192 ~]# mkdir /mnt/cdrom
    [root@192 ~]# mount -o loop /dev/sr0 /mnt/cdrom		
    [root@192 ~]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        4.0M     0  4.0M   0% /dev
    tmpfs           714M     0  714M   0% /dev/shm
    tmpfs           286M  4.3M  282M   2% /run
    tmpfs           4.0M     0  4.0M   0% /sys/fs/cgroup
    /dev/sda1        20G  1.8G   19G   9% /
    tmpfs           714M     0  714M   0% /tmp
    /dev/sda2       195M  147M   49M  76% /boot
    /dev/loop0      3.5G  3.5G     0 100% /mnt/cdrom
    

    3.2. 将启动和引导文件放到tftp目录

    如果是arm构架的系统,只需要将grubx64.efi 更换成 grubaa64.efi 即可

    # cp  /mnt/cdrom/EFI/BOOT/grubx64.efi /var/lib/tftpboot/
    # cp  /mnt/cdrom/images/pxeboot/vmlinuz /var/lib/tftpboot/
    # cp /mnt/cdrom/images/pxeboot/initrd.img /var/lib/tftpboot/
    # cp /mnt/cdrom/EFI/BOOT/grub.cfg	/var/lib/tftpboot/
    # ls /var/lib/tftpboot/
    grub.cfg  grubx64.efi  initrd.img  vmlinuz
    
    • grubx64.efi: EFI系统分区中的一个可执行文件,负责在系统启动时提供GRUB菜单和引导加载程序的功能。当UEFI固件寻找可启动的EFI应用程序时,它会加载这个文件来启动GRUB。
    • vmlinuz:vmlinuz是压缩的Linux内核映像,它是启动Linux系统的核心,它包含了启动系统所需的所有内核代码和模块。
    • initrd.img:initrd是一个临时的根文件系统,它被加载到内存中,直到真正的根文件系统被挂载。initrd.img是initrd的镜像文件,它包含了系统启动初期所需的驱动和工具,用于支持挂载根文件系统。
    • grub.cfg:UEFI启动配置文件,定义了内核的路径、启动参数、initramfs的路径等。当系统启动时,GRUB会读取这个文件来确定如何加载操作系统。

    3.3. 回到dhcp配置文件指定,UEFI启动文件地址。

    # cat  /etc/dhcp/dhcpd.conf 
    ddns-update-style interim;
    ignore client-updates;
    next-server 192.168.0.138;
    filename "grubx64.efi";		# 这里的路径在 /var/lib/tftpboot/grubaa64.efi
    
    subnet 192.168.0.0 netmask 255.255.255.0 {
      option subnet-mask 255.255.255.0;
      range 192.168.0.100 192.168.0.200;
      option domain-name-servers 192.168.0.138;
      option routers 192.168.0.138;
      default-lease-time 600;
      max-lease-time 7200;
    }	
    

    3.4. 将光盘文件复制到http目录下,并从命名为CtyunOs

    # cp -rp  /mnt/cdrom  /var/www/html/CtyunOs
    
  3. 启动服务
    4.1. 启动服务

    [root@192 ~]# systemctl enable httpd --now
    [root@192 ~]# systemctl enable xinetd --now
    [root@192 ~]# systemctl enable dhcpd --now
    [root@192 ~]# systemctl is-active httpd
    active
    [root@192 ~]# systemctl is-active xinetd
    active
    [root@192 ~]# systemctl is-active dhcpd
    active
    

    4.2. 关闭防火墙,selinux

    [root@192 ~]# sed -i 's/enforcing/disabled/g' /etc/selinux/config 
    [root@192 ~]# setenforce 0
    [root@192 ~]# systemctl disable firewalld --now
    
  4. 编写ks文件
    5.1. 编写ks文件

    系统在安装完成后,会在/root下生成一个ks文件名为anaconda-ks.cfg,可以拿过来修改一下

    [root@192 tftpboot]#  cp /root/anaconda-ks.cfg /var/www/html/ks.cfg
    [root@192 tftpboot]#	chmod 644  /var/www/html/ks.cfg
    [root@192 tftpboot]#  cat /var/www/html/ks.cfg
    
    # Generated by Anaconda 36.16.5
    # Generated by pykickstart v3.47
    #version=DEVEL
    # Use graphical install
    # 图形化安装,text 文本界面安装
    graphical
    
    # Keyboard layouts
    keyboard --vckeymap=us --xlayouts='us'
    # System language
    lang en_US.UTF-8
    
    # Network information
    network  --bootproto=dhcp --device=ens33 --ipv6=auto --activate
    
    # Use hard drive installation media
    # 这条需要注释掉
    # harddrive --dir= --partition=LABEL=openEuler-22.03-LTS-SP3-x86_64  
    # 使用http进行安装
    url --url=http://192.168.0.138/CtyunOs/
    
    # 安装软件
    %packages
    @^minimal-environment
    
    %end
    
    # Run the Setup Agent on first boot
    firstboot --enable
    
    # Generated using Blivet version 3.4.2
    # 指定盘符安装
    ignoredisk --only-use=sda
    # Partition clearing information
    # 清理无用分区
    clearpart --none --initlabel
    # Disk partitioning information
    part /boot --fstype="xfs" --ondisk=sda --size=200
    part /boot/efi --fstype="efi" --ondisk=sda --size=200 --fsoptions="umask=0077,shortname=winnt"
    # --grow 剩余容量全部分配给 / 目录
    part / --fstype="xfs" --ondisk=sda --grow
    
    # System timezone
    timezone Asia/Shanghai --utc
    
    # Root password
    # 当前系统root密码加密过的,也可以使用明文如: rootpw 123456 ,也可以对密码进行加密如:openssl passwd -1 "123456"
    
    rootpw --iscrypted $y$j9T$lh.MU2FFv0jY1dZVS.wuIRvw$ac19XSQYD8s4tuW/73RlELQaivIof51Zy878qy.7ol9
    # 安装完系统重启
    reboot
    

    5.2. 访问一下http,测试是否能访问到镜像文件和ks文件
    在这里插入图片描述
    在这里插入图片描述

  5. 修改UEFI 配置文件

    # cat /var/lib/tftpboot/grub.cfg
    ......
    # 等待5秒后立即执行默认选项
    set timeout=5
    ### END /etc/grub.d/00_header ###
    
    search --no-floppy --set=root -l 'openEuler-22.03-LTS-SP3-x86_64'
    
    ### BEGIN /etc/grub.d/10_linux ###
    # 安装模式
    menuentry 'Install openEuler 22.03-LTS-SP3' --class openEuler --class gnu-linux --class gnu --class os {
            linuxefi vmlinuz inst.stage2=http://192.168.0.138/CtyunOs/ inst.ks=http://192.168.0.138/ks.cfg  fpi_to_tail=off
            initrdefi initrd.img
    }
    # 测试媒体安装,不需要注释掉
    #menuentry 'Test this media & install openEuler 22.03-LTS-SP3' --class openEuler --class gnu-linux --class gnu --class os {
    #       linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=openEuler-22.03-LTS-SP3-x86_64 rd.live.check fpi_to_tail=off
    #       initrdefi /images/pxeboot/initrd.img
    #}
    # 故障排除模式,不需要注释掉
    #submenu 'Troubleshooting -->' {
    #       menuentry 'Install openEuler 22.03-LTS-SP3 in basic graphics mode' --class openEuler --class gnu-linux --class gnu --class os {
    #               linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=openEuler-22.03-LTS-SP3-x86_64 nomodeset fpi_to_tail=off
    #               initrdefi /images/pxeboot/initrd.img
    #       }
    # 救援模式不需要注释掉
    #       menuentry 'Rescue a openEuler system' --class openEuler --class gnu-linux --class gnu --class os {
    #               linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=openEuler-22.03-LTS-SP3-x86_64 inst.rescue fpi_to_tail=off
    #               initrdefi /images/pxeboot/initrd.img
    #       }
    #}
    
    • linuxefi vmlinuz 指定内核位置,不加路径默认是当前路径: /var/lib/tftpboot/vmlinuz
    • inst.stage2=http://192.168.0.138/CtyunOs/ 指定镜像安装文件位置
    • inst.ks=http://192.168.0.138/ks.cfg 指定ks文件位置
    • fpi_to_tail=off 内核参数
    • initrdefi initrd.img 指定 / 系统文件路径

    到此PXE服务端已经搭建成功了!!!

四、使用客户端完成安装实验。
客户端内存必须不小于2G,PXE服务器和客户端必须处理同一个物理网络
1. 创建客户端
创建的客户端必须设置为uefi启动如下:
在虚拟机设置–> 选项 --> 高级 --> UEFI在这里插入图片描述
在这里插入图片描述
在这里插入图片描述# 安装完自动重启系统
在这里插入图片描述

五、扩展
1. ks文件的使用

官方文档参考:https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/sect-kickstart-syntax.html

博客阅读:
https://blog.51cto.com/64314491/1651417
https://www.cnblogs.com/panwenbin-logs/p/9340430.html(如何加密密码)
https://www.cnblogs.com/dinmin/articles/15348374.html(参数介绍)
https://blog.csdn.net/qq_50247813/article/details/138596629(使用bios方式安装)
2. 检查Kickstart(ks)文件是否正确
使用名为ksvalidator的命令行工具。这个工具是pykickstart软件包的一部分,能够验证ks文件的语法正确性
2.1. 安装pykickstart

# dnf -y install pykickstart

2.2. 验证ks文件

如果文件中存在问题,ksvalidator会指出具体的错误和所在的行号。ksvalidator虽然可以保证ks文件的语法正确性,但它无法保证安装会成功,也不会验证%pre、%post和%packages部分
。如果ksvalidator没有发现任何问题,这通常意味着ks文件在语法上是正确的,但您可能还需要检查文件中的其他逻辑是否符合您的安装需求。

[root@192 ~]# ksvalidator  /var/www/html/ks.cfg 

Checking kickstart file /var/www/html/ks.cfg

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值