基于PXE与NFS共享的Ubuntu安装配置过程

news/2024/12/26 0:15:06/

假设存在服务器A、B、C
其中A为待装系统的服务器,DHCP(IP池:192.168.0.150~192.168.0.160),假设需要安装的系统为Ubuntu 22.04 Desktop
其中B为PXE服务端服务器,IP: 192.168.0.100,这里将以CentOS系统进行说明
其中C为NFS所在服务器,IP: 192.168.1.101

PXE的基本原理

PXE 基本原理与启动流程

一、PXE 启动流程

1. 网卡准备:

设备 A 网卡的 PXE 功能模块就绪,这是启动的初始状态,为后续网络引导操作做好准备。

2. IP 申请:

设备 A 网卡通过 DHCP Client 向本网段广播,请求分配 IP 地址。此步骤确保设备 A 能接入网络,获得通信基础。

3. 配置下发:

DHCP Server 响应请求,为设备 A 下发 IP 地址,同时在 DHCP 报文中包含关键配置。其中 Option 66 用于指定引导文件名称,Option 67 用于指定引导文件所在设备 B 的 IP,为设备 A 指明引导资源位置。

4. 引导文件获取:

设备 A 获得 IP 及引导指向信息后,使用 TFTP 协议连接设备 B,读取并加载指定引导文件。例如常见的引导文件有 netboot 中的 pxelinux.0,加载该文件后,还会同时加载 pxelinux.0/default 的菜单配置文件,此配置文件将决定后续加载走向。

5. 内核与初始化磁盘加载:

依据菜单配置文件设定,设备 A 从 TFTP 服务器加载内核(vmlinuz)与初始化磁盘(intrd),为系统启动提供核心支撑。

6. 后续引导执行:

加载的内核依据不同参数执行不同操作。

  • 可通过 http 协议加载引导指定 URL中的 ISO 文件,实现基于网络的系统镜像引导。
  • 还能通过 NFS 协议加载引导指定的 NFS 目录(形式为设备 C 的 IP:/<NFS 共享路径>,这里的目录 要求是 ISO 文件通过 mount -o loop 在 NFS Server 上挂载后的映射目录),以适配不同网络存储的引导需求。

二、启动过程控制权移交过程

  1. 启动之初,系统控制权在 BIOS,它负责硬件初始化等基础操作。
  2. 随着 PXE 启动流程推进,控制权移交给 PXE ROM,PXE ROM 开始介入网络引导相关操作。
  3. 接着控制权转移至 pxelinux.0,由它进一步协调引导文件加载、配置读取等工作。
  4. 之后控制权到相对于 pxelinux.0 的 vmlinuz 与 intrd,此时开始为内核启动做准备,加载必要的内核与初始化磁盘。
  5. 最后控制权进入 ISO 中的 vmlinuz 与 intrd 或者 ISO 中指定的其他引导过程,完成系统的深度引导,直至系统启动完成。

配置过程

1. 修改DHCP Server配置

为DHCP服务端添加Option 66与Option 67配置项,66请设定为“pexlinux.0”(不含引号);67请设定为服务器B的IP地址

2. 搭建用于PXE启动的TFTP服务器(服务器B配置)

netboot.tar.gz下载地址:ubuntu.com/ubuntu/dists/focal/main/installer-amd64/current/legacy-images/netboot/netboot.tar.gz" rel="nofollow">netboot.tar.gz

以下是在 CentOS 7.9 系统下,PXE 所在服务器的基本配置步骤:

a. 安装相关服务:

通过命令 yum install xinetd tftp-server -y 安装 xinetd 和 tftp-server。xinetd 是一种超级服务器,用于管理多种网络服务,TFTP 服务常用于 PXE 启动过程中的文件传输,安装这两个服务为后续 PXE 功能实现提供基础。

b. 配置 TFTP 服务:

使用 vim /etc/xinetd.d/tftp 编辑 tftp 服务配置文件,将 disable = yes 改为 disable = no,这一步是启用 TFTP 服务,使其能正常响应客户端的文件传输请求。

c. 服务管理操作:

依次执行以下命令:

systemctl daemon-reload # 重新加载 systemd 守护进程配置,确保新的服务配置生效。
systemctl reload xinetd # 重新加载 xinetd 服务,应用对其配置的更改,如 TFTP 服务的启用设置。
systemctl reload tftp # 同样重新加载 tftp 服务,保证服务状态更新。
systemctl -s enable xinetd # 作用是设置 xinetd 服务开机自启,确保服务器重启后 PXE 相关服务依然可用。
systemctl -s enable tftp # 设置 tftp 服务开机自启。
systemctl restart xinetd # 重启 xinetd 服务,让配置完全生效,启动相关网络服务监听。
systemctl restart tftp # 重启 tftp 服务,确保其以正确配置运行,准备好传输文件。

d. 准备引导文件:

将 netboot.tar.gz 放入 /var/lib/tftpboot 中,并解压缩:tar zxvf netboot.tar.gz。这些引导文件是 PXE 启动过程中客户端所需的基础文件,解压缩到指定目录以供后续访问。

e. 放置内核及初始化文件:

执行 mkdir /var/lib/tftpboot/ubuntu,创建用于存放 ubuntu 相关文件的目录,然后将 ubuntu 安装光盘镜像中的 casper/initrd 与 casper/vmlinuz 放入 /var/lib/tftpboot/ubuntu 中,文件名不变。这些内核与初始化文件是启动 ubuntu 系统的关键组件,放在指定位置供客户端加载。

f. 修改启动配置:

修改 /var/lib/tftpboot/ubuntu-installer/amd64/boot-screens/txt.cfg,将 Install 选项的内容改为:

        kernel ubuntu/vmlinuzappend vga=768 initrd=ubuntu/initrd boot=casper root=/dev/ram0 ramdisk_size=1500000 netboot=nfs ro nfsroot=192.168.1.101:/mnt/iso ip=dhcp

这一步是定制启动参数,指定内核、初始化文件路径,设置网络启动方式(如通过 NFS)、根文件系统挂载点等,确保客户端能按预期启动系统。
其中192.168.1.101 为服务器C的IP地址。

g. 防火墙配置:

针对于服务器A:
  • 放行UDP 69出站用于主动连接访问TFTP服务端
  • 放行UDP 入站,用于被动接收TFTP服务端发来的文件数据流
针对与服务器B:
  • 放行UDP 69入站,用于接受TFTP客户端的访问
  • 放行UDP 出站,用于主动向TFTP客户端发送文件数据流

3. 搭建用于Ubuntu安装过程中的NFS共享并提供光盘镜像(服务器C配置)

搭建过程以CentOS 7.9环境进行举例

请自行准备好安装光盘ISO文件,这里假设文件名为ubuntu22.04.iso,所在路径为:/opt/media/ubuntu22.04.iso

a. 创建挂载目录:

通过命令 mkdir /mnt/iso 创建用于挂载目标目录。这个目录将作为后续挂载 iso 文件的挂载点,为共享资源提供存储位置。

b. 挂载 iso 文件:

执行 mount -o loop /opt/media/ubuntu22.04.iso /mnt/iso,将 iso 文件挂载到 /mnt/iso 路径下。这样操作后,iso 文件中的内容就可以像本地目录一样被访问,方便后续通过 NFS 进行共享。

c. 安装 NFS 组件:

使用 yum install nfs-common nfs-server nfs-utils -y 安装 NFS 服务端所需的各类组件。其中 nfs-common 提供了一些通用的 NFS 功能支持,nfs-server 是 NFS 服务的核心组件,负责提供共享服务,nfs-utils 包含了一些实用工具,它们协同工作,确保 NFS 服务能够正常运行。

d. 配置 NFS 共享:

用 vim /etc/exportfs 编辑配置文件,并插入一行:/mnt/iso (ro, all_squash)。这行配置表示将 /mnt/iso 目录以只读(ro)方式共享给所有客户端(),并且使用 all_squash 选项将所有用户的访问权限都压缩为匿名用户权限,这在一些安全要求较高或者统一权限管理的场景下较为常用,确保共享资源的访问可控。

e. 重载 NFS 共享配置:

执行 exportfs -rv,此命令用于重新加载 NFS 共享配置,使之前在 /etc/exportfs 中所做的配置更改生效,让客户端能够按照新配置访问共享资源。

f. 防火墙配置:

针对于服务器C:
  • 放行TCP 协议与 UDP 协议的 2049 端口的入站
  • 放行 rpcbind 相关的端口的入站
针对于服务器A:
  • 放行TCP协议与UDP协议的2049端口的出站
  • 放行rpcbind相关端口的出站

http://www.ppmy.cn/news/1557849.html

相关文章

dockerfile文档编写(1):基础命令

目录 Modelscope-agentARGFROMWORKDIRCOPYRUNENVCMD run_loopy Modelscope-agent ARG BASE_IMAGEregistry.cn-beijing.aliyuncs.com/modelscope-repo/modelscope:ubuntu22.04-cuda12.1.0-py310-torch2.1.2-tf2.14.0-1.12.0FROM $BASE_IMAGEWORKDIR /home/workspaceCOPY . /hom…

数仓开发那些事(8)

程序员圣经 为什么刚刚能运行&#xff0c;现在就不行 为什么刚刚不运行&#xff0c;现在就可以 为什么他的可以跑&#xff0c;我的不能跑 为什么我的可以跑&#xff0c;他的就不行 为什么这台电脑能&#xff0c;那台就不行 为什么这台电脑不行&#xff0c;那台就行 神州员工&a…

如何测量分辨率

一、什么是分辨率&#xff1f; 分辨率指的是分清物体细节的能力。分辨率是一个成像系统还原空间频率的能力。一些人只是简单的用分辨率去描述极限分辨率&#xff0c;但是相机在在不同的对比度的情况下还原低&#xff0c;中和高频率的能力&#xff0c;也可以显示全面综合的信息。…

黑马Java面试教程_P2_Redis

系列博客目录 文章目录 系列博客目录1前言2 使用场景面试官提问1&#xff1a;我看你做的项目中&#xff0c;都用到了redis&#xff0c;你在最近的项目中哪些场景使用了redis呢?面试官会接着问你1.1&#xff1a;如果发生了缓存穿透、击穿、雪崩&#xff0c;该如何解决?2.1缓存…

汇聚点滴启迪思维(三)

switch存在的问题 缺少default语句 ‌switch语句可以包含一个可选的default语句&#xff0c;用于处理没有与任何case标签匹配的情况。如果没有default语句&#xff0c;并且没有与表达式匹配的case标签&#xff0c;程序将不会执行任何操作。 除了case switch包含的大括号中间…

搭建Elastic search群集

一、实验环境 二、实验步骤 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎Elasticsearch目录文件&#xff1a; /etc/elasticsearch/elasticsearch.yml#配置文件 /etc/elasticsearch/jvm.options#java虚拟机 /etc/init.d/elasticsearch#服务启动脚本 /e…

【Django开发】前后端分离django美多商城项目第11篇:商品数据库表设计,1. SPU介绍【附代码文档】

本教程的知识点为&#xff1a; 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计&#xff1a; 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…

分布式爬虫scrapy-redis

Scrapy 爬虫,虽然爬虫是异步加多线程的,但是我们只能在一台主机上运行,所以爬取效率还是有限的,分布式爬虫则是将多台主机组合起来,共同完成一个爬取任务,这将大大提高爬取的效率。 分布式爬虫解决的问题1:爬虫任务共享 所谓分布式爬虫,我们需要做的就是在多台主机上…