自动化安装系统(二)

利用PXE实现自动化安装

PXE简介

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

PXE启动工作原理

pxelinux.0 是redhat系Linux系统在PXE远程引导时使用的引导文件

pxelinux.cfg/default 是默认的启动菜单文件,通过编辑pxelinux.cfg文件,可以自定义启动选项、操作系统镜像、内核、内存大小等信息,为计算机的启动提供更多的选择和灵活性

vmlinuz 是可引导、压缩的内核,Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”

initrd.img 是在系统引导过程中使用的一个临时的根文件系统

PXE实现自动化安装流程

  1. Client向PXE Server上的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文件里的安装信息,下载安装源文件进行自动化安装

实验

在centos8实现PXE自动化安装centos6/7/8

环境

NAT模式,关闭vmware的DHCP功能

DHCP服务器、TFTP服务器、HTTP服务器位于同一台电脑(Centos8)

关闭firewalld和selinux

软件包:dhcp-server、tftp-server、httpd、syslinux-nonlinux(提供pxelinux.0)

过程

在centos8 192.168.28.151 上安装软件包

[root@wenzi ~]# dnf -y install dhcp-server tftp-server httpd syslinux-nonlinux
[root@wenzi ~]# systemctl enable --now httpd tftp dhcpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
Created symlink /etc/systemd/system/sockets.target.wants/tftp.socket → /usr/lib/systemd/system/tftp.socket.
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
Job for dhcpd.service failed because the control process exited with error code.
See "systemctl status dhcpd.service" and "journalctl -xe" for details.
#启动dhcpd报错是因为dhcpd只有配置过/etc/dhcp/dhcpd.conf配置文件才可以正常启动

 配置DHCP

[root@wenzi ~]# vim /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp-server/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
#
option domain-name "example.com";
option domain-name-servers 180.76.76.76,223.6.6.6;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 192.168.28.0 netmask 255.255.255.0 {range 192.168.28.152 192.168.28.159;option routers 192.168.28.2;#指定TFTP服务器地址next-server 192.168.28.151;filename "pxelinux.0";
}
[root@wenzi ~]# systemctl start dhcpd
[root@wenzi ~]# ss -tunpl
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:*            users:(("dhcpd",pid=1857,fd=10))
udp          UNCONN         0              0                                  *:69                              *:*            users:(("systemd",pid=1,fd=58))
tcp          LISTEN         0              128                          0.0.0.0:22                        0.0.0.0:*            users:(("sshd",pid=889,fd=4))
tcp          LISTEN         0              128                             [::]:22                           [::]:*            users:(("sshd",pid=889,fd=6))
tcp          LISTEN         0              128                                *:80                              *:*            users:(("httpd",pid=1630,fd=4),("httpd",pid=1629,fd=4),("httpd",pid=1628,fd=4),("httpd",pid=1623,fd=4))

准备镜像源

[root@wenzi ~]# mkdir /var/www/html/centos/{6,7,8}
[root@wenzi ~]# tree /var/www/html/
/var/www/html/
└── centos├── 6├── 7└── 8
#关闭虚拟机,再添加二个cd/dvd,分别使用centos6、centos7的ISO,开启虚拟机
[root@wenzi ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1  3.7G  0 rom
sr1          11:1    1  4.4G  0 rom
sr2          11:2    1  7.7G  0 rom
nvme0n1     259:0    0   20G  0 disk
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0   19G  0 part├─cl-root 253:0    0   17G  0 lvm  /└─cl-swap 253:1    0    2G  0 lvm  [SWAP]
#将iso分别对应挂载至httpd
[root@wenzi ~]# mount /dev/sr0 /var/www/html/centos/6
mount: /var/www/html/centos/6: WARNING: device write-protected, mounted read-only.
[root@wenzi ~]# mount /dev/sr1 /var/www/html/centos/7
mount: /var/www/html/centos/7: WARNING: device write-protected, mounted read-only.
[root@wenzi ~]# mount /dev/sr2 /var/www/html/centos/8
mount: /var/www/html/centos/8: WARNING: device write-protected, mounted read-only.

访问 192.168.28.151/centos,查看各镜像资源

准备应答文件

[root@wenzi ~]# mkdir /var/www/html/ks/{6,7,8} -p
[root@wenzi ~]# tree /var/www/html/ks/
/var/www/html/ks/
├── 6
├── 7
└── 8

centos8 kickstart应答文件

见http://t.csdn.cn/drvrQ

[root@wenzi ~]# vim /var/www/html/ks/8/centos8_ks.cfg
#version=RHEL8
#只使用系统中的第一块磁盘
ignoredisk --only-use=nvme0n1
#清除所有磁盘的分区表
zerombr
#文本方式安装
text
#graphical
#成功安装后重启
reboot
# 清除系统上所有分区
clearpart --all --initlabel
#关闭selinux
selinux --disabled
#关闭防火墙
firewall --disabled
#通过http远程服务器的目录树安装
url --url=http://192.168.28.151/centos/8/
#键盘
keyboard --vckeymap=us --xlayouts='us'
#系统语言
lang en_US.UTF-8
#网络配置
network --bootproto=dhcp --device=ens160 --ipv6=auto --activate
#network  --bootproto=static --device=ens160 --gateway=192.168.28.2 --ip=192.168.28.152 --nameserver=223.5.5.5,180.76.76.76 --netmask=255.255.255.0 --ipv6=auto --activate
#主机名
network  --hostname=wenzi
#root加密后的密码
rootpw --iscrypted $6$CEK/siEJwPyzpudd$cJ/rz9oiqDmc8LmI1uZmI8BRFxje4OnuGS0qLBRZ4cAFWqKg482sPuN1BstCMY62NN58ivBzZ.bGD.0QFaYnf/
# Run the Setup Agent on first boot
firstboot --enable
#不启动图形化
skipx
#开机时启动或关闭的服务
services --disabled="chronyd"
#系统时区
timezone Asia/Shanghai --isUtc --nontp
#分区信息
part /boot --fstype="ext4" --ondisk=nvme0n1 --size=1024
part /swap --fstype="swap" --ondisk=nvme0n1 --size=2048
part / --fstype="xfs" --ondisk=nvme0n1 --grow --size=1  #根分区/使用磁盘剩余的所有空间#需要的安装包
%packages
@^minimal-environment
kexec-tools
vim
%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

centos7 kickstart应答文件

[root@wenzi ~]# vim /var/www/html/ks/7/centos7_ks.cfg
install
keyboard --vckeymap=us --xlayouts='us'
rootpw --iscrypted $6$CEK/siEJwPyzpudd$cJ/rz9oiqDmc8LmI1uZmI8BRFxje4OnuGS0qLBRZ4cAFWqKg482sPuN1BstCMY62NN58ivBzZ.bGD.0QFaYnf/
url --url="http://192.168.28.151/centos/7/"
lang en_US
auth  --useshadow  --passalgo=sha512
text
firstboot --enable
selinux --disabled
skipx
services --disabled="chronyd"
ignoredisk --only-use=nvme0n1
firewall --disabled
network  --bootproto=dhcp --device=ens33
reboot
timezone Asia/Shanghai --isUtc --nontp
bootloader --append="crashkernel=auto" --location=mbr --boot-drive=nvme0n1
zerombr
clearpart --all --initlabel
part /boot --fstype="ext4" --ondisk=nvme0n1 --size=1024
part /swap --fstype="swap" --ondisk=nvme0n1 --size=2048
part / --fstype="xfs" --ondisk=nvme0n1 --grow --size=1%post%end%packages
@^minimal
vim
%end

centos6 kickstart应答文件

[root@wenzi ~]# vim /var/www/html/ks/6/centos6_ks.cfg
install
text
reboot
url --url=http://192.168.28.151/centos/6/
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp  --noipv6
rootpw  --iscrypted $6$CEK/siEJwPyzpudd$cJ/rz9oiqDmc8LmI1uZmI8BRFxje4OnuGS0qLBRZ4cAFWqKg482sPuN1BstCMY62NN58ivBzZ.bGD.0QFaYnf/
firewall --disabled
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone Asia/Shanghai
bootloader --location=mbr --driveorder=nvme0n1 --append="crashkernel=auto rhgb quiet"
zerombr
clearpart --all --initlabel
part /boot --fstype="ext4" --ondisk=nvme0n1 --size=1024
part /swap --fstype="swap" --ondisk=nvme0n1 --size=2048
part / --fstype="ext4" --ondisk=nvme0n1 --grow --size=1%packages
@core
@server-policy
@workstation-policy
vim
%end%post%end

访问 192.168.28.151/ks,是否能查看各个kickstart文件内容

准备PXE启动相关文件

创建centos6、centos7、centos8各自内核相关文件

[root@wenzi ~]# mkdir /var/lib/tftpboot/centos{6,7,8}
[root@wenzi ~]# tree /var/lib/tftpboot/
/var/lib/tftpboot/
├── centos6
├── centos7
└── centos8
[root@wenzi ~]# cp /var/www/html/centos/6/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos6/
[root@wenzi ~]# cp /var/www/html/centos/7/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos7/
[root@wenzi ~]# cp /var/www/html/centos/8/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos8/[root@wenzi ~]# cp /usr/share/syslinux/{pxelinux.0,menu.c32} /var/lib/tftpboot/
#centos8需要额外三个文件,centos6/7不需要
[root@wenzi ~]# cp /var/www/html/centos/8/isolinux/{ldlinux.c32,libcom32.c32,libutil.c32} /var/lib/tftpboot/[root@wenzi ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
[root@wenzi ~]# cp /var/www/html/centos/8/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default[root@wenzi ~]# 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└── default4 directories, 12 files

准备启动菜单文件

[root@wenzi ~]# vim /var/lib/tftpboot/pxelinux.cfg/default
#菜单样式
default menu.c32
#等待选择时间
timeout 600
#菜单名字
menu title WenZi Install System Menulabel linux8#符号^ 可指定快捷键,在选择见面按 8 即可选中该项menu label Auto Install CentOS Linux ^8kernel centos8/vmlinuzappend initrd=centos8/initrd.img ks=http://192.168.28.151/ks/8/centos8_ks.cfglabel linux7menu label Auto Install CentOS Linux ^7kernel centos7/vmlinuzappend initrd=centos7/initrd.img ks=http://192.168.28.151/ks/7/centos7_ks.cfglabel linux6menu label Auto Install CentOS Linux ^6kernel centos6/vmlinuzappend initrd=centos6/initrd.img ks=http://192.168.28.151/ks/6/centos6_ks.cfg#手动安装
label manualmenu label ^Manual Install CentOS Linux 8kernel centos8/vmlinuzappend initrd=centos8/initrd.img inst.repo=http://192.168.28.151/centos/8/label rescuemenu label ^Rescue a CentOS Linux system 8kernel centos8/vmlinuzappend initrd=centos8/initrd.img inst.repo=http://192.168.28.151/centos/8/ rescue quietlabel localmenu defaultmenu label Boot from ^local drivelocalboot 0xffff

测试

新建虚拟机,不用指定ISO文件,直接打开

选中按回车即可。全部测试一遍

踩坑

提示nvme0n1硬盘找不到,即kickstart文件中指定nvme0n1无效

解决:

查看测试用的新建虚拟机中硬盘类型(IDE、SCSI、SATA、NVMe)是否和kickstart中指定的硬盘类型一致,修改成一致就好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/69992.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web连接桌面打开gptmap

一:环境配置 需要的材料: python-3.10.4 我使用的是这个版本的,3.8.10 该版本和以下版本组件组合,验证过能正常运行(python 3.6.8测试异常) websockify 该项目有python版本和node js版本 noVNC 形式的app…

深入解析 Axios Blob 的使用方法及技巧

在 Web 开发中,处理文件传输是一个常见的需求。Blob(二进制对象)是一种表示二进制数据的方式,常用于处理文件和多媒体数据。本文将介绍如何使用 Axios 和 Blob 来处理文件传输。 Axios Blob 概念 在开始之前,让我们先…

Android之版本号、版本别名、API等级对应关系(全)(一百六十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

爬虫逆向实战(十八)--某得科技登录

一、数据接口分析 主页地址:某得科技 1、抓包 通过抓包可以发现数据接口是AjaxLogin 2、判断是否有加密参数 请求参数是否加密? 查看“载荷”模块可以发现有一个password加密参数和一个__RequestVerificationToken 请求头是否加密? 无…

GaussDB 实验篇+openGauss的4种1级分区案例

✔ 范围分区/range分区 -- 创建表 drop table if exists zzt.par_range; create table if not exists zzt.par_range (empno integer,ename char(10),job char(9),mgr integer(4),hiredate date,sal numeric(7,2),comm numeric(7,2),deptno integer,constraint pk_par_emp pri…

【制作npm包2】了解 package.json 相关配置

制作npm包目录 本文是系列文章, 作者一个橙子pro,本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

【左神算法刷题班】第17节:在有序二维数组中查找目标值、等于目标字符串的子序列个数

第17节 题目1:在有序二维数组中查找目标值 给定一个每一行有序、每一列也有序,整体可能无序的二维数组 再给定一个数num, 返回二维数组中有没有num这个数 例子 数组如下,找 6 是否存在。 1 3 5 7 2 4 6 13 3 9 14 …

数据库连接池(c3p0和德鲁伊)

目录 连接池介绍 c3p0连接池 传统方法引入jar包 配置文件 德鲁伊连接池 德鲁伊工具类 传统jdbc数据库使用DriverManger来获取,每次向数据库建立连接需要将Connection加载到内存中,频繁的操作会造成占用很多系统资源,造成服务器崩溃&…

ps变形怎么增加网格? PS怎么变形?

PS图片怎么变形:打开PS,找到需要处理的图片,复制图层,点选“编辑”—“变换”—“变形”,出现变形网格后,按需要操作就可以了。 PS是一款图片编辑的处理软件,它有很多的功能,在图形…

计算机竞赛 python+深度学习+opencv实现植物识别算法系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的植物识别算法研究与实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:4分 🧿 更多…

iOS Epub阅读器改造记录

六个月前在这个YHEpubDemo阅读器的基础上做了一些优化,这里做一下记录。 1.首行缩进修复 由于分页的存在,新的一页的首行可能是新的一行,则应该缩进;也可能是前面一页段落的延续,这时候不应该缩进。YHEpubDemo基于XDS…

AntPro 模版代码

1 ProTable 实现选择和反显 页面1 页面2 选择页面2选择之后反显到页面1 &#xff0c;且支持跨页选择。同时下次进来页面1展示的数据要反显到页面2被选中。 页面2代码 <ProTablerowKey"id"columns{columns}request{(params: any) > {const newParams {pageI…