1. 系统安装过程
Linux的安装过程如下:
- 加载 bootloader
- 加载启动安装菜单
- 加载内核和 initrd 文件
- 加载根系统
- 运行anaconda的安装向导
1.1 Linux安装相关文件
在系统光盘的 isolinux 目录下有和安装相关的文件:
- boot.cat:相当于grub的第一阶段
- isolinux.bin:光盘引导程序,在 mkisofs 的选项中需要明确给出文件路径,这个文件属于 SYSLINUX 项目
- isolinux.cfg:启动菜单的配置文件,当光盘启动后(即运行 isolinux.bin),会自动去找 isolinux.cfg文件
- vesamenu.c32:是光盘启动后的启动菜单图形界面,也属于SYSLINUX项目,menu.c32提供纯文本的菜单
- memtest:内存检测程序
- splash.png:启动菜单界面的背景图片
- vmlinuz:是内核映像
-
1.2 常用安装内核参数
rescue:进入救援模式
- inst.repo=path:指定安装源文件的路径
- ip= : 指定 IP 地址信息
-
1.3 指定内核参数方法
在启动菜单界面,任意选中一项安装方法,按 Tab 键,在后面增加参数
在启动菜单界面,任意选中一项安装方法,按 Esc 键:boot:linux 参数设置
2. kickstart 自动安装应答文件
实现自动安装前,需要制作对应的安装应答文件,称为 kickstart 文件,用于保存安装过程的具体操作和步骤。
官方说明2.1 格式说明
kickstart 文件主要包括三个部分:
命令段:指明各种安装前配置,如网络设置,语言,键盘类型等
keyboard: 设定键盘类型lang: 语言类型zerombr:清除mbrclearpart:清除分区part: 创建分区rootpw: 指明root的密码timezone: 时区text: 文本安装界面network:指定网络设置firewall:设置防火墙设置selinux:设置selinux设置reboot:安装完自动重启user:安装完成后为系统创建新用户url: 指明安装源
程序包段:指明要安装的程序包组或程序包,不安装的程序包等
以@^开头的指定环境包组,以@符合开头的表示一个软件包组,以-符合开头的的表示排除软件不安装。
%packages@^minimal@corekexec-toolsvim-autofs%end
脚本段:安装前或者安装后执行的操作
根据自己安装好机器后
/root目录下anaconda-ks.cfg文件进行修改。- 安装
system-config-kickstart包,一个图形化的 kickstart 文件制作工具。
先启用 x11 转发服务器图形界面到本地,然后使用
打开后具体界面如下所示:
2.3 CentOS7 kickstart 文件范例
#platform=x86, AMD64, or Intel EM64T#version=DEVEL# Install OS instead of upgradeinstall# Keyboard layoutskeyboard --vckeymap=us --xlayouts='us'# Root passwordrootpw --iscrypted $6$Ow9n3A86WGKGv8tF$.Jm4iXJLnilU0q/miXxkFD56uF/ZaD6pRzyvNjxt3H55XgA70PpJoWNQZAv3zLTU6vF3RB2qevwpHuRVNzFrI/# System languagelang en_US# System authorization informationauth --useshadow --passalgo=sha512# Use text mode installtextfirstboot --disabled# SELinux configurationselinux --disabledignoredisk --only-use=sda# Firewall configurationfirewall --disabled# Network informationnetwork --bootproto=dhcp --device=eth0# Reboot after installationreboot# System timezonetimezone Asia/Shanghai --nontp# Use network installationurl --url=http://192.168.0.74/centos/7/os/x86_64/# url --url=$tree cobbler使用这个# System bootloader configurationbootloader --append="net.ifnames=0" --location=mbr --boot-drive=sda# Clear the Master Boot Recordzerombr# Partition clearing informationclearpart --all --initlabel# Disk partitioning informationpart /boot --fstype="xfs" --size=1024part / --fstype="xfs" --size=10240part swap --fstype="xfs" --size=2048part /data --fstype="xfs" --size=5120# 自动以 LVM 格式分区# autopart --type=lvm# 创建用户wuvikr,密码744123user --name=wuvikr --password=$6$z96.c6bRe..qZRAi$sxHDL0HLf5vFPvayvSjS2uwMaC/zWFMN3oPokFC5Z2S.wD1X8PDkLShdoZxGDhN51bBn/v7QKvhumknH2Qpya0 --iscrypted --gecos="wuvikr"%packages@^minimal@corekexec-toolsvimcurltreewgetbash-completionnet-toolslrzszlsofzipunziptcpdumppsmiscman-pageschrony%end%postecho "PS1='\[\e[1;33m\][\u@\h \W]\\$ \[\e[0m\]'" >> /etc/profile.d/env.shecho "export EDITOR=vim" >> /etc/profile.d/env.shrm -rf /etc/yum.repos.d/*cat > /etc/yum.repos.d/CentOS7.repo <<EOF[Packages]name=Basebaseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/https://mirrors.huaweicloud.com/centos/7/os/x86_64/https://mirrors.163.com/centos/7/os/x86_64/gpgcheck=1gpgkey=https://mirrors.aliyun.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7[epel]name=epelbaseurl=https://mirrors.aliyun.com/epel/7/x86_64/https://mirrors.huaweicloud.com/epel/7/x86_64/gpgcheck=1gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7[extras]name=extrasbaseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/https://mirrors.huaweicloud.com/centos/7/extras/x86_64/https://mirrors.163.com/centos/7/extras/x86_64/gpgcheck=1gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-OfficialEOFcat > /root/.vimrc <<EOF"保存.vimrc文件时自动重启加载,即让此文件立即生效autocmd BufWritePost \$MYVIMRC source \$MYVIMRC"TAB长度set tabstop=2"输入tab制表符时,自动替换成空格set expandtab"设置自动缩进长度为4空格set shiftwidth=2"设置行号"set number"语法高亮syntax on"高亮显示括号匹配set showmatch"忽略大小写set ignorecase"当前行显示下划线set cursorline"自动缩进set autoindent"搜索到最后匹配的位置后,再次搜索不回到第一个匹配处set nowrapscan""定义函数SetTitle,自动插入文件头autocmd BufNewFile *.sh exec ":call SetTitle()"func SetTitle()if expand("%:e") == 'sh'call setline(1,"#!/bin/bash")call setline(2,"#")call setline(3,"#********************************************************************")call setline(4,"#Author: Wuvikr")call setline(5,"#QQ: 744123155")call setline(6,"#Date: ".strftime("%Y-%m-%d"))call setline(7,"#FileName ".expand("%"))call setline(8,"#URL: http://www.wuvikr.top")call setline(9,"#Description The test script")call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")call setline(11,"#********************************************************************")call setline(12,"")endifendfunc"新建文件后,自动定位到文件末尾autocmd BufNewFile * normal GEOF%end
2.4 制作引导光盘
[root@pxe ~]# mount /dev/sr0 /tmp/
[root@pxe ~]# mkdir /data/myiso -pv
[root@pxe ~]# cp -r /tmp/isolinux/ /data/myiso/
[root@pxe ~]# ll /data/myiso/
total 60840
-r--r--r-- 1 root root 2048 Jun 23 23:19 boot.cat
-rw-r--r-- 1 root root 84 Jun 23 23:19 boot.msg
-rw-r--r-- 1 root root 281 Jun 23 23:19 grub.conf
-rw-r--r-- 1 root root 55129656 Jun 23 23:19 initrd.img
-rw-r--r-- 1 root root 24576 Jun 23 23:19 isolinux.bin
-rw-r--r-- 1 root root 3032 Jun 23 23:19 isolinux.cfg
-rw-r--r-- 1 root root 190896 Jun 23 23:19 memtest
-rw-r--r-- 1 root root 186 Jun 23 23:19 splash.png
-r--r--r-- 1 root root 2215 Jun 23 23:19 TRANS.TBL
-rw-r--r-- 1 root root 153104 Jun 23 23:19 vesamenu.c32
-rwxr-xr-x 1 root root 6769256 Jun 23 23:19 vmlinuz
3. DHCP 服务
3.1 简介
网络中的主机获取网络配置可以通过两种方式:
- 静态指定
- 动态获取
而 DHCP 的全称是 Dynamic Host Configuration Protocol,动态主机网络配置协议。
DHCP使用 UDP协议,丛拥 C/S 模式,服务器端口为 67,客户端端口为 68。
3.2 实现
3.2.1 安装
yum install -y dhcp
dnf install -y dhcp-server
3.2.2 主要文件
- 服务器文件:
- /usr/sbin/dhcpd:dhcp服务主程序
- /etc/dhcp/dhcpd.conf:dhcp服务配置文件
- /usr/share/doc/dhcp-server/dhcpd.conf.example:dhcp服务配置范例文件
- /usr/lib/systemd/system/dhcpd.service:dhcp服务service文件
- /var/lib/dhcpd/dhcpd.leases:地址分配记录文件
- 客户端文件:
DNS
option domain-name-servers 180.76.76.76, 223.6.6.6;
租期时间,单位为秒
default-lease-time 86400;
最低续约时间
max-lease-time 7200;
日志
log-facility local7;
dhcp分配子网
subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.220 192.168.0.250; option routers 192.168.0.2; next-server 192.168.0.74; # TFTP服务器地址 filename “pxelinux.0”; # bootloader启动文件的名称 }
给指定主机分配固定IP
host testclient { hardware ethernet 00:0c:29:33:b4:1a; fixed-address 192.168.0.100; default-lease-time 86400; max-lease-time 864000; option routers 192.168.0.2; option domain-name-servers 114.114.114.114,8.8.8.8 ; option domain-name “wuvikr.top”; }
<a name="CxdoY"></a>
## 3.4 分配 IP 记录
当 dhcp 服务为某台机器分配了 IP 后,默认会在 `/var/lib/dhcpd/dhcpd.leases` 文件中将分配的情况记录下来,里面包括主机 MAC,IP 租约时间等信息。
```bash
[root@pxe dhcp]# 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.2.5
server-duid "\000\001\000\001(e\203\211\000\014)PH\300";
lease 192.168.0.220 {
starts 3 2021/06/23 05:32:37;
ends 3 2021/06/23 07:32:37;
cltt 3 2021/06/23 05:32:37;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:63:1a:b8;
uid "\001\000\014)c\032\270";
}
lease 192.168.0.223 {
starts 3 2021/06/23 06:12:04;
ends 3 2021/06/23 08:12:04;
cltt 3 2021/06/23 06:12:04;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:74:95:13;
uid "\001\000\014)t\225\023";
}
另外,客户端也可以室友 dhclient 命令,手动申请分配地址,分配好地址后其信息默认会被客户端保存在 /var/lib/dhclient/dhclient.leases 文件中。
[root@Rocky-02 ~]# dhclient
[root@Rocky-02 ~]# cat /var/lib/dhclient/dhclient.leases
default-duid "\000\004\205n\371C\363\326KT\240\311\360i\304\307\227H";
lease {
interface "eth0";
fixed-address 192.168.0.223;
filename "pxelinux.0";
option subnet-mask 255.255.255.0;
option routers 192.168.0.2;
option dhcp-lease-time 7200;
option dhcp-message-type 5;
option domain-name-servers 180.76.76.76,223.6.6.6;
option dhcp-server-identifier 192.168.0.74;
option domain-name "wpgjcs.com";
renew 3 2021/06/23 07:03:12;
rebind 3 2021/06/23 07:57:04;
expire 3 2021/06/23 08:12:04;
}
4. TFTP 服务
4.1 简介
TFTP:Trivial File Transfer Protocol,是一种用于传输文件的简单高级协议,是文件传输协议(FTP) 的简化版本,用来传输比文件传输协议(FTP)更易于使用但功能较少的文件。
TFTP 是一种开放协议,没有加密机制,缺乏安全性,使用UDP作为传输层协议,端口为 69。
4.2 安装
[root@pxe ~]# yum install -y tftp-server
# 查看安装的文件
[root@pxe ~]# rpm -ql tftp-server
/etc/xinetd.d/tftp
/usr/lib/systemd/system/tftp.service # service文件
/usr/lib/systemd/system/tftp.socket # socket文件
/usr/sbin/in.tftpd # 主程序
/usr/share/doc/tftp-server-5.2
/usr/share/doc/tftp-server-5.2/CHANGES
/usr/share/doc/tftp-server-5.2/README
/usr/share/doc/tftp-server-5.2/README.security
/usr/share/man/man8/in.tftpd.8.gz
/usr/share/man/man8/tftpd.8.gz
/var/lib/tftpboot # TFTP服务数据目录
# 启动服务
[root@pxe ~]# systemctl enable --now tftp.service
Created symlink from /etc/systemd/system/sockets.target.wants/tftp.socket to /usr/lib/systemd/system/tftp.socket.
4.3 连接TFTP
tftp 服务端家目录为 /var/lib/tftpboot ,自启动镜像和启动菜单等文件就放在该目录下:
[root@pxe ~]# echo test > /var/lib/tftpboot/test.txt
[root@pxe ~]# ls /var/lib/tftpboot/
test.txt
客户端直接连接 TFTP 服务器,不需要密码验证:
[root@U20-01:~]# tftp 192.168.0.74
tftp> ?
Commands may be abbreviated. Commands are:
connect connect to remote tftp
mode set file transfer mode
put send file
get receive file
quit exit tftp
verbose toggle verbose mode
trace toggle packet tracing
status show current status
binary set mode to octet
ascii set mode to netascii
rexmt set per-packet retransmission timeout
timeout set total retransmission timeout
? print help information
tftp> get test.txt
Received 5 bytes in 0.0 seconds
tftp> quit
5. PXE 安装流程
PXE:Preboot Excution Environment,预启动执行环境,是由 Intel 公司研发,基于 Client/Server 的网络模式,支持远程主机通过网络从远端服务器下载镜像,并由此支持通过网络启动操作系统,可以引导和安装Windows,linux等多种操作系统。
PXE的具体流程如下:
linux 内核启动后就会根据内核参数来进行系统的安装,一般常用的安装方式有 CD,Hard Disk,HTTP,NFS,TFP这几种。
这里演示 HTTP 方式的自动化安装,具体流程图如下:
- Client 向 PXE Server 上的 DHCP 发送 IP 地址请求消息,DHCP 检测 Client 是否合法(主要是检测 Client 的网卡 MAC 地址),如果合法则返回 Client 的 IP 地址,同时将启动文件 pxelinux.0 的所在 TFTP 服务器地址信息一并传送给 Client;
- Client 向 TFTP 服务器发送获取 pxelinux.0 请求消息,TFTP服务器接收到消息之后,向 Client 发送 pxelinux.0 大小信息,试探Client 是否满意,当 TFTP 收到 Client 发回的同意大小信息之后,正式向 Client 发送pxelinux.0;
- Client 执行接收到的 pxelinux.0 文件,并利用此文件启动;
- Client 向 TFTP 服务器发送请求针对本机的配置信息 pxelinux.cfg 文件,TFTP服务器将启动菜单配置文件发回 Client,继而 Client 根据启动菜单配置文件执行后续操作;
- Client 根据启动菜单配置文件里的信息,向 TFTP 发送 Linux 内核和 initrd 文件请求信息,TFTP接收到消息之后将内核文件和 initrd 文件发送给 Client;
- Client 向 TFTP 发送根文件请求信息,TFTP接收到消息之后返回 Linux 根文件系统;
- Client 启动 Linux 内核,加载相关的内核参数;
- Client 通过内核参数下载 kickstart 文件,并根据 kickstart 文件里的安装信息,下载安装源文件并自动化安装。
6. CentOS7 实现PXE自动装机
6.1 安装前准备
关闭防火墙和 SELINUX,关闭局域网中的其他 DHCP 服务。6.2 安装相关软件包并启动
```bash [root@pxe ~]# yum -y install httpd tftp-server dhcp syslinux system-config-kickstart
由于 dhcp 还没有配置文件,这里会启动失败
[root@pxe ~]# systemctl enable —now httpd tftp dhcpd
<a name="73Ps5"></a>
## 6.3 准备 yum 源和相关目录
创建安装所需要的镜像文件目录,并将文件放入到目录中。
```bash
[root@centos7 ~]# mkdir -pv /var/www/html/centos/7/os/x86_64
# 这里为了简单,直接挂载光盘里的文件
[root@centos7 ~]# mount /dev/sr0 /var/www/html/centos/7/os/x86_64
6.4 准备kickstart文件
创建 kickstart 文件目录,并将提前准备好的 kickstart 文件放入到目录中。
[root@pxe ~]# mkdir /var/www/html/ks/
[root@pxe ~]# vim /var/www/html/ks/centos7.cfg
6.5 配置DHCP服务
[root@pxe ~]# vim /etc/dhcp/dhcpd.conf
option domain-name "example.com";
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.150 192.168.0.200;
option routers 192.168.0.2;
next-server 192.168.0.74;
filename "pxelinux.0";
}
[root@pxe ~]# systemctl start dhcpd
6.6 准备 TFTP 相关文件
[root@pxe ~]# mkdir /var/lib/tftpboot/pxelinux.cfg/
# 拷贝引导文件和菜单风格文件
[root@pxe ~]# cp /usr/share/syslinux/{pxelinux.0,menu.c32} /var/lib/tftpboot/
# 拷贝内核和initrd文件
[root@pxe ~]# cp /var/www/html/centos/7/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/
# 拷贝启动菜单文件
[root@pxe ~]# cp /var/www/html/centos/7/os/x86_64/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
# 最终目录结构
[root@pxe ~]# tree /var/lib/tftpboot/
/var/lib/tftpboot/
├── initrd.img
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│ └── default
└── vmlinuz
1 directory, 5 files
6.7 修改启动菜单
[root@pxe ~]# vim /var/lib/tftpboot/pxelinux.cfg/default
default menu.c32
timeout 600
menu title PXE INSTALL MENU
label auto
menu label ^Auto Install CentOS 7
kernel vmlinuz
append initrd=initrd.img ks=http://10.0.0.100/ks/centos7.cfg
label manual
menu label ^Manual Install CentOS 7
kernel vmlinuz
append initrd=initrd.img inst.repo=http://10.0.0.100/centos/7/os/x86_64
label local
menu default
menu label ^Boot from local drive
localboot 0xffff
6.8 安装测试
创建一台新的虚拟机,设置网络引导,可看到上一步我们设置的启动菜单,选择 Auto Install CentOS 7,实现自动安装。
注意:这里机器的内存设置需要大一点,低于 2G 可能无法启动。
