领域知识

网络启动

工具链

  • netboot-bootstrap.sh

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

    • bootloader:pxelinux

    • ProxyDHCP:dnsmasq

    • TFTP:dnsmasq

    • HTTP:python

  • PXE服务器

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

    • 操作系统:ubuntu server 22.04.1

    • 网络:静态IP地址

      注:PXE服务器需要静态IP地址,否则IP变化后,客户端将无法网络启动

    • DHCP:dnsmasq

    • TFTP:dnsmasq

    • iSCSI:targetcli-fb

    • HTTP:nginx

    • SSH:OpenSSH

前提条件

  • Wi-Fi路由器

    • 能访问internet

    • 内置DHCP服务

    • LAN的两个空闲网口

  • 个人电脑

    • macOS或Linux操作系统

    • 有线(或无线)连接到Wi-Fi的LAN

  • PXE服务器

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

    • 有线连接到Wi-Fi的LAN

    • 内存 >= 5GB

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

    • 硬盘 >= 20GB

配置代码

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

netboot-bootstrap.sh

  • 参数

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

    • --server-gateway 例如192.168.0.1

    • --server-dns 例如192.168.0.1

  • 配置

    以下内容均在dist目录

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

      • dnsmasq => services/dnsmasq.conf

        	# 设置tftp根目录
        	tftp-root="/Users/XXX/homelab/netboot/dist/tftproot"
        	# 设置不同硬件启动(BIOS/UEFI)和不同CPU架构(X86-32/64和IA32/64)的bootloader文件
        	pxe-service=X86PC,"Boot x86 BIOS",lpxelinux.0
        	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配置 => tftproot/pxelinux.cfg/default

        指定内核和启动参数的HTTP地址和路径(运行netboot-bootstrap.sh的个人电脑IP地址是192.168.1.2)

        	DEFAULT install
        	LABEL install
        	  KERNEL http://192.168.1.2:8182/casper/vmlinuz
        	  INITRD http://192.168.1.2:8182/casper/initrd
        	  APPEND root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://192.168.1.2:8182/ubuntu-22.04.1-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://192.168.1.2:8182/cloud-init/			```
        
    • HTTP:python => httproot

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

      • 系统镜像 => ubuntu-22.04.1-live-server-amd64.iso

      • 内核 => httproot/casper/{vmlinuxz, initrd}

      • cloud-init => httproot/cloud-init{meta-data, user-data}

PXE服务器

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

  • 网络:静态IP地址

      network:
        version: 2
        ethernets:
          eth0:
            match:
              name: e*
            addresses:
              - 192.168.1.3
            gateway4: 192.168.1.1
            nameservers:
              addresses:
                - 192.168.1.1
    
  • DHCP:dnsmasq

    • 安装
    	#cloud-config
    	autoinstall:
    	  packages:
    	    [dnsmasq]
    
    • 配置:暂无
  • TFTP:dnsmasq

    • 安装
    	#cloud-config
    	autoinstall:
    	  packages:
    	    [dnsmasq]
    
    • 配置:暂无
  • iSCSI:targetcli-fb

    • 安装
    	#cloud-config
    	autoinstall:
    	  packages:
    	    [targetcli-fb]
    
    • 配置:暂无
  • HTTP:nginx

    • 安装
    	#cloud-config
    	autoinstall:
    	  packages:
    	    [nginx]
    
    • 配置:暂无
  • SSH:OpenSSH

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

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

自动化

  • 个人电脑

    执行 ./netboot-bootstrap.sh --server-address 192.168.1.3/24 --server-gateway 192.168.1.1 --server-dns 192.168.1.1

  • PXE服务器

    启动并等待自动化安装完成

netboot-bootstrap.sh工作原理简介

大致流程如下:

  • 检查依赖

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

  • 准备发布目录

    当前目录下创建dist目录作为发布目录

    	dist
    	|--services		# dhcp/tftp/http服务的软件和配置的目录,每次执行时清理
    	|--tftproot		# tftp文件的根目录,每次执行时清理
    	|--httproot		# http文件的根目录,每次执行时清理
    	|--download		# 下载文件的保存目录,下载支持断点续传,可以多次反复运行,不清理
    	     |--tmp		# 解压/编译等中间过程的临时目录,保留部分软件的中间过程文件
    
  • 安装bootloader

    下载,解压,安装和配置syslinux

  • 安装dhcp和tftp服务

    下载,解压,编译,安装和配置dnsmasq

  • 安装http服务

    下载,解压,安装ubuntu server live iso,并配置cloud-init

    • 网络

      需要输入PXE服务器的静态IP地址(必须指定或运行时提示输出)。网关,DNS默认从本机获取配置。

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

    • SSH

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

      PXE服务器的SSH配置为不允许密码登陆,公钥文件默认:$HOME/.ssh/id_ed25519,如果文件不存在会提示输入文件路径。

      注:因为只允许密钥方式登陆,如果需要使用其他PC管理PXE服务器,需要同步对应的私钥文件,否则无法SSH登陆PXE服务器。

    • 解压

      Linux解压iso需要root权限,执行前会提示输入密码

  • 运行dhcp和tftp服务

    运行dnsmasq需要root权限,执行前会提示输入密码

  • 运行http服务

    服务端口:8182