4. 运维自动化之系统部署-PXE

本文内容

  • 系统安装过程和配置anaconda
  • 制作自动化安装系统的应答文件
  • 制作引导光盘
  • DHCP服务
  • TFTP服务
  • 利用PXE实现自动化的系统部署
  • 利用Cobbler实现自动化的系统部署

1 系统安装过程

1.1 运维自动化发展历程及技术应用

运维自动化发展历史

1.2 系统安装过程

Linux的安装过程如下:

  • 加载boot loader
  • 加载启动安装菜单
  • 加载内核和initrd文件
  • 加载根系统
  • 运行anaconda的安装向导

1.2.1 Linux的安装光盘和安装相关文件

在系统光盘的isolinux目录下有和系统安装相关的文件, 这些文件是安装操作系统所需要的必要文件

范例: 使用autofs自动挂载系统安装光盘

[root@centos-8-1 ~]#yum -y install autofs
[root@centos-8-1 ~]#systemctl enable --now autofs
Created symlink /etc/systemd/system/multi-user.target.wants/autofs.service → /usr/lib/systemd/system/autofs.service.
[root@centos-8-1 ~]#cd /misc/cd # 先访问/misc/cd目录一次, 才能看到里面的内容
[root@centos-8-1 /misc/cd]#ll
total 12
dr-xr-xr-x 4 root root 2048 Jun  9  2020 AppStream
dr-xr-xr-x 4 root root 2048 Jun  9  2020 BaseOS
dr-xr-xr-x 3 root root 2048 Jun  9  2020 EFI
dr-xr-xr-x 3 root root 2048 Jun  9  2020 images
dr-xr-xr-x 2 root root 2048 Jun  9  2020 isolinux
-r--r--r-- 1 root root   87 Jun  9  2020 media.repo
-r--r--r-- 1 root root  664 Jun  9  2020 TRANS.TBL

[root@centos-8-1 /misc/cd]#df 
Filesystem     1K-blocks    Used Available Use% Mounted on
devtmpfs          905164       0    905164   0% /dev
tmpfs             921932       0    921932   0% /dev/shm
tmpfs             921932    8888    913044   1% /run
tmpfs             921932       0    921932   0% /sys/fs/cgroup
/dev/sda2       20961280 1691928  19269352   9% /
/dev/sda5       28295684  230320  28065364   1% /data
/dev/sda1         999320  137612    792896  15% /boot
tmpfs             184384       0    184384   0% /run/user/0
/dev/sr0         8037456 8037456         0 100% /misc/cd # 光盘会被自动挂载到/misc/cd下
[root@centos-8-1 /misc/cd]#ll isolinux/
total 72859
-r--r--r-- 1 root root     2048 Jun  9  2020 boot.cat
-r--r--r-- 1 root root       84 Jun  9  2020 boot.msg
-r--r--r-- 1 root root      293 Jun  9  2020 grub.conf
-r--r--r-- 2 root root 65114456 Jun  9  2020 initrd.img
-r--r--r-- 1 root root    38912 Jun  9  2020 isolinux.bin
-r--r--r-- 1 root root     3075 Jun  9  2020 isolinux.cfg
-r--r--r-- 1 root root   116096 Nov  9  2019 ldlinux.c32
-r--r--r-- 1 root root   180700 Nov  9  2019 libcom32.c32
-r--r--r-- 1 root root    22804 Nov  9  2019 libutil.c32
-r--r--r-- 1 root root   182704 May 13  2019 memtest
-r--r--r-- 1 root root      186 Jul 31  2019 splash.png
-r--r--r-- 1 root root     2885 Jun  9  2020 TRANS.TBL
-r--r--r-- 1 root root    26788 Nov  9  2019 vesamenu.c32
-r-xr-xr-x 2 root root  8913656 May  8  2020 vmlinuz
  • boot.cat: 相当于grub的第一阶段. 通过光盘启动也有引导的过程, 该文件用于引导系统
  • grub.conf: 相当于grub的第二阶段
  • isolinux.bin: 光盘引导程序, 在mkisofs的选项中需要明确给出文件路径, 这个文件属于SYSLINUX项目
  • isolinux.cfg: 启动菜单的配置文件, 当光盘启动后(即运行isolinux.bin后), 会自动去找isolinux.cfg文件
  • isolinux.cfg这个文件是启动菜单的配置文件, 和kickstart文件不一样
[root@centos-8-1 /misc/cd]#vim isolinux/isolinux.cfg
default vesamenu.c32                                                                                            
timeout 600 # 这个timeout是以0.1s为单位, 600代表60s. 它定义了从光盘启动时的倒计时时间
image.png

此时, 如果使用键盘上下键移动光标, 那么倒计时就会消失, 不再计时, 而是等待用户进行下一步操作


image.png
  • vesamenu.c32: 是光盘启动后的启动菜单图形界面, 也属于SYSLINUX项目, 而menu.c32提供纯文本的菜单
  • memtest: 内存检测程序
  • splash.png: 光盘启动菜单界面的背景图
  • vmlinuz: 是内核映像
  • initrd.img: ramfs文件, 包含启动时需要的相关驱动

进入到救援模式的几种方法:

开机启动, 同时迅速按ESC进入到Boot Menu, 选择CD-ROM Drive光盘启动

image.png
image.png

进入到CD-ROM Drive后, 可以通过以下四种方式进入救援模式

image.png
  1. 手动选择Troubleshooting, 然后进入到Rescue选项

    image.png

  2. ESC进入boot: 命令行, 输入rescue, 按回车, 进入到救援模式

image.png

image.png

image.png
  1. ESC进入boot: 命令行, 输入linux rescue, 按回车, 进入到救援模式. 这种方法相当于先进入label linux, 然后将内核参数设置为rescue
label linux
  menu label ^Install CentOS Linux 8
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd quiet
image.png
image.png
  1. 先进入CD-ROM Drive, 在光盘启动界面先按方向键选中Install CentOS Linux 8, 然后按tab键, 然后输入rescue, 作为内核参数. 如果没有选中Install而是选中Test & Install, 那么输入rescue按回车后, 会先进入光盘检测, 然后再进入救援模式
    image.png
启动救援模式

输入rescue后, 按回车, 进入救援模式

image.png

1.2.2 安装菜单的内核参数

可以在安装光盘的启动菜单配置文件: isolinux/isolinux.cfg中设置相关的内核加载参数, 实现不同的安装过程

isolinux.cfg文件中每个安装对应菜单选项:

  • 加载内核: isolinuz/vmlinuz

  • 向内核传递参数: append initrd=initrd.img 参数设置, 参数的前后顺序无所谓

  • 标准安装的内核参数


    image.png
  • 救援模式的内核参数


    image.png

指定内核参数方法:

  • 在启动菜单界面, 任意选择一种安装方法, 按tab键, 在后面增加参数
image.png
  • 在启动菜单界面, 任意选择一种安装方法, 按ESC键, 进入boot: 命令行, 在boot后执行 boot: linux 参数设置(如rescue)
image.png

常见的内核参数:

  • text: 默认启动GUI安装接口, text可以用来指定文本方式的安装界面
  • rescue: 进入救援模式
  • inst.repo=path: 指定安装源文件(仓库)的路径, 可以是以下格式
    CentOS 6
    DVD Drive repo=cdrom:device
    Hard Drive repo=hd:device/path
    HTTP Server repo=http://host/path
    HTTPS Server repo=https://host/path
    FTP Server repo=ftp://username:passwd@host/path
    NFS Server repo=nfs:server:/path
    ISO images on an NFS Server repo=nfsiso:server:/path

    CentOS 7&8
    Any CD/DVD drive inst.repo=cdrom
    Hard Drive inst.repo=hd:device:/path
    HTTP Server inst.repo=http://host/path
    HTTPS Server inst.repo=https://host/path
    FTP Server inst.repo=ftp://username:passwd@host/path
    NFS Server inst.repo=nfs:[options:]server:/path

通过PXE进行系统安装时, 可以先用最精简的book.iso完成系统启动, 然后再让系统到指定的yum/apt仓库去下载安装包. 而yum/apt的安装仓库就可以通过inst.repo参数指定

image.png
  • askmethod: 选择安装源文件的获取方法, 提供了光盘, 本地硬盘, NFS, FTP, HTTP多种安装源, 此项CentOS 7及以后版已放弃
  • ks=path: 指定自动化安装应答文件路径, 如: initrd=initrd.img inst.ks=http://192.168.8.8/ksdir/ks8.cfg
  • ip=指定ip地址信息
    ip=method: method 可以为DHCP
    ip=interface:method 指定特定窗口
    ip=ip:gateway:netmask:hostname:interface:none 静态IP

1.2.3 anaconda安装向导

anaconda是Linux系统安装程序, 可以提供两种风格的安装界面

  • gui: 图形工具
  • tui: 基于图形库curses的文本窗口

anaconda工作过程

  • 安装过程使用的语言
  • 键盘类型
  • 时区和时间
  • 安装源文件路径
  • 选定要安装的程序包
  • 安装目标存储设备及分区设置
    Basic Storage: 本地磁盘
    特殊设备: iSCSI
  • KDUMP功能
  • 设定主机名和配置网络接口
  • 安全策略
  • 管理员密码
  • 创建一个普通用户

anaconda的配置方式

2 自动安装的应答文件

实现自动安装前, 需要制作对应的安装应答文件, 称为kickstart文件, 用于保存安装过程需要指定的选项

2.1 kickstart文件使用过程

  1. Create a Kickstart file
  2. Make the Kickstart file availables on removable media, a hard drive or a network location
  3. Create boot media, which will be used to begin the installation
  4. Make the installation source available
  5. Start the Kickstart installation

2.2 kickstart文件的格式

2.2.1 kickstart文件格式官方说明

注意: 不同操作系统版本的应答文件格式不同, 不能混用

2.2.2 kickstart文件格式说明

kickstart文件主要包括三个部分:命令段,程序包段,脚本段

  • 命令段:指明各种安装前配置,如键盘类型等

命令段中的常见命令:

keyboard: 设定键盘类型
lang: 语言类型
zerombr:清除mbr
clearpart:清除分区
part: 创建分区
rootpw: 指明root的密码
timezone: 时区
text: 文本安装界面
network:指定网络设置
firewall:设置防火墙设置
selinux:设置selinux设置
reboot:安装完自动重启
user:安装完成后为系统创建新用户
url: 指明安装源
  • 程序包段:指明要安装的程序包组或程序包,指定不安装的程序包等
%packages
@^environment group: 指定环境包组,如:@^minimal-environment
@group_name
package
-package
%end
  • 脚本段:
%pre: 安装前脚本 %end
%post: 安装后脚本, 安装后脚本用的最多, 一般用于系统初始化 %end

注意:

  • CentOS 不同版本的kickstart文件格式不尽相同,不可混用
  • %addon, %packages, %onerror, %pre , %post 必须以%end结束,否则安装失败

CentOS-8最小化安装的ks文件案例:

# ks文件#开头的为注释

[root@centos-8-1 ~]#ls
anaconda-ks.cfg


[root@centos-8-1 ~]#grep -v "^#" anaconda-ks.cfg 
ignoredisk --only-use=sda
clearpart --none --initlabel 
graphical # graphical表示使用图形化界面安装, 自动化安装时需要改为text
cdrom # cdrom表示通过光盘安装, 如果是自动化安装要换成网络路径, 也就是yum/apt源的路径
keyboard --vckeymap=us --xlayouts='us'
lang en_AU.UTF-8

network  --bootproto=dhcp --device=ens160 --onboot=off --ipv6=auto --no-activate
network  --hostname=centos-8.daveit.org
repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream
rootpw --iscrypted $6$QbWZE5BaBqqqv32P$Jk2r8t5iyUxQ48k1ZlmZI/omtUWFML7WjKERCRDAxnCAgEhUq4./fOpKo4UX0nIMKJTYvvuA2KatJcODYrE3c1
firstboot --enable
skipx
services --disabled="chronyd"
timezone Australia/Melbourne --isUtc --nontp
part /data --fstype="xfs" --ondisk=sda --size=27646
part /boot --fstype="ext4" --ondisk=sda --size=1024
part swap --fstype="swap" --ondisk=sda --size=2048
part / --fstype="xfs" --ondisk=sda --size=20480

%packages
@^minimal-environment # @表示包组, @^表示环境包组 
kexec-tools
# 如果想要安装额外的包, 那么就把包名写在这里
vim
autofs


%end

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

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

2.3 kickstart文件创建

创建kickstart文件的方式:

  • 可使用创建工具:system-config-kickstart ,注意:此方法 CentOS 8 不再支持
  • 依据某模板修改并生成新配置,CentOS安装完后,会自动参考当前系统的安装过程,生成一个kickstart文件 /root/anaconda-ks.cfg. 因此, 这个文件的生成时间, 就是安装操作系统的时间. CentOS6&7&8版本都有该文件

检查ks文件的语法错误:

使用 ksvalidator 工具可以检查kickstart的文件格式是否有语法错误,来自于 pykickstart 包

格式:

ksvalidator /PATH/TO/KICKSTART_FILE

ks范例1: 将主控管理主机的ssh key添加到系统安装kickstart文件, 实现系统安装好, 就可以直接利用ssh基于key验证连接服务器

  1. 在管理主机本地生成公钥和私钥
  2. 管理主机使用ssh-copy-id将key传给自己本机, 生成authorized_keys文件
  3. 在kickstart文件中, 创建authorized_keys文件, 修改权限, 将上一步生成的authorized_keys信息复制到kickstart的authorized_keys中, 相当于在安装系统的时候, 就把远程管理主机的key添加到了ssh验证中, 之后就可用基于key验证, 不需要输入密码
假定CentOS-8-1 作为远程管理主机

1. 生成远程管理主机的公钥和私钥

[root@centos-8-1 ~]#ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TQ/UltmFsszQQhEAMwcxHl/FwpY/hmfiFWzlw6CXRYs root@centos-8-1.daveit.org
The key's randomart image is:
+---[RSA 3072]----+
|      O+o+*Xo*+o.|
|     . B oB.%Bo. |
|      . ..+@E+=  |
|         oo+@  . |
|        S..*..   |
|          .      |
|                 |
|                 |
|                 |
+----[SHA256]-----+

2. 将key传给自己本地

[root@centos-8-1 ~]#ssh-copy-id 10.0.0.81
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.0.0.81 (10.0.0.81)' can't be established.
ECDSA key fingerprint is SHA256:DPwcIjQh4iAUVxfi+dMW8Nkn5O7qvvw/GObaJH6pIpM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.81's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '10.0.0.81'"
and check to make sure that only the key(s) you wanted were added.

[root@centos-8-1 ~]#cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfhTvTvvfv7fukqWTdZIkHUWp1Ra/U4iuK/lTt4shqdfYk2kDu/9fV+kS+TxZTnKkeCr6dSybyh12PIFG9rPetoXgg0DWfIiY5rXfoPrDYgrkpZPnpdlvu/DG6ZpagmyfrSJfhXyflmDA8b1rN74qlDoVseuS7rs3qNDMY8XIbikTu+VY8ZpzrGsRubqDDdYkc1OdbnlsImksnXSktJcm7VwUXdLp4bUmSdSMNeAObLoBBBeuiucjEcfGetPDuc4zZNgLUEvyaz6YXl8WsKJJ1RtM2SmiVtSBktEi5w8va+LJ1kelpxfZmXrNWVfjk8PE5HwjEOAJx1SXEcn7VZl/XvCOh91nZ0hCLmYZoaHM7RUrKaOaC8ygs0JHaw7ltSQ2V2eJooLppqDWI24HGjnPfoSzVZnu0ujzjNUXvYJd15QcsKhzYIU8DRgqZo+LeR9V4xoSo4icTjCJCRle7Qrb47r56FkjUaSTQUnHV5Cr5AY+iXFqggAnifOz01xOVcQ0= root@centos-8-1.daveit.org

[root@centos-8-1 ~]#cat .ssh/known_hosts # 这个公钥是centos-8-1作为sshd服务端时的公钥
10.0.0.81 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCrW+Ppyrf8PTlwMTyioIJXZKLlip2Ts0o4+xWn3sMGGUCgXAc4/D5ZAJQcOssrvAq4fEI1fZg9rBPM7EGv1NQ0=

[root@centos-8-1 ~]#cat .ssh/authorized_keys # 这个才是作为ssh客户端时的公钥, 要把这个公钥添加到ks文件里
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfhTvTvvfv7fukqWTdZIkHUWp1Ra/U4iuK/lTt4shqdfYk2kDu/9fV+kS+TxZTnKkeCr6dSybyh12PIFG9rPetoXgg0DWfIiY5rXfoPrDYgrkpZPnpdlvu/DG6ZpagmyfrSJfhXyflmDA8b1rN74qlDoVseuS7rs3qNDMY8XIbikTu+VY8ZpzrGsRubqDDdYkc1OdbnlsImksnXSktJcm7VwUXdLp4bUmSdSMNeAObLoBBBeuiucjEcfGetPDuc4zZNgLUEvyaz6YXl8WsKJJ1RtM2SmiVtSBktEi5w8va+LJ1kelpxfZmXrNWVfjk8PE5HwjEOAJx1SXEcn7VZl/XvCOh91nZ0hCLmYZoaHM7RUrKaOaC8ygs0JHaw7ltSQ2V2eJooLppqDWI24HGjnPfoSzVZnu0ujzjNUXvYJd15QcsKhzYIU8DRgqZo+LeR9V4xoSo4icTjCJCRle7Qrb47r56FkjUaSTQUnHV5Cr5AY+iXFqggAnifOz01xOVcQ0= root@centos-8-1.daveit.org

3. 在kickstart文件里创建 authorized_keys 文件, 把刚才创建出来的远程主机的key复制到kickstart文件里, 注意需要修改文件和目录权限

******************************************
mkdir /root/.ssh # 这个.ssh目录, 只有在本机通过ssh远程连接了其他服务器后才会生成, 所以在制作kickstart时要手动创建. 
chmod 700 /root/.ssh
cat > /root/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfhTvTvvfv7fukqWTdZIkHUWp1Ra/U4iuK/lTt4shqdfYk2kDu/9fV+kS+TxZTnKkeCr6dSybyh12PIFG9rPetoXgg0DWfIiY5rXfoPrDYgrkpZPnpdlvu/DG6ZpagmyfrSJfhXyflmDA8b1rN74qlDoVseuS7rs3qNDMY8XIbikTu+VY8ZpzrGsRubqDDdYkc1OdbnlsImksnXSktJcm7VwUXdLp4bUmSdSMNeAObLoBBBeuiucjEcfGetPDuc4zZNgLUEvyaz6YXl8WsKJJ1RtM2SmiVtSBktEi5w8va+LJ1kelpxfZmXrNWVfjk8PE5HwjEOAJx1SXEcn7VZl/XvCOh91nZ0hCLmYZoaHM7RUrKaOaC8ygs0JHaw7ltSQ2V2eJooLppqDWI24HGjnPfoSzVZnu0ujzjNUXvYJd15QcsKhzYIU8DRgqZo+LeR9V4xoSo4icTjCJCRle7Qrb47r56FkjUaSTQUnHV5Cr5AY+iXFqggAnifOz01xOVcQ0= root@centos-8-1.daveit.org
EOF
chmod 600 /root/.ssh/authorized_keys
******************************************

4. 将第3步中所有内容复制到kickstart文件中的%post <脚本> %END 字段里, 系统安装完成后会自动执行

ks范例2: 利用图形化界面制作CentOS 7版本的自动化安装kickstart文件, 在CentOS 8搭建基于http的yum仓库, 提供yum包下载

制作应答文件可以以anaconda-ks.cfg为模板, 直接修改该文件. 但是, 这个文件有语法格式要求, 需要对该文件很熟悉才可以使用该方法.

一般情况可以利用system-config-kickstart图形化工具. CentOS 6 & 7 有system-config-kickstart图形化工具, CentOS8不兼容, 因为python 2和3互不兼容.

服务器一般是最小化安装, 因此, 需要在Windows安装Xmanager来打开服务器端的system-config-kickstart图形化工具

环境:

CentOS-7-1 运行system-config-kickstart
CentOS-8-2 搭建基于http的yum仓库
CentOS-8-1 作为管理端, 用于验证基于key的ssh验证
CentOS-7-KS-TEST 通过ks文件创建的新的服务器

大致步骤:

  1. 在CentOS7服务器端上安装system-config-kickstart

  2. Windows安装Xmanager

通过Windows Xmanager打开CentOS7上图形界面. 因为服务器是最小化安装, 所以即使在安装system-config-kickstart包时安装了很多其他图形化包, 但安装图形化界面始终是缺失的, 所以才需要在Windows上通过Xmanager打开CentOS7上的图形化工具

  1. 定义变量export DISPLAY=WindowsIP:N.N

  2. 打开Windows的Xmanager, 然后在服务器端运行system-config-kickstart, 会在Xmanager打开kickstart配置文件

具体步骤:

CentOS-7-1: 在这台主机上制作启动文件

image.png

确保Vmware的NAT网络的DHCP服务是开启的

image.png
  1. CentOS-7-1安装 system-config-kickstart 程序包
[19:12:50 root@centos-7-1 ~]#yum -y install system-config-kickstart
  1. 在Windows本地安装Xmanager
image.png
  1. 在服务器端(CentOS 7)定义环境变量
# 这里可以先打开Xmanager, 确认当前打开的窗口的编号, 然后再设置环境变量
# 如果Xmanager打开的窗口编号是1:0, 那么这里就要选择1:0
[root@centos-7-1 ~]#export DISPLAY=10.0.0.1:0.0
  1. 启动Xmanager, 然后在CentOS 7启动 system-config-kickstart


    image.png

选择1. Lenovo Display, 这样Xmanager就会只在笔记本显示器打开, 如果选择Virtual Screen那么会占据所有的显示器

image.png
image.png
[root@centos-7-1 ~]#system-config-kickstart # 这个程序要在执行了export DISPLAY的窗口执行
Xlib:  extension "RANDR" missing on display "10.0.0.1:0.0".
/usr/share/system-config-kickstart/kickstartGui.py:104: GtkWarning: GtkSpinButton: setting an adjustment with non-zero page size is deprecated
  xml = gtk.glade.XML ("/usr/share/system-config-kickstart/system-config-kickstart.glade", domain="system-config-kickstart")
Loaded plugins: fastestmirror

注意: 在CentOS7上执行system-config-kickstart, 那么生成的文件只支持CentOS7

image.png
  • Basic Configuration

密码 111111

image.png
  • Installation Method
image.png
  1. 搭建企业内部的yum仓库

在CentOS 8 上搭建内部基于http协议的yum仓库

使用CentOS-8-2搭建yum仓库

image.png
[root@centos-8-2 ~]#yum -y install httpd; systemctl enable --now httpd

按照yum仓库路径格式创建目录

[root@centos-8-2 ~]#mkdir /var/www/html/centos/{6,7,8}/os/x86_64/ -pv
mkdir: created directory '/var/www'
mkdir: created directory '/var/www/html'
mkdir: created directory '/var/www/html/centos'
mkdir: created directory '/var/www/html/centos/6'
mkdir: created directory '/var/www/html/centos/6/os'
mkdir: created directory '/var/www/html/centos/6/os/x86_64/'
mkdir: created directory '/var/www/html/centos/7'
mkdir: created directory '/var/www/html/centos/7/os'
mkdir: created directory '/var/www/html/centos/7/os/x86_64/'
mkdir: created directory '/var/www/html/centos/8'
mkdir: created directory '/var/www/html/centos/8/os'
mkdir: created directory '/var/www/html/centos/8/os/x86_64/'

[root@centos-8-2 ~]#tree /var/www/html/
/var/www/html/
└── centos
    ├── 6
    │   └── os
    │       └── x86_64
    ├── 7
    │   └── os
    │       └── x86_64
    └── 8
        └── os
            └── x86_64

10 directories, 0 files

生产环境:

直接把iso文件拷贝到yum服务器主机,然后mount直接把iso文件挂到/var/www/html/centos/{6,7,8}/os/x86_64/目录下

mount CentOS-6.8-x86_64-bin-DVD1.iso /var/www/html/centos/6/os/x86_64/
mount CentOS-7-x86_64-DVD-2003.iso /var/www/html/centos/7/os/x86_64/
mount CentOS-8.2.2004-x86_64-dvd1.iso /var/www/html/centos/8/os/x86_64/

实验环境:

[root@centos-8-2 ~]#lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   50G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0   20G  0 part /
├─sda3   8:3    0    2G  0 part [SWAP]
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0   27G  0 part /data
sr0     11:0    1  7.7G  0 rom  # sr0是8的光盘文件

可以给VMware虚拟机额外添加光驱, 装载iso镜像文件, 然后把不同版本的光驱 /dev/sr0-1..直接挂载到/var/www/html/centos/{6,7,8}/os/x86_64/对应目录

因为目前是在8上创建7的仓库, 而8上是没有7的光盘的, 所以要添加一个额外的光驱, 用于挂载7的安装光盘


image.png
image.png
[root@centos-8-2 ~]#lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   50G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0   20G  0 part /
├─sda3   8:3    0    2G  0 part [SWAP]
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0   27G  0 part /data
sr0     11:0    1  7.7G  0 rom  # 8的光盘
sr1     11:1    1  4.5G  0 rom  # 7的光盘
# 新添加的光驱/硬盘如果没有立即识别, 那么需要重启服务器才能识别, 或者使用scandisk命令别名来在线识别新的光驱/硬盘
echo "alias scandisk='echo - - - > /sys/class/scsi_host/host0/scan;echo - - - > /sys/class/scsi_host/host1/scan;echo - - - > /sys/class/scsi_host/host2/scan'" >> /root/.bashrc
# 挂载8的光驱
[root@centos-8-2 ~]#mount /dev/sr0 /var/www/html/centos/8/os/x86_64/ 
mount: /var/www/html/centos/8/os/x86_64: WARNING: device write-protected, mounted read-only.

# 挂载7的光驱
[root@centos-8-2 ~]#mount /dev/sr1 /var/www/html/centos/7/os/x86_64/ 
mount: /var/www/html/centos/7/os/x86_64: WARNING: device write-protected, mounted read-only.

测试访问

  • CentOS 8


    image.png
  • CentOS 7


    image.png
  1. 继续配置启动文件
  • Installation Method
image.png
  • Boot Loader Options
image.png
  • Partition Information
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
  • Network Configuration
image.png
image.png
  • Authentication 无需修改
image.png
  • Firewall Configuration


    image.png
  • Display Configuration

image.png
  • Package Selection

需要在配置ks文件之前, 就去这个CentOS7-1主机本地的yum仓库修改yum配置文件, 否则无法继续配置包的安装选项

image.png

先将配置临时保存, 然后配置yum仓库

image.png
image.png
[root@centos-7-1 ~]#ls -l
total 8
-rw-------. 1 root root 1477 May 13 23:40 anaconda-ks.cfg
-rw-r--r--  1 root root 1021 Jun  3 23:45 ks.cfg # 临时保存的ks.cfg

关闭Xmanager, 把CentOS-7-1的base标签改成development. 这是system-config-kickstart软件的一个bug

image.png
[root@centos-7-1 ~]#system-config-kickstart
Xlib:  extension "RANDR" missing on display "10.0.0.1:0.0".
/usr/share/system-config-kickstart/kickstartGui.py:104: GtkWarning: GtkSpinButton: setting an adjustment with non-zero page size is deprecated
  xml = gtk.glade.XML ("/usr/share/system-config-kickstart/system-config-kickstart.glade", domain="system-config-kickstart")
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

再次打开Xmanager, 然后验证

image.png

导入刚才保存的ks文件

image.png
image.png

重新打开ks文件后, 会发现boot loader变成了Do not install a boot loader, 之后安装系统的时候会因为没有安装boot loader而失败

image.png

选择要安装的软件, 这里测试安装mariadb客户端

image.png
  • Pre-installation Script

忽略

image.png
  • Post-installation Script

安装后执行两个操作:

  1. CentOS-8-1的公钥添加到安装好的服务器, 实现基于key的ssh认证
# CentOS-8-1生成密钥对
[root@centos-8-1 ~]#cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfhTvTvvfv7fukqWTdZIkHUWp1Ra/U4iuK/lTt4shqdfYk2kDu/9fV+kS+TxZTnKkeCr6dSybyh12PIFG9rPetoXgg0DWfIiY5rXfoPrDYgrkpZPnpdlvu/DG6ZpagmyfrSJfhXyflmDA8b1rN74qlDoVseuS7rs3qNDMY8XIbikTu+VY8ZpzrGsRubqDDdYkc1OdbnlsImksnXSktJcm7VwUXdLp4bUmSdSMNeAObLoBBBeuiucjEcfGetPDuc4zZNgLUEvyaz6YXl8WsKJJ1RtM2SmiVtSBktEi5w8va+LJ1kelpxfZmXrNWVfjk8PE5HwjEOAJx1SXEcn7VZl/XvCOh91nZ0hCLmYZoaHM7RUrKaOaC8ygs0JHaw7ltSQ2V2eJooLppqDWI24HGjnPfoSzVZnu0ujzjNUXvYJd15QcsKhzYIU8DRgqZo+LeR9V4xoSo4icTjCJCRle7Qrb47r56FkjUaSTQUnHV5Cr5AY+iXFqggAnifOz01xOVcQ0= root@centos-8-1.daveit.org
  1. 修改新的服务器的yum源
mkdir /root/.ssh
chmod 700 /root/.ssh
cat > /root/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDfhTvTvvfv7fukqWTdZIkHUWp1Ra/U4iuK/lTt4shqdfYk2kDu/9fV+kS+TxZTnKkeCr6dSybyh12PIFG9rPetoXgg0DWfIiY5rXfoPrDYgrkpZPnpdlvu/DG6ZpagmyfrSJfhXyflmDA8b1rN74qlDoVseuS7rs3qNDMY8XIbikTu+VY8ZpzrGsRubqDDdYkc1OdbnlsImksnXSktJcm7VwUXdLp4bUmSdSMNeAObLoBBBeuiucjEcfGetPDuc4zZNgLUEvyaz6YXl8WsKJJ1RtM2SmiVtSBktEi5w8va+LJ1kelpxfZmXrNWVfjk8PE5HwjEOAJx1SXEcn7VZl/XvCOh91nZ0hCLmYZoaHM7RUrKaOaC8ygs0JHaw7ltSQ2V2eJooLppqDWI24HGjnPfoSzVZnu0ujzjNUXvYJd15QcsKhzYIU8DRgqZo+LeR9V4xoSo4icTjCJCRle7Qrb47r56FkjUaSTQUnHV5Cr5AY+iXFqggAnifOz01xOVcQ0= root@centos-8-1.daveit.org
EOF
chmod 600 /root/.ssh/authorized_keys

mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
# 如果repo文件中利用了变量, 那么要给$进行转义, \$, 否则system-config-kickstart在制作ks文件时, 会先扩展变量, 然后把扩展后的结果写入到repo文件里
cat > /etc/yum.repos.d/CentOS-7.repo << EOF
[base]                                                                                                                                       
name=CentOS 7 - Base
baseurl=http://mirror.aarnet.edu.au/pub/centos/7/os/x86_64/
gpgcheck=0
enabled=1                                                                                                                              

[updates]
name=CentOS 7 - Updates
baseurl=http://mirror.aarnet.edu.au/pub/centos/7/updates/x86_64/
gpgcheck=0
enabled=1

[extras]
name=CentOS 7 - Extras
baseurl=http://mirror.aarnet.edu.au/pub/centos/7/extras/x86_64/
gpgcheck=0
enabled=1     

[epel]
name=Epel 7
baseurl=http://mirror.aarnet.edu.au/pub/epel/7/x86_64/
gpgcheck=0
enabled=1  
EOF
image.png
  1. 保存ks文件到/root目录下, 退出Xmanager, 修改ks文件的时区设置, 安装vim
image.png
image.png
image.png
[root@centos-7-1 ~]#vim ks.cfg 

...
# System timezone
timezone Australia/Melbourne    

%packages
@mariadb-client
vim                                                                                                            
%end
...
  1. 把ks文件, 上传到yum服务器对应目录

这里就将在CentOS-7-1上生成的ks.cfg文件拷贝到CentOS-8-2上搭建的yum仓库目录下

[root@centos-8-2 ~]#mkdir /var/www/html/ks # 创建存放ks文件的目录


#应答文件制作完成后, 检查语法
[root@centos-7-1 ~]#ksvalidator ks.cfg
#语法无误, 则传给yum仓库
[root@centos-7-1 ~]#scp ks.cfg 10.0.0.82:/var/www/html/ks/centos7.cfg

验证可以在8的yum仓库上访问到ks文件

image.png
  1. 下面进行系统安装

在未配置dhcp服务器的情况下, 使用应答文件安装新的系统, 需要在开机时指定应答文件的路径

准备一个新的CentOS7虚拟机, 磁盘大小一定要大于ks文件中的分区总大小(此前ks分区一共100个G, 因此准备的新的虚拟机要大于100个G), 内存2个G以上

在未配置tftp服务器的情况下, 利用ks文件安装服务器, 无需挂载7的完整安装光盘, 而是利用7的最小化启动光盘进行启动, 然后利用ks文件中的yum仓库进行软件安装

https://archive.kernel.org/centos-vault/7.8.2003/isos/x86_64/

image.png

创建新的虚拟机, 并且挂载NetInstall光盘


image.png
image.png

这个NetInstall是最小的网络安装的iso, 比Minimal还小, 只提供基本的系统启动功能(包含内核, boot loader, initrd等启动阶段必要的文件), 其他的rpm包需要通过ks文件里指定yum仓库去安装

# 查看NetInstall光盘的内容

sr1     11:1    1  568M  0 rom   # NetInstall光盘
[root@localhost cd]# mount /dev/sr1 /mnt
mount: /dev/sr1 is write-protected, mounting read-only
[root@localhost cd]# cd /mnt
[root@localhost mnt]# ls
EFI  images  isolinux  LiveOS
[root@localhost mnt]# ll
total 8
dr-xr-xr-x 3 root root 2048 Apr 21  2020 EFI
dr-xr-xr-x 3 root root 2048 Apr 21  2020 images
drwxr-xr-x 2 root root 2048 Apr 21  2020 isolinux
drwxr-xr-x 2 root root 2048 Apr 21  2020 LiveOS
[root@localhost mnt]# ls isolinux/
boot.cat  grub.conf   isolinux.bin  memtest     TRANS.TBL     vmlinuz
boot.msg  initrd.img  isolinux.cfg  splash.png  vesamenu.c32

此时一定要确保VMware的DHCP服务器是开启的. 因为Netinstall是基于网络安装的, 新的虚拟机需要ip地址, 而如果VMware不开启DHCP的话那么虚拟机是无法获取ip地址的, 也就是无法进行网络安装

image.png
image.png

开机, 进入菜单, 按ESC键, 进入boot命令行

image.png
图片.png
图片.png

指定应答文件路径. 这一步就是在服务器安装时, 手动指定内核参数.

linux ks=http://10.0.0.82/ks/centos7.cfg

image.png

敲回车, 进入安装

image.png

如果安装完, 一直卡在等待界面, 是因为grub安装失败, 此时需要重启服务器, 进入救援模式, 安装grub2, 然后退出救援模式.

此时即使重启, 或者关机再开机, 还是会卡在等待界面.

图片.png

因此安装前, 可以先检查下ks文件, 看看有没有指定boot loader安装位置, bootloader --append="net.ifnames=0" --location=mbr, 如果没有指定, 这里会显示 --location=none, 那么需要把--location=none, 改为--location=mbr, 这样下次安装就不会出错了

在VMware上做这个实验时会有bug, 明明已经在创建ks文件时指定了boot loader的安装位置的MBR, 但是生成的ks文件还是没有标明其安装位置, 所以安装后才会卡住.

这是因为之前配置ks时, 需要中途退出, 然后修改base源的标签名. 再次打开ks文件后, boot loader的配置自动变成了Do not install a boot loader, 而我们没有进行修改

image.png
image.png

下面进入救援模式, 执行安装grub2的操作

关机, 将完整的7的iso光盘挂载到新的服务器上

image.png

启动虚拟机, 然后进入救援模式

image.png
image.png
image.png
image.png
image.png
image.png
image.png
chroot /mnt/sysimage
grub2-install /dev/sda
mount /dev/sr0 /mnt
grub2-mkconfig -o /boot/grub2/grub.cfg
sync # sync要多执行几次, 确保磁盘同步, 否则重启后有可能还是进入到grub界面, 还需要再执行一次grub文件生成的操作
重启

重启服务器

image.png

登录测试

image.png

网卡名称没有修改成功, 不过没有大碍, 之后可以手动修改

image.png
image.png

测试在CentOS-8-1上连接新的服务器 - 10.0.0.128

image.png

完成了自动安装后, 如果有些配置没有设置成功, 那么还需要进行系统初始化, 因此PXE要和初始化脚本配合使用

如何实现基于网络自动化安装?

目前, 虽然可以实现利用ks文件进行自动化安装, 但是还需要在新的服务器上插入最小化启动安装光盘, 来提供内核文件, boot loader等. 因此, 需要实现基于网络的完全自动化安装, 把这些依赖的文件存放在固定的服务器上, 达到只要网络通, 可以通过服务器的网卡找到对应服务器上的文件, 然后下载安装, 在新的服务器上只需要开机, 选择菜单, 进行安装即可, 之后都是完全自动安装的.

3 制作引导光盘和U盘

4 实现DHCP服务

DHCP服务注意事项:

在一个局域网内, 只搭建一个DHCP服务器, 否则可能会出现以下情况
1. 所有的DHCP服务器都会给客户端响应DHCP请求, 但是客户端只会使用第一个接收到的ip, 那么其他的响应就会被忽略, 也就无效地占用网络带宽.
2. 多个DHCP服务器可能将同一个IP地址, 分配给不同的服务器, 造成ip地址冲突.

主机获取网络配置可以通过两种方式:

  • 静态指定
  • 动态获取:
bootp:boot protocol, MAC与IP一一静态对应
dhcp:增强的bootp,动态分配ip地址

自动化安装过程需要配置dhcp服务器. 一是让新的服务器, 在安装完成后自动获取ip地址, 这需要先在ks文件中, 指定ip地址通过dhcp获取. 二是需要dhcp服务器通知新的服务器, 存放了内核文件, boot loader等文件的服务器的地址, 这样新的服务器才能通过网络下载启动安装必要的文件, 实现不依赖于本地光盘的启动.

大概流程:

通过dhcp服务器, 获取ip地址以及tftp服务器地址 -- 从tftp服务器下载启动安装的依赖数据 -- 执行安装ks文件

4.1 DHCP工作原理

DHCP: Dynamic Host Configuration Protocol,动态主机配置协议,UDP协议,C/S模式
dhcp server:67/udp
dhcpv4 client: 68/udp,dhcpv6 client:546/udp

  • 主要用途:
用于内部网络和网络服务供应商自动分配IP地址给用户

用于内部网络管理员作为对所有电脑作集中管理的手段

自动化安装系统

解决IPV4资源不足问题
  • DHCP共有八种报文
图片.png
DHCP DISCOVER:客户端到服务器
DHCP OFFER :服务器到客户端
DHCP REQUEST:客户端到服务器
DHCP ACK :服务器到客户端
DHCP NAK:服务器到客户端,通知用户无法分配合适的IP地址
DHCP DECLINE :DHCP客户端收到DHCP服务器ACK应答报文后, 通过地址冲去检测发现服务器分配的地址冲突或者由于其他原因导致不能使用, 则会向DHCP服务器发送Decline请求报文, 通知服务器所分配的ip地址不可用, 以期获得新的ip地址
DHCP RELEASE:客户端到服务器,放弃网络地址和取消剩余的租约时间
DHCP INFORM:客户端到服务器, 客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,极少用到
  • DHCP服务续租
50% :租赁时间达到50%时会进行续租,客户端向DHCP服务器发向新的DHCPREQUEST请求。如果dhcp服务没有拒绝的理由,则回应DHCPACK信息。当DHCP客户端收到该应答信息后,就重新开始新的租用周期
87.5%:如果之前DHCP Server没有回应续租请求,等到租约期的7/8时,主机会再发送一次广播请求
  • 同网段的多个DHCP服务
DHCP服务必须基于本地
先到先得的原则, 从哪个dhcp服务器先收到地址, 就不会用后续的
客户端只需要开启dhcp, 不用指定具体用哪个dhcp服务器, 因此, 网络中有多个dhcp服务器就会冲突
  • 跨网段
RFC 1542 Compliant Routers
dhcp relay agent: 中继代理
  • 相关协议
arp
rarp
  • 租期
长租期:IP相对稳定,网络资源消耗较少,但是浪费IP资源

短租期:IP相对不稳定,网络资源消耗较多,但是IP资源可以充分利用,可以实现较少IP为较多的主机服务

在CentOS-8-2(之前的yum仓库服务器) 搭建DHCP服务

工作中, dhcp和yum仓库一般不会在同一个服务器

准备工作: 关掉VMware的dhcp服务, 防止新的虚拟机从VMware的dhcp服务获取地址


image.png

在服务器端安装dhcp-server包(Centos 8), Centos 7上安装dhcp包

[root@centos-8-2 ~]#yum -y install dhcp-server

dhcpd服务默认是无法启动的, 因为配置文件是空的/etc/dhcp/dhcpd.conf, 需要编辑dhcpd.conf文件, 添加子网地址

# 用模板文件覆盖系统生成的dhcpd.conf文件
[root@centos-8-2 ~]#cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp: overwrite '/etc/dhcp/dhcpd.conf'? y   
[root@centos-8-2 ~]#vim /etc/dhcp/dhcpd.conf
...
# option definitions common to all supported networks...
# 域名是resolv.conf文件定义的
option domain-name "daveit.org"; # search域名
# 指定DNS服务器
option domain-name-servers 8.8.8.8, 8.8.4.4;

default-lease-time 86400;  # 租期, 默认600s, dhcp达到一半时间就要开始续租, 需要把这个时间调长, 比如86400s, 一天

max-lease-time 164000; # 最长租期有效期


# No service will be given on this subnet, but declaring it helps the 
# DHCP server to understand the network topology.
# 地址段一定和当前这台dhcp服务器的网卡ip在同一个地址段, 因为dhcp是基于广播实现. 跨网段的dhcp还需要配置代理
subnet 10.0.0.0 netmask 255.255.255.0 { # 指定dhcp地址段
    range 10.0.0.200 10.0.0.250;
    option routers 10.0.0.2;     # 10.0.0.2是VMware NAT环境的网关, 实际工作中还要看具体的网关地址是多少                                         
}
# 后面的所有配置删除即可
# 也可以给其余所有行添加注释

从当前行到文本结尾, 非#开头的行加上#

进入末行模式
:.,$s/^\([^#].*\)/#\1/  
:.,$s/^[^#].*/#&/ # &符号表示前面搜索出来的所有内容  

测试dhcp服务启动成功

[root@centos-8-2 ~]#systemctl enable --now dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
#找一台机器, 配置通过dhcp获取ip, 查看是否获得ip地址, 这里用之前制作的CentOS-7-KS-TEST模拟dhcp客户端, 测试是否能接收到ip地址

# 此时ip地址是128, 这个10.0.0.128是通过VMware的dhcp服务获取的
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f9:ce:58 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.128/24 brd 10.0.0.255 scope global noprefixroute dynamic ens33
       valid_lft 1700sec preferred_lft 1700sec
    inet6 fe80::20c:29ff:fef9:ce58/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

# 确保使用dhcp
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 

# Generated by dracut initrd
NAME="ens33"
DEVICE="ens33"
ONBOOT=yes
NETBOOT=yes
UUID="2baf6164-afd4-4c1e-b889-7c463a1e83bb"
IPV6INIT=yes
BOOTPROTO=dhcp
TYPE=Ethernet


[root@localhost ~]# nmcli conn reload
[root@localhost ~]# nmcli conn up ens33 # 执行命令后, 如果远程连接断开, 说明dhcp生效. 因为当前的ip地址是从VMware虚拟机的dhcp服务器获取的, 而此时我们关闭了VMware的dhcp服务, 而是在10.0.0.82上搭建了dhcp, 那么网络重启后, 就需要到新的服务器申请dhcp, ip会发生变化, ssh远程也就会断开连接

在VMware上查看新获取的地址, 新的地址是10.0.0.200, 正是dhcp服务设置的10.0.0.200-10.0.0.250第一个地址

image.png
# 在CentOS-7-KS-TEST查看dhcp日志, cat /var/log/messages文件

...
May 28 14:59:50 localhost dhclient[1351]: DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x5079ed4c)
May 28 14:59:53 localhost dhclient[1351]: DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x5079ed4c)
May 28 14:59:58 localhost dhclient[1351]: DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x5079ed4c)
May 28 15:00:07 localhost dhclient[1351]: DHCPDISCOVER on ens33 to 255.255.255.255 port 67 interval 3 (xid=0x28c31df4)
May 28 15:00:08 localhost dhclient[1351]: DHCPREQUEST on ens33 to 255.255.255.255 port 67 (xid=0x28c31df4)
May 28 15:00:08 localhost dhclient[1351]: DHCPOFFER from 10.0.0.82
May 28 15:00:08 localhost dhclient[1351]: DHCPACK from 10.0.0.82 (xid=0x28c31df4)

...
May 28 15:00:08 localhost dhclient[1351]: bound to 10.0.0.200 -- renewal in 41105 seconds.
...

# 在dhcp服务器查看dhcp日志
# 这个.leases文件提供当前已经分配出去的ip地址的信息
[root@centos-8-2 ~]#cat /var/lib/dhcpd/dhcpd.leases 
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.3.6

# authoring-byte-order entry is generated, DO NOT DELETE
authoring-byte-order little-endian;

server-duid "\000\001\000\001,\005\233\354\000\014)\027\250\022";

lease 10.0.0.200 { # 200分给了CentOS-7-KS-TEST
  starts 0 2023/05/28 05:00:08; # 以UTC时间计时
  ends 1 2023/05/29 05:00:08;
  cltt 0 2023/05/28 05:00:08;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 00:0c:29:f9:ce:58; # dhcp客户端, 也就是CentOS-7-KS-TEST的MAC地址
}
image.png

客户端验证ip通过dhcp获取

image.png

客户端配置了通过dhcp获取地址时会自动开启dhclient程序, 运行在后台

[root@localhost ~]#  ps aux | grep dhclient
root       1351  0.0  0.1 102904  5480 ?        S    14:59   0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf /var/lib/NetworkManager/dhclient-23e80739-7cd9-4c9a-b123-f44d5f6a4614-ens33.lease -cf /var/lib/NetworkManager/dhclient-ens33.conf ens33
root       1503  0.0  0.0 112808   964 pts/4    S+   15:12   0:00 grep --color=auto dhclient

在一个使用静态地址的服务器上, 如何通过dhcp再分配一个ip地址?

如果服务器配置了通过dhcp获取ip地址, 那么服务器启动会默认执行dhclient, 运行在后台, 想要前台执行, 需要加-d选项, dhclient -d

提供dhcp服务的主机会运行dhcp服务端程序dhcpd, 监听在UDP:67端口

[root@centos-8-2 ~]#ss -ntlu
Netid       State        Recv-Q       Send-Q             Local Address:Port             Peer Address:Port      
udp         UNCONN       0            0                        0.0.0.0:67                    0.0.0.0:*         
tcp         LISTEN       0            128                      0.0.0.0:22                    0.0.0.0:*         
tcp         LISTEN       0            128                            *:80                          *:*         
tcp         LISTEN       0            128                         [::]:22                       [::]:*         

dhcp客户端会使用udp:68端口

[root@localhost ~]# ss -ntul
Netid State      Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
udp   UNCONN     0      0                         *:68                                    *:*                  
udp   UNCONN     0      0                 127.0.0.1:323                                   *:*                  
udp   UNCONN     0      0                     [::1]:323                                [::]:*                  
tcp   LISTEN     0      128                       *:22                                    *:*                  
tcp   LISTEN     0      100               127.0.0.1:25                                    *:*                  
tcp   LISTEN     0      128                    [::]:22                                 [::]:*                  
tcp   LISTEN     0      100                   [::1]:25                                 [::]:*   

配置了静态地址的服务器, 如果想要手动通过dhcp再获取一个ip地址, 需要手动执行dhclient

# 需要在使用静态地址的服务器上运行dhclient命令, 这里准备另一个虚拟机, 使用静态地址, 测试dhclient

[root@centos-7-2 ~]#vinet

ONBOOT=yes
IPADDR=10.0.0.72                                                                                               
BOOTPROTO=static # 当前是静态地址
GATEWAY=10.0.0.2
NETMASK=255.255.255.0
DNS1=8.8.8.8
DNS2=8.8.4.4
NAME=eth0
DEVICE=eth0
# 添加-d, 在前台执行dhclient
[root@centos-7-2 ~]#dhclient -d
Internet Systems Consortium DHCP Client 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth0/00:0c:29:17:a8:02
Sending on   LPF/eth0/00:0c:29:17:a8:02
Sending on   Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7 (xid=0x7bdc31aa)
DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x7bdc31aa)
DHCPOFFER from 10.0.0.82
DHCPACK from 10.0.0.82 (xid=0x7bdc31aa)
bound to 10.0.0.201 -- renewal in 33962 seconds. # 地址是201

# 验证地址
[root@centos-7-2 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:17:a8:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.72/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.201/24 brd 10.0.0.255 scope global secondary dynamic eth0
       valid_lft 86364sec preferred_lft 86364sec
    inet6 fe80::20c:29ff:fe17:a802/64 scope link 
       valid_lft forever preferred_lft forever

# 该地址也会被添加到dhcp服务器的租赁列表

[root@centos-8-2 ~]#cat /var/lib/dhcpd/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.3.6

# authoring-byte-order entry is generated, DO NOT DELETE
authoring-byte-order little-endian;

server-duid "\000\001\000\001,\005\233\354\000\014)\027\250\022";

lease 10.0.0.200 {
  starts 0 2023/05/28 05:00:08;
  ends 1 2023/05/29 05:00:08;
  cltt 0 2023/05/28 05:00:08;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 00:0c:29:f9:ce:58; # CentOS-7-KS-TEST的MAC
}
lease 10.0.0.201 {
  starts 0 2023/05/28 05:14:43;
  ends 1 2023/05/29 05:14:43;
  cltt 0 2023/05/28 05:14:43;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 00:0c:29:17:a8:02; # CentOS-7-2的MAC
}

[root@centos-7-2 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:17:a8:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.72/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.201/24 brd 10.0.0.255 scope global secondary dynamic eth0
       valid_lft 86364sec preferred_lft 86364sec
    inet6 fe80::20c:29ff:fe17:a802/64 scope link 
       valid_lft forever preferred_lft forever

5 实现TFTP服务

轻量级文件服务, 对于小文件, 不是特别复杂的下载需求, 可以使用tftp 
一台新的服务器, 如果想要启动, 并且安装Linux系统, 那么需要有boot loader(grub)和内核等文件
而干净的服务器是没有这些文件的, 因此, 需要先通过dhcp服务器, 获取一个ip地址, 并且获取到需要到哪个tftp服务器去下载这些启动需要的文件
对于实现PXE自动化安装, 需要客户端主机必须配置符合PXE标准的网卡, 该网卡内置ROM芯片, 芯片集成了dhcp客户端和tftp客户端, 即使没有安装操作系统, dhcp和tftp的客户端也可以运行
dhcp客户端用于接收ip地址
tftp客户端用于接收从tftp服务器下载的内核, boot loader等文件
否则, 新的服务器是空的, 没有启动文件, 无法接受ip, 也就无法获取必要的文件
目前使用的网卡, 基本都是符合PXE标准的网卡. 无论是笔记本还是企业服务器的网卡都是符合PXE标准的

实现PXE自动化安装所需的TFTP服务

  1. 为了让客户端知道去哪个服务器下载启动所需的文件, 需要在dhcp服务器上进行额外配置, 指明next-server地址, 也就是tftp服务器的地址
# No service will be given on this subnet, but declaring it helps the 
# DHCP server to understand the network topology.

subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.200 10.0.0.250;
    option routers 10.0.0.2;
    next-server 10.0.0.83;  # tftp服务器地址, 这里用CentOS-8-3:10.0.0.83, 提供tftp服务                                             
}
  1. 告诉客户端去tftp服务器上, 下载哪个文件

制作pxelinux.0放在tftp服务器上, 通过10.0.0.82上的dhcp服务, 分配地址, 同时告诉客户端去10.0.0.83的tftp下载pxelinux.0文件, 也就是boot loader文件

# No service will be given on this subnet, but declaring it helps the 
# DHCP server to understand the network topology.

subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.200 10.0.0.250;
    option routers 10.0.0.2;
    next-server 10.0.0.83;
    filename "pxelinux.0";   # boot loader启动文件的名称                                         
}
[root@centos-8-2 ~]#systemctl restart dhcpd
  1. 在tftp服务器(CentOS-8-3:10.0.0.83)上安装tftp服务
image.png

tftp是轻量级文件共享, 没有配置文件, 只能提供文件下载

[root@centos-8-3 ~]#yum -y install tftp-server
[root@centos-8-3 ~]#rpm -ql tftp-server
/usr/lib/.build-id
/usr/lib/.build-id/8c
/usr/lib/.build-id/8c/6921a9fb21d66da4fb299d516bce9ee6afea34
/usr/lib/systemd/system/tftp.service
/usr/lib/systemd/system/tftp.socket
/usr/sbin/in.tftpd
/usr/share/doc/tftp-server
/usr/share/doc/tftp-server/CHANGES
/usr/share/doc/tftp-server/README
/usr/share/doc/tftp-server/README.security
/usr/share/man/man8/in.tftpd.8.gz
/usr/share/man/man8/tftpd.8.gz
/var/lib/tftpboot # 共享所有数据的默认目录

# 启动tftp服务,服务端监听在udp 69端口
[root@centos-8-3 ~]#systemctl enable --now tftp
[root@centos-8-3 ~]#ss -ntlu
Netid       State        Recv-Q       Send-Q             Local Address:Port             Peer Address:Port      
udp         UNCONN       0            0                              *:69       # tftp监听udp 69端口                 *:*         
tcp         LISTEN       0            128                      0.0.0.0:22                    0.0.0.0:*         
tcp         LISTEN       0            128                         [::]:22                       [::]:* 
  1. 验证tftp服务可用
# 在服务器端添加文件到/var/lib/tftpboot/
[root@centos-8-3 ~]#cp /etc/fstab /var/lib/tftpboot/

# 客户端安装tftp客户端程序, 用CentOS-7-2作为客户端
[root@centos-7-2 ~]#yum -y install tftp

# 下载文件
[root@centos-7-2 ~]#tftp 10.0.0.83
tftp> get fstab # tftp下载时需要知道文件的全名, 没有补全功能
tftp> quit

[root@centos-7-2 ~]#ls
anaconda-ks.cfg  fstab

6. 利用PXE实现自动化系统部署

6.1 PXE介绍

PXE:Preboot Excution Environment,预启动执行环境,是由Intel公司研发,基于Client/Server的网络模式,支持远程主机通过网络从远端服务器下载镜像,并由此支持通过网络启动操作系统,可以引导和安装Windows,Linux等多种操作系统

PXE启动工作原理

图片.png
  1. Client向DHCP服务器发送IP地址请求消息,DHCP检测Client是否合法(主要是检测Client的网卡MAC地址),如果合法则租赁给Client一个IP地址,同时将启动文件pxelinux.0所在TFTP服务器地址信息一并传送给Client
  2. Client向TFTP服务器发送获取pxelinux.0请求消息,TFTP服务器接收到消息之后,向Client发送pxelinux.0大小信息,试探Client是否满意,当TFTP收到Client发回的同意发送大小信息之后,正式向Client发送pxelinux.0
  3. Client执行接收到的pxelinux.0文件,并利用此文件启动系统
  4. Client向TFTP 服务器发送请求针对本机的配置信息文件(在TFTP 服务器的pxelinux.cfg目录下),TFTP服务器将启动菜单配置文件发回Client,继而Client根据启动菜单配置文件执行后续操作
  5. Client根据启动菜单配置文件里的信息,向TFTP发送Linux内核和initrd文件请求信息,TFTP接收到消息之后将内核和initrd文件发送给Client
  6. Client向TFTP发送根文件请求信息,TFTP接收到消息之后返回Linux根文件系统
  7. Client启动Linux内核, 加载相关的内核参数
  8. Client通过内核参数下载kickstart文件,并根据kickstart文件里的安装信息,下载安装源文件进行自动化安装

UEFI客户端的安装文档

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/performing_an_advanced_rhel_installation/preparing-for-a-network-install_installing-rhel-as-an-experienced-user#configuring-a-tftp-server-for-uefi-based-clients_preparing-for-a-network-install

6.2 利用PXE实现自动化安装流程

image.png

实验环境:

TFTP: 10.0.0.83 CentOS-8-3
DHCP: 10.0.0.82 CentOS-8-2
yum仓库: 10.0.0.82 CentOS-8-2
  1. 安装boot loader阶段

准备prelinux.0文件

[root@centos-8-3 ~]#yum provides */pxelinux.0
Last metadata expiration check: 1:13:29 ago on Sun 28 May 2023 16:28:10 AEST.
syslinux-nonlinux-6.04-4.el8.noarch : SYSLINUX modules which aren't run from linux.
Repo        : BaseOS
Matched from:
Filename    : /usr/share/syslinux/pxelinux.0

syslinux-tftpboot-6.04-4.el8.noarch : SYSLINUX modules in /tftpboot, available for network booting
Repo        : BaseOS
Matched from:
Filename    : /tftpboot/pxelinux.0


[root@centos-8-3 ~]#yum -y install syslinux-nonlinux

[root@centos-8-3 ~]#rpm -ql syslinux-nonlinux
...
/usr/share/syslinux/pxelinux.0
...
# 复制/usr/share/syslinux/pxelinux.0到/var/lib/tftpboot/
[root@centos-8-3 ~]#cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
[root@centos-8-3 ~]#ll /var/lib/tftpboot/
total 48
-rw-r--r-- 1 root root   709 May 28 17:26 fstab
-rw-r--r-- 1 root root 42791 May 28 17:42 pxelinux.0
# 把之前用于测试tftp的fstab文件删除, 仅保留pxelinux.0
[root@centos-8-3 ~]#rm -rf /var/lib/tftpboot/fstab 
[root@centos-8-3 ~]#ll /var/lib/tftpboot/
total 44
-rw-r--r-- 1 root root 42791 May 28 17:42 pxelinux.0

到此boot loader(grub)阶段结束, 下一步进入菜单选项(编辑isolinux.cfg菜单模板)

  1. 准备菜单

复制isolinux.cfg到/var/lib/tftpboot

# 菜单文件可以从光盘中获取模板, 在光盘模板文件基础上进行修改
[root@centos-8-3 ~]#yum -y install autofs
Last metadata expiration check: 1:58:29 ago on Sun 28 May 2023 16:28:10 AEST.
Package autofs-1:5.1.4-40.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@centos-8-3 ~]#systemctl enable --now autofs
Created symlink /etc/systemd/system/multi-user.target.wants/autofs.service → /usr/lib/systemd/system/autofs.service.
[root@centos-8-3 ~]#ll /misc/cd
total 12
dr-xr-xr-x 4 root root 2048 Jun  9  2020 AppStream
dr-xr-xr-x 4 root root 2048 Jun  9  2020 BaseOS
dr-xr-xr-x 3 root root 2048 Jun  9  2020 EFI
dr-xr-xr-x 3 root root 2048 Jun  9  2020 images
dr-xr-xr-x 2 root root 2048 Jun  9  2020 isolinux
-r--r--r-- 1 root root   87 Jun  9  2020 media.repo
-r--r--r-- 1 root root  664 Jun  9  2020 TRANS.TBL
[root@centos-8-3 ~]#ll /misc/cd/isolinux/
total 72859
-r--r--r-- 1 root root     2048 Jun  9  2020 boot.cat
-r--r--r-- 1 root root       84 Jun  9  2020 boot.msg
-r--r--r-- 1 root root      293 Jun  9  2020 grub.conf
-r--r--r-- 2 root root 65114456 Jun  9  2020 initrd.img
-r--r--r-- 1 root root    38912 Jun  9  2020 isolinux.bin
-r--r--r-- 1 root root     3075 Jun  9  2020 isolinux.cfg
-r--r--r-- 1 root root   116096 Nov  9  2019 ldlinux.c32
-r--r--r-- 1 root root   180700 Nov  9  2019 libcom32.c32
-r--r--r-- 1 root root    22804 Nov  9  2019 libutil.c32
-r--r--r-- 1 root root   182704 May 13  2019 memtest
-r--r--r-- 1 root root      186 Jul 31  2019 splash.png
-r--r--r-- 1 root root     2885 Jun  9  2020 TRANS.TBL
-r--r--r-- 1 root root    26788 Nov  9  2019 vesamenu.c32
-r-xr-xr-x 2 root root  8913656 May  8  2020 vmlinuz

# 在/var/lib/tftpboot目录下创建一个目录, 存放菜单文件
[root@centos-8-3 ~]#cd /var/lib/tftpboot/
[root@centos-8-3 /var/lib/tftpboot]#mkdir pxelinux.cfg # 菜单文件需要放在prelinux.cfg目录下
[root@centos-8-3 /var/lib/tftpboot]#pwd
/var/lib/tftpboot
[root@centos-8-3 /var/lib/tftpboot]#cp /misc/cd/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
[root@centos-8-3 /var/lib/tftpboot]#tree 
.
├── pxelinux.0
└── pxelinux.cfg
    └── default # 这里准备的是进入操作系统安装时的选择菜单

1 directory, 2 files 

修改菜单文件

[root@centos-8-3 /var/lib/tftpboot]#vim pxelinux.cfg/default
#default vesamenu.c32  --> default menu.c32       # 默认提供的vesa菜单风格需要图形化界面, PXE自动化安装要修改成syslinux-nonlinux包所带的menu.c32,精简版菜单风格,不需要图形界面

[root@centos-8-3 /var/lib/tftpboot]#cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot
[root@centos-8-3 /var/lib/tftpboot]#ll
total 72
-rw-r--r-- 1 root root 26272 May 28 18:35 menu.c32
-rw-r--r-- 1 root root 42791 May 28 17:42 pxelinux.0
drwxr-xr-x 2 root root    21 May 28 18:33 pxelinux.cfg
[root@centos-8-3 /var/lib/tftpboot]#tree
.
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
    └── default # 这个文件默认是只读的, 修改后要加!强制保存

1 directory, 3 files


# 菜单部分, 只需保留以下四行, 其余删除, 手动修改

default menu.c32
timeout 600

# menu title是大标题, 可以保留
menu title Install CentOS via PXE  # 大标题

menu end
  • 子标题
label linux # 标签名, 可以修改为对应的要安装的系统版本
  menu label ^Install CentOS Linux 8  # 标签名
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd quiet # inst.stage2这里应该改为对应操作系统版本的应答文件路径
  • 修改后
default menu.c32 # 菜单风格
timeout 600 # 时间 60s

menu title Install CentOS via PXE  # 大标题

label CentOS-8 # 安装8的选项
  menu label Install CentOS Linux ^8 # 这里在8前面加上托字符, 可以实现, 在菜单界面输入8, 就会跳到安装8的这一行, 相当于快捷键
  kernel vmlinuz
  append initrd=initrd.img ks=http://10.0.0.82/ks/centos8.cfg 

label CentOS-7 # 安装7的选项
  menu label Install CentOS Linux ^7 
  kernel vmlinuz
  append initrd=initrd.img ks=http://10.0.0.82/ks/centos7.cfg 

label CentOS-6 # 安装6的选项
  menu label Install CentOS Linux ^6 
  kernel vmlinuz
  append initrd=initrd.img ks=http://10.0.0.82/ks/centos6.cfg 

label rescue-8 # 8的救援模式
  menu label ^Rescue a CentOS 8 Linux system
  kernel vmlinuz
  append initrd=initrd.img inst.repo=http://10.0.0.82/centos/8/os/x86_64/ rescue

label rescue-7 # 7的救援模式
  menu label ^Rescue a CentOS 7 Linux system
  kernel vmlinuz
  append initrd=initrd.img inst.repo=http://10.0.0.82/centos/7/os/x86_64/ rescue    

label rescue-6 # 6的救援模式
  menu label ^Rescue a CentOS 6 Linux system
  kernel vmlinuz
  append initrd=initrd.img inst.repo=http://10.0.0.82/centos/6/os/x86_64/ rescue    



label local # 从本地硬盘启动, 要设为默认启动项, 这样服务器开机就会从硬盘启动, 如果把安装系统作为默认项, 那么60s结束后, 会自动安装系统, 把现有系统清空

  menu label Boot from ^local drive
  menu default     # 把从本地硬盘启动设为默认启动项. 这里一定要把从本地启动设为默认, 否则一旦把从ks启动设为了默认, 那么客户端在启动后, 一旦没有在等待时间内选择从本地硬盘启动, 那么就会自动从网络启动, 直接就会开始安装系统.
                   # 如果PXE环境的dhcp服务器和办公网络不在同一个网段还好, 如果在同一个网段, 而其他客户端一旦都从该dhcp服务器获取地址, 那么只要没有把从本地硬盘启动设为默认, 就会有可能在用户开机时, 直接把系统重装了. 即使用的是Windows客户端, 也会被装为Linux系统.
                                                                                                                                                               
  localboot 0xffff


menu end
# 这样菜单就包括了安装对应版本系统, 进入对应版本的救援模式, 和本地启动三个功能.
# 不过还缺少内核文件路径, 以及initrd文件路径
  1. 指定initrd文件和内核文件

在10.0.0.82的yum服务器上, 再添加一个光盘驱动, 装载CentOS6.8的镜像文件

[root@centos-8-3 /var/lib/tftpboot]#mkdir centos{6,7,8}

# 在10.0.0.82的yum服务器上, 再添加一个光盘驱动, 装载CentOS6.8的镜像文件
[root@centos-8-2 ~]#cd /var/www/html/
[root@centos-8-2 /var/www/html]#lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   50G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0   20G  0 part /
├─sda3   8:3    0    2G  0 part [SWAP]
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0   27G  0 part /data
sr0     11:0    1  7.7G  0 rom  /var/www/html/centos/8/os/x86_64
sr1     11:1    1  4.5G  0 rom  /var/www/html/centos/7/os/x86_64
sr2     11:2    1  3.7G  0 rom  

[root@centos-8-2 /var/www/html]#mount /dev/sr2 /var/www/html/centos/6/os/x86_64


[root@centos-8-2 /var/www/html]#lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   50G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0   20G  0 part /
├─sda3   8:3    0    2G  0 part [SWAP]
├─sda4   8:4    0    1K  0 part 
└─sda5   8:5    0   27G  0 part /data
sr0     11:0    1  7.7G  0 rom  /var/www/html/centos/8/os/x86_64
sr1     11:1    1  4.5G  0 rom  /var/www/html/centos/7/os/x86_64
sr2     11:2    1  3.7G  0 rom  /var/www/html/centos/6/os/x86_64

# 将三个版本的内核文件, 从yum服务器拷贝到tftp服务器

[root@centos-8-2 /var/www/html]#scp centos/6/os/x86_64/isolinux/vmlinuz 10.0.0.83:/var/lib/tftpboot/centos6                                                                

[root@centos-8-2 /var/www/html]#scp centos/7/os/x86_64/isolinux/vmlinuz 10.0.0.83:/var/lib/tftpboot/centos7

[root@centos-8-2 /var/www/html]#scp centos/8/os/x86_64/isolinux/vmlinuz 10.0.0.83:/var/lib/tftpboot/centos8

[root@centos-8-3 /var/lib/tftpboot]#tree
.
├── centos6
│   └── vmlinuz
├── centos7
│   └── vmlinuz
├── centos8
│   └── vmlinuz
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
    └── default

4 directories, 6 files

# 将三个版本的initrd.img文件, 从yum服务器拷贝到tftp服务器
[root@centos-8-2 ~]#cd /var/www/html/

[root@centos-8-2 /var/www/html]#scp centos/6/os/x86_64/isolinux/initrd.img  10.0.0.83:/var/lib/tftpboot/centos6

[root@centos-8-2 /var/www/html]#scp centos/7/os/x86_64/isolinux/initrd.img  10.0.0.83:/var/lib/tftpboot/centos7

[root@centos-8-2 /var/www/html]#scp centos/8/os/x86_64/isolinux/initrd.img  10.0.0.83:/var/lib/tftpboot/centos8

[root@centos-8-3 /var/lib/tftpboot]#tree
.
├── centos6
│   ├── initrd.img
│   └── vmlinuz
├── centos7
│   ├── initrd.img
│   └── vmlinuz
├── centos8
│   ├── initrd.img
│   └── vmlinuz
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
    └── default

4 directories, 9 files
# 更新后的菜单文件

[root@centos-8-3 /var/lib/tftpboot]#cat pxelinux.cfg/default 
default menu.c32
timeout 600

menu title Install CentOS via PXE  

label CentOS-8 
  menu label Install CentOS Linux ^8 
  kernel centos8/vmlinuz
  append initrd=centos8/initrd.img ks=http://10.0.0.82/ks/centos8.cfg  # 自动安装都是从ks启动文件获取安装信息

label CentOS-7
  menu label Install CentOS Linux ^7 
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img ks=http://10.0.0.82/ks/centos7.cfg 

label CentOS-6 
  menu label Install CentOS Linux ^6 
  kernel centos6/vmlinuz
  append initrd=centos6/initrd.img ks=http://10.0.0.82/ks/centos6.cfg 

label rescue-8
  menu label ^Rescue a CentOS 8 Linux system
  kernel centos8/vmlinuz
  append initrd=centos8/initrd.img inst.repo=http://10.0.0.82/centos/8/os/x86_64/ rescue

label rescue-7
  menu label ^Rescue a CentOS 7 Linux system
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img inst.repo=http://10.0.0.82/centos/7/os/x86_64/ rescue    

label rescue-6
  menu label ^Rescue a CentOS 6 Linux system
  kernel centos6/vmlinuz
  append initrd=centos6/initrd.img inst.repo=http://10.0.0.82/centos/6/os/x86_64/ rescue    


# 默认从本地硬盘启动
label local 

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

# 添加一个手动安装CentOS8
label manual8
  menu label ^Manually Install CentOS 8
  kernel centos8/vmlinuz
  append initrd=initrd.img inst.repo=http://10.0.0.82/centos/8/os/x86_64/ # 手动安装会从yum仓库找到镜像文件, 然后一步一步正常按照图形化界面安装


menu end
  1. 准备CentOS8的应答文件

CentOS8不支持ks图形化工具, 只能手动创建ks文件, 一般可以使用一个已经装好系统的模板ks文件

# 直接利用CentOS8现成的应答文件, 稍作修改.
# 7和8版本的应答文件格式略有不同, 不能混用
# 在10.0.0.82这个yum服务器上, 制作8的应答文件, 利用该服务器自己的anaconda-ks.cfg文件
[root@centos-8-2 /var/www/html]#cp ~/anaconda-ks.cfg /var/www/html/ks/centos8.cfg

[root@centos-8-2 /var/www/html]#vim /var/www/html/ks/centos8.cfg

#version=RHEL8
ignoredisk --only-use=sda
# Partition clearing information
zerombr
text
reboot
clearpart --all --initlabel
selinux --disabled
firewall --disabled
url --url=http://10.0.0.82/centos/8/os/x86_64 # 指定yum仓库路径
bootloader --append="net.ifnames=0" --location=mbr --boot-drive=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=eth0 --onboot=on --ipv6=auto --activate
network  --hostname=centos-8-pxe.daveit.org
# Root password, 密码为000000
rootpw --iscrypted rootpw --iscrypted $6$QbWZE5BaBqqqv32P$Jk2r8t5iyUxQ48k1ZlmZI/omtUWFML7WjKERCRDAxnCAgEhUq4./fOpKo4UX0nIMKJTYvvuA2KatJcODYrE3c1
# Run the Setup Agent on first boot
firstboot --enable
# Do not configure the X Window System
skipx
# System services
services --disabled="chronyd"
# System timezone
timezone Australia/Melbourne --isUtc --nontp
# Disk partitioning information
part / --fstype="xfs" --ondisk=sda --size=20480
part swap --fstype="swap" --ondisk=sda --size=2048
part /boot --fstype="ext4" --ondisk=sda --size=1024
part /data --fstype="xfs" --ondisk=sda --size=27646

%packages
@^minimal-environment
kexec-tools
vim # 安装工具
wget
lrzsz

%end

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

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

%post
useradd testpxe # 建个账号, 测试安装后账号自动创建
%end 
# 把该应答文件发送到10.0.0.71上进行语法检查
[root@centos-8-2 /var/www/html]#scp ks/centos8.cfg 10.0.0.71:/root
The authenticity of host '10.0.0.71 (10.0.0.71)' can't be established.
ECDSA key fingerprint is SHA256:CoHZirMxtRAM3Ok6uIT1LZ/7jgF9nlehReAnumNluDQ.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.71' (ECDSA) to the list of known hosts.
root@10.0.0.71's password: 
centos8.cfg 

[root@centos-7-1 ~]#ksvalidator centos8.cfg 

更新菜单文件

[root@centos-8-3 /var/lib/tftpboot]#cat pxelinux.cfg/default 
default menu.c32
timeout 600

menu title Install CentOS via PXE  

label CentOS-8 
  menu label Install CentOS Linux ^8 
  kernel centos8/vmlinuz
  append initrd=centos8/initrd.img ks=http://10.0.0.82/ks/centos8.cfg 

label CentOS-7
  menu label Install CentOS Linux ^7 
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img ks=http://10.0.0.82/ks/centos7.cfg 

label CentOS-6 
  menu label Install CentOS Linux ^6 
  kernel centos6/vmlinuz
  append initrd=centos6/initrd.img ks=http://10.0.0.82/ks/centos6.cfg 

label rescue-8
  menu label ^Rescue a CentOS 8 Linux system
  kernel centos8/vmlinuz
  append initrd=centos8/initrd.img inst.repo=http://10.0.0.82/centos/8/os/x86_64/ rescue

label rescue-7
  menu label ^Rescue a CentOS 7 Linux system
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img inst.repo=http://10.0.0.82/centos/7/os/x86_64/ rescue    

label rescue-6
  menu label ^Rescue a CentOS 6 Linux system
  kernel centos6/vmlinuz
  append initrd=centos6/initrd.img inst.repo=http://10.0.0.82/centos/6/os/x86_64/ rescue    



label local 

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

label manual8
  menu label ^Manually Install CentOS 8
  kernel centos8/vmlinuz
  append centos8/initrd=initrd.img inst.repo=http://10.0.0.82/centos/8/os/x86_64/


menu end

修改CentOS8的应答文件权限. 因为8的ks文件是从已有的文件拷贝的, 系统安装好后生成的ks文件权限是600, 需要修改为644, 让其他用户可读

[root@centos-8-2 /var/www/html]#chmod 644 /var/www/html/ks/centos8.cfg
[root@centos-8-2 /var/www/html]#ll ks/
total 8
-rw-r--r-- 1 root root 2584 May 28 14:11 centos7.cfg
-rw-r--r-- 1 root root 1493 May 28 19:36 centos8.cfg

修改完, 验证可以在浏览器打开所有的ks文件


image.png

[root@centos-8-3 /var/lib/tftpboot]#tree
.
├── centos6
│   ├── initrd.img # intird文件
│   └── vmlinuz # 内核文件
├── centos7
│   ├── initrd.img
│   └── vmlinuz
├── centos8
│   ├── initrd.img
│   └── vmlinuz
├── menu.c32  # 菜单风格
├── pxelinux.0 # 安装boot loader的文件
└── pxelinux.cfg
    └── default  # 安装选项菜单文件

4 directories, 9 files
  1. 准备CentOS8特有文件
image.png

这三个文件只在CentOS8上才需要, 从yum服务器拷贝到tftp服务器

[root@centos-8-2 /var/www/html]#scp centos/8/os/x86_64/isolinux/*.c32 10.0.0.83:/var/lib/tftpboot
root@10.0.0.83's password: 
ldlinux.c32                                                                  100%  113KB  16.8MB/s   00:00    
libcom32.c32                                                                 100%  176KB  44.5MB/s   00:00    
libutil.c32                                                                  100%   22KB  11.8MB/s   00:00    
vesamenu.c32                                                                 100%   26KB  25.1MB/s   00:00   

[root@centos-8-3 /var/lib/tftpboot]#tree
.
├── centos6
│   ├── initrd.img
│   └── vmlinuz
├── centos7
│   ├── initrd.img
│   └── vmlinuz
├── centos8
│   ├── initrd.img
│   └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│   └── default
└── vesamenu.c32

4 directories, 13 files
# 把多余拷贝过来的vesamenu.c32文件删除
[root@centos-8-3 /var/lib/tftpboot]#rm -rf vesamenu.c32 
[root@centos-8-3 /var/lib/tftpboot]#tree
.
├── centos6
│   ├── initrd.img
│   └── vmlinuz
├── centos7
│   ├── initrd.img
│   └── vmlinuz
├── centos8
│   ├── initrd.img
│   └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
    └── default

4 directories, 12 files
  1. 准备6的应答文件
[root@centos-8-2 /var/www/html]#ls ks/
centos6.cfg  centos7.cfg  centos8.cfg

[root@centos-8-2 /var/www/html]#cat ks/centos6.cfg 
install
text
reboot
url --url=http://10.0.0.82/centos/6/os/x86_64/
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp  --noipv6
# 密码000000
rootpw  --iscrypted $6$FG4jjQI/t3A.A.Fg$Uwq66umE4c8oKjiCP8stUql9wE45AioQL.KHJiKF29Y6Q2BA70M/mpDIv9untio9bPaY.flSP.uAQ/JOuOrZz. 
firewall --disabled
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone Australia/Melbourne
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
zerombr
clearpart --all --initlabel
part /boot --fstype=ext4 --size=1024
part / --fstype=ext4 --size=50000
part /data --fstype=ext4 --size=30000
part swap --size=2048
%packages
@core
@server-policy
@workstation-policy
autofs
vim-enhanced
%end
%post
useradd testpxe
echo testpxe | passwd --stdin testpxe &> /dev/null
%end
image.png
  1. 确保http, tftp, dhcp服务都启动
# 10.0.0.82 yum服务器的http服务启动

[root@centos-8-2 ~]#ss -ntl
State         Recv-Q        Send-Q                 Local Address:Port                 Peer Address:Port        
LISTEN        0             128                          0.0.0.0:22                        0.0.0.0:*           
LISTEN        0             128                             [::]:22                           [::]:*           
LISTEN        0             128                                *:80                              *:*   

# 10.0.0.82 dhcp服务器的dhcp服务启动

[root@centos-8-2 ~]#ss -ntlu
Netid       State        Recv-Q       Send-Q             Local Address:Port             Peer Address:Port      
udp         UNCONN       0            0                        0.0.0.0:67                    0.0.0.0:*         
tcp         LISTEN       0            128                      0.0.0.0:22                    0.0.0.0:*         
tcp         LISTEN       0            128                         [::]:22                       [::]:*         
tcp         LISTEN       0            128                            *:80                          *:* 

# 10.0.0.83 tftp服务器的tftp服务启动

[root@centos-8-3 ~]#ss -ntul
Netid       State        Recv-Q       Send-Q             Local Address:Port             Peer Address:Port      
udp         UNCONN       0            0                              *:69                          *:*         
tcp         LISTEN       0            128                      0.0.0.0:22                    0.0.0.0:*         
tcp         LISTEN       0            128                         [::]:22                       [::]:* 
  1. 确保所有文件全部准备完毕
  • ks文件
[root@centos-8-2 ~]#tree /var/www/html/ -L 3
/var/www/html/
├── centos
│   ├── 6
│   │   └── os
│   ├── 7
│   │   └── os
│   └── 8
│       └── os
└── ks
    ├── centos6.cfg
    ├── centos7.cfg
    └── centos8.cfg

8 directories, 3 files
  • yum仓库文件
[root@centos-8-2 ~]#tree /var/www/html/ -L 3
/var/www/html/
├── centos
│   ├── 6
│   │   └── os
│   ├── 7
│   │   └── os
│   └── 8
│       └── os
└── ks
    ├── centos6.cfg
    ├── centos7.cfg
    └── centos8.cfg

8 directories, 3 files
  • 启动文件
[root@centos-8-3 ~]#tree /var/lib/tftpboot/
/var/lib/tftpboot/
├── centos6
│   ├── initrd.img
│   └── vmlinuz
├── centos7
│   ├── initrd.img
│   └── vmlinuz
├── centos8
│   ├── initrd.img
│   └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
    └── default

4 directories, 12 files

6.3 在CentOS8上实现PXE自动化安装CentOS6

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

6.4 在CentOS8上实现PXE自动化安装CentOS7

image.png
image.png
image.png
image.png

这里因为之前准备的ks文件有问题, 所以安装到最后一步时会卡在界面, 此时需要修改ks文件的boot loader安装位置

image.png
image.png

在yum服务器上修改centos7.cfg

[root@centos-8-2 ~]#vim /var/www/html/ks/centos7.cfg
bootloader --append="net.ifnames=0" --location=mbr 

把CentOS-7-1上的ks.cfg文件也改一下, 因为yum服务器上的centos7.cfg文件就是从CentOS-7-1上的ks.cfg拷贝过去的

[root@centos-7-1 ~]#vim ks.cfg 
bootloader --append="net.ifnames=0" --location=mbr   

把当前装的虚拟机删除


image.png

image.png
image.png
image.png

重新安装虚拟机

image.png
image.png
image.png
image.png

安装后登录测试

image.png
image.png

验证10.0.0.81 CentOS-8-1的公钥已经存放到新的虚拟机的authorized_keys文件里了

image.png

6.5 在CentOS8上实现PXE自动化安装CentOS8

  1. 先准备个虚拟机CentOS-8-PXE, 开机
image.png
image.png
image.png
  1. 默认会从硬盘启动, 但是因为新的服务器硬盘是空的, 所以会从网络启动
image.png

这里会提示找不到sata设备, 这是因为虚拟机没有插光盘, 选择否即可, 因为我们要从网络启动

image.png
  1. 之后就会进入网络启动菜单, 因为菜单中我们把从本地启动设为了默认, 所以菜单会直接停在Boot from local drive
image.png
  1. 在菜单内使用上下键切换到需要执行的操作, 然后按tab即可进入对应的内核参数设置, 并且进行系统安装

菜单栏每一行白色的字符都是每个Label中托字符所处的字符位置. 此时输入白色的字符就会跳转到对应的选项

image.png
  1. 选择第一行安装CentOS8
image.png

这个字符安装界面就是menu.c32提供的

image.png
  1. 安装完成, 登录测试
image.png
image.png

6.5 PXE自动化安装补充

  • 对于已经安装好的系统, 也可以通过PXE进入救援模式

需要在开机读条时, 按ESC, 然后选择NET网络启动, 然后进入菜单, 选择救援模式

  • 如果想重装系统, 也可以通过PXE重装

需要在开机读条时, 按ESC, 然后选择NET网络启动, 然后进入菜单, 选择要安装的系统版本

  • 注意: 安装系统时不要多台一起装, 因为所有服务器都要从yum和tftp服务器下载文件, 占用大量带宽, 一般10几台一起装即可

6.6 在CentOS7上实现PXE自动安装CentOS

6.6.1 安装CentOS6

6.6.2 安装CentOS7

6.6.3 安装CentOS8

6.7 在CentOS6上实现PXE自动安装CentOS

6.7.1 安装CentOS6

6.7.2 安装CentOS7

6.7.3 安装CentOS8

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容