pxe 布置 linux

 

本文简介

本文简介

什么是PXE

  • PXE(pre-boot execution environment)是预启动执行环境,由Intel开发
    • PXE提供了第1阶段的bootloader
  • 以C/S的网络模式运行
    • PXE的客户端是固化在网卡的ROM中
    • 计算机启动时BIOS把客户端加载到内存中执行(一般是一个命令菜单)
    • PXE把远端服务器上的小程序(miniOS)通过网络下载到本地执行
  • 应用场景
    • LiveOS
    • OS布置

@startuml participant “PXE Client” as p participant “DHCP Server” as d participant “TFTP Server” as t

p -> d: 请求bootloader名和tftp服务器地址 activate p activate d

d -> p: 返回bootloader名和tftp服务器地址 deactivate d

p -> t: 请求 bootloader activate t t -> p: 发送 bootloader p -> p: BIOS 执行 bootloader(prelinux.0)

p -> t: bootloader 请求配置文件(pxelinux.cfg/default)

p -> p: bootloader 读取配置文件

p -> p: 用户选择

p -> t: 请求linux内核 t -> p: 发送linux内核

p->t: 请求根文件系统 t->p: 发送根文件系统 deactivate t

p->p: 启动linux内核 @enduml

DHCP 服务器

  • 安装 dhcp, tftp-server
    • yum -y install dhcp tftp-server
  • 配置dhcp
    • /etc/dhcp/dhcpd.conf
    • 可以参考dhcpd.conf.example模板
    • 配置子网

      subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.11 192.168.1.88;
        option domain-name-servers 10.30.8.8,10.40.8.8; // 客户端保存在 /etc/resolv.conf 中
        option domain-name "---.com.cn ---.intra"; // 域名
        option routers 10.137.236.1;  // 网关
        option broadcast-address 10.137.236.255;
        default-lease-time 600; // 租约期
        max-lease-time 7200;
      }
      
  • 启动服务
    • service dhcpd restart
    • 开机自启动:systemctl enable dhcpd
  • 设置防火墙
    • port: dhcp:UDP:67 / tftp:69
    • netstat -tulnp | grep :67
    • systemctl disable firewalld.service
    • systemctl stop firewalld.service
  • selinux配置
    • /etc/selinux/config
    • 永久关闭:SELINUX=disabled
    • shell中当前关闭: setenforce 0
  • tftp配置
    • /etc/xinetd.d/tftp
    • 启动服务:service xinetd restart
    • 开机自启动:systemctl enable xinetd
    • 检查:netstat -tulnp | grep :69
  • 配置bootloader
    • /etc/dhcp/dhcpd.conf中全局配置中加入

      next-server 192.168.1.99;
      filename "/pxelinux.0";
      

      指定 tftp-server 的 ip 地址,和网络引导程序 bootloader

    • pxelinux.0文件
      • locate pxelinux.0
      • 查询文件所在包:`yum provides “*/pxelinux.0”,返回 syslinux
      • rpm -ql syslinux | grep pxe
    • cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
  • pxelinux.0
    • 网络bootloader程序
      • 正常情况linux安装好后的引导程序为grub2(磁盘0磁道第1个扇区)
        • BIOS自检
        • 读取引导程序
          • grub2
          • BIOS执行引导程序
          • 引导程序读取配置文件/boot/grub/grub.conf
    • 由syslinux包提供
    • 与正常OS无关
    • 它的配置文件在pxelinux.cfg/filename
      • filename通常为default
      • /media/isolinx/isolinux.cfg这就是开关菜单
    • cp isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
    • cp /media/isolinx/* /var/lib/tftpboot/
  • default启动菜单脚本

    label linux
      menu label ^Install Red Hat Enterprise Linux 7.1 // 菜单名,回车后加载后面的脚本
      kernel /vmlinuz
      append initrd=initrd.img inst.stage2=hd:LABEL=RHEL-7.1\x20Server.x86_64 quiet
    
    label rhel6 // 用于匹配手输的选项
      menu label ^Install Red Hat Enterprise Linux 6.4 // 菜单名,回车后加载后面的脚本
      kernel /rhel6.4/vmlinuz
      append initrd=/rhel6.4/initrd.img // 这是第2步的安装源:inst.stage2=hd:LABEL=RHEL-7.1\x20Server.x86_64 quiet
    
    • linux这个选项会读vmlinuzinitrd.img两个文件
    • 它们在media/images/pxeboot/
    • vmlinuz内核版本与后面安装的OS版本必须匹配
    • vmlinuz为内核,initrd.img为驱动
      • initrd.img
        • initrd的解释是initialized RAM disk,就是启动的时候由uboot来初始化内存,当做disk来使用
        • 内核启动时会在访问挂载的根文件系统前先访问该内存中的 initrd文件系统。
        • 在uboot配置了initrd的情况下,文件系统启动被分成两个阶段
          • 第一阶段先执行initrd文件系统中的”某个可执行文件”(linuxrc或init,下面会讲到具体会执行哪一个),完成加载驱动模块等任务。
          • 第二阶段是挂载真正的根文件系统中,然后执行/sbin/init进程
      • initrd镜像的制作
        • cpio-initrd格式镜像制作
          • 进入到要制作的文件系统的根目录
          • find . | cpio -c -o > ../initrd.img
          • gzip ../initrd.img
        • image-initrd格式镜像制作(往往采用制作工具genext2fs)
          • 进入到要制作的文件系统的根目录
          • dd if=/dev/zero of=../initrd.img bs=512k count=5
          • mkfs.ext2 -F -m0 ../initrd.img
          • mount -t ext2 -o loop ../initrd.img /mnt
          • cp -r * /mnt
          • umount /mnt
          • gzip -9 ../initrd.img
      • initramfs
        • initramfs相当于把initrd放进了内核,通过cpio(这是一个文件处理工具)实现
  • 无人值守安装OS
    • system-config-kickstart软件提供无人值守的安装脚本
    • 安装httpd:yum install httpd;systemctl start httpd
    • /etc/httpd/conf/httpd.conf

        DocumentRoot "/var/www/html" // 网站的根目录
      
    • mount /dev/cdrom /var/www/html/pub/
    • firefox http://192.168.6.99/pub &
    • 开机生效:
      • vim /etc/fstab
      • /dev/cdrom /var/www/html/pub iso9660 defaults,loop 0 0
      • mount -a
    • system-config-kickstart中选择安装源
      • HTTP server: 192.168.6.99
      • HTTP Directory: /pub
    • 引导程序
      • install type: install new boot loader
      • install boot loader on Master Boot Record(MBR)
    • 最后保存成ks666.cfg文件
    • 在pxelinux.cfg/default中

      default vesamenu.c32
      timeout 60
      
      label rhel7
        menu label ^Install RHEL7.6
        menu default
        kernel /vmlinuz
        append initrd=initrd.img ks=http://192.168.6.99/ks/ks666.cfg
      

通过 dnsmasq 实现DHCP、tfptd Server 安装和配置

  • dnsmasq: DHCP + DNS + TFTPD
    • sudo apt install dnsmasq
    • sudo vi /etc/dnsmasq.conf

      conf-dir=/etc/dnsmasq.d # 去掉此行注释
      
    • sudo vi /etc/dnsmasq.d/pxe

      interface=*
      bind-interfaces
      dhcp-range=192.168.0.100,192.168.0.200,12h
      dhcp-boot=pxelinux.0
      #dhcp-match=set:efi-x86_64,option:client-arch,7
      #dhcp-boot=tag:efi-x86_64,bootx64.efi
      enable-tftp
      tftp-root=/var/lib/tftp
      #dhcp-option=66,0.0.0.0
      #dhcp-boot=netboot.xyz.kpxe
      

      -sudo systemctl restart dnsmasq.service

      • 若其他 tftpd(如:tftpd-hpa)在运行,请 stop
      • 关防火墙
      • 可用 sudo dnsmasq --no-daemon 跟踪测试
  • tftp
    • 将rhel8.2.iso光盘的isolinux/*目录文件拷贝到/var/lib/tftp目录下
      • cd /var/lib/tftp
      • mkdir pxelinux.cfg
      • cp isolinux.cfg pxelinux.cfg/default
      • sudo vim pxelinux.cfg/default

        • 修改1,开头3行

          default vesamenu.32
          # 倒计时3秒
          timeout 30
          
          display boot.msg        
          
          ...
          
        • 修改2,增加rhel8.2的内存启动方式

          label rhel8.2
            menu label ^Install RHEL8
            menu default
            kernel vmlinuz
            append initrd=initrd.img root=live:http://192.168.0.11/data/download/sroot.img
          
          • menu default倒计时后执行此选项
          • 主机是192.168.0.11
          • 主机http服务器
    • 将pxelinux.0放到/var/lib/tftp
      • pxelinux.0在syslinux软件包中,先yum install syslinux安装,后rpm -ql syslinux | grep pxe查询
      • cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
  • 主机安装好 Nginx 服务器
    • 配置http
      • sudo vim /etc/nginx/sites-available/default
      • server {...}中添加下载目录

        ``` server{ …

        location /download { root /var/www/html/data; add_header Content-Disposition: “attachment”; add_header Content-Type application/octet-stream; autoindex off; autoindex_exact_size off; autoindex_localtime on; } }

  • 制作内存Live根文件系统(大小:2.56G)

    #!/bin/bash
    
    # 文件系统大小2.56G,可以修改
    dd if=/dev/zero of=rootfs.img bs=1M count=2560
    mkfs.ext4 rootfs.img
    mount rootfs.img /mnt
    cp -a rootfs/* /mnt
    umount /mnt
    rm -rf squashfs-root/LiveOS/rootfs.img
    mv rootfs.img squashfs-root/LiveOS/
    mksquashfs squashfs-root/ sroot.img
    
    • 将/etc/pam.d/login替换成新的login文件

      #%PAM-1.0
      auth        required      pam_env.so
      auth        sufficient    pam_unix.so likeauth nullok
      auth        required      pam_deny.so
      account     required      pam_unix.so
      password    sufficient    pam_unix.so nullok use_authtok md5 shadow
      password    required      pam_deny.so
      session     required      pam_limits.so
      session     required      pam_unix.so
      
    • 将制作好的文件系统放到服务器的/var/www/html/data/download/sroot.img