本文内容
- 系统安装过程和配置anaconda
- 制作自动化安装系统的应答文件
- DHCP服务
- TFTP服务
- 利用PXE实现自动化的系统部署
1 系统安装过程
1.1 运维自动化发展历程及技术应用
运维自动化发展历史1.2 系统安装过程
Linux的安装过程如下:
- 加载boot loader
- 加载启动安装菜单
- 加载内核和initrd文件
- 加载根系统
- 运行anaconda的安装向导
1.2.1 Linux的安装光盘的安装相关文件
在系统光盘的isolinux目录下有和安装相关的文件, 安装操作系统需要的必要文件
[18:03:49 root@CentOS-8-1 ~]#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
- boot.cat: 相当于grub的第一阶段, 引导系统
- grub.conf: 相当于grub的第二阶段
- isolinux.bin: 光盘引导程序, 在mkisofs的选项中需要明确给出文件路径, 这个文件属于SYSLINUX项目
- isolinux.cfg: 启动菜单的配置文件, 当光盘启动后(即运行isolinux.bin), 会自动去找isolinux.cfg文件. 这是启动菜单, 和kickstart文件不一样
- vesamenu.c32: 是光盘启动后的启动菜单图形界面, 也属于SYSLINUX项目, menu.c32提供纯文本的菜单
- memtest: 内存检测程序
- splash.png: 光盘启动菜单界面的背景图
- vmlinuz: 是内核映像
- ininrd.img: ramfs文件, 启动时需要的相关驱动
进入到救援模式的几种方法:
开机按ESC进入到启动菜单, 选择光盘启动
-
手动选择Troubleshooting, 然后进入到rescue选项
-
按ESC, 进入boot: , 按rescue, 回车, 进入到救援模式
-
按ESC, 进入boot, 按linux rescue, 回车, 进入到救援模式
-
在光盘启动界面, 按tab键, 然后输入rescue, 作为内核参数
1.2.2 安装菜单的内核参数
可以在安装光盘的启动菜单配置文件: isolinux/isolinux.cfg中设置相关的内核加载参数, 实现不同的安装过程
isolinux.cfg文件中每个安装对应菜单选项:
- 加载内核: isolinuz/vmlinuz
- 向内核传递参数: append initrd=initrd.img 参数设置
指定内核参数方法:
- 在启动菜单界面, 选择一种安装方法, 按tab键, 在后面增加参数
- 在启动菜单界面, 任意选中一种安装方法, 按ESC键: boot: linux 参数设置
常见的内核参数:
- text: 默认启动GUI安装接口, 可以指定文本方式的安装界面
- 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
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 - 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的配置方式
- 交互配置方式
- 通过读取事先给定的配置文件自动完成配置, 加载内核参数: ks=/path实现指明kickstart文件的位置, 各种路径格式如下:
DVD drive: ks=cdrom:/PATH/TO/KICKSTART_FILE
Hard drive: ks=hd:device:/directory/KICKSTART_FILE
HTTP server: ks=http://host:Port/path/to/KICKSTART_FILE
FTP server: ks=ftp://host:port/path/to/KICKSTART_FILE
HTTPS server: ks=https://host:port/path/to/KICKSTART_FILE
NFS server: ks=nfs:host:/path/to/KICKSTART_FILE
2 自动安装的应答文件
实现自动安装前, 需要制作对应的安装应答文件, 称为kickstart文件, 用于保存安装过程需要指定的选项
2.1 kickstart文件使用过程
- Create a Kickstart file
- Make the Kickstart file availables on removable media, a hard drive or a network location
- Create boot media, which will be used to begin the installation
- Make the installation source available
- 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: 安装前脚本
%post: 安装后脚本
注意:
CentOS 8,7,6 不同版本的kickstart文件格式不尽相同,不可混用
%addon, %packages, %onerror, %pre 、 %post 必须以%end结束,否则安装失败
2.3 kickstart文件创建
创建kickstart文件的方式:
- 可使用创建工具:system-config-kickstart ,注意:此方法 CentOS 8 不再支持
- 依据某模板修改并生成新配置,CentOS安装完后,会自动参考当前系统的安装过程,生成一个kickstart文件 /root/anaconda-ks.cfg
检查ks文件的语法错误:
使用 ksvalidator 工具可以检查kickstart的文件格式是否有语法错误,来自于 pykickstart 包
格式:
ksvalidator /PATH/TO/KICKSTART_FILE
范例: 将远程管理主机的ssh key添加到系统安装kickstart文件, 实现系统安装好, 就可以直接ssh基于key验证连接
- 在管理主机本地生成公钥和私钥
- 管理主机使用ssh-copy-id将key传给自己本机, 生成authorized_keys文件
- 在kickstart文件中, 创建authorized_keys文件, 修改权限, 将上一步生成的key信息复制到kickstart的key文件中, 相当于在安装系统的时候, 就把远程管理主机的key添加到了ssh验证中, 之后就可用基于key验证, 不需要输入密码
假定CentOS 8 作为远程管理主机
1. 生成远程管理主机的公钥和私钥
[18:55:35 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:QyrO/TW6kDpVuspItUqKR4G6IQIuZON40i+PQwUcGGY root@CentOS-8-1
The key's randomart image is:
+---[RSA 3072]----+
|.E.. |
|+ o |
| . . . |
|o+. . o. |
|O..oo .oS |
|Oo=+ +o. . |
|+Bo.+.+. o |
|o++=o..o o . |
|o.++=o +. |
+----[SHA256]-----+
2. 将key传给自己本地
[18:55:39 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:r5nZbKITDuMpv35jbqsfjYh8JVFnMaO5/avXQxh6Hmk.
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.
[18:56:14 root@CentOS-8-1 ~]#ls .ssh
authorized_keys
[18:57:18 root@CentOS-8-1 ~]#cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt92c0R+BMldavwCdmnRD2xWOlZ+YcZUEAvQcCoyWWe1DszF72qyk4zlb0SJ9s/oNbLkxg5LQ2afuR/E37sQ61d+5nq5LZUyiY6yX4qFDojUeMyk2rqiO/e3edolZahadOuuS8nbkL7hHM/qTo2MyWfQgESwbNGOfgnnIZ5PbBeCO3OlpWL2yJeFdnDWTPNGfSfzNAyQXicPW2M8Q1Pri4RBTSqfcVHN4MbvpWsgcjMp4nopLk/sZfoI8YeXJIc0gWc0aVC3ymKd49nKNeMm9VJ5bDIBN/AMzUhL+15zL7v68Y6lbBoRlK+wFAkO6GWT7LTxue+iXlbjLvH9+rjGHfZKY9aSKYV8EyVCb4IvWoOqp4bOfsY6nNghRVZsuEjxLy/Hpb4h+p+Ywq2XoUdxunEJUlBabg5SY62aKjJEl9TPUONexrn5Q4CkFItrGStI6rklSeQyg8gVaNme8cxgBqovOcVuKMrLz5TfwyFonaKzKQWp+aGkuJyIO/O0e+/iE= root@CentOS-8-1
3. 在kickstart文件里创建 authorized_keys 文件, 把刚才创建出来的远程主机的key复制到kickstart文件里, 注意需要修改文件和目录权限
******************************************
mkdir /root/.ssh # 这个.ssh文件, 只有发生了远程ssh连接后才会在服务器端生成, 所以在制作kickstart时要手动创建.
chmod 700 /root/.ssh
cat > /root/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt92c0R+BMldavwCdmnRD2xWOlZ+YcZUEAvQcCoyWWe1DszF72qyk4zlb0SJ9s/oNbLkxg5LQ2afuR/E37sQ61d+5nq5LZUyiY6yX4qFDojUeMyk2rqiO/e3edolZahadOuuS8nbkL7hHM/qTo2MyWfQgESwbNGOfgnnIZ5PbBeCO3OlpWL2yJeFdnDWTPNGfSfzNAyQXicPW2M8Q1Pri4RBTSqfcVHN4MbvpWsgcjMp4nopLk/sZfoI8YeXJIc0gWc0aVC3ymKd49nKNeMm9VJ5bDIBN/AMzUhL+15zL7v68Y6lbBoRlK+wFAkO6GWT7LTxue+iXlbjLvH9+rjGHfZKY9aSKYV8EyVCb4IvWoOqp4bOfsY6nNghRVZsuEjxLy/Hpb4h+p+Ywq2XoUdxunEJUlBabg5SY62aKjJEl9TPUONexrn5Q4CkFItrGStI6rklSeQyg8gVaNme8cxgBqovOcVuKMrLz5TfwyFonaKzKQWp+aGkuJyIO/O0e+/iE= root@CentOS-8-1
EOF
chmod 600 /root/.ssh/authorized_keys
******************************************
4. 将第三步中所有内容复制到kickstart文件中的%post <脚本> %END 字段里, 系统安装完成后自动执行
范例: 利用图形化制作CentOS7自动化安装kickstart文件, 在CentOS 8搭建http yum仓库提供下载
Centos 6 & 7 有system-config-kickstart图形化工具, Centos8不兼容, 因为python 2和3互不兼容
服务器一般是最小化安装, 因此, 需要在Windows安装Xmanager来打开服务器端的system-config-kickstart图形化工具
大致步骤
- 在服务器端安装system-config-kickstart
- Windows安装Xmanager
通过Windows Xmanager打开CentOS7上图形界面,因为服务器是最小化安装,所以即使在安装system-config-kickstart包时安装了很多其他图形化包,但是并没有安装图形化界面
- 定义变量export DISPLAY=WindowsIP:N.N
- 在服务器端运行system-config-kickstart, 会在Xmanager打开kickstart配置文件
步骤:
- CentOS-7安装 system-config-kickstart 程序包
[19:12:50 root@centos-7-1 ~]#yum -y install system-config-kickstart
- 在Windows本地安装xManager
- 在服务器端(CentOS 7)定义环境变量
[19:55:16 root@centos-7-1 ~]#export DISPLAY=10.0.0.1:0.0
- Centos 7启动 system-config-kickstart
[20:02:08 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
图片.png
图片.png
图片.png
CentOS 8 上搭建内部yum仓库 http
yum -y install httpd; systemctl start httpd
按照yum仓库路径格式创建目录
[12:33:05 root@centos8 ~]#mkdir /var/www/html/centos/{6,7,8}/os/x86_64/ -pv
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/'
0 directories, 2 files
[20:16:46 root@CentOS-8-1 ~]#tree /var/www/html/
/var/www/html/
└── centos
├── 6
│ └── os
│ └── x86_64
├── 7
│ └── os
│ └── x86_64
└── 8
└── os
└── x86_64
10 directories, 0 files
实验环境
挂载光盘到 /var/www/html/centos/{7,8}/os/x86_64/
在8上制作yum仓库, 通过7的kickstart图形化工具创建7的kickstart应答文件
在新的服务器安装7系统
将iso文件挂载到/var/www/html/centos/{6,7,8}/os/x86_64/目录下
添加一个额外的光驱, 用于挂载7的安装光盘
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
[20:30:00 root@CentOS-8-1 ~]#scandisk # 新添加的光驱需要重启服务器才能识别, 或者使用scandisk命令别名
[20:30:03 root@CentOS-8-1 ~]#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 # 挂载到8的目录
sr1 11:1 1 4.5G 0 rom # 挂载到7的目录
[20:24:45 root@CentOS-8-1 ~]#mount /dev/sr0 /var/www/html/centos/8/os/x86_64/ # 挂载8的安装光盘
mount: /var/www/html/centos/8/os/x86_64: WARNING: device write-protected, mounted read-only.
[20:31:43 root@CentOS-8-1 ~]#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.
生产环境
直接把iso文件拷贝到yum服务器主机,然后mount直接把iso文件挂到var/www/html/centos/{6,7,8}/os/x86_64/目录下
mount CentOS-8.2.2004-x86_64-dvd1.iso /var/www/html/centos/8/os/x86_64/
图片.png
图片.png
图片.png 图片.png 图片.png 图片.png 图片.png 图片.png 图片.png 图片.png 图片.png
Package Selection
需要在配置Xmanager之前, 就去本地7的yum仓库修改yum配置文件, 否则无法继续包的安装选项
图片.png先将配置临时保存, 然后配置yum仓库
图片.png 图片.png 图片.png关闭Xmanger
把base标签改成development
图片.png再次打开Xmanager, 验证开始接受yum仓库信息
图片.png 图片.png导入刚才保存的ks文件
图片.png选择要安装的软件, 这里测试安装mariadb客户端
图片.png安装后执行脚本, 添加创建新系统yum配置文件
图片.pngmkdir /root/.ssh
chmod 700 /root/.ssh
cat > /root/.ssh/authorized_keys << EOF
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt92c0R+BMldavwCdmnRD2xWOlZ+YcZUEAvQcCoyWWe1DszF72qyk4zlb0SJ9s/oNbLkxg5LQ2afuR/E37sQ61d+5nq5LZUyiY6yX4qFDojUeMyk2rqiO/e3edolZahadOuuS8nbkL7hHM/qTo2MyWfQgESwbNGOfgnnIZ5PbBeCO3OlpWL2yJeFdnDWTPNGfSfzNAyQXicPW2M8Q1Pri4RBTSqfcVHN4MbvpWsgcjMp4nopLk/sZfoI8YeXJIc0gWc0aVC3ymKd49nKNeMm9VJ5bDIBN/AMzUhL+15zL7v68Y6lbBoRlK+wFAkO6GWT7LTxue+iXlbjLvH9+rjGHfZKY9aSKYV8EyVCb4IvWoOqp4bOfsY6nNghRVZsuEjxLy/Hpb4h+p+Ywq2XoUdxunEJUlBabg5SY62aKjJEl9TPUONexrn5Q4CkFItrGStI6rklSeQyg8gVaNme8cxgBqovOcVuKMrLz5TfwyFonaKzKQWp+aGkuJyIO/O0e+/iE= root@CentOS-8-1
EOF
chmod 600 /root/.ssh/authorized_keys
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo << EOF
[base]
name=CentOS
baseurl=https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch/ # $符号需要进行转义, 否则会直接扩展变量
gpgcheck=0
[extra]
name=extras
baseurl=https://mirrors.aliyun.com/centos/\$releasever/extras/\$basearch
gpgcheck=0
enabled=1
[epel]
name=EPEL
baseurl=http://mirrors.aliyun.com/epel/\$releasever/\$basearch
gpgcheck=0
EOF
保存ks文件到/root目录下, 退出Xanager, 修改ks文件的时区设置, 安装vim
[21:21:52 root@centos-7-1 ~]#vim ks.cfg
...
# System timezone
timezone Asia/Shanghai
...
图片.png
将ks.cfg文件拷贝到CentOS 8 yum仓库目录下
在CentOS7上生成kickstart文件, 然后传到yum服务器上
[20:31:58 root@CentOS-8-1 ~]#mkdir /var/www/html/ks # 创建存放ks文件的目录
#应答文件制作完成后, 检查语法
[21:25:06 root@centos-7-1 ~]#ksvalidator ks.cfg
#语法无误, 则传给yum仓库
[21:25:22 root@centos-7-1 ~]#scp ks.cfg 10.0.0.81:/var/www/html/ks/centos7.cfg
验证8的yum仓库上可以访问到ks文件
图片.png安装新的系统, 应答文件的使用需要在开机时, 指定应答文件的路径
准备一个新的CentOS7虚拟机, 对于磁盘大小一定要大于ks文件中的分区总大小(此前ks分区一个430个G
, 因此准备的新的虚拟机要大于430个G), 内存2个G以上
无需挂载7的安装光盘, 而是利用7的最小化启动光盘进行启动, 然后利用ks文件中的yum仓库进行软件安装
https://mirror.tuna.tsinghua.edu.cn/centos-vault/7.8.2003/isos/x86_64/
图片.png新的虚拟机挂载NetInstall光盘
图片.png开机, 开机时进入菜单, 按ESC键, 进入boot命令行-指定应答文件路径
图片.png 图片.pnglinux ks=http://10.0.0.81/ks/centos7.cfg
敲回车
图片.png进入安装
图片.png如果安装完, 一直卡在等待界面, 可能是因为grub安装失败, 需要重启, 进入救援模式, 安装grub2, 退出救援模式
可以在安装前, 先检查下ks文件, 看看有没有指定bootloader安装位置, bootloader --append="net.ifnames=0" --location=mbr, 如果没有选择安装boot loader 这里会显示 --location=none
图片.pngchroot /mnt/sysimage
grub2-install /dev/sda
mount /dev/sr0 /mnt
grub2-mkconfig -o /boot/grub2/grub.cfg
sync
重启
如何实现基于网络自动化安装
目前, 虽然可以实现利用ks文件进行自动化安装, 但是系统还需要插入最小化启动安装光盘, 来提供内核文件, boot loader, grub等, 因此, 需要实现基于网络的完全自动化安装, 把这些依赖的文件存放在固定的服务器上, 达到只要网络通, 可以通过新的服务器的网卡找到对应服务器上的文件, 然后下载安装
在新的服务器上开机, 选择菜单, 进行安装即可
4 实现DHCP服务
主机获取网络配置可以通过两种方式:
- 静态指定
- 动态获取:
bootp:boot protocol MAC与IP一一静态对应
dhcp:增强的bootp,动态
自动化安装过程需要配置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共有八种报文
DHCP DISCOVER:客户端到服务器
DHCP OFFER :服务器到客户端
DHCP REQUEST:客户端到服务器
DHCP ACK :服务器到客户端
DHCP NAK:服务器到客户端,通知用户无法分配合适的IP地址
DHCP DECLINE :客户端到服务器,指示地址已被使用
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(之前的yum仓库服务器) 搭建DHCP服务
工作中, dhcp和yum仓库一般不会在同一个服务器
准备工作: 关掉vmware的dhcp服务, 防止新的虚拟机从dhcp收取地址
- 在服务器端安装dhcp-server包(Centos 8) Centos 7上安装dhcp包
[23:35:49 root@CentOS-8-1 ~]#yum -y install dhcp-server
- dhcpd服务默认是无法启动的, 因为配置文件是空的/etc/dhcp/dhcpd.conf需要编辑dhcpd.conf文件, 添加子网地址
# 用模板文件覆盖系统生成的dhcpd.conf文件
[23:36:30 root@CentOS-8-1 ~]#cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp: overwrite '/etc/dhcp/dhcpd.conf'? yes
# option definitions common to all supported networks...
option domain-name "david.org"; #域名是resolv.conf文件定义的search域名
option domain-name-servers 54.252.183.4, 54.252.183.5;
default-lease-time 86400; #租期, 默认600s, 达到一半时间就要开始续租, 需要时间调长, 比如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.
# 地址段一定和当前网卡IP在同一个地址段, 因为dhcp基于广播实现
subnet 10.0.0.0 netmask 255.255.255.0 { #指定给哪个网段分配地址
range 10.0.0.150 10.0.0.200;
option routers 10.0.0.2; # 10.0.0.2是vmware nat环境的网关, 实际工作中还要看具体的网关地址是多少
}
从当前行到结尾, 非#开头的行加上#
进入末行模式
:.,$s/^\([^#].*\)/#\1/
:.,$s/^[^#].*/#&/ # &符号表示前面搜索出来的所有内容
测试DHCP服务成功
[23:59:37 root@CentOS-8-1 ~]#systemctl enable --now dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
#找一台机器配置dhcp获取ip, 查看是否获得ip地址, 这里用之前制作ks文件的centos7模拟dhcp客户端
[00:04:43 root@centos-7-1 ~]#vinet
BOOTPROTO=dhcp
NAME=eth0
DEVICE=eth0
ONBOOT=yes
[00:05:02 root@centos-7-1 ~]#nmcli conn reload
[00:05:23 root@centos-7-1 ~]#nmcli conn up eth0 # 执行命令后, 如果远程连接断开, 说明dhcp生效
#在centos7查看dhcp日志
查看cat /var/log/message文件
Mar 14 00:05:28 centos-7-1 dbus[540]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Mar 14 00:05:28 centos-7-1 systemd: Started Network Manager Script Dispatcher Service.
Mar 14 00:05:28 centos-7-1 NetworkManager[548]: <info> [1615651528.4339] dhcp4 (eth0): dhclient started with pid 1116
Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:1 'connectivity-change': new request (2 scripts)
Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:1 'connectivity-change': start running ordered scripts...
Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:2 'down' [eth0]: new request (2 scripts)
Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:2 'down' [eth0]: start running ordered scripts...
Mar 14 00:05:28 centos-7-1 dhclient[1116]: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4 (xid=0x7523106d)
Mar 14 00:05:29 centos-7-1 dhclient[1116]: DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x7523106d)
Mar 14 00:05:29 centos-7-1 dhclient[1116]: DHCPOFFER from 10.0.0.81
Mar 14 00:05:29 centos-7-1 dhclient[1116]: DHCPACK from 10.0.0.81 (xid=0x7523106d)
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5142] dhcp4 (eth0): address 10.0.0.151
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5142] dhcp4 (eth0): plen 24 (255.255.255.0)
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): gateway 10.0.0.2
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): lease time 86400
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): nameserver '223.5.5.5'
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): nameserver '180.76.76.76'
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): domain name 'david.org'
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5143] dhcp4 (eth0): state changed unknown -> bound
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5156] device (eth0): state change: ip-config -> ip-check (reason 'none', sys-iface-state: 'managed')
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5165] device (eth0): state change: ip-check -> secondaries (reason 'none', sys-iface-state: 'managed')
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5180] device (eth0): state change: secondaries -> activated (reason 'none', sys-iface-state: 'managed')
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5186] manager: NetworkManager state is now CONNECTED_LOCAL
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5367] manager: NetworkManager state is now CONNECTED_SITE
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5369] policy: set 'eth0' (eth0) as default for IPv4 routing and DNS
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5413] device (eth0): Activation: successful, device activated.
Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info> [1615651529.5421] manager: NetworkManager state is now CONNECTED_GLOBAL
#在dhcp服务器查看dhcp日志
[00:00:49 root@CentOS-8-1 ~]#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'\337\235\355\000\014)\037J\012";
lease 10.0.0.150 { # 150分给了之前ks启动的新的虚拟机
starts 6 2021/03/13 16:02:39; # UTC时间 比北京时间完了8小时
ends 0 2021/03/14 16:02:39;
cltt 6 2021/03/13 16:02:39;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:b9:c5:39; # 分配给客户端的mac地址
}
lease 10.0.0.151 { # 151是分给centos7客户端的
starts 6 2021/03/13 16:05:28;
ends 0 2021/03/14 16:05:28;
cltt 6 2021/03/13 16:05:28;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:54:b7:78; # 该ip地址分配给的主机的mac地址
client-hostname "centos-7-1"; # 客户端的主机名
}
图片.png
客户端验证ip通过dhcp获取
图片.png客户端获取dhcp地址时会自动开启dhclient程序
[00:17:33 root@centos-7-1 ~]#ps aux | grep dhclient
root 1116 0.0 0.5 102904 5516 ? S 00:05 0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03-eth0.lease -cf /var/lib/NetworkManager/dhclient-eth0.conf eth0
root 1235 0.0 0.0 112808 968 pts/2 R+ 00:17 0:00 grep --color=auto dhclient
在一个使用静态地址的服务器上, 如何通过dhcp再分配一个ip地址
如果服务器配置了通过dhcp获取ip地址, 那么服务器启动会默认执行dhclient, 运行在后台, 想要前台执行, 需要加-d选项, dhclient -d
如果想要手动通过dhcp获取一个ip地址, 需要手动执行dhclient
需要在静态地址的服务器上运行dhclient命令, 这里准备另一个虚拟机, 使用静态地址, 测试dhclient
[00:21:22 root@centos-7-2 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static # 当前地址是静态获取
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.227
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
DNS1=223.5.5.5
DNS2=223.5.5.6
[00:23:24 root@centos-7-2 ~]#dhclient
[00:23:36 root@centos-7-2 ~]#
[00:23:36 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:54:b7:90 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.227/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.0.0.152/24 brd 10.0.0.255 scope global secondary dynamic eth0 # 获的新的地址, 通过dhcp
valid_lft 86365sec preferred_lft 86365sec
inet6 fe80::20c:29ff:fe54:b790/64 scope link
valid_lft forever preferred_lft forever
5 实现TFTP服务
轻量级文件服务, 对于小文件, 不是特别复杂的下载需求, 可以使用tftp
对于实现PXE自动化安装, 需要服务器必须配置符合PXE标准的网卡, 其内置ROM芯片, 集成了dhcp客户端和tftp客户端
dhcp客户端用于接收ip地址
tftp客户端用于接收从tftp服务器下载来的内核, boot loader等文件
否则, 新的服务器是空的, 没有硬盘, 无法接受ip, 也就无法获取必要的文件
1. 需要编辑dhcpd配置文件,让客户端网卡知道从哪个服务器获取安装系统所需文件
# 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.150 10.0.0.200;
option routers 10.0.0.2;
next-server 10.0.0.81; #tftp服务器地址, 这里用centos8-1:10.0.0.81, 提供yum, dhcp服务和tftp服务
}
2. 在tftp服务器上安装tftp服务
[00:53:38 root@CentOS-8-1 ~]#yum -y install tftp-server
[00:53:46 root@CentOS-8-1 ~]#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端口
[00:53:59 root@CentOS-8-1 ~]#systemctl start tftp
[00:54:14 root@CentOS-8-1 ~]#ss -ntlu
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 0.0.0.0:67 # tftp监听udp:67端口 0.0.0.0:*
udp UNCONN 0 0 *:69 *:*
#tftp轻量级文件共享, 没有配置文件, 只能提供文件下载
3. 告诉客户端tftp去服务器上下载哪个文件
制作pxelinux0放在tftp服务器上, 通过dhcp服务, 分配地址同时告诉客户端去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.150 10.0.0.200;
option routers 10.0.0.2;
next-server 10.0.0.8;
filename "pxelinux.0"; #bootloader启动文件的名称
}
[00:55:38 root@CentOS-8-1 ~]#systemctl restart dhcpd
验证tftp服务可用
#在服务器端添加文件到/var/lib/tftpboot/
[00:56:09 root@CentOS-8-1 ~]#cp /etc/fstab /var/lib/tftpboot/
#客户端安装tftp客户端程序, 用centos-7作为客户端
[00:35:26 root@centos-7-1 ~]#yum -y install tftp
#下载文件
[00:58:40 root@centos-7-1 ~]##tftp 10.0.0.81
[00:58:52 root@centos-7-1 ~]#tftp 10.0.0.81
tftp> get fstab
tftp> quit
[00:59:18 root@centos-7-1 ~]#ls
anaconda-ks.cfg fstab ks.cfg Sys_Init.sh
#tftp下载时需要知道文件的全名,没有补全功能
4. 安装pxelinux.0
[01:01:50 root@CentOS-8-1 ~]#yum provides */pxelinux.0
Last metadata expiration check: 0:06:53 ago on Sun 14 Mar 2021 12:54:59 AM CST.
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
[01:02:22 root@CentOS-8-1 ~]#yum -y install syslinux-nonlinux
[01:02:45 root@CentOS-8-1 ~]#rpm -ql syslinux-nonlinux
/usr/share/syslinux/pxelinux.0
#复制/usr/share/syslinux/pxelinux.0到/var/lib/tftpboot/
[01:03:03 root@CentOS-8-1 ~]#cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
到此bootloader(grub)阶段结束, 下一步进入菜单选项(isolinux.cfg菜单模板)
1. 复制isolinux.cfg到/var/lib/tftpboot
[01:05:40 root@CentOS-8-1 ~]#mkdir /var/lib/tftpboot/pxelinux.cfg
[01:06:26 root@CentOS-8-1 ~]#cp /misc/cd/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
[01:06:49 root@CentOS-8-1 ~]#tree /var/lib/tftpboot/
/var/lib/tftpboot/
├── fstab
├── pxelinux.0
└── pxelinux.cfg
└── default # 这里准备的是进入操作系统安装时的选择菜单
1 directory, 3 files
2. 修改isolinux.cfg文件
[01:07:07 root@CentOS-8-1 ~]#vim /var/lib/tftpboot/pxelinux.cfg/default
#default vesamenu.c32 --> default menu.c32 #默认提供的vesa菜单风格需要图形化界面, 要修改成syslinux-nonlinux包所带的menu.c32,精简版菜单风格,不需要图形界面
[00:58:00 root@CentOS-8-1 ~]#cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot
#关于菜单部分, 只需保留以下三行
default menu.c32
timeout 600
menu title Automatic Install Linux # 大标题
- 子标题
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 Automatic Install Linux # 大标题
label CentOS-8 # 安装8的选项
menu label Install CentOS Linux ^8 # 这里在8前面加上托字符, 可以实现, 在菜单界面输入8, 就会跳到安装8的这一行, 相当于快捷键
kernel vmlinuz
append initrd=initrd.img ks=
label CentOS-7 # 安装7的选项
menu label Install CentOS Linux ^7
kernel vmlinuz
append initrd=initrd.img ks=http://10.0.0.81/ks/centos7.cfg
label rescue # 8的救援模式
menu label ^Rescue a CentOS 8 Linux system
kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/8/os/x86_64/ rescue
label rescue
menu label ^Rescue a CentOS 7 Linux system
kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/ rescue
label local # 从本地硬盘启动, 要设为默认启动项, 这样服务器开机就会从硬盘启动, 如果把安装系统作为默认项, 那么60s结束后, 会自动安装系统, 把现有系统清空
menu label Boot from ^local drive
menu default
localboot 0xffff
menu end
# 这样菜单就包括了安装对应版本系统, 进入对应版本的救援模式, 和本地启动三个功能.
# 不过还缺少内核文件路径, 以及initrd文件路径
3. 指定initrd文件和内核文件
[01:40:45 root@CentOS-8-1 /var/lib/tftpboot]#mkdir centos{7,8}
[01:41:17 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/8/os/x86_64/isolinux/vmlinuz centos8 # 内核文件
[01:41:47 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/8/os/x86_64/isolinux/initrd.img centos8
[01:41:55 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/7/os/x86_64/isolinux/vmlinuz centos7
[01:42:08 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/7/os/x86_64/isolinux/initrd.img centos7
[01:42:17 root@CentOS-8-1 /var/lib/tftpboot]#tree
.
├── centos7
│ ├── initrd.img
│ └── vmlinuz
├── centos8
│ ├── initrd.img
│ └── vmlinuz
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
└── default
3 directories, 7 files
# 更新后的菜单文件
default menu.c32
timeout 600
menu title Automatic Install Linux
label CentOS-8
menu label Install CentOS Linux ^8
kernel vmlinuz
default menu.c32
timeout 600
menu title Automatic Install Linux
label CentOS-8
menu label Install CentOS Linux ^8
kernel centos8/vmlinuz
append initrd=centos8/initrd.img ks=
label CentOS-7
menu label Install CentOS Linux ^7
kernel centos7/vmlinuz
append initrd=centos7/initrd.img ks=http://10.0.0.81/ks/centos7.cfg
label rescue
menu label ^Rescue a CentOS 8 Linux system
kernel centos8/vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/8/os/x86_64/ rescue
label rescue
menu label ^Rescue a CentOS 7 Linux system
kernel centos7/vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/ rescue
#支持手动安装centos7
label manual
menu label ^Manual Install Centos
kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/
label local
menu label Boot from ^local drive
menu default
localboot 0xffff
menu end
4. 准备CentOS8的应答文件
- CentOS8不支持ks图形化工具, 只能手动创建ks文件, 一般可以使用一个已经装好系统的模板ks文件
#直接利用CentOS8现成的应答文件, 稍作修改, 因为7和8版本的应答文件格式略有不同
[01:42:48 root@CentOS-8-1 /var/lib/tftpboot]#cp ~/anaconda-ks.cfg /var/www/html/ks/centos8.cfg
[01:49:08 root@CentOS-8-1 /var/lib/tftpboot]#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.81/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
# Root password
rootpw --iscrypted $6$FG4jjQI/t3A.A.Fg$Uwq66umE4c8oKjiCP8stUql9wE45AioQL.KHJiKF29Y6Q2BA70M/mpDIv9untio9bPaY.flSP.uAQ/JOuOrZz.
# 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 Asia/Shanghai --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
[01:55:26 root@CentOS-8-1 /var/lib/tftpboot]#ksvalidator /var/www/html/ks/centos8.cfg
- 最终的菜单文件
default menu.c32
timeout 600
menu title Automatic Install Linux
label CentOS-8
menu label Install CentOS Linux ^8
kernel centos8/vmlinuz
append initrd=centos8/initrd.img ks=http://10.0.0.81/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.81/ks/centos7.cfg
label rescue 8
menu label ^Rescue a CentOS 8 Linux system
kernel centos8/vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/8/os/x86_64/ rescue
label rescue 7
menu label ^Rescue a CentOS 7 Linux system
kernel centos7/vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/ rescue
label manual
menu label ^Manual Install Centos
kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/
label local
menu label Boot from ^local drive
menu default
localboot 0xffff
menu end
~
- 修改8的应答文件权限, 因为8的ks文件是从已有的文件拷贝的, 而系统安装好后生成的ks文件权限是600, 需要修改为644, 让其他用户可读
[02:00:09 root@CentOS-8-1 /var/lib/tftpboot]#chmod 644 /var/www/html/ks/centos8.cfg
- 菜单文件需要使用wq!保存, 因为默认是rrr权限
[02:03:55 root@CentOS-8-1 /var/lib/tftpboot]#tree
.
├── centos7
│ ├── initrd.img # intird文件
│ └── vmlinuz # 内核文件
├── centos8
│ ├── initrd.img
│ └── vmlinuz
├── menu.c32 # 菜单风格
├── pxelinux.0 # 安装boot loader的文件
└── pxelinux.cfg
└── default # 安装选项菜单文件
3 directories, 7 files
5. 准备CentOS8特有文件
图片.png[02:06:49 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/8/os/x86_64/isolinux/*.c32 ./
[02:07:00 root@CentOS-8-1 /var/lib/tftpboot]#tree
.
├── centos7
│ ├── initrd.img
│ └── vmlinuz
├── centos8
│ ├── initrd.img
│ └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│ └── default
└── vesamenu.c32
3 directories, 11 files
[02:07:05 root@CentOS-8-1 /var/lib/tftpboot]#rm -rf vesamenu.c32
[02:08:20 root@CentOS-8-1 /var/lib/tftpboot]#tree
.
├── centos7
│ ├── initrd.img
│ └── vmlinuz
├── centos8
│ ├── initrd.img
│ └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
└── default
3 directories, 10 files
- 确保http, tftp, dhcp服务都启动
[02:10:35 root@CentOS-8-1 /var/lib/tftpboot]#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:*
udp UNCONN 0 0 *:69 *:*
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
6. 验证8的系统安装
- 先准备个虚拟机装CentOS-8, 开机
7. 验证7的系统安装
8. 对于已经安装好的系统, 也可以通过PXE进入救援模式
需要开启读条时, 按ESC, 然后选择NET网络启动, 然后进入菜单, 选择救援模式
9. 如果想重装系统, 也可以通过PXE重装
需要开启读条时, 按ESC, 然后选择NET网络启动, 然后进入菜单, 选择要安装的系统版本
补充: PXE启动流程
图片.png注意: 安装系统时不要多台一起装, 因为所有服务器都要从服务器下载文件, 占用大量带宽, 一般10几台一起装即可
网友评论