zhangguanzhang's Blog

uefi模式下docker+交换机部署pxe批量安装

字数统计: 1.1k阅读时长: 5 min
2019/06/26

华三服务器的 ipmi 的 web 提供了 nfs 挂载 iso 去安装,也是我之前使用的,发现研发给的镜像在4g以上(镜像基于centos7.3改的,我之前测试都是用的minimal镜像890M左右)。安装的时候报错,然后当面测试得出结论 nfs 的网速原因,其次也是我们这边办公网是百兆。。。
办公网被 it 接管了,交换机密码不给,自己找了台 5130 交换机,下面接服务器和我自己电脑搭建测了下定制iso的pxe流程

这是组网情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
             10.96.4.1/24
+------------+
| switch |
| |
+-+--------+-+
| |
| |
+------+ +--------+
| |
| |
v v
+----+------+ +------+------+
| h3c server| | my pc |
+-----------+ +-------------+
10.96.4.2

叫同事帮忙配置下交换机的 dhcp,我虚机桥接的,虚机 ip 配置为4.2。起初?看到有nextserver还有个tftp-server两命令,以为nextserver是dhcp中继的命令,而tftp-server是指定pxe下载pxelinux.0的tftp ip,也就是一开始下面的配置

1
2
3
[H3C-S5130-dhcp-pool-1] bootfile-name pxelinux.0
[H3C-S5130-dhcp-pool-1] next-server 10.96.4.2
[H3C-S5130-dhcp-pool-1] tftp-server ip-address 10.96.4.2

pxe的 dhcp 直接用交换机的,tftp 和 web 我用 docker 起的,网上的做法基本都不能识别进到菜单界面,最后在 http://blog.chinaunix.net/uid-22621471-id-4980582.html 找到启发,复制 EFI/BOOT 下文件到 tftp 的根目录,并且 bootfile-name 设置为BOOTX64.EFIhttp/cvk下是 iso 解压的,vmlinuz 和 initrd 是镜像/EFI/BOOT/里复制到tftp根目录的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.
├── docker-compose.yml
├── http
│   └── cvk
| .....
├── nginx-conf.d
│   └── default.conf
└── tftp
├── BOOTX64.EFI
├── fonts
│   ├── TRANS.TBL
│   └── unicode.pf2
├── grub.cfg
├── grubx64.efi
├── HDM-1.11.29_signed.bin //华三的HDM固件,忽略
├── initrd.img
├── MokManager.efi
├── TRANS.TBL
└── vmlinuz

docker-compose.yml

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
version: '3.4'
services:
nginx:
image: nginx:alpine
hostname: nginx
volumes:
- /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro
- ./http:/usr/share/nginx/html
- ./nginx-conf.d/:/etc/nginx/conf.d/
network_mode: "host"
logging:
driver: json-file
options:
max-file: '3'
max-size: 100m

tftp:
image: zhangguanzhang/tftp
hostname: tftp
volumes:
- /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro
- ./tftp:/var/tftpboot
command:
["--verbose", "--foreground", "--secure", "/var/tftpboot"]
network_mode: "host"
logging:
driver: json-file
options:
max-file: '3'
max-size: 100m

default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
autoindex on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

在交换机的dhcp里设置bootfile-name BOOTX64.EFI后pxe进入的菜单是grub.cfg的内容,而一般的官方的启动选项为

1
2
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
initrdefi /images/pxeboot/initrd.img

里面的inst.stage2=hd:LABEL=CentOS\x207\x20x86_64是指向带label的hard disk,这里需要修改为url,并且里面的vmlinuz和initrd要修改为根,需要把这俩文件从镜像文件拷贝到tftp的根目录里,这里我改为

1
2
linuxefi vmlinuz inst.repo=http://10.96.4.2/cvk ks=http://10.96.4.2:81/ks.cfg inst.ks.sendmac  inst.ks.sendsn quiet
initrdefi initrd.img

url 是从我自己go写的一个 web 占用的 81 端口,ks会在访问web渲染后返回获取的,详情上一篇,ks 文件里得加一行指定安装源

1
url --url="http://10.96.4.2/cvk"

一般网上的老资料都说在 append 后加启动选项ksdevice=eth0的指定获取ks的默认网卡,现在的centos里的anaconda已经改了逻辑会从每张网卡去retry获取,根本不需要指定,指定也可以,但是不是说不指定下会弹出选择需要人为去选择网卡

initrd-init

最后给个日志给懂的人

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
tftp daemon.notice in.tftpd[66]: RRQ from 10.0.23.31 filename /grub.cfg-01-9c-e8-95-d8-3c-cd
tftp daemon.notice in.tftpd[67]: RRQ from 10.0.23.31 filename /grub.cfg-01-9c-e8-95-d8-3c-cd
tftp daemon.notice in.tftpd[68]: RRQ from 10.0.23.31 filename /grub.cfg-0A00171F
tftp daemon.notice in.tftpd[69]: RRQ from 10.0.23.31 filename /grub.cfg-0A00171F
tftp daemon.notice in.tftpd[70]: RRQ from 10.0.23.31 filename /grub.cfg-0A00171
tftp daemon.notice in.tftpd[71]: RRQ from 10.0.23.31 filename /grub.cfg-0A00171
tftp daemon.notice in.tftpd[72]: RRQ from 10.0.23.31 filename /grub.cfg-0A0017
tftp daemon.notice in.tftpd[73]: RRQ from 10.0.23.31 filename /grub.cfg-0A0017
tftp daemon.notice in.tftpd[74]: RRQ from 10.0.23.31 filename /grub.cfg-0A001
tftp daemon.notice in.tftpd[75]: RRQ from 10.0.23.31 filename /grub.cfg-0A001
tftp daemon.notice in.tftpd[76]: RRQ from 10.0.23.31 filename /grub.cfg-0A00
tftp daemon.notice in.tftpd[77]: RRQ from 10.0.23.31 filename /grub.cfg-0A00
tftp daemon.notice in.tftpd[78]: RRQ from 10.0.23.31 filename /grub.cfg-0A0
tftp daemon.notice in.tftpd[79]: RRQ from 10.0.23.31 filename /grub.cfg-0A0
tftp daemon.notice in.tftpd[80]: RRQ from 10.0.23.31 filename /grub.cfg-0A
tftp daemon.notice in.tftpd[81]: RRQ from 10.0.23.31 filename /grub.cfg-0A
tftp daemon.notice in.tftpd[82]: RRQ from 10.0.23.31 filename /grub.cfg-0
tftp daemon.notice in.tftpd[83]: RRQ from 10.0.23.31 filename /grub.cfg-0

CATALOG