一个计算机技术爱好者与学习者

0%

通过远程控制接口批量安装系统

1. 前言

《通过远程控制接口给服务器安装系统》一文中,我们发现通过远程控制接口给服务器安装系统很方便。《Ubuntu系统批量自动安装》一文中,我们学会了使用PXE技术进行系统的批量安装。

这两者结合,能产生怎样的魔力?下面是见证奇迹的时刻。

需求:机房里有40台曙光I620-G20机器需要安装Ubuntu16 Server系统,曙光供应商说需要两天的工作量,报价五千元。那么自己安装的话,需要多长时间?也需要两天吗?

2. 安装步骤

1、进入机房,给40台机器配置远程控制接口的IP。参考《通过远程控制接口给服务器安装系统》的远程控制接口配置部分。

2、搭建PXE服务器。参考《Ubuntu系统批量自动安装》,并且进行改进。

3、远程控制批量安装系统。

3. 搭建PXE服务器

3.1. 基本准备

1、一台服务器,已经安装好了Ubuntu16 Server版系统,IP为172.16.0.162。
2、更换源列表并更新,参考《Ubuntu更换源列表》
3、切换到root用户,sudo -i
4、开启路由转发,echo 1 > /proc/sys/net/ipv4/ip_forward。务必开启,因为PXE服务器同时作为网关,不开启的话安装会卡住。
5、在PXE服务器上安装DNS服务(可选操作,没有什么影响)。

3.2. DHCP和FTP

本节主要参考How to Install Ubuntu via PXE Server Using Local DVD Sources

1、安装DHCP和FTP服务
apt-get install dnsmasq

2、指定DHCP网卡
ip add,看到正在使用的网卡为ens2f1(172.16.0.162)。

3、配置dnsmasq
vim /etc/dnsmasq.conf,在文件末尾添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface=ens2f1
dhcp-range=172.16.0.163,172.16.0.254,24h
dhcp-option=3,172.16.0.162
dhcp-option=6,172.16.0.162
dhcp-option=28,172.16.0.255
dhcp-option=42,0.0.0.0
dhcp-boot=pxelinux.0,172.16.0.162
enable-tftp
tftp-root=/tftpboot
# gateway to Internet
#dhcp-option=3,172.16.0.135
# real dns server
#dhcp-option=6,172.20.1.4
#server=8.8.4.4

dhcp-option=3表示网关,6表示域名服务器,28表示broadcast,48表示时间服务器。server表示DNS forwarder IPs Address。

需要注意的是,网关一定要配置,否则在使用内网镜像安装时会特别慢。在获取镜像时卡住半小时,查看安装日志如下图所示;在“Updating the list of available packages”时也会卡住半小时。

而且,最好不要让服务器连接到外网,否则安装过程中会自动从网络中获取更新,安装就会很慢。就像本文中的配置,网关和域名服务器都设置为PXE服务器的IP,而不是真实的可以访问外网的网关和域名服务器。

4、查看服务
systemctl status dnsmasq

3.3. 配置netboot

1、下载网络启动文件,只有43M

1
wget http://ftp.ubuntu.com/ubuntu/dists/xenial/main/installer-amd64/current/images/netboot/netboot.tar.gz

或者从ubuntu-16.04.4-server-amd64.iso镜像中拷贝,netboot.tar.gz相当于install/netboot目录的压缩文件。

2、解压文件

1
tar -xzvf netboot.tar.gz -C /tftpboot/

解压后的文件包括:

1
2
3
4
5
ldlinux.c32 -> ubuntu-installer/amd64/boot-screens/ldlinux.c32
pxelinux.0 -> ubuntu-installer/amd64/pxelinux.0
pxelinux.cfg -> ubuntu-installer/amd64/pxelinux.cfg/
ubuntu-installer/
version.info

3.4. 安装系统

1、远程连接需要安装系统的服务器,设置BIOS,选择从网络启动。

2、选择Install,正常安装系统即可,不过,系统镜像需要从外网下载。这里没有连接外网,就不再往下演示。

以上,实现了从网络安装源安装Ubuntu系统。但是存在两个问题,一个问题是系统镜像需要从外网下载,浪费带宽。另一个问题是安装过程中需要不断交互,浪费时间。

4. PXE服务器升级

4.1. 配置内网镜像

1、安装apache2
apt-get install apache2 -y

web根目录是 /var/www/html/

2、测试apache2
curl 127.0.0.1

3、重启apache2
/etc/init.d/apache2 restart

4、上传ubuntu-16.04.4-server-amd64.iso到用户目录。
scp ubuntu-16.04.4-server-amd64.iso test@172.16.0.162:~

5、挂载ubuntu-16.04.4-server-amd64.iso到ubuntu目录。在用户目录执行:

1
2
mkdir /var/www/html/ubuntu
mount ubuntu-16.04.4-server-amd64.iso /var/www/html/ubuntu

6、替换netboot为镜像中的netboot,否则内核版本的差异会导致安装失败。

1
2
rm -rf /tftpboot/*
cp -r /var/www/html/ubuntu/install/netboot/* /tftpboot/

7、再次安装系统,此时就可以从PXE服务器获取系统镜像了。

在选择镜像界面,上拉到enter information manually,回车。

archive hostname输入172.16.0.162。directory输入/ubuntu,注意,ubuntu后面不要有斜杠。
如果系统安装卡住,那么Alt+F2进入控制台,tail /var/log/syslog查看系统安装日志,根据日志进行排错。查看错误后Alt+F1返回图形安装界面。

8、安装完成的系统,启动后发现卡住。

这时Alt+F2切换到第二个终端,就可以正常使用系统了。

4.2. 添加硬盘启动

系统安装完成,如果依然从网络启动的话,那么每次启动依然会进入到Installer boot menu界面,除非再次修改BIOS首选启动项。不妨在Installer boot menu界面添加一个启动项,该启动项允许从本地硬盘启动。主要参考Install Ubuntu 16.04 via PXE and network boot

1、编辑pxelinux.cfg文件
vim /tftpboot/pxelinux.cfg/default,修改为:

1
2
3
4
5
6
7
8
9
10
11
12
# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
path ubuntu-installer/amd64/boot-screens/
include ubuntu-installer/amd64/boot-screens/menu.cfg
default ubuntu-installer/amd64/boot-screens/vesamenu.c32
prompt 0
# add localboot here
label localboot
menu label Boot from Disk
localboot 0

timeout 0

此外,timeout默认是0,这里可以改为60,那么6秒后会自动选择install选项。

2、再次通过网络启动,即可看到硬盘启动选项。

选中它回车,即可启动本地硬盘上的系统。

4.3. 自动选择安装源

以上安装,我们需要手动输入archive hostname和directory,能不能在安装过程中自动选择?当然可以。本方法主要参考PXEInstallServer

1、编辑txt.cfg
vim /tftpboot/ubuntu-installer/amd64/boot-screens/txt.cfg,原内容为:

1
2
3
4
5
6
7
8
9
10
default install
label install
menu label ^Install
menu default
kernel ubuntu-installer/amd64/linux
append vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet
label cli
menu label ^Command-line install
kernel ubuntu-installer/amd64/linux
append tasks=standard pkgsel/language-pack-patterns= pkgsel/install-language-support=false vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet

修改为:

1
2
3
4
5
6
7
8
9
10
default install
label install
menu label ^Install
menu default
kernel ubuntu-installer/amd64/linux
append ks=http://172.16.0.162/ks.cfg vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet
label cli
menu label ^Command-line install
kernel ubuntu-installer/amd64/linux
append tasks=standard pkgsel/language-pack-patterns= pkgsel/install-language-support=false vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet

2、在/var/www/html目录创建ks.cfg文件,内容为:

1
2
install
url --url http://172.16.0.162/ubuntu/

3、重新安装系统,即可省去设置archive hostname的步骤。

4.4. 配置无人值守

既然可以自动选择安装源,那么其他交互步骤可不可以自动选择?当然可以。控制安装过程的自动交互主要有两个文件:ks.cfg和ubuntu-server.seed。

4.4.1. ks.cfg

1、在安装菜单添加ks.cfg和ubuntu-server.seed
vim /tftpboot/ubuntu-installer/amd64/boot-screens/txt.cfg,修改为:

1
2
3
4
5
6
7
8
9
10
default install
label install
menu label ^Install
menu default
kernel ubuntu-installer/amd64/linux
append ks=http://172.16.0.162/ks.cfg preseed/url=http://172.16.0.162/ubuntu-server.seed vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet
label cli
menu label ^Command-line install
kernel ubuntu-installer/amd64/linux
append tasks=standard pkgsel/language-pack-patterns= pkgsel/install-language-support=false vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet

2、编辑/var/www/html/ks.cfg文件
参考《Ubuntu系统批量自动安装》一文中的ks.cfg。
编辑后的ks.cfg文件内容如下:

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
#Generated by Kickstart Configurator
#platform=AMD64 or Intel EM64T

#System language
lang en_US
#Language modules to install
langsupport en_US
#System keyboard
keyboard us
#System mouse
mouse
#System timezone
timezone Asia/Shanghai
#Root password
rootpw --disabled
#Initial user
user test --fullname "test" --iscrypted --password $1$AKq0i3Yu$Tunuha7bYwq5uUV62F2nF0
#Reboot after installation
reboot
#Use text mode install
text
#Install OS instead of upgrade
install
#Use Web installation
url --url http://172.16.0.162/ubuntu/
#System bootloader configuration
bootloader --location=mbr
#Clear the Master Boot Record
zerombr yes
#Partition clearing information
clearpart --all --initlabel
#System authorization infomation
auth --useshadow --enablemd5
#Network information
network --bootproto=dhcp --device=ens2f0
#Firewall configuration
#firewall --disabled --trust=ens2f0 --ssh
#Do not configure the X Window System
skipx

需要注意的是网卡的配置,这里的网卡名指的是需要安装系统的网卡名。

3、在/var/www/html目录创建ubuntu-server.seed文件,内容为空(暂时不配置)。

4、再次安装系统,绝大部分步骤都会自动进行选择了。但是,在分区部分卡住。

手动分区后,后续会全部自动安装。安装完成后,系统没有安装openssh服务。

4.4.2. ubuntu-server.seed

本文中,ubuntu-server.seed主要用来解决分区、选择软件等ks.cfg没有解决的问题。

1、编辑seed文件
vim /var/www/html/ubuntu-server.seed,添加:

1
2
3
4
d-i pkgsel/include string openssh-server
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select Finish partitioning and write changes to disk
d-i partman/confirm boolean true

其他配置可以参考/var/www/html/ubuntu/preseed/目录中的文件,不过本文中用不到其他配置了。

2、再次安装系统,此时就会自动分区,并且安装openssh服务了。全程不需要手动帮助设置,完美。

4.5. 配置手动安装

个别情况下,自动安装会失败,这时就需要手动安装,在Installer boot menu界面添加一个手动安装启动项即可。

1、编辑pxelinux.cfg文件
vim /tftpboot/pxelinux.cfg/default,修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)
path ubuntu-installer/amd64/boot-screens/
include ubuntu-installer/amd64/boot-screens/menu.cfg
default ubuntu-installer/amd64/boot-screens/vesamenu.c32
prompt 0
# add localboot here
label localboot
menu label Boot from Disk
localboot 0

label manual install
menu label Manual Install
kernel ubuntu-installer/amd64/linux
append ks=http://172.16.0.162/manual.cfg vga=788 initrd=ubuntu-installer/amd64/initrd.gz --- quiet

timeout 0

2、在/var/www/html目录创建manual.cfg文件,内容为:

1
2
install
url --url http://172.16.0.162/ubuntu/

3、重新安装系统,Installer boot menu界面就会出现手动安装选项。

5. 批量安装

1、远程连接需要安装系统的服务器,设置BIOS,选择从网络启动。

2、安装正常系统,有些机器在网络部分卡住。

此时,可以手动给网卡配置IP。但是,如果系统只检测到一个网卡,而这个网卡没有连接网线,那么无法完成接下来的安装。因为没有IP,所以无法通过获取ks.cfg等文件。

Alt+F2进入控制台,ip add看到IP设置成功,但是无法ping通PXE服务器。Alt+F1返回图形界面。

此时,最好的做法是进入机房,把网线接到可以检测到的那个网卡。然后Ctrl+Alt+Del重启服务器。

3、再次安装系统,即可顺利安装。

6. 配置静态IP

系统安装完成后,此时不能上网,需要给系统配置静态IP和网关,这时发现了一个小问题:系统中没有安装vim,自带的vi也有毛病。怎么办?使用nano。

1、编辑interfaces
sudo nano /etc/network/interfaces

2、保存文件
编辑完成,Ctrl+X退出,系统提示是否保存,输入Y回车,然后再次回车保存。

3、重启网络服务

1
2
3
4
sudo /etc/init.d/networking restart
# or
sudo ifdown ens2f0
sudo ifup ens2f0

重启网络服务后发现,此时网卡上有两个IP地址,而且只有DHCP分配的旧的IP地址生效(第一个)。

4、取消IP地址并重启网络服务

1
2
sudo ip addr flush dev ens2f0
sudo /etc/init.d/networking restart

此时静态IP就配置成功了。

7. 后记

给40台机器配置远程控制接口的IP,搭建PXE服务器,安装系统,配置静态IP,总计用时一周左右。从效率上讲不如外包找人安装,从研究上讲还是有很多收获的。还好最近清闲了一些,不然还真没时间把整个安装流程搞清楚。
之所以用时很久,主要是因为有一些机器之前使用过,所以安装的时候需要手动确认remove volume data,或者disk detect报错需要手动安装,如下图所示。

8. 书签

Netboot Install

PXE-netboot-install

Ubuntu 16.04 LTS (Xenial Xerus) Netboot

How to install PXE Server on Ubuntu 16.04

神奇的fdisk和dd命令

PXE网络克隆图文教程

DHCP tftp PXE实现Ghost网络克隆