系统部署

本文最后更新于:2023年12月5日 晚上

系统安装过程

Linux 安装过程

  1. 加载 boot loader
  2. 加载启动安装菜单
  3. 加载内核和 initrd 文件
  4. 加载根系统
  5. 运行 anaconda 的安装向导

isolinux 目录下安装相关文件

# 将光盘挂载到/mnt/sro目录下
[root@centos8 mnt]$mount /dev/sr0 /mnt/sr0/
mount: /mnt/sr0: WARNING: device write-protected, mounted read-only.
# 查看isolinux目录下的文件
[root@centos8 isolinux]$ll /mnt/sr0/isolinux/
total 72859
-r--r--r--. 1 root root     2048 Jun  8 18:08 boot.cat
-r--r--r--. 1 root root       84 Jun  8 17:26 boot.msg
-r--r--r--. 1 root root      293 Jun  8 17:26 grub.conf
-r--r--r--. 2 root root 65114136 Jun  8 17:25 initrd.img
-r--r--r--. 1 root root    38912 Jun  8 17:26 isolinux.bin
-r--r--r--. 1 root root     3075 Jun  8 17:26 isolinux.cfg
-r--r--r--. 1 root root   116096 Nov  8  2019 ldlinux.c32
-r--r--r--. 1 root root   180700 Nov  8  2019 libcom32.c32
-r--r--r--. 1 root root    22804 Nov  8  2019 libutil.c32
-r--r--r--. 1 root root   182704 May 12  2019 memtest
-r--r--r--. 1 root root      186 Jul 30  2019 splash.png
-r--r--r--. 1 root root     2885 Jun  8 18:08 TRANS.TBL
-r--r--r--. 1 root root    26788 Nov  8  2019 vesamenu.c32
-r-xr-xr-x. 2 root root  8913656 May  8 07:07 vmlinuz
  • boot.cat: 相当于 grub 的第一阶段
  • isolinux.bin:光盘引导程序,在 mkisofs 的选项中需要明确给出文件路径,这个文件属于 SYSLINUX 项目
  • isolinux.cfg:启动菜单的配置文件,当光盘启动后(即运行 isolinux.bin),会自动去找 isolinux.cfg 文件
  • vesamenu.c32:是光盘启动后的启动菜单图形界面,也属于 SYSLINUX 项目,menu.c32 提供纯文本的菜单
  • memtest:内存检测程序
  • splash.png:光盘启动菜单界面的背景图
  • vmlinuz:是内核映像
  • initrd.img:ramfs 文件

安装菜单的内核参数

安装光盘的启动菜单配置文件:isolinux/isolinux.cfg,每个 label 就是一个菜单项,主菜单或者二级菜单。

isolinux.cfg 中部分内容:

# 默认使用vesamenu.c32:图形化菜单界面。menu.32提供纯文本的菜单
default vesamenu.c32
# 默认等待时间,单位是十分之一秒
timeout 600
# 标题
menu title CentOS Linux 8

# 菜单选项
label linux
  menu label ^Install CentOS Linux 8 # 菜单标签
  kernel vmlinuz # 加载的内核,这里是相对路径
  # 向内核传递参数,除了菜单文件指定,在安装界面还可以tab键后 手动输入,常见内核参数见下表
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd quiet

# menu begin 设置Troubleshooting的二级菜单 开始
menu begin ^Troubleshooting
  menu title Troubleshooting

# menu begin 和 menu begin end 之间的内容,属于二级菜单
...

# menu begin 设置二级菜单 结束
menu end

常见内核参数

注意:安装程序的引导参数都使用 inst. 作为前缀。目前这个前缀是可选的,例如 inst.ks= 和 ks= 的效果完全一样。但预期在未来会强制使用 inst. 前缀。

自动安装的应答文件

实现自动化安装前,需要制作对应的应答文件,称为 kickstart 文件,用于保存安装过程中的需要指定的选项

如果是图形化手动一步步安装,系统会自动生成应答文件:/root/anaconda-ks.cfg

kickstart 文件格式的官方说明:centos6centos7centos8

kickstart 文件格式说明

kickstart 文件主要包括三个部分:命令段、程序包段、脚本段

命令段

指明各种安装前配置,如键盘类型等

命令 说明
keyboard 设定键盘类型
lang 语言类型
zerombr 清除 mbr
clearpart 清除分区
part 创建分区
rootpw 指明 root 的密码
timezone 时区
text 文本安装界面
network 指定网络设置
firewall 设置防火墙设置
selinux 设置 selinux 设置
reboot 安装完自动重启
user 安装完成后为系统创建新用户
url 指明安装源
程序包段

%packages:指定要安装的程序包组或程序包、指定不安装的程序包等。以%end 结尾。范例:

%packages
@^environment group  # 环境包组,如:@^minimal-environment
@group_name  # 程序包组
package  # 程序包
-package # 不安装的程序包
%end
脚本段
  • %pre: 安装前脚本,%end 结尾
  • %post: 安装后脚本,%end 结尾

范例:

%post
useradd mage
echo magedu | passwd --stdin mage &> /dev/null
%end
其他
  • %addon:安装插件,%end 结尾,范例:

    %addon com_redhat_kdump --enable --reserve-mb=128
    %end
    %addon org_fedora_oscap
    content-type = datastream
    content-url = http://www.example.com/scap/testing_ds.xml
    datastream-id = scap_example.com_datastream_testing
    xccdf-id = scap_example.com_cref_xccdf.xml
    profile =  xccdf_example.com_profile_my_profile
    fingerprint = 240f2f18222faa98856c3b4fc50c4195
    %end
  • %anaconda:控制安装系统的用户界面的行为。此部分必须放在 kickstart 文件的末尾。目前,在%anaconda 部分中,pwplicy 是唯一可以使用的命令,范例:

    # 设置密码策略,要求root密码至少为10个字符长,并严格禁止与此要求不匹配的密码
    %anaconda
    pwpolicy root --minlen=10 --strict
    %end

注意:CentOS6、7、8 的 kickstart 文件格式不尽相同,不可混用

kickstart 文件创建

  • 可使用创建工具:system-config-kickstart ,注意:此方法 CentOS 8 不再支持
  • CentOS 安装完后,会根据当前系统的安装过程,自动生成一个 kickstart 文件:/root/anaconda-ks.cfg,可以根据此文件修改并生成新配置

推荐使用第二种方式,手动编辑,最后使用 ksvalidator(来自于 pykickstart 包) 工具检查一下文件格式是否有语法错误。

[root@centos8 ~]$yum install pykickstart.noarch
[root@centos8 ~]$ksvalidator ./anaconda-ks.cfg

制作引导 U 盘

制作应答文件、修改 iso 的启动菜单配置文件 isolinux.cfg,然后把 iso 制作成引导 U 盘,就可以实现半自动化安装。

应答文件可以放在 iso 中,也可以放在 http 服务器,只需要在 isolinux.cfg 中配置好 ks=path 即可。

DHCP

主机获取网络配置可以通过两种方式:

  • 静态指定
  • 动态获取
    • bootp:boot protocol,IP 与 MAC 一一静态对应
    • dhcp:增强的 bootp,IP 与 MAC 既可以静态绑定,也可以动态分配

DHCP 工作原理

DHCP: Dynamic Host Configuration Protocol,动态主机配置协议。基于 UDP 协议,DHCP Server 默认 67 端口号,DHCP Client 默认 68(ipv4)和 546(ipv6)端口号。

主要用途:

  • 用于内部网络和网络服务供应商自动分配 IP 地址给用户
  • 用于内部网络管理员作为对所有电脑作集中管理的手段
  • 自动化安装系统
  • 解决 IPV4 资源不足问题

DHCP 实现

实现 DHCP 服务的软件:

  • dhcp(centos7) 或 dhcp server(centos8)
  • dnsmasq:小型服务软件,可以提供 dhcp 和 dns 服务

DHCP 相关文件组成

dhcp 或 dhcp server 包文件组成:

  • /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:DHCP 服务器日志,记录了地址分配记录

dhcp-client 客户端包:

  • /usr/sbin/dhclient:客户端程序
  • /var/lib/dhclient/dhclient.leases:DHCP 客户端日志,

DHCP 服务器配置文件

帮助参考:man 5 dhcpd.conf

dhcpd.conf 配置信息: subnet 网段设置; host 主机设置。 范例:

option domain-name "magedu.org"; # 分配给用户域名,就是/etc/resolve.conf中的domain
# 分配给用户DNS,就是/etc/resolve.conf中的nameserver
option domain-name-servers 180.76.76.76, 223.6.6.6;
# 默认租约时间,以秒为单位,十分钟,五分钟就要续约,所以一般我们需要把这个值调长一些
default-lease-time 600;
max-lease-time 7200;    # 最长续约时间,两个小时
log-facility local7; # 日志类型,具体什么含义后面的日志章节会详细学习,这里先不用管它
# 网段设置
subnet 10.0.0.0 netmask 255.255.255.0 {
  range 10.0.0.10 10.0.0.100;   # ip 范围
  range 10.0.0.110 10.0.0.200;    # ip 范围
  option routers 10.0.0.2;    # 路由
  # 提供引导文件的服务器IP地址,一般是一个tftp服务器。与pxe自动化安装有关
  next-server 10.0.0.8;
  # 指明引导文件名称:pxelinux.0
  filename "pxelinux.0";
}
# 主机设置,DHCP服务器给指定主机分配固定IP
host testclient {
  hardware ethernet 00:0c:29:33:b4:1a;
  fixed-address 10.0.0.106;  # 指定ip,与MAC地址绑定
  default-lease-time 86400;
  max-lease-time 864000;
  option routers 10.0.0.254;
  option domain-name-servers 114.114.114.114,8.8.8.8 ;
  option domain-name "magedu.net";
}

dhclient 命令

dhclient -d  # 强制dhclient作为前台进程运行
dhclient -l  # 尝试获得一次租约
dhclient -r  # 释放当前租约并停止正在运行的DHCP客户端

TFTP

OpenSSH 服务中,我们学习了 SFTP 是安全版的 FTP,而 TFTP 是简化版的 FTP:

  1. FTP 基于 TCP、TFTP 基于 UDP

  2. FTP 支持账号登录,TFTP 不支持账号登录

  3. FTP 使用 2 个端口:TCP 端口 21,是个侦听端口;TCP 端口 20 或更高 TCP 端口 1024 以上用于源连接。

    FTP 仅使用一个具有停止和等待模式的端口:端口:69/udp

  4. FTP 有许多可以执行的命令(get,put,ls,dir,lcd)并且可以列出目录等
    TFTP 只有 5 个指令可以执行(rrq,wrq,data,ack,error)

安装和使用 TFTP

服务器包 tftp-server:

[root@centos8 ~]$dnf -y install tftp-server  # 安装dftp服务器包
[root@centos8 ~]$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 # tftp service文件
/usr/lib/systemd/system/tftp.socket  # tftp socket文件
/usr/sbin/in.tftpd      # tftp主程序
/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服务数据目录

# 启动服务并设置开机自启
[root@centos8 ~]$systemctl enable --now tftp.service
[root@centos8 ~]$ss -ntulp

# 准备测试文件
[root@centos8 ~]$cd /var/lib/tftpboot/
[root@centos8 tftpboot]$echo 'hello tftp' > test.txt

客户端包 tftp:

[root@centos7 ~]#yum -y install tftp
[root@centos7 ~]#tftp 10.0.0.8
tftp> ?
tftp-hpa 5.2
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
literal         toggle literal mode, ignore ':' in file name
status          show current status
binary          set mode to octet
ascii           set mode to netascii
rexmt           set per-packet transmission timeout
timeout         set total retransmission timeout
?               print help information
help            print help information
tftp> get test.txt  # 注意,目录不能get,ftp也不行
tftp> quit
[root@centos7 ~]#ll test.txt
-rw-r--r--. 1 root root 12 Sep 15 19:12 test.txt
[root@centos7 ~]#cat test.txt
hello tftp

利用 PXE 实现自动化安装部署

PXE:Preboot Excution Environment,预启动执行环境,是由 Intel 公司研发,基于 Client/Server 的网络模式。

Intel PXE 规范定义了一些机制和协议,可让 PXE 设备使用其网络接口卡 (NIC) 来查找位于网络服务器上的引导程序。在 PXE 规范中,这些程序被称为“网络引导程序”(NBP)。

复习:MBR 硬盘的 0 号扇区的前 446 个字符是主引导程序 BootLoader,作用是查找和装载可引导的操作系统。
NBP 类似 BootLoader,只不过 NMP 是在网络中查找配置文件,根据配置文件引导系统。

syslinux 是一个启动加载器集合,支持从硬盘、光盘或通过 PXE 的网络引导启动系统,支持 ext4、FAT 等文件系统。Server 安装 syslinux 后,会在/usr/share/syslinux 目录下生成很多文件,其中 pxelinux.0 就是 NBP,pxelinux.cfg 就是配置文件。

PXE 启动工作原理:

在 CentOS8 上实现 PXE 自动化安装 CentOS6、7、8

安装前准备:

  • 关闭 Vmware 软件中的 DHCP 服务,设置为基于 NAT 模式
  • 关闭 CentOS 8 的防火墙和 SELINUX
  • 确保 CentOS 8 的 IP 是静态指定,不是 DHCP 获取
  • 使用 1G 以下内存的主机安装 CentOS 7,8 会提示空间不足,建议 2G 以上
  1. 安装相关软件包并启动
[root@centos8 ~]#dnf -y install dhcp-server tftp-server httpd syslinux-nonlinux
[root@centos8 ~]#systemctl enable --now httpd tftp dhcpd
  1. 配置 DHCP 服务
option domain-name "magedu.org";
option domain-name-servers 180.76.76.76, 223.6.6.6;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 10.0.0.0 netmask 255.255.255.0 {
  range 10.0.0.10 10.0.0.100;
  range 10.0.0.110 10.0.0.200;
  option routers 10.0.0.2;
  next-server 10.0.0.8;
  filename "pxelinux.0";
}
  1. 配置 TFTP 服务,参考上文
  2. 准备 yum 源和相关目录
[root@centos8 ~]#mkdir -pv /var/www/html/centos/{6,7,8}/os/x86_64/
[root@centos8 ~]#mount /dev/sr0 /var/www/html/centos/6/os/x86_64/
[root@centos8 ~]#mount /dev/sr1 /var/www/html/centos/8/os/x86_64/
[root@centos8 ~]#mount /dev/sr2 /var/www/html/centos/7/os/x86_64/
  1. 准备应答文件

centos6:

# 参考 14.1 CentOS6、7、8应答文件.md

centos7:

# 参考 14.1 CentOS6、7、8应答文件.md

centos8:

# 参考 14.1 CentOS6、7、8应答文件.md
  1. 准备 PXE 启动相关文件
[root@centos8 tftpboot]$mkdir /var/lib/tftpboot/centos{6,7,8}
[root@centos8 centos]$pwd
/var/www/html/centos
[root@centos8 centos]$cp 6/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos6/
[root@centos8 centos]$cp 7/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos7/
[root@centos8 centos]$cp 8/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos8/
[root@centos8 centos]$cp /usr/share/syslinux/{pxelinux.0,menu.c32} /var/lib/tftpboot/

#以下三个文件是CentOS8安装所必须文件,CentOS6,7则不需要
[root@centos8 centos]$cp 8/os/x86_64/isolinux/{ldlinux.c32,libcom32.c32,libutil.c32} /var/lib/tftpboot/

#生成安装菜单文件
[root@centos8 centos]$mkdir /var/lib/tftpboot/pxelinux.cfg
[root@centos8 centos]$cp 8/os/x86_64/isolinux/{ldlinux.c32,libcom32.c32,libutil.c32} /var/lib/tftpboot/

#最终目录结构如下
[root@centos8 centos]$cd /var/lib/tftpboot/
[root@centos8 tftpboot]$tree
.
├── centos6
│   ├── initrd.img
│   └── vmlinuz
├── centos7
│   ├── initrd.img
│   └── vmlinuz
├── centos8
│   ├── initrd.img
│   └── vmlinuz
├── ldlinux.c32
├── libcom32.c32
├── libutil.c32
├── menu.c32
├── pxelinux.0
└── pxelinux.cfg
    └── default

4 directories, 12 files
  1. 准备启动菜单文件

    修改/var/lib/tftpboot/pxelinux.cfg/default

default menu.c32
timeout 600
menu title Install CentOS Linux

label linux8
 menu label Auto Install CentOS Linux ^8
 kernel centos8/vmlinuz
 append initrd=centos8/initrd.img inst.ks=http://10.0.0.8/ks/centos8.cfg

label linux7
 menu label Auto Install CentOS Linux ^7
 kernel centos7/vmlinuz
 append initrd=centos7/initrd.img inst.ks=http://10.0.0.8/ks/centos7.cfg

label linux6
 menu label Auto Install CentOS Linux ^6
 kernel centos6/vmlinuz
 append initrd=centos6/initrd.img inst.ks=http://10.0.0.8/ks/centos6.cfg

label manual
 menu label ^Manual Install CentOS Linux 8.0
 kernel centos8/vmlinuz
 append initrd=centos8/initrd.img inst.repo=http://10.0.0.8/centos/8/os/x86_64/

label rescue
 menu label ^Rescue a CentOS Linux system 8
 kernel centos8/vmlinuz
 append initrd=centos8/initrd.img inst.repo=http://10.0.0.8/centos/8/os/x86_64/ rescue

label local
 menu default
 menu label Boot from ^local drive
 localboot 0xffff
  1. 新准备一台主机,设置网卡引导,可看到看启动菜单,并实现自动安装

    安装成功:

利用 cobbler 实现自动安装


系统部署
http://blog.lujinkai.cn/运维/运维自动化/系统部署/系统部署/
作者
像方便面一样的男子
发布于
2020年12月9日
更新于
2023年12月5日
许可协议