PXE+Kickstart实现全自动批量引导安装CentOS

  • 原创
  • Madman
  • /
  • 2018-04-19 09:27
  • /
  • 0
  • 473 次阅读

PXE+Kickstart实现全自动批量引导安装CentOS-min.png

Synopsis: 首先从服务器加电开始,详细解析了操作系统是如何实现引导的,以及如何加载系统安装程序。PXE可以使计算机通过网络而不是从本地硬盘、光驱等设备启动(即加载引导程序)。现代的网卡,一般都内嵌支持PXE的ROM芯片。当计算机引导时,BIOS把PXE Client调入内存执行,并显示出命令菜单,经用户选择后,PXE Client将放置在远端的操作系统通过网络下载到本地运行。Anaconda支持使用Kickstart文本化安装操作系统,在此文件中指定安装源在哪,后续如何进行磁盘分区等信息,即可实现网络全自动批量安装系统

Linux系统自动部署系列:


1. 系统引导与安装的内部原理

1.1 第一阶段

Step1. 上电自检POST(Power-On-Self-Test)是BIOS(Basic Input Output System)功能的一个主要部分,它负责完成对CPU、主板、内存、软硬盘子系统、显示子系统(包括显示缓存)、串并行接口、键盘、CD-ROM光驱等的检测,主要检查硬件的好坏

Step2. 读取BIOS中的Boot Sequence,可用于启动的介质包括: 硬盘,CDROM,USB,支持PXE的网卡等

Step3. 加载引导程序(Bootstrap)

  • syslinux.0
  • isolinux.bin

Step4. 读取启动菜单文件

  • pxelinux.cfg/default
  • isolinux/isolinux.cfg

Step5. 选定安装选项后,依据参数指定的位置,加载内核映像vmlinuz 和初始RAM磁盘initrd.img,在内存中构建了一个Linux启动所需的虚拟的根文件系统(rootfs)

  • kernel : vmlinuz
  • initrd : initrd.img

Step6. 内核执行initrd.img中的/init程序(这实际上是一个指向/sbin/init的软链接),init会调用/sbin/loader程序,执行anaconda主程序

至此,安装引导的第一个阶段结束,这个阶段的主要任务就是找到第二个阶段的引导程序anaconda并执行它。

文件的调用顺序为 vmlinuzinitrd.img/init/sbin/loaderimagaes/install.img/usr/bin/anaconda

1.2 第二阶段

准备安装源(Preparing Installation Sources)

  • DVD
  • Hard drive
  • Network location
  • NFS
  • HTTPS, HTTP or FTP

Anaconda是RedHat、CentOS、Fedora等Linux的安装管理程序。它可以提供文本、图形等安装管理方式,并支持Kickstart等脚本提供自动安装的功能。此外,其还支持许多启动参数,熟悉这些参数可为安装带来很多方便。该程序的功能是把位于光盘或其他源上的数据包,根据设置安装到主机上。为实现该定制安装,它提供一个定制界面,可以实现交互式界面供用户选择配置(如选择语言,键盘,时区等信息)。Anaconda的大部分模块用Python编写,有少许的载入模块用C编写。

Anaconda的两种安装管理方式:

  • 图形化界面人工定制安装
  • 文本界面结合Kickstart实现自动化安装

2. 安装方式总结

根据前面的描述,要完成系统安装,只需要提供如下内容:

  • 加载引导程序(Bootstrap)
  • 启动菜单文件
  • vmlinuz 和 initrd.img
  • 包含二进制RPM包的安装源

1 PXE+Kickstart实现全自动批量引导安装CentOS

也就是说,可以使用官方下载的完整ISO,制作DVD安装光盘或U盘来安装CentOS;或者,从官方ISO中抽离加载引导程序这些文件,制作一个迷你的引导光盘或U盘,然后由本地磁盘或网络提供RPM包的安装源;或者使用PXE技术,通过网络来加载引导程序,结合Kickstart,则可实现网络全自动安装

3. PXE网络安装

3.1 PXE原理

2 PXE+Kickstart实现全自动批量引导安装CentOS

PXE是由Intel设计的协议,它可以使计算机通过网络而不是从本地硬盘、光驱等设备启动(即加载引导程序)。现代的网卡,一般都内嵌支持PXE的ROM芯片。当计算机引导时,BIOS把PXE Client调入内存执行,并显示出命令菜单,经用户选择后,PXE Client将放置在远端的操作系统通过网络下载到本地运行。

执行流程:

当BIOS将PXE Client载入内存后,便具备了DHCP Client的功能(可以透过DHCP Server来获取IP地址)、具备TFTP Client功能(可通过TFTP Server来下载kernel和initrd.img等文件)

3 PXE+Kickstart实现全自动批量引导安装CentOS

Step1. PXE Client向UDP 67端口广播 DHCPDISCOVER 消息.

Step2. DHCP SERVER或者DHCP Proxy收到广播消息后,发送DHCPOFFER(包含ip地址)消息到PXE Client的68端口.

Step3. PXE Client发送DHCPREQUEST消息到DHCP SERVER,获取启动文件名和位置(Network Bootstrap Program file name,简称NBP).

Step4. DHCP SERVER发送DHCPACK(包含NBP)消息到PXE Client.

Step5. PXE Client向Boot Server获取NBP文件.

Step6. PXE Client从TFTP SERVER下载NBP,然后在客户端执行NBP文件

注意:

在NBP执行初始化后,NBP会按照自己默认的方式从TFTP SERVER中下载其他所需的配置文件。这个时候PXE启动流程已经完成了,剩下的工作都是有NBP来执行完成的。

例如,pxelinux.0(安装Linux)的NBP会下载default配置文件,来显示菜单,根据需要启动不同的kernel和image;如果是RIS(安装Windows)的NBP,则会启动Windows boot loader来执行安装部署。

3.2 部署PXE Boot Server

(1) 安装TFTP

tftp是由 super daemon (xinetd) 所管理的服务,需要安装xinetd和tftp。默认情况下TFTP服务是禁用的,所以要修改文件来开启服务。

1. 安装
# yum -y install xinetd tftp tftp-server

2. 配置
# 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 /var/lib/tftpboot  # 指定tftp的文件保存目录
        disable                 = no  # 由默认值yes修改为no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

3. 启动服务
# systemctl start xinetd
# systemctl enable xinetd

4. 查看运行状态
# netstat -tunap | grep :69
udp        0      0 0.0.0.0:69              0.0.0.0:*                           1641/xinetd 

(2) 安装DHCP

如果你的公司里面已经存在DHCP服务器,请使用已有的DHCP,否则会造成网络混乱。如果此DHCP是Windows Server提供的,需要正确设置DHCP的下一跳地址指向上一步骤中创建的TFTP Server的IP地址。找到066启动服务器主机名,这里输入tftp服务器的IP地址,我的是"192.168.80.10",再找到067启动文件名,输入pxelinux.0

1. 安装
# yum -y install dhcp

2. 修改配置文件
# vim /etc/dhcp/dhcpd.conf
内容如下:
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#

# option definitions common to all supported networks...
ddns-update-style interim;
ignore client-updates;
authoritative;
allow booting;
allow bootp;
allow unknown-clients;

# A slightly different configuration for an internal subnet.
subnet 192.168.80.0 netmask 255.255.255.0 {
    range 192.168.80.100 192.168.80.200;
    option domain-name-servers 192.168.80.10; 
    option domain-name "pxe.wangy.com"; 
    option routers 192.168.80.2; 
    option broadcast-address 192.168.80.255;
    default-lease-time 600; 
    max-lease-time 7200; 
    # TFTP Server Information
    next-server 192.168.80.10;
    filename "pxelinux.0";
}

3. 启动服务
# systemctl start dhcpd
# systemctl enable dhcpd

(3) 提供Network Bootstrap Program

pxelinux.0包含在SYSLINUX项目中,其中PXELINUX用于网络启动

  • The original SYSLINUX, used for booting from FAT and NTFS filesystems (such as floppy disks and USB drives).
  • ISOLINUX, used for booting from CD-ROM ISO 9660 filesystems.
  • PXELINUX, used for booting from a network server using the Preboot Execution Environment (PXE) system.
  • EXTLINUX, used to boot from Linux ext2/ext3/ext4, XFS, Btrfs, or UFS/UFS2 filesystems. FAT and NTFS are also supported.
  • MEMDISK, used to boot older operating systems like MS-DOS from these media.
1. 安装 syslinux 包
# yum -y install syslinux

2. 拷贝pxelinux.0到tftp目录中
# cp -v /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot

(4) 拷贝 vmlinuz 和 initrd.img 到 tftp 目录中

1. 挂载CentOS-7.2 ISO到/mnt
# mount -o loop,ro -t iso9660 CentOS-7-x86_64-DVD-1511.iso /mnt

2. 拷贝
# mkdir /var/lib/tftpboot/CentOS-7.2
# cp /mnt/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/CentOS-7.2

(5) 提供安装镜像源

可以使用网络方式包括NFS/HTTP/FTP等,此处使用FTP,安装vsftpd软件包:

1. 安装
# yum -y install vsftpd

2. 在vsftpd默认服务器路径下(/var/ftp/pub)新建目录CentOS-7.2,复制挂载的光盘镜像内容到其中
# mkdir /var/ftp/pub/CentOS-7.2
# cp -r /mnt/* /var/ftp/pub/CentOS-7.2/

3. 启动服务
# systemctl start vsftpd
# systemctl enable vsftpd

访问浏览器,查看:

4 PXE+Kickstart实现全自动批量引导安装CentOS

(6) 提供Kickstart文件,可实现自动化部署

# vim /var/ftp/pub/ks.cfg

内容如下:
# Kickstart file automatically generated by anaconda.
# version=DEVEL

##############################################################################
# Command section --- must include the required options.
##############################################################################

# Text mode or graphical mode?
text
firstboot --disable

# Install or upgrade?
install

# installation path
url --url="ftp://192.168.80.10/pub/CentOS-7.2"

# Network information
network --onboot yes --device eth0 --bootproto dhcp --noipv6
network --hostname=localhost.localdomain

# System authorization information
auth --enableshadow --passalgo=sha512

# Root password
rootpw --iscrypted $6$tbGvXZz7E2ZHKiFw$krdZKp7WUY4iNierOFh4ZbV1FhroTuomNr71.0Ns52xARVrfr39DnU64sHqZv/K2iWUvMw0cI6DO64VgQWYRg0

# System timezone
timezone Asia/Shanghai

# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'

# System language
lang en_US.UTF-8

# Firewall configuration
firewall --disabled

# SELinux configuration
selinux --disabled

# Installation logging level
logging --level=info

# Reboot after installation
reboot

##############################################################################
# The %pre sections 
##############################################################################
%include /tmp/part-include
%pre
#!/bin/sh
## 如果有SATA或SCSI磁盘则不论是否还有IDE磁盘,都使用sdx;如果仅有IDE磁盘,则使用hdx
if `grep -q "sd.*$" /proc/partitions` ; then
        OSDISK_PREFIX='sd'
elif `grep -q "hd.*$" /proc/partitions` ; then
        OSDISK_PREFIX='hd'
else
        print "Lost disks, please install disks first!"
        exit 1
fi
## 如果只有一个磁盘,则不论磁盘大小多大;如果有多个磁盘,则按自定义的规则选择系统安装盘
DISK_COUNT=`fdisk -l | grep "Disk /dev/${OSDISK_PREFIX}" | wc -l`
if [ ${DISK_COUNT} -eq 1 ] ; then
        str=`fdisk -l | grep "Disk /dev/${OSDISK_PREFIX}" | awk '{print $2}'`
else
        str=`fdisk -l | grep "Disk /dev/${OSDISK_PREFIX}" | awk '{if ($3 >=50 && $3 <= 100) print $2}'`
fi
OSDISK=${str:5:3}
## 设置swap大小,如果内存mem<=2G,则swap设置为与物理内存大小一样;如果内存2G<mem<=16G,swap=8G;如果内存mem>16G,则swap=16G
## 注意/proc/meminfo中单位是kb,而kickstart中指定swap大小时单位是mb
ACT_MEM=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`
if [ $ACT_MEM -le $((2*1024*1024)) ] ; then
    SWAP_SIZE=$((2*1024))
elif [ $ACT_MEM -gt $((2*1024*1024)) ] && [ $ACT_MEM -le $((16*1024*1024)) ] ; then
    SWAP_SIZE=$((8*1024))
else
    SWAP_SIZE=$((16*1024))
fi

cat >> /tmp/part-include << EOF
# System bootloader configuration
bootloader --location=mbr --boot-drive=${OSDISK}
# Partition clearing information
clearpart --all --initlabel
# Clear the Master Boot Record
zerombr
# Disk partitioning information
part /boot --fstype="xfs" --ondisk=${OSDISK} --size=500
part pv.01 --size=1 --ondisk ${OSDISK} --grow
volgroup sysvg --pesize=4096 pv.01
logvol / --vgname=sysvg --size=1024 --grow --maxsize=102400 --name=rootlv --fstype="xfs"
logvol swap --vgname=sysvg --size=${SWAP_SIZE} --name=swaplv --fstype=swap
ignoredisk --only-use=${OSDISK}
EOF
%end

##############################################################################
# The %packages section
##############################################################################
%packages
@^web-server-environment
@base
@core
@java-platform
@python-web
@web-server

%end

%addon com_redhat_kdump --disable --reserve-mb='auto'

%end

Kickstart的安装后配置段(可选):

##############################################################################
# The %post sections 
##############################################################################
%post
#!/bin/sh
## 系统安装完成后,将IP等信息发送到PXE Server上/tmp目录
HOST='192.168.80.10'
PASSWORD='password'

## Synchronize with the NTP Server
for (( i=0;i<=2;i++ ))
do
    ntpdate -b ${HOST} 1 >> /tmp/sync_time.log 2>&1
    [ $? -eq 0 ] && break
    sleep 5
done
hwclock --systohc --utc

## 记录时间和IP
IPINFO=$(ip addr show | grep 'inet ' | grep -v '127.0.0.1')
TIME=$(date +%Y_%m_%d_%H_%M_%S)

cat > /tmp/PXE_${TIME}.txt << EOF
IP Information : ${IPINFO} 
EOF

## 实现scp自动交互需要expect软件的支持,检查是否已安装
rpm -qa | grep 'expect' > /dev/null
if [ $? -ne 0 ] ; then
    cd /tmp
    wget ftp://${HOST}/pub/rpms/*
    rpm -ivh ./*.rpm
fi

/usr/bin/expect <<-EOF
spawn scp -p /tmp/PXE_${TIME}.txt ${HOST}:/tmp
expect {
"*(yes/no)?" { send "yes\r"; exp_continue }
"*password:" { send "$PASSWORD\r" }
}
expect "100%"
expect eof
EOF

## 设置aliyun和EPEL YUM源
cp -r /etc/yum.repos.d /etc/yum.repos.d.bak
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo ftp://${HOST}/pub/repos/CentOS-Base.repo
wget -O /etc/yum.repos.d/epel.repo ftp://${HOST}/pub/repos/epel.repo
#yum makecache

## Bash Color
echo 'PS1="\[\e[32;1m\][\u@\h \W]\$ \[\e[0m\]"' >> ~/.bashrc
. ~/.bashrc

%end

注意: clearpart --all --initlabel

(7) 提供启动菜单Boot Menu

1. 拷贝启动菜单所需要的诸如背景图片等文件到tftp
# cp /mnt/isolinux/{boot.msg,splash.png,vesamenu.c32} /var/lib/tftpboot

2. 在ISO的Boot Menu文件 [isolinux/isolinux.cfg] 基础上修改
# mkdir /var/lib/tftpboot/pxelinux.cfg
# cp /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
# vim /var/lib/tftpboot/pxelinux.cfg/default

内容如下:
default vesamenu.c32
timeout 100

display boot.msg

# Clear the screen when exiting the menu, instead of leaving the menu displayed.
# For vesamenu, this means the graphical background is still displayed without
# the menu itself for as long as the screen remains in graphics mode.
menu clear
menu background splash.png
menu title ### PXE Boot Menu ###
menu vshift 8
menu rows 18
menu margin 8
#menu hidden
menu helpmsgrow 15
menu tabmsgrow 13

# Border Area
menu color border * #00000000 #00000000 none

# Selected item
menu color sel 0 #ffffffff #00000000 none

# Title bar
menu color title 0 #ff7ba3d0 #00000000 none

# Press [Tab] message
menu color tabmsg 0 #ff3a6496 #00000000 none

# Unselected menu item
menu color unsel 0 #84b8ffff #00000000 none

# Selected hotkey
menu color hotsel 0 #84b8ffff #00000000 none

# Unselected hotkey
menu color hotkey 0 #ffffffff #00000000 none

# Help text
menu color help 0 #ffffffff #00000000 none

# A scrollbar of some type? Not sure.
menu color scrollbar 0 #ffffffff #ff355594 none

# Timeout msg
menu color timeout 0 #ffffffff #00000000 none
menu color timeout_msg 0 #ffffffff #00000000 none

# Command prompt text
menu color cmdmark 0 #84b8ffff #00000000 none
menu color cmdline 0 #ffffffff #00000000 none

# Do not display the actual menu unless the user presses a key. All that is displayed is a timeout message.

menu tabmsg Press Tab for full configuration options on menu items.

menu separator # insert an empty line
menu separator # insert an empty line

label kickstart
  menu label ^Install CentOS 7 with FTP source Kickstart
  menu default
  kernel CentOS-7.2/vmlinuz
  append initrd=CentOS-7.2/initrd.img inst.repo=ftp://192.168.80.10/pub/CentOS-7.2 ks=ftp://192.168.80.10/pub/ks.cfg

label manual
  menu label ^Install CentOS 7 with FTP source Manual
  kernel CentOS-7.2/vmlinuz
  append initrd=CentOS-7.2/initrd.img inst.repo=ftp://192.168.80.10/pub/CentOS-7.2 devfs=nomount

label vnc
  menu label ^Install CentOS 7 with FTP source VNC
  kernel CentOS-7.2/vmlinuz
  append initrd=CentOS-7.2/initrd.img inst.repo=ftp://192.168.80.10/pub/CentOS-7.2 devfs=nomount inst.vnc inst.vncpassword=password

label internet
  menu label ^Install CentOS 7 with http://mirror.centos.org Repo
  kernel CentOS-7.2/vmlinuz
  append initrd=CentOS-7.2/initrd.img inst.repo=http://mirrors.aliyun.com/centos/7/os/x86_64/ devfs=nomount ip=dhcp

menu separator # insert an empty line

# utilities submenu
menu begin ^Troubleshooting
  menu title Troubleshooting

label vesa
  menu indent count 5
  menu label Install CentOS 7 in ^basic graphics mode
  text help
    Try this option out if you're having trouble installing
    CentOS 7.
  endtext
  kernel CentOS-7.2/vmlinuz
  append initrd=CentOS-7.2/initrd.img inst.repo=ftp://192.168.80.10/pub/CentOS-7.2 xdriver=vesa nomodeset quiet

label rescue
  menu indent count 5
  menu label ^Rescue a CentOS system
  text help
    If the system will not boot, this lets you access files
    and edit config files to try to get it booting again.
  endtext
  kernel CentOS-7.2/vmlinuz
  append initrd=CentOS-7.2/initrd.img inst.repo=ftp://192.168.80.10/pub/CentOS-7.2 rescue quiet

label memtest
  menu label Run a ^memory test
  text help
    If your system is having issues, a problem with your
    system's memory may be the cause. Use this utility to
    see if the memory is working correctly.
  endtext
  kernel memtest

menu separator # insert an empty line

label local
  menu label Boot from ^local drive
  localboot 0xffff

menu separator # insert an empty line
menu separator # insert an empty line

label returntomain
  menu label Return to ^main menu
  menu exit

menu end

(8) 测试

5 PXE+Kickstart实现全自动批量引导安装CentOS

可以在PXE Boot Server上查看DHCP日志:

# tail -f /var/log/messages

6 PXE+Kickstart实现全自动批量引导安装CentOS

未经允许不得转载: LIFE & SHARE - 王颜公子 » PXE+Kickstart实现全自动批量引导安装CentOS

分享

作者

作者头像

Madman

如果博文内容有误或其它任何问题,欢迎留言评论,我会尽快回复; 或者通过QQ、微信等联系我

0 条评论

暂时还没有评论.

发表评论前请先登录