PXE批量部署

旧城冷巷雨未停 提交于 2019-11-28 04:14:05

PXE的部署

简介

什么是PXE?

1. PXE是 Preboot Execution Environment的缩写,称之为预启动执行环境;
2. 由Intel设计的一种网络协议,可使计算机通过网络启动安装系统;
3. 是一种使用网络接口启动计算机的机制,其不依赖本地数据存储设备或本地已安装的系统;
4. 协议分为client端和server端,PXE client在网卡的boot ROM中启动,当计算机开机引导时,BIOS把PXE client调入内存执行,
    并显示出命令菜单,经用户选择需要安装的系统后,PXE client将放置在远端的操作系统通过网络下载到本地运行;

常见安装方式:

1. 光盘安装
    使用server内置光驱或外置USB光驱,将系统镜像刻录,从光盘安装;
2. U盘安装
    利用工具将镜像系统写入U盘,从U盘启动;
3. 镜像挂载安装
    利用BMC Web GUI远程挂载镜像安装;
4. 网络引导安装(PXE)
    客户端通过网络启动,读取远端服务器上的镜像以安装;

PXE server的四种模式

IPV4 legacy,IPV4 UEFI,IPV6 legacy,IPV6 UEFI

IPV4 legacy PXE启动需要文件

1. pxelinux.0: 计算机自展引导程序(bootstrap),负责系统引导和启动,作用类似于BIOS,会调用PXE相关配置文件
2. pxelinux.cfg: 文件夹,存放PXE配置文件
3. vmlinuz: linux的内核文件,可以被引导程序加载,从而启动Linux系统
4. initrd.img: boot loader initialized RAM disk的缩写,作为根文件系统加载各种模块、驱动、服务等,网卡驱动就包含在该文件中.

原理

1. 客户端(Client)的BIOS支持网卡启动,且网卡具有PXE ROM芯片;
2. 服务端(PXE Server)至少有dhcp,tftp,nfs服务且为开启状态;
3. BIOS通过PXE Client调入内存执行,PXE Sever向本地局域网中dhcp.server发出分配IP请求;
4. 在dhcp.server收到请求后,便向PXE Server返回IP及bootstrap文件(自展引导程序)的位置;客户端向tftp.server请求bootstrap文件
    ,tftp.server收到请求向客户端发送bootstrap文件 -->pxelinux.0;
5. 客户端收到pxelinux.0文件后执行文件,并根据内容向tftp.server请求pxelinux.0的配置文件-->tftpboot/pxelinux.cfg/default;
6. 客户机读取default文件,等待用户选择安装系统后,客户端向tftp.server发出提供内核文件vmlinuz和根文件系统initrd.img请求;
7. tftp.server收到客户端请求,提供vmlinuz和initrd.img;
8. 客户端收到文件,启动内核映像文件,内核文件根据bootstrap的配置文件pxelinux.0向PXE sever请求提供自动安装脚本和源文件,PXE 
    Server通过ftp/http/nfs中的一个向客户端传送相关脚本和源文件,客户端获得后进行自动安装。

PXE server架设过程

1. 关闭Firewalls & SELinux
    Firewalls:
    $service iptables stop  <!--临时有效,重启后防火墙自动打开-->
    $chkconfig iptables off <!--永久有效,重启后防火墙不自动打开->
    SELinux:
    $setenforce 0   <!-- 临时有效,重启后失效-->
    $vim /etc/selinux/config    <!--永久有效,重启后也有效-->
        SELINUX=disabled
2. 检查是否安装了dhcp,tftp,nfs服务
    $rpm -qa | grep {dhcp |  tftp | nfs}
3. 配置yum源
    $vim /etc/yum.repos.d/server.repo
        [development]
        name=development
        baseurl=file:///mnt/
        gpgcheck=0
        enabled=1
        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
4. 安装dhcp,ftp,nfs服务
    $yum install -y dhcp tftp nfs
5. 配置任意网口信息,并设定IP地址
    $vim /etc/sysconfig/network-scripts/ifcfg-enp3s0f0
        # Generated by dracut initrd
        NAME="enp3s0f0"         
        DEVICE="enp3s0f0"       
        ONBOOT=yes  <!--开机自启-->
        NETBOOT=yes
        UUID="169f6948-307c-42a7-bb35-a773c86fb5d6"
        BOOTPROTO=none  <!--IP地址类型-->
        IPADDR=192.168.1.250    <!--IP地址-->
        TYPE=Ethernet
        PREFIX=24
        DEFROUTE=yes
        IPV4_FAILURE_FATAL=no
        IPV6INIT=yes
        IPV6_FAILURE_FATAL=no
        IPV6_AUTOCONF=yes
        IPV6_DEFROUTE=yes
        IPV6_PEERDNS=yes
        IPV6_PEERROUTES=yes
    $service network start
6. 配置dhcp.conf并启动服务
    $vim /etc/dhcp/dhcpd.conf
        # dhcpd.conf
        # Sample configuration file for ISC dhcpd
        ddns-update-style interim;  <!-- 暂时,间歇 -->
        ignore client-updates;
        allow booting;  <!--指定dhcp.server是否允许客户端在booting阶段查询host declaration-->
        allow bootp;    <!--指定dhcp.server是否对bootp query做出响应 -->
        class "pxeclients" {
        match if substring(option vendor-class-identifier,0,9)="PXEClient";
        next-server 192.168.1.250;  <!--指定主机启动文件从哪个地址的服务器上获取 -->
        filename "pxelinux.0";  <!--指定主机启动文件名字 -->
        }
        subnet 192.168.1.0 netmask 255.255.255.0 {
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.250;
        option subnet-mask 255.255.255.0;
        range 192.168.1.205 192.168.1.249;  <!--dhcp地址空间 -->
        default-lease-time 8640000;
        }
    $service dhcp start or $chkconfig dhcpd on  <!-- 启用dhcp -->
7. 配置tftp并启动服务
    $vim /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 /tftpboot  <!-- 存放操作系统镜像文件的文件夹,默认路径是/lib/var/tftpboot -->
            disable         = no    <!-- yes代表关闭,no代表打开 -->
            per_source      = 11
            cps         = 100 2
            flags           = IPv4
        }
    $servicre tftp start 
or /etc/init.d/xinetd start or chkconfig tftp on<!-- 启用tftp.server,最后一个为开机自启tftp.server -->
8. 配置nfs并启动服务
    $vim /etc/exports
        /tftpboot *(rw,no_root_squash)  <!-- 将该文件下的所有文件共享给任意用户 -->
    $service nfs start
9. 准备系统镜像文件
    $mount -o loop rhel7.4.iso /mnt
    $mkdir /tftpboot/rhel7.4
    $cp -rf /mnt/* /tftpboot/rhel7.4
    $chmod -R +x /tftpboot/rhel7.4
    $cp -rf /usr/share/syslinux/pxelinux.0 /tftpboot/
    $cp -rf boot.msg vesamenu.c32 splash.png /tftpboot/
    $mkdir /tftpboot/pxelinux.cfg
    $cp -rf /tftpboot/rhel7.4/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/
    $mv /tftpboot/pxelinux.cfg/isolinux.cfg /tftpboot/pxelinux.cfg/default
10. 配置pxelinux.cfg文件
    $vim default
        default vesamenu.c32    <!-- vesamenu.c32:设置图形化选择界面,Linux操作系统的isolinux文件夹下,menu.c32:设置文字
        选择界面,从/user/share/syslinux  路径下获取 -->
        prompt 1    <!-- 是否显示"boot"提示符,"1"表示显示,提示符显示时可以直接键入想要安装的系统;"0"表示不显示,会直接按
        "default"中的参数指定的内容启动-->
        timeout 600     <!-- 用户输入前的超时时间,单位1/10秒 -->
        display boot.msg
        menu background 1.jpg   <!-- 背景图片 -->
        menu title Welcome to CV Team's PXE server!     <!-- 显示菜单的标题 -->
        menu color border 0 #ffffffff #00000000
        menu color sel 7 #ffffffff #ff000000
        menu color title 0 #ffffffff #00000000
        menu color tabmsg 0 #ffffffff #00000000
        menu color unsel 0 #ffffffff #00000000
        menu color hotsel 0 #ff000000 #ffffffff
        menu color hotkey 7 #ffffffff #ff000000
        menu color scrollbar 0 #ffffffff #00000000

        label install   <!-- "开始安装过程" -->
        menu label ^1)Install rhel7.4 in /dev/sda
        menu default    <!-- 规定时间内没有做出选择,将自动启动默认选项 -->
        kernel rhel7.4/vmlinuz biosdevname=0
        append initrd=rhel7.4/initrd.img ks=nfs:192.168.1.250:/tftpboot/rhel7.4/ks/ks.cfg   <!-- append:指定追加给内
        核参数的initrd.img的路径;inst.repo:设置镜像文件位置 -->
11. 配置无人值守kickstart文件
        #platform=x86, AMD64, or Intel EM64T
        #version=DEVEL
        # Install OS instead of upgrade
        install
        # Keyboard layouts
        keyboard 'us'
        # Root password
        rootpw --iscrypted $1$BrX4T9WN$OXLjtLaSe7VNnmjlsUyXE0
        # System language
        lang zh_CN
        # Firewall configuration
        firewall --disabled
        # System authorization information
        auth  --useshadow  --passalgo=sha512
        # Use graphical install
        install
        graphical
        # SELinux configuration
        selinux --disabled
        # Use NFS installation media
        nfs --server=192.168.1.250 --dir=/tftpboot/rhel7.4
        # Network information
        network  --bootproto=dhcp --device=enp3s0f0
        # Reboot after installation
        reboot
        # System timezone
        timezone Asia/Shanghai
        # Partition clearing information
        clearpart --all --drives=sda
        # System bootloader configuration
        bootloader --append="crashkernel=768M vconsole.font=latarcyrheb-sun16 vconsole.keymap=us biosdevname=0 ipv6.
        disable=1 console=tty0 console=ttyS0,115200 scsi_mod.scan=sync intel_idle.max_cstate=0 pci=pcie_bus_perf
        nouveau.modeset=0 rd.driver.blacklist=nouveau video=vesa:off rd.driver.pre=ahci" --location=mbr --boot-drive
        =sda
        # autopart --type=lvm
        part /boot --asprimary --fstype="ext4" --ondisk=sda --size=1024
        part swap --asprimary --fstype="swap" --ondisk=sda --size=51200
        part / --asprimary --fstype="ext4" --ondisk=sda --size=153600

        %packages
        @additional-devel
        @anaconda-tools
        @backup-client
        @backup-server
        @base
        @compat-libraries
        @console-internet
        @core
        @debugging
        @desktop-debugging
        @development
        @dial-up
        @directory-client
        @directory-server
        @dns-server
        @emacs
        @file-server
        @fonts
        @ftp-server
        @gnome-apps
        @gnome-desktop
        @graphical-admin-tools
        @graphics
        @guest-agents
        @guest-desktop-agents
        @hardware-monitoring
        @identity-management-server
        @infiniband
        @input-methods
        @internet-browser
        @java-platform
        @kde-desktop
        @large-systems
        @legacy-unix
        @legacy-x
        @load-balancer
        @mail-server
        @mainframe-access
        @mariadb
        @mariadb-client
        @multimedia
        @network-file-system-client
        @network-server
        @network-tools
        @networkmanager-submodules
        @perl-runtime
        @perl-web
        @php
        @platform-devel
        @platform-kvm
        @platform-microsoft
        @platform-vmware
        @postgresql
        @postgresql-client
        @print-client
        @print-server
        @python-web
        @remote-desktop-clients
        @remote-system-management
        @ruby-runtime
        @scientific
        @security-tools
        @smart-card
        @system-admin-tools
        @system-management
        @technical-writing
        @virtualization-client
        @virtualization-hypervisor
        @virtualization-platform
        @virtualization-tools
        @web-server
        @web-servlet
        @x11
        %end
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!