美文网首页
4. 运维自动化之系统部署-PXE

4. 运维自动化之系统部署-PXE

作者: 随便写写咯 | 来源:发表于2021-03-14 03:02 被阅读0次

    本文内容

    • 系统安装过程和配置anaconda
    • 制作自动化安装系统的应答文件
    • DHCP服务
    • TFTP服务
    • 利用PXE实现自动化的系统部署

    1 系统安装过程

    1.1 运维自动化发展历程及技术应用

    运维自动化发展历史

    1.2 系统安装过程

    Linux的安装过程如下:

    • 加载boot loader
    • 加载启动安装菜单
    • 加载内核和initrd文件
    • 加载根系统
    • 运行anaconda的安装向导

    1.2.1 Linux的安装光盘的安装相关文件

    在系统光盘的isolinux目录下有和安装相关的文件, 安装操作系统需要的必要文件

    [18:03:49 root@CentOS-8-1 ~]#ll /misc/cd/isolinux
    total 72859
    -r--r--r-- 1 root root     2048 Jun  9  2020 boot.cat
    -r--r--r-- 1 root root       84 Jun  9  2020 boot.msg
    -r--r--r-- 1 root root      293 Jun  9  2020 grub.conf
    -r--r--r-- 2 root root 65114456 Jun  9  2020 initrd.img
    -r--r--r-- 1 root root    38912 Jun  9  2020 isolinux.bin
    -r--r--r-- 1 root root     3075 Jun  9  2020 isolinux.cfg
    -r--r--r-- 1 root root   116096 Nov  9  2019 ldlinux.c32
    -r--r--r-- 1 root root   180700 Nov  9  2019 libcom32.c32
    -r--r--r-- 1 root root    22804 Nov  9  2019 libutil.c32
    -r--r--r-- 1 root root   182704 May 13  2019 memtest
    -r--r--r-- 1 root root      186 Jul 31  2019 splash.png
    -r--r--r-- 1 root root     2885 Jun  9  2020 TRANS.TBL
    -r--r--r-- 1 root root    26788 Nov  9  2019 vesamenu.c32
    -r-xr-xr-x 2 root root  8913656 May  8  2020 vmlinuz
    
    • boot.cat: 相当于grub的第一阶段, 引导系统
    • grub.conf: 相当于grub的第二阶段
    • isolinux.bin: 光盘引导程序, 在mkisofs的选项中需要明确给出文件路径, 这个文件属于SYSLINUX项目
    • isolinux.cfg: 启动菜单的配置文件, 当光盘启动后(即运行isolinux.bin), 会自动去找isolinux.cfg文件. 这是启动菜单, 和kickstart文件不一样
    • vesamenu.c32: 是光盘启动后的启动菜单图形界面, 也属于SYSLINUX项目, menu.c32提供纯文本的菜单
    • memtest: 内存检测程序
    • splash.png: 光盘启动菜单界面的背景图
    • vmlinuz: 是内核映像
    • ininrd.img: ramfs文件, 启动时需要的相关驱动

    进入到救援模式的几种方法:

    开机按ESC进入到启动菜单, 选择光盘启动

    1. 手动选择Troubleshooting, 然后进入到rescue选项

    2. 按ESC, 进入boot: , 按rescue, 回车, 进入到救援模式

    3. 按ESC, 进入boot, 按linux rescue, 回车, 进入到救援模式

    4. 在光盘启动界面, 按tab键, 然后输入rescue, 作为内核参数

    启动救援模式

    1.2.2 安装菜单的内核参数

    可以在安装光盘的启动菜单配置文件: isolinux/isolinux.cfg中设置相关的内核加载参数, 实现不同的安装过程

    isolinux.cfg文件中每个安装对应菜单选项:

    • 加载内核: isolinuz/vmlinuz
    • 向内核传递参数: append initrd=initrd.img 参数设置

    指定内核参数方法:

    • 在启动菜单界面, 选择一种安装方法, 按tab键, 在后面增加参数
    • 在启动菜单界面, 任意选中一种安装方法, 按ESC键: boot: linux 参数设置

    常见的内核参数:

    • text: 默认启动GUI安装接口, 可以指定文本方式的安装界面
    • rescue: 进入救援模式
    • inst.repo=path: 指定安装源文件的路径, 可以是以下格式
      CentOS 6
      DVD Drive repo=cdrom :device
      Hard Drive repo=hd:device/path
      HTTP Server repo=http://host/path
      HTTPS Server repo=https://host/path
      FTP Server repo=ftp://username:passwd@host/path
      NFS Server repo=nfs:server:/path
      ISO images on an NFS Server repo=nfsiso:server:/path
      CentOS 7
      Any CD/DVD drive inst.repo=cdrom
      Hard Drive inst.repo=hd:device:/path
      HTTP Server inst.repo=http://host/path
      HTTPS Server inst.repo=https://host/path
      FTP Server inst.repo=ftp://username:passwd@host/path
      NFS Server inst.repo=nfs:[options:]server:/path
    • askmethod: 选择安装源文件的获取方法, 提供了光盘, 本地硬盘, NFS, FTP, HTTP多种安装源, 此项CentOS 7以后版已放弃
    • ks=path: 指定自动化安装应答文件路径, 如: initrd=initrd.img inst.ks=http://192.168.8.8/ksdir/ks8.cfg
    • ip=:指定ip地址信息
      ip=method, method 可以为DHCP
      ip=interface:method 指定特定窗口
      ip=ip::gateway:netmask:hostname:interface:none 静态IP

    1.2.3 anaconda安装向导

    anaconda是Linux系统安装程序, 可以提供两种风格的安装界面

    • gui: 图形工具
    • tui: 基于图形库curses的文本窗口

    anaconda工作过程

    • 安装过程使用的语言
    • 键盘类型
    • 时区和时间
    • 安装源文件路径
    • 选定要安装的程序包
    • 安装目标存储设备及分区设置
      Basic Storage: 本地磁盘
      特殊设备: iSCSI
    • KDUMP功能
    • 设定主机名和配置网络接口
    • 安全策略
    • 管理员密码
    • 创建一个普通用户

    anaconda的配置方式

    2 自动安装的应答文件

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

    2.1 kickstart文件使用过程

    1. Create a Kickstart file
    2. Make the Kickstart file availables on removable media, a hard drive or a network location
    3. Create boot media, which will be used to begin the installation
    4. Make the installation source available
    5. Start the Kickstart installation

    2.2 kickstart文件的格式

    2.2.1 kickstart文件格式官方说明

    注意: 不同操作系统版本的应答文件格式不同, 不能混用

    2.2.2 kickstart文件格式说明

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

    • 命令段:指明各种安装前配置,如键盘类型等

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

    • 程序包段:指明要安装的程序包组或程序包,不安装的程序包等

    %packages
    @^environment group: 指定环境包组,如:@^minimal-environment
    @group_name
    package
    -package
    %end

    • 脚本段:

    %pre: 安装前脚本
    %post: 安装后脚本

    注意:

    CentOS 8,7,6 不同版本的kickstart文件格式不尽相同,不可混用
    %addon, %packages, %onerror, %pre 、 %post 必须以%end结束,否则安装失败

    2.3 kickstart文件创建

    创建kickstart文件的方式:

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

    检查ks文件的语法错误:

    使用 ksvalidator 工具可以检查kickstart的文件格式是否有语法错误,来自于 pykickstart 包

    格式:

    ksvalidator /PATH/TO/KICKSTART_FILE
    

    范例: 将远程管理主机的ssh key添加到系统安装kickstart文件, 实现系统安装好, 就可以直接ssh基于key验证连接

    1. 在管理主机本地生成公钥和私钥
    2. 管理主机使用ssh-copy-id将key传给自己本机, 生成authorized_keys文件
    3. 在kickstart文件中, 创建authorized_keys文件, 修改权限, 将上一步生成的key信息复制到kickstart的key文件中, 相当于在安装系统的时候, 就把远程管理主机的key添加到了ssh验证中, 之后就可用基于key验证, 不需要输入密码
    假定CentOS 8 作为远程管理主机
    
    1. 生成远程管理主机的公钥和私钥
    
    [18:55:35 root@CentOS-8-1 ~]#ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Created directory '/root/.ssh'.
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:QyrO/TW6kDpVuspItUqKR4G6IQIuZON40i+PQwUcGGY root@CentOS-8-1
    The key's randomart image is:
    +---[RSA 3072]----+
    |.E..             |
    |+ o              |
    | . .    .        |
    |o+. .  o.        |
    |O..oo .oS        |
    |Oo=+ +o. .       |
    |+Bo.+.+.  o      |
    |o++=o..o o .     |
    |o.++=o  +.       |
    +----[SHA256]-----+
    
    
    2. 将key传给自己本地
    
    [18:55:39 root@CentOS-8-1 ~]#ssh-copy-id 10.0.0.81
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    The authenticity of host '10.0.0.81 (10.0.0.81)' can't be established.
    ECDSA key fingerprint is SHA256:r5nZbKITDuMpv35jbqsfjYh8JVFnMaO5/avXQxh6Hmk.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    root@10.0.0.81's password: 
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh '10.0.0.81'"
    and check to make sure that only the key(s) you wanted were added.
    
    [18:56:14 root@CentOS-8-1 ~]#ls .ssh
    authorized_keys
    
    [18:57:18 root@CentOS-8-1 ~]#cat /root/.ssh/authorized_keys 
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt92c0R+BMldavwCdmnRD2xWOlZ+YcZUEAvQcCoyWWe1DszF72qyk4zlb0SJ9s/oNbLkxg5LQ2afuR/E37sQ61d+5nq5LZUyiY6yX4qFDojUeMyk2rqiO/e3edolZahadOuuS8nbkL7hHM/qTo2MyWfQgESwbNGOfgnnIZ5PbBeCO3OlpWL2yJeFdnDWTPNGfSfzNAyQXicPW2M8Q1Pri4RBTSqfcVHN4MbvpWsgcjMp4nopLk/sZfoI8YeXJIc0gWc0aVC3ymKd49nKNeMm9VJ5bDIBN/AMzUhL+15zL7v68Y6lbBoRlK+wFAkO6GWT7LTxue+iXlbjLvH9+rjGHfZKY9aSKYV8EyVCb4IvWoOqp4bOfsY6nNghRVZsuEjxLy/Hpb4h+p+Ywq2XoUdxunEJUlBabg5SY62aKjJEl9TPUONexrn5Q4CkFItrGStI6rklSeQyg8gVaNme8cxgBqovOcVuKMrLz5TfwyFonaKzKQWp+aGkuJyIO/O0e+/iE= root@CentOS-8-1
    
    
    3. 在kickstart文件里创建 authorized_keys 文件, 把刚才创建出来的远程主机的key复制到kickstart文件里, 注意需要修改文件和目录权限
    
    ******************************************
    
    mkdir /root/.ssh # 这个.ssh文件, 只有发生了远程ssh连接后才会在服务器端生成, 所以在制作kickstart时要手动创建. 
    chmod 700 /root/.ssh
    cat > /root/.ssh/authorized_keys << EOF
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt92c0R+BMldavwCdmnRD2xWOlZ+YcZUEAvQcCoyWWe1DszF72qyk4zlb0SJ9s/oNbLkxg5LQ2afuR/E37sQ61d+5nq5LZUyiY6yX4qFDojUeMyk2rqiO/e3edolZahadOuuS8nbkL7hHM/qTo2MyWfQgESwbNGOfgnnIZ5PbBeCO3OlpWL2yJeFdnDWTPNGfSfzNAyQXicPW2M8Q1Pri4RBTSqfcVHN4MbvpWsgcjMp4nopLk/sZfoI8YeXJIc0gWc0aVC3ymKd49nKNeMm9VJ5bDIBN/AMzUhL+15zL7v68Y6lbBoRlK+wFAkO6GWT7LTxue+iXlbjLvH9+rjGHfZKY9aSKYV8EyVCb4IvWoOqp4bOfsY6nNghRVZsuEjxLy/Hpb4h+p+Ywq2XoUdxunEJUlBabg5SY62aKjJEl9TPUONexrn5Q4CkFItrGStI6rklSeQyg8gVaNme8cxgBqovOcVuKMrLz5TfwyFonaKzKQWp+aGkuJyIO/O0e+/iE= root@CentOS-8-1
    EOF
    chmod 600 /root/.ssh/authorized_keys
    ******************************************
    
    4. 将第三步中所有内容复制到kickstart文件中的%post <脚本> %END 字段里, 系统安装完成后自动执行
    

    范例: 利用图形化制作CentOS7自动化安装kickstart文件, 在CentOS 8搭建http yum仓库提供下载

    Centos 6 & 7 有system-config-kickstart图形化工具, Centos8不兼容, 因为python 2和3互不兼容
    服务器一般是最小化安装, 因此, 需要在Windows安装Xmanager来打开服务器端的system-config-kickstart图形化工具

    大致步骤

    1. 在服务器端安装system-config-kickstart
    2. Windows安装Xmanager

    通过Windows Xmanager打开CentOS7上图形界面,因为服务器是最小化安装,所以即使在安装system-config-kickstart包时安装了很多其他图形化包,但是并没有安装图形化界面

    1. 定义变量export DISPLAY=WindowsIP:N.N
    2. 在服务器端运行system-config-kickstart, 会在Xmanager打开kickstart配置文件

    步骤:

    1. CentOS-7安装 system-config-kickstart 程序包
    [19:12:50 root@centos-7-1 ~]#yum -y install system-config-kickstart
    
    1. 在Windows本地安装xManager
    图片.png
    1. 在服务器端(CentOS 7)定义环境变量
    [19:55:16 root@centos-7-1 ~]#export DISPLAY=10.0.0.1:0.0
    
    
    1. Centos 7启动 system-config-kickstart
    [20:02:08 root@centos-7-1 ~]# system-config-kickstart
    Xlib:  extension "RANDR" missing on display "10.0.0.1:0.0".
    /usr/share/system-config-kickstart/kickstartGui.py:104: GtkWarning: GtkSpinButton: setting an adjustment with non-zero page size is deprecated
      xml = gtk.glade.XML ("/usr/share/system-config-kickstart/system-config-kickstart.glade", domain="system-config-kickstart")
    Loaded plugins: fastestmirror
    
    
    图片.png 图片.png 图片.png

    CentOS 8 上搭建内部yum仓库 http

    yum -y install httpd; systemctl start httpd
    

    按照yum仓库路径格式创建目录

    [12:33:05 root@centos8 ~]#mkdir /var/www/html/centos/{6,7,8}/os/x86_64/ -pv
    mkdir: created directory '/var/www/html/centos'
    mkdir: created directory '/var/www/html/centos/6'
    mkdir: created directory '/var/www/html/centos/6/os'
    mkdir: created directory '/var/www/html/centos/6/os/x86_64/'
    mkdir: created directory '/var/www/html/centos/7'
    mkdir: created directory '/var/www/html/centos/7/os'
    mkdir: created directory '/var/www/html/centos/7/os/x86_64/'
    mkdir: created directory '/var/www/html/centos/8'
    mkdir: created directory '/var/www/html/centos/8/os'
    mkdir: created directory '/var/www/html/centos/8/os/x86_64/'
    
    0 directories, 2 files
    [20:16:46 root@CentOS-8-1 ~]#tree /var/www/html/
    /var/www/html/
    └── centos
        ├── 6
        │   └── os
        │       └── x86_64
        ├── 7
        │   └── os
        │       └── x86_64
        └── 8
            └── os
                └── x86_64
    
    10 directories, 0 files
    
    

    实验环境

    挂载光盘到 /var/www/html/centos/{7,8}/os/x86_64/

    在8上制作yum仓库, 通过7的kickstart图形化工具创建7的kickstart应答文件

    在新的服务器安装7系统

    将iso文件挂载到/var/www/html/centos/{6,7,8}/os/x86_64/目录下

    添加一个额外的光驱, 用于挂载7的安装光盘

    echo "alias scandisk='echo - - - > /sys/class/scsi_host/host0/scan;echo - - - > /sys/class/scsi_host/host1/scan;echo - - - > /sys/class/scsi_host/host2/scan'" >> /root/.bashrc
    
    [20:30:00 root@CentOS-8-1 ~]#scandisk # 新添加的光驱需要重启服务器才能识别, 或者使用scandisk命令别名
    [20:30:03 root@CentOS-8-1 ~]#lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   50G  0 disk 
    ├─sda1   8:1    0    1G  0 part /boot
    ├─sda2   8:2    0   20G  0 part /
    ├─sda3   8:3    0    2G  0 part [SWAP]
    ├─sda4   8:4    0    1K  0 part 
    └─sda5   8:5    0   27G  0 part /data
    sr0     11:0    1  7.7G  0 rom  /var/www/html/centos/8/os/x86_64 # 挂载到8的目录
    sr1     11:1    1  4.5G  0 rom # 挂载到7的目录
    
    [20:24:45 root@CentOS-8-1 ~]#mount /dev/sr0 /var/www/html/centos/8/os/x86_64/ # 挂载8的安装光盘
    mount: /var/www/html/centos/8/os/x86_64: WARNING: device write-protected, mounted read-only.
    [20:31:43 root@CentOS-8-1 ~]#mount /dev/sr1 /var/www/html/centos/7/os/x86_64/
    mount: /var/www/html/centos/7/os/x86_64: WARNING: device write-protected, mounted read-only.
    
    

    生产环境

    直接把iso文件拷贝到yum服务器主机,然后mount直接把iso文件挂到var/www/html/centos/{6,7,8}/os/x86_64/目录下

    mount CentOS-8.2.2004-x86_64-dvd1.iso /var/www/html/centos/8/os/x86_64/
    
    图片.png 图片.png
    图片.png 图片.png 图片.png 图片.png 图片.png 图片.png 图片.png 图片.png 图片.png

    Package Selection

    需要在配置Xmanager之前, 就去本地7的yum仓库修改yum配置文件, 否则无法继续包的安装选项

    图片.png

    先将配置临时保存, 然后配置yum仓库

    图片.png 图片.png 图片.png

    关闭Xmanger

    把base标签改成development

    图片.png

    再次打开Xmanager, 验证开始接受yum仓库信息

    图片.png 图片.png

    导入刚才保存的ks文件

    图片.png

    选择要安装的软件, 这里测试安装mariadb客户端

    图片.png

    安装后执行脚本, 添加创建新系统yum配置文件

    图片.png
    mkdir /root/.ssh
    chmod 700 /root/.ssh
    cat > /root/.ssh/authorized_keys << EOF
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCt92c0R+BMldavwCdmnRD2xWOlZ+YcZUEAvQcCoyWWe1DszF72qyk4zlb0SJ9s/oNbLkxg5LQ2afuR/E37sQ61d+5nq5LZUyiY6yX4qFDojUeMyk2rqiO/e3edolZahadOuuS8nbkL7hHM/qTo2MyWfQgESwbNGOfgnnIZ5PbBeCO3OlpWL2yJeFdnDWTPNGfSfzNAyQXicPW2M8Q1Pri4RBTSqfcVHN4MbvpWsgcjMp4nopLk/sZfoI8YeXJIc0gWc0aVC3ymKd49nKNeMm9VJ5bDIBN/AMzUhL+15zL7v68Y6lbBoRlK+wFAkO6GWT7LTxue+iXlbjLvH9+rjGHfZKY9aSKYV8EyVCb4IvWoOqp4bOfsY6nNghRVZsuEjxLy/Hpb4h+p+Ywq2XoUdxunEJUlBabg5SY62aKjJEl9TPUONexrn5Q4CkFItrGStI6rklSeQyg8gVaNme8cxgBqovOcVuKMrLz5TfwyFonaKzKQWp+aGkuJyIO/O0e+/iE= root@CentOS-8-1
    EOF
    chmod 600 /root/.ssh/authorized_keys
    
    mkdir /etc/yum.repos.d/backup
    mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
    
    cat > /etc/yum.repos.d/base.repo << EOF
    [base]
    name=CentOS
    baseurl=https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch/ # $符号需要进行转义, 否则会直接扩展变量
    gpgcheck=0
    
    [extra]
    name=extras
    baseurl=https://mirrors.aliyun.com/centos/\$releasever/extras/\$basearch
    gpgcheck=0
    enabled=1
    
    [epel]
    name=EPEL
    baseurl=http://mirrors.aliyun.com/epel/\$releasever/\$basearch
    gpgcheck=0
    EOF
    

    保存ks文件到/root目录下, 退出Xanager, 修改ks文件的时区设置, 安装vim

    [21:21:52 root@centos-7-1 ~]#vim ks.cfg 
    
    ...
    # System timezone
    timezone Asia/Shanghai
    ...
    
    图片.png

    将ks.cfg文件拷贝到CentOS 8 yum仓库目录下

    在CentOS7上生成kickstart文件, 然后传到yum服务器上

    [20:31:58 root@CentOS-8-1 ~]#mkdir /var/www/html/ks # 创建存放ks文件的目录
    
    
    #应答文件制作完成后, 检查语法
    [21:25:06 root@centos-7-1 ~]#ksvalidator ks.cfg 
    #语法无误, 则传给yum仓库
    [21:25:22 root@centos-7-1 ~]#scp ks.cfg 10.0.0.81:/var/www/html/ks/centos7.cfg
    
    

    验证8的yum仓库上可以访问到ks文件

    图片.png

    安装新的系统, 应答文件的使用需要在开机时, 指定应答文件的路径

    准备一个新的CentOS7虚拟机, 对于磁盘大小一定要大于ks文件中的分区总大小(此前ks分区一个430个G
    , 因此准备的新的虚拟机要大于430个G), 内存2个G以上

    无需挂载7的安装光盘, 而是利用7的最小化启动光盘进行启动, 然后利用ks文件中的yum仓库进行软件安装

    https://mirror.tuna.tsinghua.edu.cn/centos-vault/7.8.2003/isos/x86_64/

    图片.png

    新的虚拟机挂载NetInstall光盘

    图片.png

    开机, 开机时进入菜单, 按ESC键, 进入boot命令行-指定应答文件路径

    图片.png 图片.png

    linux ks=http://10.0.0.81/ks/centos7.cfg

    敲回车

    图片.png

    进入安装

    图片.png

    如果安装完, 一直卡在等待界面, 可能是因为grub安装失败, 需要重启, 进入救援模式, 安装grub2, 退出救援模式

    可以在安装前, 先检查下ks文件, 看看有没有指定bootloader安装位置, bootloader --append="net.ifnames=0" --location=mbr, 如果没有选择安装boot loader 这里会显示 --location=none

    图片.png
    chroot /mnt/sysimage
    grub2-install /dev/sda
    mount /dev/sr0 /mnt
    grub2-mkconfig -o /boot/grub2/grub.cfg
    sync
    重启
    

    如何实现基于网络自动化安装

    目前, 虽然可以实现利用ks文件进行自动化安装, 但是系统还需要插入最小化启动安装光盘, 来提供内核文件, boot loader, grub等, 因此, 需要实现基于网络的完全自动化安装, 把这些依赖的文件存放在固定的服务器上, 达到只要网络通, 可以通过新的服务器的网卡找到对应服务器上的文件, 然后下载安装

    在新的服务器上开机, 选择菜单, 进行安装即可

    4 实现DHCP服务

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

    • 静态指定
    • 动态获取:
    bootp:boot protocol MAC与IP一一静态对应
    dhcp:增强的bootp,动态
    

    自动化安装过程需要配置dhcp服务器, 一是让新的服务器, 安装完成后自动获取ip地址, 需要在ks文件中, 指定ip地址通过dhcp获取. 二是需要dhcp服务器通知新的服务器, 存放了内核文件, boot loader等文件的服务器的地址, 这样新的服务器才能通过网络下载启动安装必要的文件, 实现不依赖于本地的光盘

    大概流程:

    通过dhcp获取一个ip地址以及tftp服务器地址 --> 从tftp服务器下载启动安装的依赖数据 --> 执行安装ks文件

    4.1 DHCP工作原理

    DHCP: Dynamic Host Configuration Protocol,动态主机配置协议,UDP协议,C/S模式
    dhcp server:67/udp
    dhcpv4 client :68/udp,dhcpv6 client:546/udp

    • 主要用途:
    用于内部网络和网络服务供应商自动分配IP地址给用户
    
    用于内部网络管理员作为对所有电脑作集中管理的手段
    
    自动化安装系统
    
    解决IPV4资源不足问题
    
    • DHCP共有八种报文
    图片.png
    DHCP DISCOVER:客户端到服务器
    DHCP OFFER :服务器到客户端
    DHCP REQUEST:客户端到服务器
    DHCP ACK :服务器到客户端
    DHCP NAK:服务器到客户端,通知用户无法分配合适的IP地址
    DHCP DECLINE :客户端到服务器,指示地址已被使用
    DHCP RELEASE:客户端到服务器,放弃网络地址和取消剩余的租约时间
    DHCP INFORM:客户端到服务器, 客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,极少用到
    
    • DHCP服务续租
    50% :租赁时间达到50%时来续租,刚向DHCP服务器发向新的DHCPREQUEST请求。如果dhcp服务没有拒绝的理由,则回应DHCPACK信息。当DHCP客户端收到该应答信息后,就重新开始新的租用周期
    87.5%:如果之前DHCP Server没有回应续租请求,等到租约期的7/8时,主机会再发送一次广播请求
    
    • 同网段的多个DHCP服务
    DHCP服务必须基于本地
    先到先得的原则, 从哪个dhcp服务器先收到地址, 就不会用后续的
    客户端只需要开启dhcp, 不用指定具体用哪个dhcp服务器, 因此, 网络中有多个dhcp服务器就会冲突
    
    • 跨网段
    RFC 1542 Compliant Routers
    dhcp relay agent: 中继代理
    
    • 相关协议
    arp
    rarp
    
    • 租期:
    长租期:IP相对稳定,网络资源消耗较少,但是浪费IP资源
    
    短租期:IP相对不稳定,网络资源消耗较多,但是IP资源可以充分利用,可以实现较少IP为较多的主机服务
    

    在CentOS 8(之前的yum仓库服务器) 搭建DHCP服务

    工作中, dhcp和yum仓库一般不会在同一个服务器

    准备工作: 关掉vmware的dhcp服务, 防止新的虚拟机从dhcp收取地址

    1. 在服务器端安装dhcp-server包(Centos 8) Centos 7上安装dhcp包
    [23:35:49 root@CentOS-8-1 ~]#yum -y install dhcp-server
    
    1. dhcpd服务默认是无法启动的, 因为配置文件是空的/etc/dhcp/dhcpd.conf需要编辑dhcpd.conf文件, 添加子网地址
    # 用模板文件覆盖系统生成的dhcpd.conf文件
    [23:36:30 root@CentOS-8-1 ~]#cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
    cp: overwrite '/etc/dhcp/dhcpd.conf'? yes
    
    
    # option definitions common to all supported networks...
    option domain-name "david.org"; #域名是resolv.conf文件定义的search域名
    
    option domain-name-servers 54.252.183.4, 54.252.183.5;
    
    default-lease-time 86400;  #租期, 默认600s, 达到一半时间就要开始续租, 需要时间调长, 比如86400s, 一天
    
    max-lease-time 164000; #最长租期有效期
    
    
    # No service will be given on this subnet, but declaring it helps the 
    # DHCP server to understand the network topology.
    # 地址段一定和当前网卡IP在同一个地址段, 因为dhcp基于广播实现
    subnet 10.0.0.0 netmask 255.255.255.0 { #指定给哪个网段分配地址
        range 10.0.0.150 10.0.0.200;
        option routers 10.0.0.2;     # 10.0.0.2是vmware nat环境的网关, 实际工作中还要看具体的网关地址是多少                                         
    }
    

    从当前行到结尾, 非#开头的行加上#

    进入末行模式
    :.,$s/^\([^#].*\)/#\1/  
    :.,$s/^[^#].*/#&/ # &符号表示前面搜索出来的所有内容  
    

    测试DHCP服务成功

    [23:59:37 root@CentOS-8-1 ~]#systemctl enable --now dhcpd
    Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.
    
    
    #找一台机器配置dhcp获取ip, 查看是否获得ip地址, 这里用之前制作ks文件的centos7模拟dhcp客户端
    [00:04:43 root@centos-7-1 ~]#vinet
    
    BOOTPROTO=dhcp                                                                                                                                                                      
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    
    [00:05:02 root@centos-7-1 ~]#nmcli conn reload 
    [00:05:23 root@centos-7-1 ~]#nmcli conn up eth0 # 执行命令后, 如果远程连接断开, 说明dhcp生效
    
    #在centos7查看dhcp日志
    
    查看cat /var/log/message文件
    
    Mar 14 00:05:28 centos-7-1 dbus[540]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
    Mar 14 00:05:28 centos-7-1 systemd: Started Network Manager Script Dispatcher Service.
    Mar 14 00:05:28 centos-7-1 NetworkManager[548]: <info>  [1615651528.4339] dhcp4 (eth0): dhclient started with pid 1116
    Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:1 'connectivity-change': new request (2 scripts)
    Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:1 'connectivity-change': start running ordered scripts...
    Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:2 'down' [eth0]: new request (2 scripts)
    Mar 14 00:05:28 centos-7-1 nm-dispatcher: req:2 'down' [eth0]: start running ordered scripts...
    Mar 14 00:05:28 centos-7-1 dhclient[1116]: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4 (xid=0x7523106d)
    Mar 14 00:05:29 centos-7-1 dhclient[1116]: DHCPREQUEST on eth0 to 255.255.255.255 port 67 (xid=0x7523106d)
    Mar 14 00:05:29 centos-7-1 dhclient[1116]: DHCPOFFER from 10.0.0.81
    Mar 14 00:05:29 centos-7-1 dhclient[1116]: DHCPACK from 10.0.0.81 (xid=0x7523106d)
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5142] dhcp4 (eth0):   address 10.0.0.151
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5142] dhcp4 (eth0):   plen 24 (255.255.255.0)
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5143] dhcp4 (eth0):   gateway 10.0.0.2
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5143] dhcp4 (eth0):   lease time 86400
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5143] dhcp4 (eth0):   nameserver '223.5.5.5'
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5143] dhcp4 (eth0):   nameserver '180.76.76.76'
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5143] dhcp4 (eth0):   domain name 'david.org'
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5143] dhcp4 (eth0): state changed unknown -> bound
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5156] device (eth0): state change: ip-config -> ip-check (reason 'none', sys-iface-state: 'managed')
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5165] device (eth0): state change: ip-check -> secondaries (reason 'none', sys-iface-state: 'managed')
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5180] device (eth0): state change: secondaries -> activated (reason 'none', sys-iface-state: 'managed')
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5186] manager: NetworkManager state is now CONNECTED_LOCAL
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5367] manager: NetworkManager state is now CONNECTED_SITE
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5369] policy: set 'eth0' (eth0) as default for IPv4 routing and DNS
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5413] device (eth0): Activation: successful, device activated.
    Mar 14 00:05:29 centos-7-1 NetworkManager[548]: <info>  [1615651529.5421] manager: NetworkManager state is now CONNECTED_GLOBAL
    
    
    #在dhcp服务器查看dhcp日志
    
    [00:00:49 root@CentOS-8-1 ~]#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.3.6
    
    # authoring-byte-order entry is generated, DO NOT DELETE
    authoring-byte-order little-endian;
    
    server-duid "\000\001\000\001'\337\235\355\000\014)\037J\012";
    
    lease 10.0.0.150 { # 150分给了之前ks启动的新的虚拟机
      starts 6 2021/03/13 16:02:39; # UTC时间 比北京时间完了8小时
      ends 0 2021/03/14 16:02:39;
      cltt 6 2021/03/13 16:02:39;
      binding state active;
      next binding state free;
      rewind binding state free;
      hardware ethernet 00:0c:29:b9:c5:39; # 分配给客户端的mac地址
    }
    lease 10.0.0.151 { # 151是分给centos7客户端的
      starts 6 2021/03/13 16:05:28;
      ends 0 2021/03/14 16:05:28;
      cltt 6 2021/03/13 16:05:28;
      binding state active;
      next binding state free;
      rewind binding state free;
      hardware ethernet 00:0c:29:54:b7:78; # 该ip地址分配给的主机的mac地址
      client-hostname "centos-7-1"; # 客户端的主机名
    }
    
    
    图片.png

    客户端验证ip通过dhcp获取

    图片.png

    客户端获取dhcp地址时会自动开启dhclient程序

    [00:17:33 root@centos-7-1 ~]#ps aux | grep dhclient
    root       1116  0.0  0.5 102904  5516 ?        S    00:05   0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03-eth0.lease -cf /var/lib/NetworkManager/dhclient-eth0.conf eth0
    root       1235  0.0  0.0 112808   968 pts/2    R+   00:17   0:00 grep --color=auto dhclient
    
    

    在一个使用静态地址的服务器上, 如何通过dhcp再分配一个ip地址

    如果服务器配置了通过dhcp获取ip地址, 那么服务器启动会默认执行dhclient, 运行在后台, 想要前台执行, 需要加-d选项, dhclient -d
    如果想要手动通过dhcp获取一个ip地址, 需要手动执行dhclient

    需要在静态地址的服务器上运行dhclient命令, 这里准备另一个虚拟机, 使用静态地址, 测试dhclient
    
    [00:21:22 root@centos-7-2 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0 
    BOOTPROTO=static # 当前地址是静态获取
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.227
    NETMASK=255.255.255.0
    GATEWAY=10.0.0.2
    DNS1=223.5.5.5
    DNS2=223.5.5.6
    
    
    
    [00:23:24 root@centos-7-2 ~]#dhclient
    [00:23:36 root@centos-7-2 ~]#
    
    [00:23:36 root@centos-7-2 ~]#ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:0c:29:54:b7:90 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.227/24 brd 10.0.0.255 scope global noprefixroute eth0
           valid_lft forever preferred_lft forever
        inet 10.0.0.152/24 brd 10.0.0.255 scope global secondary dynamic eth0  # 获的新的地址, 通过dhcp
           valid_lft 86365sec preferred_lft 86365sec
        inet6 fe80::20c:29ff:fe54:b790/64 scope link 
           valid_lft forever preferred_lft forever
    
    

    5 实现TFTP服务

    轻量级文件服务, 对于小文件, 不是特别复杂的下载需求, 可以使用tftp 
    
    对于实现PXE自动化安装, 需要服务器必须配置符合PXE标准的网卡, 其内置ROM芯片, 集成了dhcp客户端和tftp客户端
    dhcp客户端用于接收ip地址
    tftp客户端用于接收从tftp服务器下载来的内核, boot loader等文件
    否则, 新的服务器是空的, 没有硬盘, 无法接受ip, 也就无法获取必要的文件
    

    1. 需要编辑dhcpd配置文件,让客户端网卡知道从哪个服务器获取安装系统所需文件

    # No service will be given on this subnet, but declaring it helps the 
    # DHCP server to understand the network topology.
    
    subnet 10.0.0.0 netmask 255.255.255.0 {
        range 10.0.0.150 10.0.0.200;
        option routers 10.0.0.2;
        next-server 10.0.0.81;  #tftp服务器地址, 这里用centos8-1:10.0.0.81, 提供yum, dhcp服务和tftp服务                                             
    }
    

    2. 在tftp服务器上安装tftp服务

    [00:53:38 root@CentOS-8-1 ~]#yum -y install tftp-server
    
    
    [00:53:46 root@CentOS-8-1 ~]#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
    /usr/lib/systemd/system/tftp.socket
    /usr/sbin/in.tftpd
    /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服务, 监听在udp 69端口
    [00:53:59 root@CentOS-8-1 ~]#systemctl start tftp
    [00:54:14 root@CentOS-8-1 ~]#ss -ntlu
    Netid               State                Recv-Q               Send-Q                               Local Address:Port                               Peer Address:Port               
    udp                 UNCONN               0                    0                                          0.0.0.0:67         # tftp监听udp:67端口                             0.0.0.0:*                  
    udp                 UNCONN               0                    0                                                *:69                                            *:*  
    #tftp轻量级文件共享, 没有配置文件, 只能提供文件下载
    

    3. 告诉客户端tftp去服务器上下载哪个文件

    制作pxelinux0放在tftp服务器上, 通过dhcp服务, 分配地址同时告诉客户端去tftp下载pxelinux.0文件, 也就是boot loader文件

    # No service will be given on this subnet, but declaring it helps the 
    # DHCP server to understand the network topology.
    
    subnet 10.0.0.0 netmask 255.255.255.0 {
        range 10.0.0.150 10.0.0.200;
        option routers 10.0.0.2;
        next-server 10.0.0.8;
        filename "pxelinux.0";   #bootloader启动文件的名称                                         
    }
    
    [00:55:38 root@CentOS-8-1 ~]#systemctl restart dhcpd
    
    

    验证tftp服务可用

    #在服务器端添加文件到/var/lib/tftpboot/
    [00:56:09 root@CentOS-8-1 ~]#cp /etc/fstab /var/lib/tftpboot/
    
    #客户端安装tftp客户端程序, 用centos-7作为客户端
    [00:35:26 root@centos-7-1 ~]#yum -y install tftp
    
    #下载文件
    [00:58:40 root@centos-7-1 ~]##tftp 10.0.0.81
    [00:58:52 root@centos-7-1 ~]#tftp 10.0.0.81
    
    tftp> get fstab
    
    tftp> quit
    [00:59:18 root@centos-7-1 ~]#ls
    anaconda-ks.cfg  fstab  ks.cfg  Sys_Init.sh
    #tftp下载时需要知道文件的全名,没有补全功能
    

    4. 安装pxelinux.0

    [01:01:50 root@CentOS-8-1 ~]#yum provides */pxelinux.0
    Last metadata expiration check: 0:06:53 ago on Sun 14 Mar 2021 12:54:59 AM CST.
    syslinux-nonlinux-6.04-4.el8.noarch : SYSLINUX modules which aren't run from linux.
    Repo        : BaseOS
    Matched from:
    Filename    : /usr/share/syslinux/pxelinux.0
    
    syslinux-tftpboot-6.04-4.el8.noarch : SYSLINUX modules in /tftpboot, available for network booting
    Repo        : BaseOS
    Matched from:
    Filename    : /tftpboot/pxelinux.0
    
    [01:02:22 root@CentOS-8-1 ~]#yum -y install syslinux-nonlinux
    
    [01:02:45 root@CentOS-8-1 ~]#rpm -ql syslinux-nonlinux
    
    /usr/share/syslinux/pxelinux.0
    
    #复制/usr/share/syslinux/pxelinux.0到/var/lib/tftpboot/
    [01:03:03 root@CentOS-8-1 ~]#cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
    

    到此bootloader(grub)阶段结束, 下一步进入菜单选项(isolinux.cfg菜单模板)

    1. 复制isolinux.cfg到/var/lib/tftpboot

    [01:05:40 root@CentOS-8-1 ~]#mkdir /var/lib/tftpboot/pxelinux.cfg
    
    [01:06:26 root@CentOS-8-1 ~]#cp /misc/cd/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
    
    [01:06:49 root@CentOS-8-1 ~]#tree /var/lib/tftpboot/
    /var/lib/tftpboot/
    ├── fstab
    ├── pxelinux.0
    └── pxelinux.cfg
        └── default # 这里准备的是进入操作系统安装时的选择菜单
    
    1 directory, 3 files
    
    

    2. 修改isolinux.cfg文件

    [01:07:07 root@CentOS-8-1 ~]#vim /var/lib/tftpboot/pxelinux.cfg/default 
    
    #default vesamenu.c32  --> default menu.c32       #默认提供的vesa菜单风格需要图形化界面, 要修改成syslinux-nonlinux包所带的menu.c32,精简版菜单风格,不需要图形界面
    [00:58:00 root@CentOS-8-1 ~]#cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot
    
    #关于菜单部分, 只需保留以下三行
    
    default menu.c32
    timeout 600
    
    menu title Automatic Install Linux # 大标题
    
    • 子标题
    label linux # 标签名, 可以修改为对应的要安装的系统版本
      menu label ^Install CentOS Linux 8  # 标签名
      kernel vmlinuz
      append initrd=initrd.img inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd quiet # inst.stage2这里应该指定对应操作系统版本的应答文件路径
    
    • 修改后
    default menu.c32 # 菜单风格
    timeout 600 # 时间 60s
    
    menu title Automatic Install Linux  # 大标题
    
    label CentOS-8 # 安装8的选项
      menu label Install CentOS Linux ^8 # 这里在8前面加上托字符, 可以实现, 在菜单界面输入8, 就会跳到安装8的这一行, 相当于快捷键
      kernel vmlinuz
      append initrd=initrd.img ks=
    
    label CentOS-7 # 安装7的选项
      menu label Install CentOS Linux ^7 
      kernel vmlinuz
      append initrd=initrd.img ks=http://10.0.0.81/ks/centos7.cfg 
    
    
    label rescue # 8的救援模式
      menu label ^Rescue a CentOS 8 Linux system
      kernel vmlinuz
      append initrd=initrd.img inst.repo=http://10.0.0.81/centos/8/os/x86_64/ rescue
    
    label rescue
      menu label ^Rescue a CentOS 7 Linux system
      kernel vmlinuz
      append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/ rescue    
    
    
    label local # 从本地硬盘启动, 要设为默认启动项, 这样服务器开机就会从硬盘启动, 如果把安装系统作为默认项, 那么60s结束后, 会自动安装系统, 把现有系统清空
    
      menu label Boot from ^local drive
      menu default                                                                                                                                                                      
      localboot 0xffff
    
    
    menu end
    # 这样菜单就包括了安装对应版本系统, 进入对应版本的救援模式, 和本地启动三个功能.
    # 不过还缺少内核文件路径, 以及initrd文件路径
    

    3. 指定initrd文件和内核文件

    [01:40:45 root@CentOS-8-1 /var/lib/tftpboot]#mkdir centos{7,8}
    [01:41:17 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/8/os/x86_64/isolinux/vmlinuz centos8 # 内核文件
    [01:41:47 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/8/os/x86_64/isolinux/initrd.img centos8
    [01:41:55 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/7/os/x86_64/isolinux/vmlinuz centos7
    [01:42:08 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/7/os/x86_64/isolinux/initrd.img centos7
    
    [01:42:17 root@CentOS-8-1 /var/lib/tftpboot]#tree
    .
    ├── centos7
    │   ├── initrd.img
    │   └── vmlinuz
    ├── centos8
    │   ├── initrd.img
    │   └── vmlinuz
    ├── menu.c32
    ├── pxelinux.0
    └── pxelinux.cfg
        └── default
    
    3 directories, 7 files
    
    
    # 更新后的菜单文件
    
    default menu.c32
    timeout 600
    
    menu title Automatic Install Linux
    
    label CentOS-8
      menu label Install CentOS Linux ^8
      kernel vmlinuz
    default menu.c32
    timeout 600
    
    menu title Automatic Install Linux 
    
    label CentOS-8
      menu label Install CentOS Linux ^8
      kernel centos8/vmlinuz
      append initrd=centos8/initrd.img ks=
    
    label CentOS-7
      menu label Install CentOS Linux ^7 
      kernel centos7/vmlinuz
      append initrd=centos7/initrd.img ks=http://10.0.0.81/ks/centos7.cfg 
    
    
    label rescue
      menu label ^Rescue a CentOS 8 Linux system
      kernel centos8/vmlinuz
      append initrd=initrd.img inst.repo=http://10.0.0.81/centos/8/os/x86_64/ rescue
    
    label rescue
      menu label ^Rescue a CentOS 7 Linux system
      kernel centos7/vmlinuz
      append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/ rescue    
    
    #支持手动安装centos7
    
    label manual
      menu label ^Manual Install Centos
      kernel vmlinuz
      append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/
    
    label local
      menu label Boot from ^local drive
      menu default
      localboot 0xffff
    
    
    menu end 
    

    4. 准备CentOS8的应答文件

    • CentOS8不支持ks图形化工具, 只能手动创建ks文件, 一般可以使用一个已经装好系统的模板ks文件
    #直接利用CentOS8现成的应答文件, 稍作修改, 因为7和8版本的应答文件格式略有不同
    
    [01:42:48 root@CentOS-8-1 /var/lib/tftpboot]#cp ~/anaconda-ks.cfg /var/www/html/ks/centos8.cfg
    
    [01:49:08 root@CentOS-8-1 /var/lib/tftpboot]#vim /var/www/html/ks/centos8.cfg
    
    #version=RHEL8
    ignoredisk --only-use=sda
    # Partition clearing information
    zerombr
    text
    reboot
    clearpart --all --initlabel
    selinux --disabled
    firewall --disabled
    url --url=http://10.0.0.81/centos/8/os/x86_64 # 指定yum仓库路径
    bootloader --append="net.ifnames=0" --location=mbr --boot-drive=sda
    # Keyboard layouts
    keyboard --vckeymap=us --xlayouts='us'
    # System language
    lang en_US.UTF-8
    
    # Network information
    network  --bootproto=dhcp --device=eth0 --onboot=on --ipv6=auto --activate
    network  --hostname=CentOS-8
    # Root password
    rootpw --iscrypted $6$FG4jjQI/t3A.A.Fg$Uwq66umE4c8oKjiCP8stUql9wE45AioQL.KHJiKF29Y6Q2BA70M/mpDIv9untio9bPaY.flSP.uAQ/JOuOrZz.
    # Run the Setup Agent on first boot
    firstboot --enable
    # Do not configure the X Window System
    skipx
    # System services
    services --disabled="chronyd"
    # System timezone
    timezone Asia/Shanghai --isUtc --nontp
    # Disk partitioning information
    part / --fstype="xfs" --ondisk=sda --size=20480
    part swap --fstype="swap" --ondisk=sda --size=2048
    part /boot --fstype="ext4" --ondisk=sda --size=1024
    part /data --fstype="xfs" --ondisk=sda --size=27646
    
    %packages
    @^minimal-environment
    kexec-tools
    vim # 安装工具
    wget
    lrzsz
    
    %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
    
    %post
    useradd testpxe # 建个账号, 测试安装后账号自动创建
    %end 
    
    [01:55:26 root@CentOS-8-1 /var/lib/tftpboot]#ksvalidator /var/www/html/ks/centos8.cfg
    
    • 最终的菜单文件
    default menu.c32                                                                                                                                                                    
    timeout 600
    
    menu title Automatic Install Linux 
    
    label CentOS-8
      menu label Install CentOS Linux ^8
      kernel centos8/vmlinuz
      append initrd=centos8/initrd.img ks=http://10.0.0.81/ks/centos8.cfg
    
    label CentOS-7
      menu label Install CentOS Linux ^7
      kernel centos7/vmlinuz
      append initrd=centos7/initrd.img ks=http://10.0.0.81/ks/centos7.cfg
    
    
    label rescue 8
      menu label ^Rescue a CentOS 8 Linux system
      kernel centos8/vmlinuz
      append initrd=initrd.img inst.repo=http://10.0.0.81/centos/8/os/x86_64/ rescue
    
    label rescue 7                                                                                                                                                                      
      menu label ^Rescue a CentOS 7 Linux system
      kernel centos7/vmlinuz
      append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/ rescue
    
    
    label manual
      menu label ^Manual Install Centos
      kernel vmlinuz
      append initrd=initrd.img inst.repo=http://10.0.0.81/centos/7/os/x86_64/
    
    label local
      menu label Boot from ^local drive
      menu default
      localboot 0xffff
    
    
    menu end
    ~         
    
    • 修改8的应答文件权限, 因为8的ks文件是从已有的文件拷贝的, 而系统安装好后生成的ks文件权限是600, 需要修改为644, 让其他用户可读
    [02:00:09 root@CentOS-8-1 /var/lib/tftpboot]#chmod 644 /var/www/html/ks/centos8.cfg
    
    • 菜单文件需要使用wq!保存, 因为默认是rrr权限
    [02:03:55 root@CentOS-8-1 /var/lib/tftpboot]#tree
    .
    ├── centos7
    │   ├── initrd.img # intird文件
    │   └── vmlinuz # 内核文件
    ├── centos8
    │   ├── initrd.img
    │   └── vmlinuz
    ├── menu.c32 # 菜单风格
    ├── pxelinux.0 # 安装boot loader的文件
    └── pxelinux.cfg
        └── default # 安装选项菜单文件
    
    3 directories, 7 files
    

    5. 准备CentOS8特有文件

    图片.png
    [02:06:49 root@CentOS-8-1 /var/lib/tftpboot]#cp /var/www/html/centos/8/os/x86_64/isolinux/*.c32 ./
    [02:07:00 root@CentOS-8-1 /var/lib/tftpboot]#tree
    .
    ├── centos7
    │   ├── initrd.img
    │   └── vmlinuz
    ├── centos8
    │   ├── initrd.img
    │   └── vmlinuz
    ├── ldlinux.c32
    ├── libcom32.c32
    ├── libutil.c32
    ├── menu.c32
    ├── pxelinux.0
    ├── pxelinux.cfg
    │   └── default
    └── vesamenu.c32
    
    3 directories, 11 files
    
    
    [02:07:05 root@CentOS-8-1 /var/lib/tftpboot]#rm -rf vesamenu.c32 
    [02:08:20 root@CentOS-8-1 /var/lib/tftpboot]#tree 
    .
    ├── centos7
    │   ├── initrd.img
    │   └── vmlinuz
    ├── centos8
    │   ├── initrd.img
    │   └── vmlinuz
    ├── ldlinux.c32
    ├── libcom32.c32
    ├── libutil.c32
    ├── menu.c32
    ├── pxelinux.0
    └── pxelinux.cfg
        └── default
    
    3 directories, 10 files
    
    • 确保http, tftp, dhcp服务都启动
    [02:10:35 root@CentOS-8-1 /var/lib/tftpboot]#ss -ntlu
    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:*                  
    udp                 UNCONN               0                    0                                                *:69                                            *:*                  
    tcp                 LISTEN               0                    128                                        0.0.0.0:80                                      0.0.0.0:*                  
    tcp                 LISTEN               0                    128                                        0.0.0.0:22                                      0.0.0.0:*                  
    tcp                 LISTEN               0                    128                                           [::]:22                                         [::]:*   
    

    6. 验证8的系统安装

    1. 先准备个虚拟机装CentOS-8, 开机
    图片.png

    7. 验证7的系统安装

    8. 对于已经安装好的系统, 也可以通过PXE进入救援模式

    需要开启读条时, 按ESC, 然后选择NET网络启动, 然后进入菜单, 选择救援模式

    9. 如果想重装系统, 也可以通过PXE重装

    需要开启读条时, 按ESC, 然后选择NET网络启动, 然后进入菜单, 选择要安装的系统版本

    补充: PXE启动流程

    图片.png

    注意: 安装系统时不要多台一起装, 因为所有服务器都要从服务器下载文件, 占用大量带宽, 一般10几台一起装即可

    相关文章

      网友评论

          本文标题:4. 运维自动化之系统部署-PXE

          本文链接:https://www.haomeiwen.com/subject/gwilkktx.html