自动化安装系统(二)

利用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.rhkb.cn/news/94320.html

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

相关文章

【嵌入式环境下linux内核及驱动学习笔记-(19)LCD驱动框架2-FrameBuffer】

目录 1、 Frmebuffer(帧缓冲)操作介绍1.1 显示设备的抽象1.2 内存映像1.3 输出画面数据1.4 用户态下操作屏显1.4.1 用文件I / O 操作屏显1.4.2 mmap() 函数1.4.3 ioctl()函数1.4.5 用命令操作屏1.4.6 测试程序 2、Framebuffer总体框架2.1 框架要点2.2 fbmem.c分析2.…

Spring 框架入门介绍及IoC的三种注入方式

目录 一、Spring 简介 1. 简介 2. spring 的核心模块 ⭐ 二、IoC 的概念 2.1 IoC 详解 2.2 IoC的好处 2.3 谈谈你对IoC的理解 三、IoC的三种注入方式 3.1 构造方法注入 3.2 setter方法注入 3.3 接口注入(自动分配) 3.4 spring上下文与tomcat整…

RTC实验

一、RTC简介 RTC(Real Time Clock)即实时时钟,它是一个可以为系统提供精确的时间基准的元器件,RTC一般采用精度较高的晶振作为时钟源,有些RTC为了在主电源掉电时还可以工作,需要外加电池供电BCD码,四位二进制表示一位…

Linux Vm上部署Docker

创建ubutu虚拟机并远程连接, 参考 https://blog.csdn.net/m0_48468018/article/details/132267096 在终端中切换到root用户,并安装docker服务 2.1 切换到root用户 sudo su2.2 安装docker服务 , 参考 https://docs.docker.com/engine/install/ubuntu/ …

cesium学习记录09-turf.js的使用(画矩形结合地形生成三角网)

上一篇是绘制多边形,这一篇来说绘制矩形,但又因为只说绘制矩形太短了,所以就结合一下turf.js,生成一下地形三角网 Turf.js中文网 最终效果: 一、引入Turf.js 1,下载 npm install turf/turf2,…

使用maven打包时如何跳过test,有三种方式

方式一 针对spring项目&#xff1a; <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>true</skipTests> </configuration> …

影响力再度提升,Smartbi多次蝉联Gartner、IDC等权威认可

近期&#xff0c;思迈特软件捷报频传&#xff0c;Smartbi凭借技术创新实力和产品能力&#xff0c;成功入选Gartner中国增强数据分析代表厂商及自助分析代表厂商&#xff0c;同时&#xff0c;连续三年蝉联“IDC中国FinTech 50”榜单。 Part.1 再次被Gartner提名 Smartbi深度融…

如何在控制台查看excel内容

背景 最近发现打开电脑的excel很慢&#xff0c;而且使用到的场景很少&#xff0c;也因为mac自带了预览的功能。但是shigen就是闲不住&#xff0c;想自己搞一个excel预览软件&#xff0c;于是在一番技术选型之后&#xff0c;我决定使用python在控制台显示excel的内容。 具体的需…

【数据库系统】-- 【1】DBMS概述

1.DBMS概述 01数据库系统概述02数据库技术发展概述03关系数据库概述04数据库基准测试 01数据库系统概述 几个基本概念 为什么使用数据库系统 数据库发展的辉煌历程 02数据库技术发展概述 数据模型 应用领域 ● OLTP ● OLAP ● HTAP ● GIS OLTP与OLAP 与其他技术相…

V2board缓存投毒漏洞复现

1.什么是缓存投毒 缓存投毒&#xff08;Cache poisoning&#xff09;&#xff0c;通常也称为域名系统投毒&#xff08;domain name system poisoning&#xff09;&#xff0c;或DNS缓存投毒&#xff08;DNS cache poisoning&#xff09;。它是利用虚假Internet地址替换掉域名系…

PHP-MD5注入

0x00 前言 有些零散的知识未曾关注过&#xff0c;偶然捡起反而更加欢喜。 0x01 md5 注入绕过 md5函数有两个参数&#xff0c;第一个参数是要进行md5的值&#xff0c;第二个值默认为false&#xff0c;如果为true则返回16位原始二进制格式的字符串。意思就是会将md5后的结果当…

使用qsqlmysql操作mysql提示Driver not loaded

环境: win10 IDE: qt creator 编译器: mingw32 这里简单的记录下。我遇到的情况是在IDE使用debug和release程序都是运行正常&#xff0c;但是当我编译成发布版本之后。老是提示Driver not load。 这就很奇诡了。 回顾了下编译的时候是需要在使用qt先编译下libqsqlmysql.dll的…

神经网络基础-神经网络补充概念-08-逻辑回归中的梯度下降算法

概念 逻辑回归是一种用于分类问题的机器学习算法&#xff0c;而梯度下降是优化算法&#xff0c;用于更新模型参数以最小化损失函数。在逻辑回归中&#xff0c;我们使用梯度下降算法来找到最优的模型参数&#xff0c;使得逻辑回归模型能够更好地拟合训练数据。 逻辑回归中的梯…

python selenium如何保存网站的cookie用于下次自动登录

## 一、python selenium如何保存网站的cookie 使用Selenium保存网站的Cookie非常简单。下面是一个示例&#xff0c;展示了如何使用Selenium打开网站&#xff0c;然后保存获取到的Cookie&#xff1a; from selenium import webdriver# 初始化浏览器 browser webdriver.Chrome…

正则表达式 —— Awk

Awk awk&#xff1a;文本三剑客之一&#xff0c;是功能最强大的文本工具 awk也是按行来进行操作&#xff0c;对行操作完之后&#xff0c;可以根据指定命令来对行取列 awk的分隔符&#xff0c;默认分隔符是空格或tab键&#xff0c;多个空格会压缩成一个 awk的用法 awk的格式…

【经典排序】—— “希尔排序”

插入排序希尔排序插入排序VS希尔排序 测试 希尔排序是在插入排序的基础上进行改进优化&#xff0c;所以学习希尔排序之前需要先了解插入排序。 插入排序 像玩扑克牌摸牌时一样&#xff0c;一张一张摸&#xff0c;每摸到一张插入到对应的位置&#xff0c;插入排序就是从第一个位…

大模型技术实践(一)|ChatGLM2-6B基于UCloud UK8S的创新应用

近半年来&#xff0c;通过对多款主流大语言模型进行了调研&#xff0c;我们针对其训练方法和模型特点进行逐一分析&#xff0c;方便大家更加深入了解和使用大模型。本文将重点分享ChatGLM2-6B基于UCloud云平台的UK8S实践应用。 01各模型结构及特点 自从2017年6月谷歌推出Transf…

NFTScan NFT API 在 DID Protocol 开发中的应用

自互联网发展以来&#xff0c;Web2.0 时代产生了网络社会&#xff0c;社会已经不再局限于地理边界&#xff0c;而 Web 3.0 引入了去中心化的理念&#xff0c;强调个体数据隐私和可信互操作性。在这个新的时代中&#xff0c;去中心化身份&#xff08;Decentralized Identifier 即…

vue3+vite配置vantUI主题

❓在项目中统一配置UI主题色&#xff0c;各个组件配色统一修改 vantUI按需安装 参考vantUI文档 创建vantVar.less文件夹进行样式编写 vantVar.less :root:root{//导航--van-nav-bar-height: 44px;//按钮--van-button-primary-color: #ffffff;--van-button-primary-backgr…

【Rust】Rust学习 第十一章编写自动化测试

Rust 是一个相当注重正确性的编程语言&#xff0c;不过正确性是一个难以证明的复杂主题。Rust 的类型系统在此问题上下了很大的功夫&#xff0c;不过它不可能捕获所有种类的错误。为此&#xff0c;Rust 也在语言本身包含了编写软件测试的支持。 编写一个叫做 add_two 的将传递…