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

0%

Ubuntu系统批量自动安装

1. 前言

《Ubuntu 14.04.5 Server物理机安装》一文中,我们安装了一台Ubuntu Server服务器,整个过程花费了很多时间。令人难过的是,还有15台机器需要安装!本来打算每天安装个一两台,慢慢来,今天老师提醒说为什么不使用脚本呢?对啊,为什么不试试脚本呢!这是一个思路。突然想起师兄曾说,机房的机器系统安装都是通过网络,这也是一个很好的思路啊!

按照上面两个思路,那就研究下批量安装Ubuntu系统的方法!

2. 原理篇

2.1. 历史

参考PXE、kickstart与preseed简介Linux装机利器Cobbler简述ubuntu 14.04 无人职守全自动安装-基础知识中,郝同学简单归纳了批量装机的发展。

历史上,很多同学都遇到过和我同样的问题,机器太多,需要挨个装机,简直就是折磨!

于是,为了降低批量装机的难度,出现了PXE技术,它将操作系统远程下载到本地运行,有了这个技术,我们就不需要再挨个机器插U盘安装系统。

有了PXE技术,依然需要在安装的过程中不停地与机器进行交互,设置选项,费时费力。为了减轻同学们的工作量,RedHat推出了kickstart,在安装操作系统前将其中出现的各种问题的应答内容提前写好,使整个操作系统的安装可以自动完成。Debian系的Ubuntu等感觉kickstart对自己不够友善,不能完全满足自己的要求,于是推出了preseed。

再后来,因为kickstart难度系数太高,RedHad又推出了cobbler,把批量装机的难度降低到了小学水平。

2.2. PXE

PXE是Intel公司开发的将操作系统远程下载到本地运行的一种技术。

本地网卡ROM中包含有PXE客户端软件。网卡启动时会发出DHCP请求,从PXE服务器端获得动态IP地址、网关及TFTP服务器信息后,它会自动下载一个用于引导操作系统的启动软件包到本地内存(不同的操作系统使用不同的PXE引导文件)中,再通过此软件加载操作系统启动文件,从而开始操作系统的安装工作。

PXE的详细介绍请参考自动化运维之-PXE实现系统批量自动安装PXE网络装机攻略

2.3. kickstart与preseed

在我们手动安装操作系统时,需要回答各种提示问题,而针对某种特定应用时,这种回答完全有章可循,如果我们能在安装操作系统时将其中出现的各种问题的应答内容提前写好,那么整个操作系统的安装就可以自动完成。

kickstart是RedHat公司针对自动安装RedHat、Fedora与CentOS这3种同一体系的操作系统而制定的问答规范。它一般会以.cfg作为文件后缀名,不仅可以自动应答一些简单问题,还可以指定操作系统需要安装的各种软件包,更可以在操作系统完装完成后自动执行一些脚本,这些脚本可以让我们直接配置系统。

通常,kickstart配置文件通过命令行工具system-config-kickstart生成。当然,我们更喜欢在CentOS图形界面环境下生成用于定制操作系统安装的配置文件。

preseed则是Debian/Ubuntu操作系统自动安装的问答规范,同样可以预定义Ubuntu如何安装,其配置更多通过手动处理。

2.4. cobbler

RedHat在2008年发布了网络安装服务器套件 cobbler(补鞋匠),它集成了PXE、DHCP、HTTP、TFTP、kickstart等服务,相对之前的 kickstart ,能够更加快捷、方便的批量布署redhat、centos类系统。

2.5. 选择

由上面的基础概念我们了解到,可选择的技术组合有:

  • PXE+DHCP+HTTP+TFTP+kickstart
  • PXE+DHCP+HTTP+TFTP+preseed
  • PXE+DHCP+HTTP+TFTP+kickstart+preseed
  • PXE+cobbler
  • PXE+cobbler+preseed

本文,我们选择PXE+DHCP+HTTP+TFTP+kickstart+preseed,主要参考PXE无人值守网络安装Ubuntu14.04PXE+kickstart自动安装ubuntu14.04在 Ubuntu 14.04 中配置 PXE 服务器

3. 实践篇

3.1. PXE服务器

PXE服务器选择我们手动安装好的那一台,系统是Ubuntu 14.04.5 Server (64-bit)版,当前IP为172.16.0.213。

配置为PXE服务器后网段为10.0.0.0/8,IP为10.0.0.100。

3.2. DHCP

1、安装isc-dhcp-server
sudo apt-get update

sudo apt-get install isc-dhcp-server -y

2、查看网卡和ip
ip add或者ifconfig,查看正在使用的局域网网卡,假设为eth0。

3、指定dhcp网卡
sudo vim /etc/default/isc-dhcp-server
拉到最底部,修改为:

1
INTERFACES="eth0"

4、配置dhcp服务
sudo vim /etc/dhcp/dhcpd.conf
在文件末尾添加:

1
2
3
4
5
6
7
8
subnet 10.0.0.0 netmask 255.0.0.0 {
range 10.0.0.101 10.0.0.200;
option subnet-mask 255.0.0.0;
option routers 10.0.0.100;
option broadcast-address 10.255.255.255;
filename "pxelinux.0";
next-server 10.0.0.100;
}

子网和掩码可以根据自己的需要设置。

filename "pxelinux.0";,指定PXE启动文件名。
next-server 10.0.0.100;,指定PXE服务器IP地址,TFTP服务器IP地址。

5、重启服务
service isc-dhcp-server restart

备注:也可以安装DNSmasq,DNSmasq实际上是一个集成工具,包含了DNS、DHCP、TFTP服务器。

3.3. TFTP

主要参考Tftpd-hpa

1、安装tftpd-hpa
apt-get install tftpd-hpa -y

2、给根目录添加读写权限
sudo chmod 777 /var/lib/tftpboot/

3、测试tftp

1
2
3
4
apt-get install tftp -y
cd ~
tftp 127.0.0.1
get version.info

4、tftpd开启关闭命令
sudo /etc/init.d/tftpd-hpa start

sudo /etc/init.d/tftpd-hpa stop

3.4. apache2

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

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

2、测试apache2
curl 127.0.0.1

3、重启命令
sudo /etc/init.d/apache2 restart

3.5. 文件准备

1、上传ubuntu-14.04.5-server-amd64.iso到用户目录。使用xftp上传,或者使用scp命令,这里使用scp命令。打开git bash,执行:
scp ubuntu-14.04.5-server-amd64.iso test@172.16.0.213:~

2、挂载ubuntu-14.04.5-server-amd64.iso到ubuntu目录。在用户目录执行:
sudo mkdir /var/www/html/ubuntu

sudo mount ubuntu-14.04.5-server-amd64.iso /var/www/html/ubuntu

3、拷贝部分文件到tftp
sudo cp -r /var/www/html/ubuntu/install/netboot/* /var/lib/tftpboot/

4、拷贝seed文件到web根目录
sudo cp /var/www/html/ubuntu/preseed/ubuntu-server.seed /var/www/html/

5、编辑seed文件
sudo vim /var/www/html/ubuntu-server.seed

在文件末尾添加:

1
2
d-i live-installer/net-image string http://10.0.0.100/ubuntu/install/filesystem.squashfs
d-i pkgsel/include string openssh-server

(1)因为在ubuntu12.10版本以后,安装一些包会依赖于预配置的文件系统,这就是导致使用kickstart方式无法成功安装的原因。
(2)自动安装ssh服务。

3.6. kickstart

ks.cfg中保存的是安装系统过程中默认的系统配置,没有这个文件就需要安装中对系统手动交互设置。kickstart则是方便编辑这个文件的,不用它的话也可以手工编辑。

kickstart需要GUI界面,我因为是安装的server,所以需要安装桌面(如果是desktop版本就不需要)。

1、安装图形界面
sudo apt-get install ubuntu-desktop -y

过程非常久,请先去继续读论文。

2、安装kickstart
sudo apt-get install system-config-kickstart -y

3、使用屏幕键盘连接主机,进入图形界面
sudo startx,或者直接重启sudo reboot

4、点击右上角“Search your computer and online resources”,搜索kickstart,启动kickstart。

5、然后,按照图示选择kickstart的配置。

附:上图的长图合成工具为 美图秀秀网页版

6、保存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
40
#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://10.0.0.100/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=eth0
#Firewall configuration
firewall --disabled --trust=eth0 --ssh
#Do not configure the X Window System
skipx

7、移动ks.cfg到web根目录
sudo mv ks.cfg /var/www/html/

8、修改txt.cfg
sudo vim /var/lib/tftpboot/ubuntu-installer/amd64/boot-screens/txt.cfg,原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://10.0.0.100/ks.cfg preseed/url=http://10.0.0.100/ubuntu-server.seed netcfg/get_nameservers=10.0.0.100 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

3.7. pxelinux.cfg

编辑pxelinux.cfg配置文件
sudo vim /var/lib/tftpboot/pxelinux.cfg/default

1
2
3
4
5
# D-I config version 2.0
include ubuntu-installer/amd64/boot-screens/menu.cfg
default ubuntu-installer/amd64/boot-screens/vesamenu.c32
prompt 0
timeout 60

timeout默认是0,改为60(6秒后自动选择install选项)。

3.8. 收尾

1、重新配置IP
sudo vim /etc/network/interfaces,修改eth0的IP为10.0.0.100:

1
2
3
4
5
6
7
8
9
10
11
12
13
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 10.0.0.100
gateway 10.0.0.100
netmask 255.0.0.0

2、重启eth0
sudo ifdown eth0sudo ifup eth0

3、重启dhcp
sudo service isc-dhcp-server restart

4、重新挂载镜像
sudo mount ubuntu-14.04.5-server-amd64.iso /var/www/html/ubuntu

5、检查各个服务
ps aux | grep dhcp

ps aux | grep apache

ps aux | grep tftp

6、把PC和PXE服务器连接到同一个交换机,测试一下PC能否获取到IP。

7、PC浏览器访问 http://10.0.0.100/ubuntu/ ,测试能否正常访问Web服务。

4. 安装篇

4.1. 安装步骤

1、把PXE服务器和需要安装系统的主机(下文统一称为目标主机)连接到同一个交换机。

2、目标主机开机启动进入BIOS,首选启动项选择PXE,保存退出。

3、然后,目标主机就会自动获取IP地址,连接PXE服务器,进入到安装界面。

4、在自动网络配置的时候失败,报错“Network autoconfiguration failed”,多次尝试依然失败。

Alt+F2,进入命令行界面,ip add,查看到已经获取到IP地址。

Alt+F1,切换回安装界面,这时需要手动配置,一次不行就再来一次。

5、安装过程中,分区后卡住,需要手动选择确认分区。

6、之后,无需任何操作,直到安装成功。

7、测试ssh服务
ssh test@localhost,顺利登录。

以上安装过程,已经省去了很多交互步骤,但是依然比较麻烦,主要存在两个问题:一个是自动配置网络的问题,一个是需要分区确认的问题。下面尝试解决这两个问题。

4.2. 网络问题

1、对于网络配置问题,在14.04 server PXE installation fails at “Configure the network” page 找到了可能的答案,也许是/var/lib/tftpboot/pxelinux.cfg/default 文件的问题,修改为:

1
2
3
4
5
6
7
8
9
10
# D-I config version 2.0
include ubuntu-installer/amd64/boot-screens/menu.cfg
default linux
label linux
menu default
menu label Linux
kernel ubuntu-installer/amd64/linux
append ks=http://10.0.0.100/ks.cfg preseed/url=http://10.0.0.100/ubuntu-server.seed vga=normal initrd=ubuntu-installer/amd64/initrd.gz --
prompt 0
timeout 60

问题依旧。最好再改回原来的/var/lib/tftpboot/pxelinux.cfg/default文件配置,因为这样启动时通过DHCP获取IP的时间明显变长了,有时还会出现无法获取IP以至于无法启动安装的情况。如果没有获取到IP,记得及时按下ctrl+alt+del,进行重启,不然要等很久才能开始第二次尝试。

2、莫非是dhcp配置的问题?参考14.04 server PXE installation fails at “Configure the network” page修改网卡配置为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 10.0.0.100
netmask 255.0.0.0
gateway 10.0.0.100
broadcast 10.255.255.255
dns-nameservers 10.0.0.100

重启网络,sudo ifdown eth0sudo ifup eth0
重启dhcp,sudo service isc-dhcp-server restart
问题依旧。

3、参考Install And Configure PXE Server On Ubuntu 14.04 LTSsudo vim /etc/dhcp/dhcpd.conf,在最后添加:

1
2
3
4
5
6
allow booting;
allow bootp;
option option-128 code 128 = string;
option option-129 code 129 = text;
next-server 10.0.0.100;
filename "pxelinux.0";

重启dhcp,sudo service isc-dhcp-server restart
问题依旧。

4、莫非是因为没有安装DNS?参考《Ubuntu14.04配置DNS Server》,安装好DNS。
问题依旧。

5、参考preseedssudo vim /var/www/html/ubuntu-server.seed,在尾部添加:

1
2
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string $hostname

问题依旧。

6、删除步骤第5次尝试的内容,参考sudo vim /var/www/html/ubuntu-server.seed,在尾部添加:

1
2
3
4
d-i netcfg/choose_interface select eth0
d-i netcfg/dhcp_timeout string 60
d-i netcfg/get_hostname string ubuntu
d-i netcfg/get_domain string ubuntu-domain

问题依旧。

7、删除步骤第6次尝试的内容,参考基于PXE和preseed安装Ubuntu-14.04 Server 64位操作系统sudo vim /var/www/html/ubuntu-server.seed,在尾部添加:

1
2
3
4
5
d-i netcfg/choose_interface select eth0
d-i netcfg/dhcp_failed note
d-i netcfg/dhcp_options select Do not configure the network at this time
d-i netcfg/get_hostname string ubuntu
d-i netcfg/get_domain string ubuntu-domain

问题依旧。

8、参考附录 B. 使用预置自动进行安装sudo vim /var/www/html/ubuntu-server.seed,在尾部添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# If you prefer to configure the network manually, uncomment this line and
# the static network configuration below.
d-i netcfg/disable_dhcp boolean true
d-i netcfg/disable_autoconfig boolean true
d-i netcfg/use_autoconfig boolean false

# If you want the preconfiguration file to work on systems both with and
# without a dhcp server, uncomment these lines and the static network
# configuration below.
d-i netcfg/dhcp_failed note
d-i netcfg/dhcp_options select Configure network manually

# Static network configuration.
#
# IPv4 example
d-i netcfg/get_ipaddress string 10.0.0.134
d-i netcfg/get_netmask string 255.0.0.0
d-i netcfg/get_gateway string 10.0.0.100
d-i netcfg/get_nameservers string 10.0.0.100
d-i netcfg/confirm_static boolean true

问题依旧。感觉netcfg这个系列的命令根本没有生效!

附录 B. 使用预置自动进行安装一文中说,例如,为网卡设置静态地址。它使加载了预置文件以后网络预置再运行一次,这需要将下面的命令包含在 “preseed/run” 脚本里面:
kill-all-dhcp; netcfg

于是在Is it possible to download a bash script and execute it from a preseed file?kill-all-dhcp中找到了使用脚本的方法。
(1)创建脚本
sudo vim /var/www/html/run.sh
写入内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
# Killall for dhcp clients.

kill-all-dhcp;
netcfg;
for client in dhclient udhcpc pump dhcp6c; do
pid=$(pidof $client) || true
[ "$pid" ] || continue

if kill -0 $pid 2>/dev/null; then
kill -TERM $pid
sleep 1
# Still alive? Die!
if kill -0 $pid 2>/dev/null; then
kill -KILL $pid
fi
fi
done

(2)变更权限
sudo chmod a+x /var/www/html/run.sh

(3)在ubuntu-server.seed文件中添加一行:

1
d-i preseed/run string run.sh

问题依旧,但是Alt+F2进入命令行,发现获取的IP确实没有了。

9、莫非,是因为DHCP的网段问题?折腾了一个多小时,PXE服务器地址换成192.168.34.1,DHCP换成了192.168.34.0网段,然而并没有什么用。

最终,我猜测这个锅是ubuntu14的,或者是电脑硬件的。在askubuntu上进行了提问,但是没有得到满意的回复。

4.3. 分区问题

1、参考Ubuntu Kickstart installation using LVM waits for input,修改ks.cfg文件。

sudo vim /var/www/html/ks.cfg,添加:

1
preseed partman-lvm/confirm_nooverwrite boolean true

问题依旧。

2、sudo vim /var/www/html/ks.cfg,添加:

1
2
3
4
5
preseed partman-lvm/confirm_nooverwrite boolean true
preseed partman-lvm/device_remove_lvm boolean true
preseed partman/confirm_write_new_label boolean true
preseed partman/confirm boolean true
preseed partman/confirm_nooverwrite boolean true

问题依旧。

3、删除ks.cfg中添加的内容,参考Automated Kickstart Partitioningsudo vim /var/www/html/ubuntu-server.seed,在末尾加上:

1
2
3
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

分区成功,吼吼吼!折腾了一整天,总算有点成就,泪流满面。。。让我安静的哭一会。。。

5. 后记

配置Ubuntu批量自动安装的过程中,发现最重要的两个文件是/var/www/html/ks.cfg/var/www/html/ubuntu-server.seed,因为他们两个是控制交互的。

折腾的过程中学到了很多东西,而最终的成果,除了网络需要手动配置之外,其他都很满意。我会继续尝试解决网络配置的问题,有了进展,再更新本文。

6. 书签

PXE无人值守网络安装Ubuntu14.04

KICKSTART无人值守安装

COBBLER无人值守安装

Cobbler+preseed自动化安装Ubuntu系统

Ubuntu 16.04.2 LTS PXE全自动安装

u盘全自动安装 ubuntu server 12.04

CentOS/Ubuntu制作自动安装iso实操

Installation/UnattendedCD

PXELINUX

第二章、安裝伺服器與 kickstart 大量部署用戶端電腦