系统部署

系统安装过程

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实现自动安装