领域知识

网络启动

工具链

  • pxe-server.sh

    PXE服务器上运行的一个脚本工具,用来自动化配置需要的软件和服务。代码仓库地址

    • DHCP:dnsmasq

    • TFTP:dnsmasq

    • HTTP:nginx

  • Linux PC

    通过PXE服务器自动化安装的Linux服务器。自动配置所有必须的软件和服务。包含:

    • 操作系统:ubuntu server 22.04.1

    • 网络:静态IP地址

    • SSH:OpenSSH

前提条件

  • Wi-Fi路由器

    • 能访问internet

    • 内置DHCP服务

    • LAN的两个空闲网口

  • PXE服务器

    • 有线连接到Wi-Fi的LAN
  • Linux PC

    • BIOS或UEFI支持并配置成网络启动

    • 有线连接到Wi-Fi的LAN

    • 内存 >= 5GB

      加载ubuntu server 22.04.1的iso需要1.5G内存,cloud-init需要3G内存

    • 硬盘 >= 20GB

配置代码

以下均已通过工具自动化配置完毕。这里是对配置内容进行说明,以便需要修改时参考。

pxe-server.sh

  • 运行模式

    • probe

      探测设备Id,这样可以给不同的设备安装不同的软件,配置不同的参数。

    • add

      添加设备参数:<device_id> <options>

      • 参数device_id

        探测阶段获取的设备Id,例如:

        • PC:01-00-0c-29-4f-62-c7 (MAC地址)

        • 树莓派:7092246e (设备序列号)

      • 参数options有以下几个选项

        • --node-address CIDR格式,例如192.168.0.6/24

        • --node-gateway 例如192.168.0.1

        • --node-dns 例如192.168.0.1

  • 配置

    • ProxyDHCP:dnsmasq => /etc/dnsmasq.conf
    	# 禁用DHCP
    	port=0
    	# 开启日志
    	log-dhcp
    	# 开启ProxyDHCP
    	dhcp-range=192.168.0.255,proxy
    
    • TFTP

      • dnsmasq => /etc/dnsmasq.conf

        	# 设置tftp根目录
        	tftp-root="/var/homelab/tftproot"
        	# 设置不同硬件启动(BIOS/UEFI)和不同CPU架构(X86-32/64和IA32/64)的bootloader文件。注意:因为树莓派的特殊性,以下的顺序能同时兼容PC和树莓派
        	pxe-service=X86PC,"Boot x86 BIOS",lpxelinux.0
        	pxe-service=X86PC,"Raspberry Pi Boot"
        	pxe-service=X86-64_EFI,"PXELINUX (EFI 64)",efi64/syslinux.efi
        	pxe-service=IA64_EFI,"PXELINUX (EFI 64)",efi64/syslinux.efi
        	pxe-service=IA32_EFI,"PXELINUX (EFI 32)",efi32/syslinux.efi
        	pxe-prompt="PXE",0
        
      • pxe配置 => /var/homelab/tftproot/pxelinux.cfg/01-00-0c-29-4f-62-c7

        指定内核和启动参数的HTTP地址和路径(运行pxe-server的PXE服务器IP地址是192.168.1.3)

        	DEFAULT install
        	LABEL install
        	  KERNEL http://192.168.1.3:12345/01-00-0c-29-4f-62-c7/casper/vmlinuz
        	  INITRD http://192.168.1.3:12345/01-00-0c-29-4f-62-c7/casper/initrd
        	  APPEND root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://192.168.1.3:12345/01-00-0c-29-4f-62-c7/ubuntu-22.04.1-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://192.168.1.3:12345/01-00-0c-29-4f-62-c7/cloud-init/
        
    • HTTP:nginx

      PXE服务器的操作系统内核和系统安装配置

      	server {
      		listen 12345 default_server;
      		listen [::]:12345 default_server;
      		root /var/homelab/httproot;
      		server_name _;
      	}
      

Linux PC

以下工具均是在cloud-init的user-data文件中指定安装和配置

  • 网络:静态IP地址

      network:
        version: 2
        ethernets:
          eth0:
            match:
              name: e*
            addresses:
              - 192.168.1.4
            gateway4: 192.168.1.1
            nameservers:
              addresses:
                - 192.168.1.1
    
  • SSH:OpenSSH

    安装ssh服务并禁止密码登录,然后配置了公钥。

    	#cloud-config
    	autoinstall:
    	  ssh:
    	    install-server: true
    	    allow-pw: false
    	    authorized-keys:
    	      - -----BEGIN OPENSSH PRIVATE KEY-----
    	      xxxxxxxxx
    	-----END OPENSSH PRIVATE KEY-----
    

自动化

  • PXE服务器

    • 探测设备Id

      执行 ./pxe-server.sh probe

    • 添加设备

      执行 ./pxe-server.sh add --node-address 192.168.1.4/24 --node-gateway 192.168.1.1 --node-dns 192.168.1.1

  • Linux PC

    • 探测设备Id

      BIOS或UEFI设置为网络启动后重启机器,等待pxe-server.sh探测PC的device_id

    • 添加设备

      执行./pxe-server.sh add xxx后,重启PC等待网络启动和自动化安装完成

pxe-server.sh工作原理简介

大致流程如下:

  • 检查依赖

    如果依赖的命令工具不存在,将提示错误后退出

  • 准备发布目录

    当前目录下创建dist/download目录作为下载目录

    	dist
    	|--download		# 下载文件的保存目录,下载支持断点续传,可以多次反复运行,不清理
    	     |--tmp		# 解压/编译等中间过程的临时目录
    

    创建/var/homelab目录作为服务根目录

    	/var/homelab
    	|--tftproot		# tftp服务根目录,包含bootloader和配置
    	|--httproot		# http服务根目录,包含操作系统iso和cloud-init配置
    	|--iscsiroot		# iscsi服务根目录,包含无盘设备的磁盘镜像文件,例如树莓派
    
  • 检查服务状态

    PXE相关服务(proxyDHCP+tftp:dnsmasq和http:nginx)是否安装并启动,如果未启动则尝试启动

  • 配置服务

    • proxyDHCP和tftp

      dnsmasq设置为proxyDHCP模式,开启tftp服务,指定tftp根目录并配置bootloader文件路径。

    • http

      删除nginx默认的server配置,新增server(设置根目录和端口:12345)

  • 安装bootloader

    下载,解压,安装syslinux到tftp根目录

  • 探测设备

    读取并分析tftp日志,根据pxelinux文档,提取mac地址作为唯一的device_id

  • 添加设备

    下载,解压,安装ubuntu server live iso到http目录,配置cloud-init(包含主机名/用户密码/网络/SSH/防火墙)

    • 主机名

      为了避免冲突,把device_id作为主机名

    • 用户密码

      默认用户名:ubuntu,密码:ubuntu,执行sudo不需要密码,虽然只允许SSH密钥方式登录,还是建议安装完成后更改密码

    • 网络

      需要输入PC节点的静态IP地址。网关,DNS默认从本机获取配置。

      也可以在执行时设置参数--node-address(CIDR格式,例如192.168.0.6/24),--node-gateway(例如192.168.0.1),--node-dns(例如192.168.0.1)

      注:为了方便IaaS的管理,需要节点有固定不变的静态IP地址

    • SSH

      PC节点的SSH配置为不允许密码登陆,公钥文件默认是/home/ubuntu/.ssh/authorized_keys的第一个key,如果文件不存在会提示输入正确的文件路径。

      注:因为只允许密钥方式登陆,PXE服务器的公钥是在bootstrap过程时配置的,所以需要使用bootstrap的私钥才能SSH登陆到PC节点

    • 防火墙

      K3S只支持旧版iptables,从默认安装的nftables切换到iptables