PXE + kickstart/preseed 无人值守安装多种Linux系统

本文主要讲解如何利用 PXE + kickstart/preseed 来实现 有人/无人 状态下的多种Linux发行版本的安装,比如:

  • CentOS-6
  • CentOS-7
  • Ubuntu 16.04
  • Ubuntu 18.04

通过以下几个服务组件的组合,实现自动化无人值守装机:

  1. PXE Client 从自己的PXE网卡启动,向本网络中的DHCP服务器索取IP;
  2. DHCP 服务器返回分配给客户机的IP及PXE文件1)的位置;
  3. PXE Client 向本网络中的TFTP服务器索取pxelinux.0;
  4. PXE Client 取得 pxelinux.0 文件后之执行该文件;
  5. 根据 pxelinux.0 的执行结果,通过TFTP服务器加载内核(vmlinuz)和文件系统(initrd.img);
  6. 进入安装阶段, 通过 kickstart 的配置内容进行OS安装;

# 修改pxe服务器为固定IP
vim /etc/sysconfig/network-scripts/ifcfg-eno16780032
systemctl restart network
ip a
# 停用firewalld,请空iptables,并保存规则.
systemctl stop firewalld
systemctl disable firewalld
yum install iptables iptables-services -y
iptables -F
service iptables save
# 禁用selinux
setenforce 0
sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
# 系统更新,安装必要软件,重启.
yum update -y
yum install net-tools vim wget tree -y
reboot

本章采用dnsmasq的方案,同时实现DHCP,TFTP的服务,也可以将2个服务独立部署,详见:dhcp_tftp独立部署

yum install dnsmasq -y
cp /etc/dnsmasq.conf{,.ori}
 
cat > /etc/dnsmasq.conf<<'EOF'
# not read hosts file
no-hosts
domain=mypxe.local
dhcp-range=172.17.3.100,172.17.3.200,12h
# gateway
dhcp-option=3,172.17.3.254
# dns
dhcp-option=6,10.1.1.254
# broadcast
dhcp-option=28,172.17.3.255
# pxe boot file
dhcp-boot=pxelinux.0
enable-tftp
# working directory
tftp-root=/tftp
EOF
 
mkdir /tftp
systemctl enable dnsmasq
systemctl restart dnsmasq
systemctl status dnsmasq
netstat -antlup | grep dnsmasq

Note: Nginx来提供HTTP服务,当然也可以vsftp来提供ftp服务,甚至NFS都是可以的,看个人选择了.

安装 Nginx:

yum install nginx -y
systemctl enable nginx

配置 Nginx 以提供HTTP服务:

# nginx.conf
cat >/etc/nginx/nginx.conf<<'EOF'
user nginx;
worker_processes auto;
pid /run/nginx.pid;
 
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
 
events {
    worker_connections 1024;
}
 
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
}
EOF
 
# file.conf
cat > /etc/nginx/conf.d/file.conf<<'EOF'
server {
    listen 80;
    server_name _;
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    autoindex_format html;
    root /var/www;
}
EOF

重启&检查nginx状态:

systemctl restart nginx
netstat -antlp|grep 80

Note: 因为会涉及到CentOS6,7 Ubuntu16.04等发行版的安装,所以现在开始将所需的文件准备好.

可以将ISO文件直接挂载至指定目录(最好设置开机挂载ISO), 就不用先临时挂载 然后 copy 文件到指定目录了.

Warning: ubuntu-16.04-server-amd64.iso initrd.gz有BUG,会导致PXE不能成功,下载最新的ISO!!!

Warning: 不要下载“ubuntu-18.04.1-live-server-amd64.iso” 的LIVE CD,不然会失败,需要去这里下载:http://cdimage.ubuntu.com/releases/18.04/release/

# 下载相关ISO
wget http://mirrors.163.com/centos/6/isos/x86_64/CentOS-6.10-x86_64-minimal.iso
wget http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso
wget http://mirrors.163.com/ubuntu-releases/16.04/ubuntu-16.04.5-server-amd64.iso
wget http://cdimage.ubuntu.com/releases/18.04/release/ubuntu-18.04.1-server-amd64.iso
 
# 创建相关目录
mkdir -p /var/www/centos{6,7}
mkdir -p /var/www/ubuntu16.04
mkdir -p /var/www/ubuntu18.04
# 写入fstab
/root/CentOS-6.10-x86_64-minimal.iso	/var/www/centos6	iso9660 defaults,loop,ro 0 0
/root/CentOS-7-x86_64-Minimal-1810.iso	/var/www/centos7	iso9660 defaults,loop,ro 0 0
/root/ubuntu-16.04.5-server-amd64.iso	/var/www/ubuntu16.04	iso9660 defaults,loop,ro 0 0
/root/ubuntu-18.04.1-server-amd64.iso	/var/www/ubuntu18.04	iso9660 defaults,loop,ro 0 0
# 挂载
mount -a
# 查看挂载结果
df -h | grep www

通过浏览器访问http://172.17.3.1, 看是否文件都能访问了。

6.1 准备相关文件

该步骤是准备PXE工作环境所需的所有文件,其各个文件简单罗列如下:

  • /var/lib/tftpboot/: tftp的工作主目录
  • syslinux
    1. pxelinux.0: PXE启动文件
    2. menu.c32: 启动菜单背景文件
  • ISO
    1. isolinux.cfg: 启动菜单配置文件
    2. vmlinuz/linux: 可引导压缩内核
    3. initrd.img: 开机过程中所需的核心模块
    4. vesamenu.c32: 同menu.c32都是启动菜单背景,比menu.c32好看了一点点 2)
    5. boot.msg: 提供些额外信息,让使用者了解菜单含义
    6. splash.png: 启动菜单的背景图
    7. bg.png: 自定义的背景图,大小640*480

Note: 如果要配置多个系统的PXE安装,一定在TFTP的工作目录通过不同子目录来区分不同系统的内核&核心模块。

拷贝相关文件:

yum install syslinux -y
# pxelinux.0 & menu.c32(可选,可只使用vesamenu.c32)
cp /usr/share/syslinux/{pxelinux.0,menu.c32} /tftp
cp /var/www/centos7/isolinux/{vesamenu.c32,boot.msg,splash.png} /tftp
# 各系统对应的可引导内核文件 & 核心模块
mkdir /tftp/centos{6,7} /tftp/ubuntu16.04 mkdir /tftp/ubuntu18.04
cp /var/www/centos6/images/pxeboot/{vmlinuz,initrd.img} /tftp/centos6
cp /var/www/centos7/images/pxeboot/{vmlinuz,initrd.img} /tftp/centos7
cp /var/www/ubuntu16.04/install/netboot/ubuntu-installer/amd64/{linux,initrd.gz} /tftp/ubuntu16.04/
cp /var/www/ubuntu18.04/install/netboot/ubuntu-installer/amd64/{linux,initrd.gz} /tftp/ubuntu18.04/
chmod 755 /tftp/ubuntu18.04/*

查看tftp目录结构:

tree -N /tftp

6.2 配置PXE启动菜单

更多PXE启动菜单的高级配置:

配置启动菜单:

mkdir /tftp/pxelinux.cfg
cp /var/www/centos7/isolinux/isolinux.cfg /tftp/pxelinux.cfg/default.ori
/tftp/pxelinux.cfg/default
TIMEOUT 600
UI vesamenu.c32
MENU TITLE ########## BBD PXE Boot Menu ##########
MENU BACKGROUND bg.png
MENU COLOR border 0 #566573
 
label 1
   menu label ^1) Boot from local drive
   localboot
   menu default
 
label 2
   menu label ^2) CentOS-7 Mini (Automatic)
   kernel centos7/vmlinuz
   append initrd=centos7/initrd.img ks=http://172.17.3.1/centos7-ks.cfg method=http://172.17.3.1/centos7 devfs=nomount
 
label 3
   menu label ^3) CentOS-7 Mini (Manual)
   kernel centos7/vmlinuz
   append initrd=centos7/initrd.img method=http://172.17.3.1/centos7 devfs=nomount
 
label 4
   menu label ^4) CentOS-6 Mini (Automatic)
   kernel centos6/vmlinuz
   append initrd=centos6/initrd.img ks=http://172.17.3.1/centos6-ks.cfg method=http://172.17.3.1/centos6 devfs=nomount
 
label 5
   menu label ^5) CentOS-6 Mini (Manual)
   kernel centos6/vmlinuz
   append initrd=centos6/initrd.img method=http://172.17.3.1/centos6 devfs=nomount
 
label 6
    menu label ^6) Ubuntu 16.04 (Automatic)
    kernel ubuntu16.04/linux
    append auto=true priority=critical vga=788 initrd=ubuntu16.04/initrd.gz preseed/url=http://172.17.3.1/ubuntu16.04.seed
 
label 7
    menu label ^7) Ubuntu 18.04 (Automatic)
    kernel ubuntu18.04/linux
    append auto=true priority=critical vga=788 initrd=ubuntu18.04/initrd.gz preseed/url=http://172.17.3.1/ubuntu18.04.seed

7.1 kickstart

/var/www/conf/centos7-ks.cfg

  • 优化
    1. 自动判断系统盘(vda/sda/hda)
    2. 禁用了selinux
    3. dhcp获取ip
    4. 设置root密码
    5. 禁用chronyd
    6. 禁用firewalld
    7. 设置为Asia/Shanghai时区
  • 分区
    • 删除sda的全部分区!!!
    • /boot: 512MB,xfs格式分区;
    • /: sda的全部余量,xfs格式分区;
    • swap: 没有swap分区,系统安装完成后用脚本实现swapfile;
  • 需自行修改
    1. rootpw: root密码 (openssl passwd -1 “your_password”)
    2. url: HTTP服务的URL,指向ISO内容

/var/www/centos6-ks.cfg centos6-ks_2.cfg 3)

  • 优化
    1. 自动判断系统盘(vda/sda/hda)
    2. 禁用了selinux
    3. dhcp获取ip
    4. 设置root密码
    5. 禁用chronyd
    6. 禁用firewalld
    7. 设置为Asia/Shanghai时区
  • 分区
    • 删除sda的全部分区!!!
    • /boot: 512MB,ext4格式分区;
    • /: sda的全部余量,ext4格式分区;
    • swap: 没有swap分区,系统安装完成后用脚本实现swapfile;
  • 需自行修改
    1. rootpw: root密码 (openssl passwd -1 “your_password”)
    2. url: HTTP服务的URL,指向ISO内容

7.2 preseed

/var/www/ubuntu16.04.seed

  • 自动应答安装程序的常规问题,如键盘格局,语言等
  • 设置时区为 Aisa/Shanghai
  • 创建用户ubuntu,密码ubuntu
  • 只安装了openssh-server
  • 手动创建分区

/var/www/ubuntu18.04.seed

  • 自动应答安装程序的常规问题,如键盘格局,语言等
  • 设置时区为 Aisa/Shanghai
  • 创建用户ubuntu,密码ubuntu
  • 只安装了openssh-server
  • 手动创建分区

  • linux/os_provision/pxe无人值守装机.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)