网络引导详解

PXE

什么是PXE

Pre-boot Execution Environment 预启动执行环境

是一种通过网络接口启动计算机的机制,这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统,由Intel发明。

原理

客户机的固件(如网卡的PXE固件)先通过DHCP协议发送DHCP Discover消息,找到可用的PXE启动服务器的IP,找不到就一直等待到找到为止。
在找到可用的PXE启动服务器后,固件会向合适的启动服务器询问网络引导程序(NBP,Network Boot Program)的路径,并且通过TFTP协议将网络引导程序下载到电脑的内存中,最后执行它。
后续流程转交给网络引导程序,它通过 tftp 协议下载配置,了解它在哪里下载内核(kernel)、ramdisk和内核命令行以使用。
接下来的流程分为有盘和无盘系统启动,当客户端机器没有盘时,可以从网络磁盘启动(比如NFS);客户端有盘时,ramdisk查看内核命令行以了解如何配置网络以及从何处下载操作系统镜像文件并执行自动化脚本安装操作系统,或者直接从已安装的磁盘启动(PXE会自动识别是直接安装还是直接启动)
因此PXE的实现依赖网卡的支持,只有支持 PXE 客户端的网卡才能实现网络自动安装(现在基本都支持,只需要在BIOS中打开网络引导功能)。这种网卡实现了 DHCP 客户端和 TFTP 客户端,在 BIOS 的引导下通过 DHCP 协议自动分配 IP 地址,通过 TFTP 获取最小内核,然后在最小内核环境下通过 HTTP 协议或 NFS 协议获取系统安装版本。
服务端的DHCP服务器必须支持PXE的相关选项(最好还支持网络唤醒), 这些选项PXE客户端会通过DHCP Discover消息的Request Paramenter List来声明所有需要的选项,如果DHCP Server没有启用PXE启动支持,那么PXE客户端不会理会DHCP回应,继续发送请求。
一般网卡里的PXE固件,只支持通过DHCP和TFTP配合来启动;但是一些开源的项目,已经拓展了PXE的启动方式,支持通过HTTP, iSCSI, NFS来引导启动远程操作系统,比较有名的有iPXE(gPXE的继承者),它们可以烧录在网卡上替代网卡出厂设置,也可以下载ipxe.efi文件写入EFI系统分区作为启动程序。
iPXE下载
PXE bootloader(网络引导程序)也有一些知名的,比如syslinux, pxelinux, iPXE也可以作为bootloader来使用。

注:上图为EFI引导流程,若采用Legacy BIOS,那么 PXE 客户端请求的不是bootx64.efi而是pxelinux.0
UEFI和传统模式之间的区别在于:在 UEFI 模式下,引导加载程序是 EFI 可执行文件,经过签名以便安全引导 SecureBoot 接受,而在传统模式下,它是 PXELINUX 。大多数 DHCP/bootp 服务器可以配置为为特定机器提供正确的引导加载程序。
HTTP也可以改为使用NFS
一个内网存在两个DHCP服务器可能会存在冲突,在使用PXE时尽量不要同时存在两个DHCP服务器。
不要使用无线网卡进行PXE

用途

想象以下几个场景:

  1. 有100台电脑需要进行统一化的系统安装
  2. 公司对信息安全要求比较高,需要使用无盘系统,工作站上不存在本地存储,全部使用中央服务器进行存储
  3. 你想要在别的电脑上启动你手上特定的系统

搭建

Windows

Windows下的PXE服务端有TinyPXE,傲梅PXE和Serva。以TinyPXE为例。

TinyPXE

一些资源链接:
汉化版TinyPXE下载
iPXE UEFI内核, 放在files
iPXE wimboot内核, 放在files

  1. ProxyDHCP:是DHCP代理服务
    勾选:在局域网已有DHCP服务的情况下,建议勾选,不会与现有DHCP服务冲突,但它能传递Next-Server等选项,传统DHCP服务不一定能传递参数和选项;
    不勾选:如果局域网没有DHCP服务,可使用此软件的DHCP服务,就不勾选,客户端会得到该软件分配的IP。
  2. HTTPd:开启本机的httpd服务,即web服务,可通过httpd服务来启动系统,浏览器可访问。
  3. SMB:文件共享协议,勾选并启动后主机会把当前目录下的files目录共享出去,共享名为PXE,可通过命令:net share查看主机共享出去的目录。
  4. Option:有多个Option项,在不启动ProxyDHCP时,它会让主机充当DHCP服务器,分配IP地址及这些选项都能生效,启动ProxyDHCP时,这里设定的IP地址/子网/DNS等选项被忽略,由主DHCP来分配,其它选项(比如Next-Server)可以被分配。
  5. Boot File:启动文件,可选择files目录下的各种启动文件,默认ipxe.pxe适合BIOS/UEFI等多种启动,在有些情况下也有选择pxelinux.0等的,一般保持默认。
  6. Filename if user-class=gPXE or iPXE:选择iPXE或gPXE启动菜单文件,默认menu.ipxe,在files目录下,可以根据这个模板生成自己的菜单文件。
  7. More:更多选项(略)
  8. TFTP服务:tftp服务是pxe启动的根本,运行TinyPXE时,tftp服务自动启动,没有tftp服务,就没有pxe在启动之初下载文件的能力,Httpd或Smb服务虽然能下载文件,但客户端pxe没有启动前是不能使用的;Tftp服务适合传输小文件,大文件传输太慢,旧的pxe仅基于tftp来传输,不适合安装大系统;检测服务启动是否成功,在命令行下运行netstat -an | grep "69"
  9. Tftpboot目录:即Tftp服务启动的根目录,它存放pxe启动文件和菜单文件,在软件里这个目录是files目录,我们可以在files下创建各系统的子目录,但目录结构要与menu.ipxe启动菜单内核和安装包文件对应一致。
  10. 日志:在软件面板中上部,有一块区域显示日志,客户端启动时获取IP,下载文件,执行启动等都会有日志显示在上面,这里可以在出错时给我们分析排除错误很大的帮助。
    iPXE启动菜单配置文件
    TinyPXE使用iPXE启动程序,系统提供了多个扩展名为.ipxe的菜单文件,但它并非只能叫这个扩展名,.txt或者别的扩展名也可以,只要它是纯文件文件,且符合ipxe的语法规则就可以。
    以menu.ipxe为例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #!ipxe

    #set boot-url http://${proxydhcp}/next-server
    set boot-url http://${next-server}
    set iscsi-server ${next-server}
    set iqn iqn.2008-08.com.starwindsoftware:target1
    set iscsi-target iscsi:${iscsi-server}::::${iqn}
    set nfs-server ${next-server}
    set cifs-server //${next-server}

    # Setup some basic convenience variables
    set menu-timeout 5000
    set submenu-timeout ${menu-timeout}

    # Ensure we have menu-default set to something
    isset ${menu-default} || set menu-default exit

    ######## MAIN MENU ###################
    :start
    menu Welcome to iPXE's Boot Menu
    item
    item --gap -- ------------------------- Utilities ------------------------------
    #item bootsan Boot On San (${iscsi-target})
    item bootaoe Boot On AOE (e0.0)
    #item iscsi setup, sanhook or sanboot iscsi
    item iscsi Boot On San
    item pxelinux pxelinux
    item grub4dos grub4dos
    item grub2 grub2
    #item grub_cd boot to dvd (via grub4dos)
    #item grub_startrom boot to startrom.0 (via grub4dos)
    item grub_floppy boot floppy (via grub4dos)
    item grub_hd0 boot to hd0 (via grub4dos)
    item hdt hdt
    #item netbootme Netboot.Me
    #item undi_dos undi_dos
    item disk_util Disk Utilities
    item winpe Live Systemes
    item linux Install Linux Distros
    item --gap -- ------------------------------ Advanced ---------------------------------
    item config Configure settings
    item shell Enter iPXE shell
    item reboot Reboot
    item exit Exit (boot local disk)
    choose --default exit --timeout 30000 target && goto ${target}

    ########## UTILITY ITEMS ####################
    :shell
    echo Type exit to get the back to the menu
    shell
    set menu-timeout 0
    goto start

    :failed
    echo Booting failed, dropping to shell
    goto shell

    :reboot
    reboot

    :exit
    exit

    :cancel
    echo You cancelled the menu, dropping you to a shell

    :config
    config
    goto start

    :back
    set submenu-timeout 0
    clear submenu-default
    goto start
    ......后面省略
    分为三个部分:预处理部分,主菜单部分,引导程序部分

首行
#!ipxe声明解释器

变量设置
set 变量名 值

变量调用
和shell一样,${变量}

代码段

1
2
:start
...

类似汇编的流程控制逻辑,到下一个冒号前,这段代码都是一个整体,会按照顺序执行,除非遇到goto跳转到其它的代码段。

设置菜单项
menu Welcome 设置顶部显示的说明
item 代码段名 描述 设置可选项目
item --gap 内容 不可选择的分隔行
item --key 按键 代码段 设置带快捷键的项目
choose [--dafault 代码段] [--timeout 时间毫秒] target && goto ${target}

程序代码
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
:win7    # Win7引导
kernel ${next-server}/wimboot || goto failed
initrd ${next-server}/windows7/boot/bcd bcd || goto failed
initrd ${next-server}/windows7/boot/boot.sdi boot.sdi || goto failed
#windows的boot.wim最好是用微软工具生成的winpe启动文件,win10的也一样,在此不赘述
initrd ${next-server}/windows7/sources/boot.wim boot.wim || goto failed
boot || goto failed
goto start

:win10 # Win10引导
kernel ${next-server}/wimboot || goto failed
initrd ${next-server}/windows10/boot/bcd bcd || goto failed
initrd ${next-server}/windows10/boot/boot.sdi boot.sdi || goto failed
initrd ${next-server}/windows10/sources/boot.wim boot.wim || goto failed
boot || goto failed
goto start

:winpe # WinPE引导
sanboot --no-describe ${boot-url}/images/winpe.iso || goto failed
goto start

:clonezilla # 再生龙引导
initrd ${boot-url}/_ISO/clonezilla/live/initrd.img || goto failed
kernel ${boot-url}/_ISO/clonezilla/live/vmlinuz boot=live config noswap nolocales edd=on nomodeset vga=788 nosplash noprompt fetch=${boot-url}/_ISO/clonezilla/live/filesystem.squashfs || goto failed
boot || goto failed
goto start

:debian # debian引导
cpuid --ext 29 && set arch amd64 || set arch i386
# sanboot http://ftp.fr.debian.org/debian/dists/Debian9.1/main/installer-amd64/current/images/netboot/mini.iso
sanboot ${boot-url}/images/debian-10.7.0-amd64-netinst.iso || goto failed
boot || goto failed
goto start

关键有以下几参数:
cpuid --ext 29 && set arch x86_64 || set arch i386 64位检测
|| goto failed 失败跳转,可省略,但有它出错了它可以返回主菜单
kernel 调用内核
initrd 调用img
sanboot 调用iso文件
kernel 载入内核
initrd 载入init ramdisk
chain=boot 引导,必须先载入必须的内核和ramdisk或ISO镜像
调用的文件,也是httpd服务或者smb服务上的文件,大文件不适合tftp服务来调用,速度非常慢,而httpd和smb传输文件非常快,所以代码段执行的文件调用建议都采用httpd路径来调取。
最终文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!ipxe

set boot-url http://${next-server}

# Setup some basic convenience variables
set menu-timeout 5000

# Ensure we have menu-default set to something
isset ${menu-default} || set menu-default exit

######## MAIN MENU ###################
:start
menu Welcome to iPXE's Boot Menu
item
item --gap -- ------------------------- Utilities ------------------------------
item win7 Install Windows 7
item win10 Install Windows 10
item winpe Winpe
item clonezilla Boot clonezilla
item debian Install Debian 10
item --gap -- ------------------------------ Advanced ---------------------------
item --key r reboot [R] Reboot the Computer
item --key x exit [X] Exit (boot local disk)
choose --default exit --timeout 60000 target && goto ${target}

########## UTILITY ITEMS ####################
:failed
echo Booting failed, dropping to shell
goto start

:reboot
reboot

:exit
exit

:win7
kernel ${next-server}/wimboot || goto failed
initrd ${next-server}/windows7/boot/bcd bcd || goto failed
initrd ${next-server}/windows7/boot/boot.sdi boot.sdi || goto failed
#windows的boot.wim最好是用微软工具生成的winpe启动文件,win10的也一样,在此不赘述
initrd ${next-server}/windows7/sources/boot.wim boot.wim || goto failed
boot || goto failed
goto start

:win10
kernel ${next-server}/wimboot || goto failed
initrd ${next-server}/windows10/boot/bcd bcd || goto failed
initrd ${next-server}/windows10/boot/boot.sdi boot.sdi || goto failed
initrd ${next-server}/windows10/sources/boot.wim boot.wim || goto failed
boot || goto failed
goto start

:winpe
sanboot --no-describe ${boot-url}/images/winpe.iso || goto failed
goto start

:clonezilla
initrd ${boot-url}/_ISO/clonezilla/live/initrd.img || goto failed
kernel ${boot-url}/_ISO/clonezilla/live/vmlinuz boot=live config noswap nolocales edd=on nomodeset vga=788 nosplash noprompt fetch=${boot-url}/_ISO/clonezilla/live/filesystem.squashfs || goto failed
boot || goto failed
goto start

:debian
cpuid --ext 29 && set arch amd64 || set arch i386
#sanboot http://ftp.fr.debian.org/debian/dists/Debian9.1/main/installer-amd64/current/images/netboot/mini.iso
sanboot ${boot-url}/images/debian-10.7.0-amd64-netinst.iso || goto failed
boot || goto failed
goto start

创建存储文件
在files目录下创建指定文件夹和子文件夹windows7\boot,windows7\sources,windows10\boot,windows10\sources,_ISO\clonezilla
将Windows镜像中的bcd,boot.sdi和boot.wim移入对应子目录中的boot文件夹

1
2
3
4
5
6
7
copy x:\boot\bcd  pxesrv\files\windows7\boot\
copy x:\boot\boot.sdi pxesrv\files\windows7\boot\
copy x:\sources\boot.wim pxesrv\files\windows7\sources\

copy x:\boot\bcd pxesrv\files\windows10\boot\
copy x:\boot\boot.sdi pxesrv\files\windows10\boot\
copy x:\sources\boot.wim pxesrv\files\windows10\sources\

将PE镜像文件和Linux镜像文件放入images文件夹

1
2
copy winpe.iso pxesrv\files\images
copy debian-10.7.0-amd64-netinst.iso pxesrv\files\images

启动服务端

设置BIOS,启用Netboot后启动客户端

Linux 传统PXE+Cloud-init

安装软件包

需要安装DHCP, TFTP和DNS服务器以实现PXE,dnsmasq包恰好同时实现了三种服务。
需要安装HTTP服务器以传输镜像和实现Cloud-init,nginxapache2都可以,也可以使用python3 -m http.server [port] [--bind IP] --directory|-d /var/www/html/的简易服务器(此服务器默认使用当前目录,所以需要手动指定资源目录)。
需要安装两阶段的EFI Bootloader固件,第一阶段固件包名一般为shim-signedshim-x64,第二阶段固件包名一般为grub-efi-amd64-signedgrub2-efi-x64
需要一个用于网络安装的镜像。

创建TFTP文件夹

在符合规范的目录下创建tftp服务的根目录,目录下结构应当如下:

1
2
3
4
5
6
7
8
9
10
tftp
├── boot
│ └── 镜像名
│ ├── initrd
│ └── vmlinuz
├── grub
│ ├── bootx64.efi
│ ├── font.pf2
│ └── grub.cfg
└── grubx64.efi
  1. bootx64.efi来自shim-signed软件包
  2. grubx64.efi 引导程序来自grub-efi-amd64-signed软件包
  3. grub.cfg 自行拷贝或创建
  4. 其他文件如启动镜像initrd和内核vmlinuz来自镜像

创建引导文件

创建目录后,执行
cp /usr/lib/shim/shimx64.efi.signed /.../tftp/grub/bootx64.efi 创建bootx64.efi
cp /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /.../tftp/grubx64.efi 创建grubx64.efi

创建内核文件

先挂载镜像mount -o ro xxx.iso /media
若提示mount: /media: WARNING: device write-protected, mounted read-only.,不影响使用。
执行cp /media[/casper]/initrd /.../tftp/boot/镜像名/ 创建引导镜像
执行cp /media[/casper]/vmlinuz /.../tftp/boot/镜像名/ 创建内核
执行cp /media/grub/font.pf2 /.../tftp/grub/ 创建GRUB字体文件
执行cp /media/grub/grub.cfg /.../tftp/grub/ 创建GRUB配置文件

配置DNSMASQ

关键配置有以下几个:

  1. 配置 DHCP 地址段
  2. 配置引导文件目录
  3. 配置 tftp 根目录
  4. 配置日志路径
  5. 配置监听网卡,多网卡机器尤其需要关注

修改/etc/dnsmasq.cconf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 配置上游 DNS 服务器地址
server=114.114.114.144

# 指定服务的网卡
interface=enp2s0,lo

# 绑定端口
bind-interfaces

# 设置 DHCP 分发 IP 端范围、地址掩码、IP 地址有效时间
dhcp-range=192.168.1.100,192.168.1.150,255.255.255.0,12h
# 或者使用CIDR
dhcp-range=192.168.1.100/24,192.168.1.150/24,12h

# 根据架构设置引导程序,路径为相对于 tftp 根目录的路径
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9
dhcp-boot=tag:efi-x86_64,grub/bootx64.efi
# 也可以使用pxe-service
pxe-service=X86-64_EFI,"PXELINUX (EFI)",grub/bootx64.efi

# 启用 tftp 服务
enable-tftp

# 设置 tftp 根路径
tftp-root=/srv/tftp

# 设置日志路径
log-facility=/var/log/dnsmasq.log

修改配置后,重启 dnsmasq 服务才能生效。

创建HTTP资源目录

启动HTTP服务systemctl start nginx|apache2
默认HTTP服务的资源根目录是 /var/www/html,目录下结构应当如下:

1
2
3
4
5
6
7
html/
├── autoinstall
│ ├── meta-data
│ └── user-data
├── index.html(没用)
└── iso
└── 镜像名.iso
  1. autoinstall 目录存放参数自动配置文件,user-datameta-data 是cloud-init 要求的文件名
  2. iso 目录存放操作系统镜像文件

修改grub.cfg

写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
set timeout=5

if loadfont /grub/font.pf2 ; then
set gfxmode=auto
insmod efi_gop
insmod efi_uga
insmod gfxterm
terminal_output gfxterm
fi

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry "autoinstall" {
set gfxpayload=keep
linux /boot/xxx/vmlinuz root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url='http://192.168.1.X/iso/xxx.iso' autoinstall ds=nocloud-net\;s=http://192.168.1.X/autoinstall/ ---
initrd /boot/xxx/initrd
}
  1. 指定镜像文件相对于 tftp 根目录的路径 /boot/xxx/initrd
  2. root=/dev/ram0 ramdisk_size=1500000 是为了创建内核镜像的挂载空间,可删除
  3. ip=dhcp 指定内核镜像挂载后使用 DHCP 获取 IP 地址
  4. url= 指定 ISO 文件的网络存放路径
  5. autoinstall ds=nocloud-net\;s=http://192.168.1.9/autoinstall/ --- Grub中”;”有特殊含义,因此需要转义。注意末尾有空格和三个”-“,该配置指明配置文件所在路径,并指明参数自动填写

autoinstall配置

配置 user-data
遵循yaml格式,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#cloud-config
autoinstall:
version: 1
# 修改apt服务地址
apt:
primary:
- arches: [default]
uri: https://mirrors.ustc.edu.cn/ubuntu
user-data:
# 配置时区
timezone: Asia/Shanghai
# 禁用root账号
disable_root: true
# 配置用户
identity:
hostname: ubuntu-server
password: "123456"
username: ubuntu
# 配置键盘
keyboard: {layout: us, variant: ''}
locale: en_US.UTF-8
# 默认安装ssh server
ssh:
install-server: true
# 指定安装的包
packages:
- net-tools
- python3-pip
# 配置磁盘分区
storage:
grub:
reorder_uefi: False
config:
- {ptable: gpt, path: /dev/sda, wipe: superblock-recursive, preserve: false, name: '', grub_device: false, type: disk, id: disk-sda}
- {device: disk-sda, size: 536870912, wipe: superblock, flag: boot, number: 1, preserve: false, grub_device: true, type: partition, id: partition-0}
- {fstype: fat32, volume: partition-0, preserve: false, type: format, id: format-0}
- {device: disk-sda, size: -1, wipe: superblock, flag: '', number: 2, preserve: false, type: partition, id: partition-1}
- {fstype: xfs, volume: partition-1, preserve: false, type: format, id: format-1}
- {device: format-1, path: /, type: mount, id: mount-1}
- {device: format-0, path: /boot/efi, type: mount, id: mount-0}
  1. 密码需要加密,可以先用工具对自己的密码进行加密后填入
  2. 磁盘分区配置要注意,配置不对会导致自动安装走不下去,提示 crash;这个配置的整体思路是先格式化 disk-sda,然后在 disk-sda 下划分 /dev/sda1/dev/sda2 ,然后分别挂载 //boot/efi 目录
  3. 安装过程日志在 /var/log/installer/,如果安装失败可以通过 nc 等工具实时发出去

配置meta-data
touch创建一个空文件即可。
vendor-data
不需要理会。
确保以上文件所有人可读。
引导后即可自动安装。

autoinstall脚本

最小化的配置是:

1
2
3
4
5
version: 1
identity:
hostname: hostname
username: username
password: $crypted_pass

一个标准设置为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
version: 1
reporting:
hook:
type: webhook
endpoint: http://example.com/endpoint/path
early-commands:
- ping -c1 198.162.1.1
locale: en_US
keyboard:
layout: gb
variant: dvorak
network:
network:
version: 2
ethernets:
enp0s25:
dhcp4: yes
enp3s0: {}
enp4s0: {}
bonds:
bond0:
dhcp4: yes
interfaces:
- enp3s0
- enp4s0
parameters:
mode: active-backup
primary: enp3s0
proxy: http://squid.internal:3128/
apt:
primary:
- arches: [default]
uri: http://repo.internal/
sources:
my-ppa.list:
source: "deb http://ppa.launchpad.net/curtin-dev/test-archive/ubuntu $RELEASE main"
keyid: B59D 5F15 97A5 04B7 E230 6DCA 0620 BBCF 0368 3F77
storage:
layout:
name: lvm
identity:
hostname: hostname
username: username
password: $crypted_pass
ssh:
install-server: yes
authorized-keys:
- $key
allow-pw: no
snaps:
- name: go
channel: 1.14/stable
classic: true
debconf-selections: |
bind9 bind9/run-resolvconf boolean false
packages:
- libreoffice
- dns-server^
user-data:
disable_root: false
late-commands:
- sed -ie 's/GRUB_TIMEOUT=.*/GRUB_TIMEOUT=30/' /target/etc/default/grub
error-commands:
- tar c /var/log/installer | nc 192.168.0.1 1000

关键字包括
version
名称:版本
类型:整型
默认值:无
为将来不同版本准备的版本信息,目前只能为 1 。
locale
名称:语言环境
类型:字符串
默认值:en_US.UTF-8
是否可交互:可,对于任何块中是的话,总是可以交互
为已安装系统配置的语言环境。
network
名称:网络
类型:netplan-format映射,参看下面
默认值:用于DHCP协议的名字为ethen的网卡
是否可交互:可
netplan 格式的网络配置。将在安装期间以及已安装的系统中应用。默认是解释安装媒介的配置,它在名称匹配 “eth” 或 “en” 的任何网卡上运行 DHCPv4 请求,并随后禁用任何未获取到IP地址的网卡。
例如,要在特定网卡 enp0s31f6 上运行 dhcp6 请求:

1
2
3
4
5
network:
version: 2
ethernets:
enp0s31f6:
dhcp6: yes

apt
名称:APT高级包管理工具
类型:映射
默认值:参看下面
是否可交互:可
APT配置,在安装期间和引导到目标系统后都使用。默认值为:

1
2
3
4
5
6
7
8
apt:
preserve_sources_list: false
primary:
- arches: [i386, amd64]
uri: "http://archive.ubuntu.com/ubuntu"
- arches: [default]
uri: "http://ports.ubuntu.com/ubuntu-ports"
geoip: true

任何提供的配置都会与默认配置合并,而不是替换它。
如果您只想设置镜像源,请使用如下配置:

1
2
3
4
apt:
primary:
- arches: [default]
uri: YOUR_MIRROR_GOES_HERE

storage
名称:存储
类型:映射,参看下面
默认值:对于单块硬盘为 lvm ,对于多块硬盘则无默认值
是否可交互:可
支持的布局:目前支持的布局就两种,分别是逻辑卷模式 lvm 和直通模式 direct 。

1
2
3
4
5
6
storage:
layout:
name: lvm
storage:
layout:
name: direct

默认情况下,这些将安装到系统中容量最大的磁盘,但可以提供匹配规范(“match: {}”,见下文)来指示要使用的磁盘:

1
2
3
4
5
6
7
8
9
10
storage:
layout:
name: lvm
match:
serial: CT*
storage:
layout:
name: disk
match:
ssd: yes

默认采用 lvm 。
基于动作的配置
如果使用 layout 功能配置磁盘,则不会使用 config 部分。
除了将操作列表放在关键字 config 下之外, grub 和swap curtin配置项也可以放在此处。因此存储部分可能如下所示:

1
2
3
4
5
6
7
8
9
storage:
swap:
size: 0
config:
- type: disk
id: disk0
serial: ADATA_SX8200PNP_XXXXXXXXXXX
- type: partition
...

磁盘选择扩展
Curtin支持通过串行或路径(如 /dev/sdc )识别磁盘,服务器安装程序也支持这一点。安装程序还支持磁盘操作上的 match spec,支持更灵活的匹配。
存储配置中的操作按照它们在自动安装文件中的顺序进行处理。任何磁盘操作都会被分配一个匹配的磁盘——如果有多个磁盘,则从一组未分配的磁盘中任意选择,如果没有未分配的匹配磁盘,则会导致安装失败。
匹配规范支持以下关键字:

  • model: foo :匹配 udev 中 ID_VENDOR=foo 的磁盘,支持通配符
  • path: foo :匹配 udev 中 DEVPATH=foo 的磁盘,支持通配符(通配符支持将此与直接在磁盘操作中指定 path: foo 区分开来)
  • serial: foo :匹配 udev 中 ID_SERIAL=foo 的磁盘,支持通配符(通配符支持将此与直接在磁盘操作中指定 serial: foo 区分开来)
  • ssd: yes|no :匹配是或不是 SSD 的磁盘(相对于机械硬盘)
  • size: largest|smallest :如果有多个匹配项,则取最大或最小的磁盘而不是任意一个(在 20.06.1 版本中添加了对最小 smallest 的支持)
    因此,例如,要匹配任意磁盘,只需:
    1
    2
    - type: disk
    id: disk0
    匹配容量最大的SSD硬盘:
    1
    2
    3
    4
    5
    - type: disk
    id: big-fast-disk
    match:
    ssd: yes
    size: largest
    匹配希捷Seagate硬盘:
    1
    2
    3
    4
    - type: disk
    id: data-disk
    match:
    model: Seagate
    分区/逻辑卷扩展
    curtin中的分区或逻辑卷的大小指定为字节数。自动安装配置更加灵活:
    可以使用安装程序用户界面中支持的“1G”、“512M”语法指定大小
    可以将大小指定为包含磁盘(或RAID)的百分比,例如“50%”
    对于为特定设备指定的最后一个分区,可以将大小指定为“-1”以指示该分区应填充剩余空间。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    - type: partition
    id: boot-partition
    device: root-disk
    size: 10%
    - type: partition
    id: root-partition
    size: 20G
    - type: partition
    id: data-partition
    device: root-disk
    size: -1
    identity
    名称:身份
    类型:映射,参看下面
    默认值:无
    是否可交互:可
    配置系统的初始用户。这是唯一必须存在的配置关键字(除非存在用户数据部分,在这种情况下它是可选的)。
    可以包含关键字的映射,所有关键字都采用字符串值:
    realname:实际名
    username:用户名
    hostname: 主机名
    password:密码,加密的。这是与 sudo 一起使用时所必需的,即使配置了 SSH 访问。

ssh
名称: SSH 服务
类型:映射,参看下面
默认值:参看下面
是否可交互:可
为已安装的系统配置 SSH 服务。可以包含关键字的映射:
install-server
名称:安装 SSH 服务
类型:布尔型
默认值:false,不安装
是否安装 OpenSSH 服务。
authorized-keys
名称: SSH 认证公钥
类型:字符串列表
默认值:[]
要安装在初始用户帐户中的 SSH 公钥列表,方便其他主机采用密钥通过 SSH 访问该主机。
allow-pw
名称:是否允许密码
类型:布尔型
默认值:当 authorized_keys 为空时为真 true ,否则为否 false

snaps
名称:snap包
类型:列表
默认值:不安装其他snap
是否可交互:可
要安装的snap包列表。每个snap都表示为具有必需的关键字 name 和可选的关键字 chanel (默认为 stable )和 classic (经典默认为 false )的映射。如:

1
2
3
4
snaps:
- name: etcd
channel: edge
classic: false

debconf-selections
名称:采用 debconf 设置包选择
类型:字符串
默认值:无
是否可交互:否
安装程序将使用 debconf 设置选择值更新目标。用户需要熟悉软件包 debconf 选项。

packages
名称:软件包
类型:列表
默认值:无软件包
是否可交互:否
要安装到目标系统中的软件包列表。更准确地说,是传递给命令 apt-get install 的字符串列表,因此这包括任务选择( dns-server^ )和安装特定版本的包( my-package=1-1 )。

user-data
名称:用户数据
类型:映射
默认值:{}
是否可交互:否
提供 cloud-init 用户数据,它将与安装程序生成的用户数据 user-data 合并。如果您提供此信息,则无需提供身份 identity 部分(但您有责任确保您可以登录到已安装的系统!)。

转换preceed文件
安装autoinstall-generator
执行autoinstall-generator my-preseed.txt my-cloud-config.yaml --cloud

Linux+iPXE+preseed

安装软件包

需要安装DHCP, TFTP和DNS服务器以实现PXE,dnsmasq包恰好同时实现了三种服务。
需要iPXE的引导文件,在 iPXE.org 下载undionly.kpxeipxe.efi,也可直接执行
wget https://boot.ipxe.org/undionly.kpxe
wget https://boot.ipxe.org/ipxe.efi
需要安装HTTP服务器以传输镜像,nginxapache2都可以,也可以使用python3 -m http.server [port] [--bind IP] --directory|-d /var/www/html/的简易服务器(此服务器默认使用当前目录,所以需要手动指定资源目录)。

创建TFTP文件夹

在符合规范的目录下创建tftp服务的根目录,目录下结构应当如下:

1
2
3
4
tftp
├── undionly.kpxe
├── boot.ipxe
└── ipxe.efi

配置DNSMASQ

同上,不解释了。不同之处在于这次同时支持不同架构的计算机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 配置上游 DNS 服务器地址
server=114.114.114.144

# 指定服务的网卡
interface=enp2s0,lo

# 绑定端口
bind-interfaces

# 设置 DHCP 分发 IP 端范围、地址掩码、IP 地址有效时间
dhcp-range=192.168.1.100,192.168.1.150,255.255.255.0,12h
# 或者使用CIDR
dhcp-range=192.168.1.100/24,192.168.1.150/24,12h

# 匹配BIOS架构的客户端
dhcp-match=set:bios,option:client-arch,0

# 匹配iPXE客户端,其特征码为175
dhcp-match=set:ipxe,175

# iPXE客户端直接引导iPXE,方括号内容为使用外部TFTP服务器
dhcp-boot=tag:ipxe,boot.ipxe[,,192.168.1.X]

# 非iPXE的BIOS客户端直接使用undionly.kpxe引导
dhcp-boot=tag:!ipxe,tag:bios,undionly.kpxe[,,192.168.1.X]

# EFI客户端全部使用ipxe.efi引导
dhcp-boot=tag:!ipxe,tag:!bios,ipxe.efi[,,192.168.1.X]

# 也可以使用pxe-service,此处不细写了

# 启用 tftp 服务
enable-tftp

# 设置 tftp 根路径
tftp-root=/srv/tftp

# 设置日志路径
log-facility=/var/log/dnsmasq.log

创建HTTP资源目录

启动HTTP服务systemctl start nginx|apache2
默认http服务的资源根目录是 /var/www/html,目录下结构应当如下:

1
2
3
4
5
6
7
8
html/
├── index.html(没用)
├── boot
│ ├── bcd
│ ├── boot.sdi
│ └── boot.wim
└── iso
└── 镜像名.iso
  1. boot目录下为Windows引导文件,详情见之前内容
  2. iso目录存放镜像

创建iPXE启动脚本

创建boot.ipxe后,根据之前说过的格式,写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!ipxe
# 设定服务器IP,这里只演示HTTP服务器
set boot-url http://192.168.1.X

set menu-timeout 5000
isset ${menu-default} || set menu-default exit

######## MAIN MENU ###################
:start
menu PXE Boot Menu
item shell iPXE shell
item ubuntu Ubuntu autoinstall
item debian Debian autoinstall
item reboot Reboot
item exit Exit to BIOS
choose --default debian --timeout 10000 option && goto ${option}

########## UTILITIES ####################
:shell
shell

# 直接下载
:ubuntu
set mirror https://mirrors.ustc.edu.cn/
set release jammy
cpuid --ext 29 && set arch amd64 || set arch i386
# 使用url=指定preseed脚本
set base-url ${mirror}/ubuntu/dists/${release}/main/installer-${arch}/current/legacy-images/netboot/ubuntu-installer/${arch}
kernel ${base-url}/linux auto=true url=xxx/ubuntu.cfg keymap=us domain= hostname=ubuntu-server interface=auto netcfg/do_not_use_netplan=true || goto failed
initrd ${base-url}/initrd.gz || goto failed
goto start

# 本地服务器文件
:debian
cpuid --ext 29 && set arch amd64 || set arch i386
sanboot ${boot-url}/iso/debian.iso || goto failed
boot || goto failed
goto start

:reboot
reboot

:exit
exit

preseed自动安装脚本

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 自动设置网络接口
d-i netcfg/choose_interface select auto
# 手动设置网络接口
#d-i netcfg/choose_interface select eth1
# 手动设置网络请先禁用DHCP
#d-i netcfg/disable_dhcp boolean true
# 手动设置网络
d-i netcfg/get_nameservers string 10.0.2.3
d-i netcfg/get_ipaddress string 10.0.2.99
d-i netcfg/get_netmask string 255.255.255.0
d-i netcfg/get_gateway string 10.0.2.2
d-i netcfg/confirm_static boolean true
# 设置主机名和域名
d-i netcfg/get_hostname string babelbox
d-i netcfg/get_domain string unassigned-domain
### 设置镜像源
d-i mirror/country string enter information manually
d-i mirror/http/hostname string 10.0.2.2
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
### 分区
# 使用单分区
d-i partman-auto/init_automatically_partition select biggest_free
d-i partman-auto/choose_recipe select atomic
# 使用自动分区
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
### 时区设置
# 是否使用UTC
d-i clock-setup/utc boolean true
# 设置时区
d-i time/zone string Asia/Shanghai
### Apt设置
# 是否使用镜像源
d-i apt-setup/use_mirror boolean false
### 用户设置
# root用户设置
d-i passwd/root-password password r00tme
d-i passwd/root-password-again password r00tme
# 普通用户设置
d-i passwd/user-fullname string Debian User
d-i passwd/username string debian
d-i passwd/user-password password r00tme
d-i passwd/user-password-again password r00tme
### GRUB设置
d-i grub-installer/skip boolean false
d-i lilo-installer/skip boolean true
### 包设置
d-i pkgsel/update-policy select none
d-i pkgsel/include string openssh-server vim wget net-tools software-properties-common
d-i pkgsel/upgrade select none
### 完成安装
d-i finish-install/reboot_in_progress note

在引导菜单中使用url=指定preseed脚本

kickstart脚本

在RHEL系安装完成后,kickstart脚本会自动生成于/root/anaconda-ks.cfg。
在其他系统下,可以安装system-config-kickstart包,然后按照图形界面进行设置后生成文件。
在引导选项中使用ks=指定kickstart脚本。

Docker+Cobbler

Cobbler 是一个 Linux 服务器安装的服务,可以通过网络启动 (PXE) 的方式来快速安装、重装物理服务器和虚拟机,同时还可以管理 DHCP,DNS 等。
Cobbler集成以下服务

  • PXE 服务支持
  • DHCP 服务管理(可选dhcp-server, dnsmasq和kea)
  • DNS 服务管理(可选bind或dnsmasq)
  • IPMI 电源管理
  • Kickstart 服务支持
  • YUM 仓库管理
  • TFTP (PXE 启动时需要)
  • Apache httpd(提供 kickstart 的安装源,并提供定制化的 kickstart 配置)
    Cobbler可以使用命令行方式管理,也提供了基于Web的界面管理工具(cobbler-web),还提供了API接口,可以方便二次开发使用。

Cobbler的配置结构基于一组注册的对象。每个对象表示一个与另一个实体相关联的实体。当一个对象指向另一个对象时,它就继承了被指向对象的数据,并可覆盖或添加更多特定信息。
发行版(distros): 表示一个操作系统。它承载了内核和initrd的信息,以及内核参数等其他数据。
配置文件(profiles):包含一个发行版、一个kickstart文件以及可能的存储库,还包括更多特定的内核参数等其他数据。
系统(systems):表示要配给的机器。它包括一个配置文件或一个镜像、IP和MAC地址、电源管理(地址、凭据、类型)以及更为专业的数据等信息。
镜像(images):可以替换一个保函不屑于此类别的文件的发行版对象(例如,无法分为内核和initrd的对象)。

Server端

  • 启动Cobbler服务
  • 进行Cobbler错误检查,执行cobbler check命令
  • 进行配置同步,执行cobbler sync命令
  • 复制相关启动文件到TFTP目录中
  • 启动DHCP服务,提供地址分配
  • DHCP服务分配IP地址
  • TFTP传输启动文件
  • Server端接收安装信息
  • Server端发送ISO镜像与Kickstart文件

Client端

  • 客户端以PXE模式启动
  • 客户端获取IP地址
  • 通过TFTP服务器获取启动文件
  • 进入Cobbler安装选择界面
  • 根据配置信息准备安装系统
  • 加载Kickstart文件
  • 传输系统安装的其它文件
  • 进行安装系统

安装

不幸的是,Deb系的官方源中没有Cobbler。所以要么从源码构建,要么使用Docker。
RHEL系安装:
dnf module enable cobbler:3
dnf install cobbler

Docker安装:
docker pull tartarefr/docker-cobbler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 挂载镜像,此处以centos为例,挂载点会与容器共享
sudo mkdir /mnt/centos
sudo mount -o ro /path/to/isos/CentOS-7-x86_64-DVD-1804.iso /mnt/centos

# 创建cobbler http资源目录卷
docker volume create cobbler_www
# 创建cobbler tftp根目录卷
docker volume create cobbler_tftp
# 创建cobbler配置文件目录卷
docker volume create cobbler_config
# 创建cobbler备份目录卷
docker volume create cobbler_backup
# 创建cobbler运行时卷
docker volume create cobbler_run

HOST_IP_ADDR: 主机的IP,用于cobbler API,必要
HOST_HTTP_PORT: 主机的HTTP端口,用于容器中的cobbler API,默认为80
DEFAULT_ROOT_PASSWD: 默认root密码,默认为cobbler,必要
COBBLER_WEB_USER: cobbler_web的用户,默认为cobbler,可选
COBBLER_WEB_PASSWD: cobbler_web的用户密码,默认为cobbler,可选
COBBLER_WEB_REALM: cobbler_web的领域,默认为Cobbler,可选
COBBLER_LANG: 语言,默认为fr_FR,可选
COBBLER_KEYBOARD: 键盘类型,默认为fr-latin-9,可选
COBBLER_TZ: 时区,默认为Europe/Paris,可选


docker run -itd \
-v cobbler_www:/var/www/cobbler:Z \
-v cobbler_tftp:/var/lib/tftp:Z \
-v cobbler_config:/var/lib/cobbler/config:Z \
-v cobbler_backup:/var/lib/cobbler/backup:Z \
-v cobbler_run:/var/run/supervisor:Z \
-v /mnt/centos:/mnt:Z \
-e DEFAULT_ROOT_PASSWD=cobbler \
-e HOST_IP_ADDR=$(hostname --ip-address | awk '{print $1}') \
-e HOST_HTTP_PORT=80 \
-e COBBLER_WEB_USER=cobbler \
-e COBBLER_WEB_PASSWD=cobbler \
-e COBBLER_WEB_REALM=Cobbler \
-e COBBLER_LANG=en_US \
-e COBBLER_KEYBOARD=us \
-e COBBLER_TZ=Asia/Shanghai \
-p 69:69/udp \
-p 80:80 \
-p 443:443 \
-p 25151:25151 \
--name cobbler \
cobbler:latest

导入测试镜像,在容器中执行cobbler image add --name=memtest86+ --file=/boot/memtest86+-5.01 --image-type=direct
导入CentOS镜像,在容器中执行cobbler import --path=/mnt --name=CentOS-7-x86_64
设置CentOS镜像,在容器中执行

1
2
3
cobbler profile add --name=CentOS-7-x86_64-Desktop --distro=CentOS-7-x86_64 --kickstart=/var/lib/cobbler/kickstarts/sample_end.ks --virt-file-size=12 --virt-ram=2048

cobbler profile edit --name CentOS-7-x86_64-Desktop --ksmeta="type=desktop"

文件内容

Cobbler的文件组成如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 配置目录
/etc/cobbler # 配置文件目录
/etc/cobbler/settings # cobbler主配置文件,这个文件是YAML格式
/etc/cobbler/dhcp.template # DHCP服务的配置模板
/etc/cobbler/tftpd.template # tftp服务的配置模板
/etc/cobbler/rsync.template # rsync服务的配置模板
/etc/cobbler/iso # iso模板配置文件目录
/etc/cobbler/pxe # pxe模板文件目录
/etc/cobbler/power # 电源的配置文件目录
/etc/cobbler/users.conf # Web服务授权配置文件
/etc/cobbler/users.digest # 用于web访问的用户名密码配置文件
/etc/cobbler/dnsmasq.template # DNS服务的配置模板
/etc/cobbler/modules.conf # Cobbler模块配置文件

# 数据目录
/var/lib/cobbler # Cobbler数据目录
/var/lib/cobbler/config # 用于存放distros,system,profiles等信息配置文件
/var/lib/cobbler/triggers/ # 用于存放用户定义的cobbler命令
/var/lib/cobbler/kickstarts # 默认存放kickstart文件
/var/lib/cobbler/loaders # 存放的各种引导程序

# 镜像目录
/var/www/cobbler # 系统安装镜像目录
/var/www/cobbler/ks_mirror # 导入的发行版系统镜像列表
/var/www/cobbler/images # 导入的系统镜像的kernel和initrd启动文件
/var/www/cobbler/repo_mirror # yum源存储目录

# 日志目录
/var/log/cobbler # 日志目录
/var/log/cobbler/install.log # 客户端系统安装日志
/var/log/cobbler/cobbler.log # cobbler日志

cobbler命令

  • cobbler check 核对当前设置是否有问题
  • cobbler list 列出所有的Cobbler元素
  • cobbler report 列出元素的详细信息
  • cobbler setting edit --name=配置项 --value=配置内容 修改Cobbler配置,对应/etc/cobbler/settings中的内容
  • cobbler sync 同步配置到数据目录,更改配置后最好都要执行下
  • cobbler reposync 同步yum仓库到与本地一致
  • cobbler distro 查看导入的发行版系统信息
  • cobbler system 查看添加的系统信息
  • cobbler profile 查看配置信息
  • cobbler get-loaders 下载bootloader
  • cobbler import --name=centos --path=/media/cdrom --arch=x86_64 导入系统
  • cobbler profile edit --name=centos --distro=centos --kickstart= /var/lib/cobbler/kickstarts/centos.cfg 修改profile,对应profile report中的内容

配置流程

  1. 配置/etc/cobbler/settings,设置服务器IP和TFTP服务器IP
    1
    2
    server: 192.168.1.X
    next_server: 192.168.1.X
    或直接执行cobbler setting edit --name=server --value=192.168.1.X
    cobbler setting edit --name=next_server --value=192.168.1.X
  2. 下载bootloader文件
    执行cobbler get-loaders,也可以手动下载后放入/var/lib/cobbler/loaders
    cat /var/lib/tftpboot/pxelinux.cfg/default进行检查
  3. 生成密码
    执行openssl passwd -1,使用MD5算法生成加密密码,写入/etc/cobbler/settings
    1
    default_password_crypted: "password"
  4. 修改/etc/xinetd.d/xxx中的服务,将需要的服务的disable=改为no
  5. 根据需要安装额外包如pykickstartfence-agentsdebmirror,解决check出的剩余错误

settings文件全部内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# 不允许将同样的hostname配置到多个操作系统,如果为#将不利于局域网内的域名解析。
allow_duplicate_hostnames:0
# 不允许将同样的IP地址配置到多个操作系统,如果为#将会造成局域网内DHCP和DNS服务冲突。
allow_duplicate_ips:0
# 不允许将同样的MAC地址配置到多个操作系统,如果为#将会造成局域网内DHCP和DNS服务冲突。
allow_duplicate_macs:0
# 允许被安装操作系统客户机将系统安装信息返回到Cobbler Server的/var/log/cobbler/anamon/目录下,0为关闭
anamon_enabled:1
# 在此修改认证模块,默认为login
authn_pam_service:"login"
# 关闭操作系统安装结束后构建报表,1为开起
build_reporting_enabled:0

# 报表邮件发件人,可选
build_reporting_sender:""
# 报表发送地址列表
build_reporting_email:['root@localhost']
# 发送报表邮件的SMTP服务器地址
build_reporting_smtp_server:172.16.2.232
# 报表邮件的主题
build_reporting_subject:""

# cheetah(一个用python写的开源的模板引擎和代码生成工具)模块导入白名单。配置白名单后cheetah将可以使用里面相关模块。这是一个有用的高级功能,如果允许cheetah导入任意模块,这系统将会有安全隐患。
cheetah_import_whitelist:-"random"-"re"-"time"
# 使用createrepo命令的reposync期间创建新存储库的默认选项。如果createrepo版本大于或等于0.4.10,使用此参数将大幅缩短cobbler reposync命令执行的时间
createrepo_flags:"-c cache -s sha"

# 默认的kickstart文件,当被安装操作系统服务器没有指定使用kickstart文件时,将使用此文件。
default_kickstart:/var/lib/cobbler/kickstarts/default.ks
# 默认的DNS服务器地址,当被安装操作系统服务器没有指定使用DNS服务器地址时候,将使用此地址
default_name_servers:[]
# 分配给新创建对象的所有者列表,仅用于Cobbler Web。
default_ownership:"admin"
# 被安装操作系统服务器的root密码(默认为cobbler)。使用”openssl passwd -1″命令生成
default_password_crypted: cloud$b#gaBwSH/Z8OiOGobbx7H
# 默认解析kickstart和snippets使用的类型为cheetah,cobbler支持cheetah和jinja2,如果修改将修改cobbler所有模板的相关需解析项。
default_template_type:"cheetah"

# 配置默认的虚拟桥接网卡,也可配置为virbr0
default_virt_bridge: xenbr0
# 虚拟机默认磁盘空间(GB)
default_virt_file_size:5
# 虚拟机默认内存大小(MB)
default_virt_ram:#2
# 默认的虚拟化类型为xen(RHEL6以后默认使用KVM)
default_virt_type: xenpv
# 不允许gpxe启动。(gPXE支持通过HTTP、FTP和NFS方式传输文件)通常用于ESXi和XenServer的安装
enable_gpxe:0
# 开启在被安装操作系统pxe启动时,使用菜单方式选择安装操作系统,该选项在Cobbler system那默认关闭。
enable_menu:1

# 不允许cobbler安装和配置func(一个强大的远程控制和脚本执行工具)。1为允许
func_auto_setup:0
# func server地址,默认为其官网主页
func_master: overlord.example.org

# Apache监听端口
http_port:80
# 内核选项,在每一个使用cobbler安装的系统都存在以下选项
kernel_options: ksdevice: bootif lang:' ' text:~
# 内核选项s390x架构,和内核选项一样
kernel_options_s390x: RUNKS:1 ramdisk_size:40000 root:/dev/ram0 ro:~ ip: off vnc:~

# 使用LDAP身份验证的服务器地址
ldap_server:172.16.2.232
# 使用LDAP身份认证的DN
ldap_base_dn:"DC=example,DC=com"
# 连接到LDAP服务器时所使用的端口。如果启用了TLS和这个端口389是默认,Cobbler在内部转换为SSL的636端口
ldap_port:389
# 允许LDAP身份验证使在SSL/TLS加密连接
ldap_tls:1
# 允许LDAP身份验证模块使用一个匿名绑定连接到LDAP服务器。
ldap_anonymous_bind:1
# 用于绑定到LDAP服务器进行身份验证使用的DN,当ldap_anonymous_bind=0才会生效。
ldap_search_bind_dn:''
# 用于绑定到LDA服务器进行身份验证使用的密码,当ldap_anonymous_bind=0才会生效。
ldap_search_passwd:''
# 用于搜索查询LDAP服务器时使用的前缀。
ldap_search_prefix:'uid='

# 所有对象列表的默认管理类名。用于集成一个配置管理系统,例如Puppet。
mgmt_classes:[]mgmt_parameters: from_cobbler:1
# 允许被安装操作系统的服务器,在安装操作系统时安装和配置Puppet工具。0为不允许。
puppet_auto_setup:1
# 允许Cobbler使用Snipperts将客户操作系统自动注册到Puppet Master。
sign_puppet_certs_automatically:1
# Puppetca命令的路径,用于Cobbler为新安装操作系统时自动注册和自动清理注册信息。
puppetca_path:"/usr/bin/puppet"
# 自动清理老的认证信息(当节点有重新安装操作系统时,会触发puppet master清理对应的认证信息)。
remove_old_puppet_certs_automatically:1

# 允许Cobbler接管DHCP服务。这意味着它会根据模板自动生成dhcp配置文件。
manage_dhcp:1
# 允许Cobbler接管DNS服务。并不重要。
manage_dns:0
# 设置绑定的chroot路径,默认为空,自动检测。
bind_chroot_path:""
# DNS服务的IP地址
bind_master:127.0.0.1
# 允许Cobbler接管tftp服务。必须。
manage_tftpd:1
# 允许Cobbler接管rsync服务。并不重要。
manage_rsync:1

# 如果允许Cobbler接管DNS服务,则以下为配置DNS解析管理区域列表。
manage_forward_zones:['huacloud.demo']manage_reverse_zones:[]
# 如果允许Cobbler接管DHCP服务,这个IP地址将传送给被安装操作系统在PXE启动时使用。如果地址错误,则会导致Tftp时提示timeout错误。
next_server:172.16.2.232
# Cobbler使用电源管理工具时使用的类型,默认为ipmitools工具。
power_management_default_type:'ipmitool'
# 用于发送电源管理功能到客户机的模板路径。
power_template_dir:"/etc/cobbler/power"
# 客户机只安装一次操作系统,再次开机时不进入PXE,重装需要 Cobbler system 中使用 netboot-enabled 指定。
pxe_just_once:1
# 如果允许Cobbler接管Tftp服务,这个目录包含模板用于生成PXE启动配置文件。
pxe_template_dir:"/etc/cobbler/pxe"

# 系统控制台路径,主要用于清除日志和消息。
consoles:"/var/consoles"
# 是否允许将红帽管理平台添加到Cobbler中。默认“off”关闭,“hosted”使用红帽网络,“site”使用红帽Satellite Server和Spacewalk服务器。
redhat_management_type:"off"
# 如果允许使用红帽管理平台,在此配置默认RHN服务器,用于认证和和其他服务。
redhat_management_server:172.16.2.232
# 在此填写红帽注册密钥。
redhat_management_key:""
# 不允许cobbler接管红帽管理平台
redhat_management_permissive:0
# 不允许使用/usr/bin/cobbler-register远程添加system信息,以及不允许注册的新硬件系统记录。
register_new_installs:0
# 使用yum命令的reposync时,默认添加的参数,如果不支持以下参数可以修改。
reposync_flags:"-l -m -d"
# 当cobbler sync允许重启DNS和DHCP服务。
restart_dns:1 restart_dhcp:1
# 允许执行/var/lib/cobbler/triggers/install目录下的触发器(脚本)。默认使用root帐号执行。
run_install_triggers:1
# 使用允许将触发器通过使用版本控***务管理,默认使用git,也支持hg。
scm_track_enabled:0 scm_track_mode:"git"

# Cobbler服务的IP地址。
server:172.16.2.232
# 不允许客户机使用本地主机地址而是通过Cobbler Server的配置,通常
client_use_localhost:0
# Snippets存放路径
snippetsdir:/var/lib/cobbler/snippets
# 不允许Cobbler使用远程的kickstart文件
template_remote_kickstarts:0
# 开启物理服务器启动后重启上面的虚拟机。
virt_auto_boot:1
# Cobbler Web页面存放路径
webdir:/var/www/cobbler
# Cobbler监听的XMLRPC端口。
xmlrpc_port:25151
# 允许系统安装后将自建软件园放到/etc/yum.repo.d/目录下
yum_post_install_mirror:1
# 默认将cobbler的软件园设置到最优先权。
yum_distro_priority:1
# 默认使用yumdownloader命令时,添加–resolve参数
yumdownloader_flags:"--resolve"
# 不允许cobbler将JSON信息写入JSON文件(包含所有数据对象类型),默认的是,将JSON输出到一行。
serializer_pretty_json:0
  1. 配置DHCP
    首先修改/etc/cobbler/settings
    1
    manage_dhcp: 1
    总结一下,目前settings一共修改了以下几项:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    server: 192.168.1.X

    # 这个参数重点说明一下:
    # 这里指的是TFTP的地址,有些情况下也是DHCP地址;因为DHCP服务器会把这个地址作为DHCP选项(66 Boot Server Host Name, 67 Bootfile Name)一起传送过去;这也是一个对当前DHCP要求的指标之一,如果当前环境中服务器的DHCP软件不支持这个选项,那么就得考虑换一个了。
    # 当DHCP服务器同时也是TFTP服务器的话就会和DHCP地址一样。如果两者分离的话就需要在DHCP服务器手动配置一下选项,这里也要指向TFTP服务器的地址
    next_server: 192.168.1.X

    # 装系统重启后,不再进入PXE引导菜单,直接引导硬盘的系统。
    pxe_just_once: 1

    # 这里是新系统的root密码,使用命令openssl passwd -1创建
    default_password_crypted:

    # 这里的管理指的是cobbler对于这些服务的配置文件定义,当使用sync命令同步的时候,会自动根据模板文件覆盖这些服务的配置文件;
    manage_dhcp: 1
    manage_rsync: 1
    或直接执行cobbler setting edit --name=manage_dhcp --value=1
    然后修改cobbler的dhcp模版/etc/cobbler/dhcp.template,不要直接修改dhcp本身的配置文件,因为cobbler会覆盖它们。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    subnet 192.168.1.0 netmask 255.255.255.0 { #这里改为分配的子网和掩码
    # option routers 192.168.1.5; # 设置网关地址,可选
    # option domain-name-servers 192.168.1.1; # 设置DNS地址,可选
    option subnet-mask 255.255.255.0; # IP掩码
    range dynamic-bootp 192.168.2.100 192.168.2.254; # DHCP的IP范围
    default-lease-time 21600;
    max-lease-time 43200;
    next-server $next_server; # 就是settings配置的next_server!
    ...以下不变,省略
    }
    修改完成后执行cobbler sync

导入镜像

将镜像挂载 mount -o ro xxx.iso /media
导入

1
2
3
4
5
cobbler import --path=/media --name=xxx --arch=x86_64
# --path 镜像路径
# --name 为安装源定义一个名字
# --arch 指定安装源是32位、64位、ia64, 目前支持的选项有: x86│x86_64│ia64
# 安装源的唯一标示就是根据name参数来定义,如果重复,系统会提示导入失败。

安装成功后,可以在cobbler distro list中看到系统名
系统会拷贝到镜像目录/var/www/cobbler/ks_mirror/中,可以进行检查
检查镜像信息 cobbler distro report --name=xxx
检查镜像profile cobbler profile report --name=xxx

设置Kickstart

可以自己编辑创建,也可以使用/var/lib/cobbler/kickstarts/中内置的,默认使用sample_end.ks,可以通过cobbler profile edit --name=xxx --kickstart=/var/lib/cobbler/kickstarts/xxx.ks修改

启动PXE测试

可以修改/etc/cobbler/pxe/pxedefault.template,改变PXE界面。

设置Web

cobbler web包名为cobbler_web,安装前请确定django版本对应
web链接为http://IP/cobbler_webhttps://IP/cobbler_web,默认用户名和密码都是cobbler。可以修改/etc/cobbler/users.conf/etc/cobbler/users.digest进行自定义用户。
修改密码可以通过htdigest /etc/cobbler/users.digest "Cobbler" cobbler
设置认证模式可以修改/etc/cobbler/modules.conf
比如,使用authn_configfile

1
2
[authentication]
module=authn_configfile

这种模式下,添加用户使用htdigest [-c] /etc/cobbler/users.digest Cobbler admin
-c 在添加第一个用户时使用
使用authn_pam

1
2
[authentication]
module = authn_pam

此时使用主机上的Linux PAM用户,创建用户只需要在主机上执行useradd,然后在/etc/cobbler/users.conf设置管理员权限

1
2
[admins]
admin = "cobbler"