第 1 章 OpenStack基本操作系统环境的PXE自动部署

第 1 章 OpenStack基本操作系统环境的PXE自动部署

在本章中,我们重点阐述CentOS以及Ubuntu操作系统的自动化部署问题。

很多熟悉CentOS、刚刚接触OpenStack的人碰到的一个麻烦是,网上关于OpenStack的安装指导资料多是以Ubuntu为基础的,CentOS方面的资料相对较少,这是因为以Ubuntu为基础来学习OpenStack更容易一些。

另外一个问题是,刚开始学习时,我们通常只有非常少的服务器,面对OpenStack那么多组件,如果不考虑将所有的控制服务都安装到一台机器中,而是尝试多点部署OpenStack组件,就需要将MySQL、RabbitMQ、Nova API、Keystone、Glance等分别安装到不同的虚拟机之中。此时,应该选择哪个操作系统作为运行虚拟机的基础操作系统呢?

CentOS操作系统的很多发行版光盘都是图形界面的形式,在上面创建与管理虚拟机较为方便;而Ubuntu的服务器版本多是字符终端的形式,如果在上面创建虚拟机,就意味着要用大量的命令行操作。但OpenStack的学习资料又多是以Ubuntu为基础的,那该怎么办呢?

一个好的思路是在CentOS上创建多个Ubuntu虚拟机来运行OpenStack的多个控制服务,而计算节点则直接采用Ubuntu,因为计算节点由OpenStack系统直接控制,并不需要我们通过命令行来创建虚拟机。这样的话,整个OpenStack系统都跑在Ubuntu上,并且可以直接参考网上资料,上手快一些。在本书后面关于OpenStack的实验环境中,我们采用的就是这种结构。这样,我们通常只需要大约两台服务器就可以搭建出多点部署的OpenStack结构。

对于初学者来说,因为实验环境简单,自动化安装操作系统并不是一件急需学习的任务。但如果后期开始在生产环境中使用,那么大量部署CentOS或Ubuntu则是一件必需的工作了,这也是本章的目的所在。

虽然在网上可以很容易找到关于使用Kickstart安装CentOS或Ubuntu的案例,但读者最终会发现,Kickstart虽然可以很好地安装CentOS,但却无法满足我们灵活安装Ubuntu的需要,而Ubuntu自身的Preseed配置文件机制才能让我们具备灵活调整安装Ubuntu的能力。

迫使我们不得不寻求自动安装Ubuntu系统的另一个原因是:安装Ubuntu光盘时,需要从美国的软件源下载并更新各软件模块,但网络下载非常慢,基本上处于不可接受的状态。我们更期望能直接从国内的搜狐或163的源下载相关软件,这样会快很多,而如果要做这种调整,不得不学习Preseed方法。

费力学习的好处是,你可以心情舒畅地看着几十台机器都在自动安装操作系统,这期间你大可做你想做的事。而更让人充满想象的是,你可以附加一些脚本,直接将OpenStack的计算节点所需要的软件全部一次性安装到位。

1.1 PXE、Kickstart与Preseed简介

PXE是一种远程启动技术,结合使用CentOS的Kickstart和Ubuntu的Preseed机制,我们就可以达到自动化安装操作系统的目标。

1.1.1 PXE简介

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

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

1.1.2 Kickstart与Preseed简介

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

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

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

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

1.2 PXE服务器的准备

要使用PXE技术,需要在系统中准备一台服务器,我们将其称为PXE服务器,它通过网络与其他需要安装服务器的客户机连接。首先,我们需要将CentOS、Ubuntu或Windows等操作系统光盘中的文件复制到PXE服务器中,然后当客户机通过PXE技术与服务器成功建立连接后,就可以自动引导操作系统的安装了。

1.2.1 选择Ubuntu操作系统

在安装PXE服务器时,我们首先会考虑使用CentOS操作系统。因为Kickstart就是首先在CentOS上使用的,很多人对自动化安装的尝试也都是从听到Kickstart的方法开始的。但试验发现,虽然CentOS的Kicksart机制可以很好地支持CentOS客户机安装,但若客户机需要安装Ubuntu,则仅仅能提供最基础的支持。一旦需要调整Ubuntu的安装源、预安装包等,Kickstart就无能为力了,此时需要使用Ubuntu本身的Preseed机制。因此,在我们的测试中,如果选择Ubuntu作为PXE服务器的操作系统,那么它不仅可以支持CentOS的安装,也可以很好地支持Ubuntu的安装。

1.2.2 Ubuntu操作系统的基本安装与更新

注意 在本书中,我们选择的Ubuntu操作系统均指Ubuntu 14.04 LTS版本。关于它的基本安装信息,请参考Ubuntu官方资料。这里需要说明的是,在安装完成后,禁用iptables及selinux以简化后续过程。

安装完Ubuntu 14.04 Server后,还需要配置网卡、安装ssh server以及更新源等一系列工作。

1. 设置服务器IP地址

这里我们使用实验环境中的IP地址,网卡配置文件如下:

auto eth0
iface eth0 inet static
address 172.16.112.40
netmask 255.255.255.0
gateway 172.16.112.2
dns-nameservers 61.139.2.69

2. 安装ssh server

安装ssh server的相关命令如下所示:

apt-get install openssh-server

3. 更新Ubuntu的源

备份原来的源并将安装源更新为国内源,以提高安装速度:

root@pxeubuntu:/etc/apt# cd /etc/apt
root@pxeubuntu:/etc/apt# cpsources.list sources.list.00

将Ubuntu源文件sources.list更新为国内163或搜狐的源,下面是更新后的文件:

deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse

deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse

deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse

deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse

deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse

deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse

deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse

deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse

deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse

deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse

4. 更新系统与确认签名

更新系统:

apt-get update

若系统提示如下信息:

Reading package lists... Done
W: GPG error: http://extras.ubuntu.com precise Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 16126D3A3E5C1192

则说明此安装源需要得到签名,以下是签名方法:

apt-key adv -keyserver keyserver.ubuntu.com --recv-keys 16126D3A3E5C1192

执行如下命令,再次更新系统:

apt-get update
apt-get upgrade

至此,PXE服务器的Ubuntu操作系统准备完毕。

5. 安装与配置NTP、DHCP、TFTP服务

PXE服务器需要通过DHCP服务为客户端分配动态IP地址,通过TFTP服务让客户端下载各种操作系统的引导文件。这里我们选择dnsmasq作为DHCP服务与TFTP服务,安装并配置如下:

apt-get install dnsmasqntp

配置NTP服务,其中配置文件/etc/ntp.conf如下:

server 127.127.1.0
fudge 127.127.1.0 stratum 8
server 172.16.112.40 mask 255.255.255.0 nomodify
restrict 127.0.0.1

配置TFTP服务时,需创建TFTP服务的根目录,这里指定/var/tftproot作为根目录,操作如下:

cd /var/
mkdirtftproot

配置dnsmasq的DHCP服务,其配置文件/etc/dnsmasq.conf如下:

bogus-priv
filterwin2k
interface=eth0
domain=xinlixun.cn
dhcp-range=172.16.112.41,172.16.112.49,12h
dhcp-option=3,172.16.112.2
dhcp-option=6,61.139.2.69
dhcp-option=121,172.16.112.0/24
dhcp-boot=/var/tftproot/pxelinux.0
enable-tftp
tftp-root=/var/tftproot
dhcp-authoritative

下面简要介绍上述配置文件中的相关内容。

  • 分配172.16.112.41-172.16.112.49为客户端通过DHCP获得的IP地址范围。

  • 172.16.112.2是互联网的网关。

  • 61.139.2.69 是域名服务器。

  • 网络掩码是 24,即配置文件的netmask=255.255.255.0

  • PXE客户端获得IP地址后,使用TFTP协议下载/var/tftproot/pxelinux.0文件作为PXE的启动文件。

6. HTTP 服务的作用与安装

当客户端获得IP地址并成功引导了pxelinux.0文件后,需要进一步下载PXE上需要安装的操作系统文件。下载文件使用的方法主要有NFS与HTTP两种。相对来说,使用HTTP较为简单一点。在本例中,我们选择Apache2作为HTTP的服务软件(简单地看,Apache2对Preseed机制提供的支持比Nginx更好)。安装Apache2服务的命令如下:

apt-get install apache2

安装完Apache2服务后,HTTP服务的根目录是/var/www/html,这里需将根目录调整为/var/www/:

sed -i "/DocumentRoot/{s/html\///}" /etc/apache2/sites-enabled/000-default.conf
service apache2 restart

7. Kickstart与Preseed配置文件的生成

如前所述,Kickstart可以使用命令行工具system-config-kickstart或在CentOS下使用图形界面来生成配置文件,而Preseed配置文件只能手工完成。安装kickstartconfig配置工具的命令如下:

apt-get install system-config-kickstart

1.3 复制Ubuntu和CentOS操作系统文件

当准备完基本的PXE服务器基础环境后,我们就需要进一步将客户端需要安装的操作系统文件复制到PXE服务器中。

1.3.1 复制Ubuntu操作系统全目录、内核与启动镜像文件

复制工作主要将PXE启动文件与操作系统文件分别放入/var/tftproot以及/var/www/ubuntu目录中。

前面我们将Ubuntu操作系统下载到服务器目录中,现在将其挂载至/mnt目录,相关命令如下:

mount ubuntu-14.04.2-server-amd64.iso /mnt -o loop

复制PXE启动文件及操作系统文件的命令如下:

cp -r /mnt/install/netboot/* /var/tftproot
mkdir -p /var/www/ubuntu
cp -a /mnt/* /var/www/ubuntu

这里需要说明的是,Ubuntu操作系统的PXE启动文件存在于ISO镜像的/install/netboot目录中,包含以下内容。

  • PXE启动所需要的pxelinux.0。

  • pxelinux.cfg目录:它下面有default 文件,用于指示客户PXE启动后的进一步动作,比如选择哪一个镜像文件菜单。

  • default文件:它实际指向ubuntu-install/amd64/boot-screens/syslinux.cfg。

  • ubuntu-install/amd64目录:这个目录下有 initrd.gz与linux内核这两个文件。

1.3.2 复制CentOS操作系统全目录、内核与启动镜像文件

CentOS的发行版通常有两张光盘,我们需要将这两张光盘复制到PXE操作系统中。如同Ubuntu一样,需要处理操作系统本身及PXE引导部分,复制过程如下。

(1) 将CentOS 6.2的第一张光盘复制到PXE操作系统中。

将整个CentOS文件复制到/var/www/CentOS目录下,相关命令如下:

mount CentOS-6.2-x86_64-bin-DVD1.iso /mnt -o loop
mkdir - p /var/www/CentOS
cp -rf /mnt/* /var/www/CentOS

将CentOS的内核及启动镜像文件复制到/var/tftproot/CentOS目录下,相关命令如下:

mkdir -p /var/tftproot/CentOS
cp /mnt/images/pxeboot/initrd.img  /var/tftproot/CentOS
cp /mnt/images/pxeboot/vmlinuz /var/tftproot/CentOS

(2) 将CentOS 6.2的第二张光盘复制到PXE操作系统中。

这里需要说明的是,将CentOS的第二张光盘也装入,可以保证安装图形桌面时文件齐全。具体方法是:将第二张光盘中Packages中的rpm包复制到第一张光盘中的Packages目录即可,操作如下:

mount /home/romi/ISO/CentOS-6.2-x86_64-bin-DVD2.iso /mnt -o loop
cp -rf /mnt/Packages/* /var/www/CentOS/Packages

1.4 PXE客户端操作系统的选择与引导过程

为了在PXE客户启动时能够选择安装的操作系统类型,我们需要做一些导示文件。

1.4.1 创建PXE客户端导示文件

为了使PXE客户端启动时,能够选择安装CentOS还是Ubuntu,需要准备一下引导菜单文件/var/tftproot/boot.msg,该文件的内容如下:

### START INSTALLING ######
Choose installation type(0/1/2),the DEFAULT is 100:

0 ubuntu basic: ubuntu install through ks.cfg
1 ubuntucomput node: Ubuntu-12.04-LTS-amd64-No RAID install,preseed
......
6 CentOS-6.2-64-No-RAID-Basic
......
10 CentOS-6.2-64-No-RAID-minidesktop-virtualization-for testing

上述文件的意思是,如果按0或者1,表示安装Ubuntu;如果按6或者10,表示安装CentOS。这4项更进一步的解释如下所示。

  • 0:表示ubuntu basic,是指通过Kickstart安装最基本的Ubuntu,使用的是美国源,安装速度基本无法接受。

  • 1:表示ubuntu compute node,该安装方式是通过Ubuntu 特有的Preseed机制进行安装,适合于OpenStack的计算节点。

  • 6:用于安装基本的CentOS无图形界面。

  • 10:用于安装包含最小图形界面环境及虚拟化运行与管理工具软件包的CentOS。

对于我们需要的OpenStack实验环境或生产环境来说,这里我们主要关心1与10的安装配置。其原因是使用Ubuntu 的Preseed配置方法,可以很方便快速地安装OpenStack计算节点,而带有最小图形界面以及虚拟化运行及管理工具的CentOS系统则方便我们安装OpenStack控制服务的各个虚拟机。

1.4.2 选择安装配置文件

当客户选择了相关操作系统所代表的数字后,就将由/var/tftproot/pxelinux.cfg/default文件进一步指定使用的相关配置文件,比如当客户选择0时,系统就通过http服务将/var/www/cfg/ ubuntu-ks-noraid.cfg文件回应给客户端:

#iD-I config version 2.0

#include ubuntu-installer/amd64/boot-screens/menu.cfg
#default ubuntu-installer/amd64/boot-screens/vesamenu.c32
#prompt 0
#timeout 0

default 100
display boot.msg                                                    ①

#label 100,boot from hddisk
LABEL 100
localboot 0x80                                                      ②

#################### ubuntu install #################

#########label 0,install CentOS,sigledisk,mini basic
label 0
kernel ubuntu-installer/amd64/linux
append ks=http://172.16.112.40/cfg/ubuntu-ks-noraid.cfg vga=normal
    initrd=ubuntu-installer/amd64/initrd.gz --quiet

#####label 1,install ubuntu,sigle disk
label 1
kernel ubuntu-installer/amd64/linux
append priority=critical interface=eth0 netcfg/dhcp_timeout=120
    console-setup/layoutcode=us auto=true
    preseed/url=http://172.16.112.40/cfg/ubuntu-preseed-noraid.cfg
    vga=normal initrd=ubuntu-installer/amd64/initrd.gz --quiet

#########label 6,install CentOS,sigledisk,mini basic
label 6
kernel CentOS/vmlinuz
append ks=http://172.16.112.40/cfg/CentOS-ks-noraid-minibasic.cfg
    vga=normal initrd=CentOS/initrd.img devfs=nomount ramdisk_size=9216 nofb

#label 10,install CentOS,noraid virtualization for testing
label 10
kernel CentOS/vmlinuz
append ks=http://172.16.112.40/cfg/CentOS-ks-noraid-minidesktop-virtualization.cfg
    vga=normal initrd=CentOS/initrd.img devfs=nomount ramdisk_size=9216 nofb


prompt 1
timeout 900

第①~②行代码是指客户等待一定时间且无任何选择时,则从客户端本地硬盘启动。这可以避免一些已安装有操作系统的机器网卡处于PXE启动状态时,不会冲掉已有的系统。

preseed/url=http://172.16.112.40/cfg/ubuntu-preseed-noraid.cfgks=http://172.16.112.40/cfg/CentOS-ks-noraid-minidesktop-virtualization.cfg这两条语句用于给出客户端取得安装配置文件的URL地址。cfg实际存放在服务器的/var/www/cfg/目录下。

修改文件/var/tftproot/pxelinux.cfg/default时,会遇到以下错误:

E45: 'readonly' option is set (add ! to override)

这主要是因为文件/var/tftproot/pxelinux.cfg/default为一个软连接,并非真实数据文件。真实的数据文件为:

root@ubuntu:/var/tftproot# ll ubuntu-installer/amd64/pxelinux.cfg/default
    lrwxrwxrwx 1 root root 28 Jul  2 10:43 ubuntu-installer/amd64/pxelinux.cfg/default -> ../boot-screens/syslinux.cfg

查看该真实文件的权限属性:

root@ubuntu:/var/tftproot# ll ubuntu-installer/amd64/boot-screens/
    syslinux.cfg-r--r--r-- 1 root root 154 Jul  2 10:43 ubuntu-installer/
    amd64/boot-screens/syslinux.cfg

这里文件的访问极限为只读。

要想修改此文件内容,需先修改文件属性:

root@ubuntu:~# chmod 755 /var/tftproot/ubuntu-installer/amd64/
    boot-screens/syslinux.cfg

1.5 CentOS宿主机的Kickstart配置文件

在本书的示例中,我们的OpenStack 控制服务均运行在Ubuntu上,而运行Ubuntu操作系统的虚拟机均运行在操作系统为CentOS的宿主机上。

为了简化虚拟机管理工具,我们要求宿主机的CentOS操作系统需要带最小图形化界面且包含了虚拟化运行环境(KVM)与管理工具virt-manager的软件包。

为了生成Kickstart配置文件,我们可以直接利用一台具备图形界面的CentOS的服务器,在其上执行system-config-kickstart命令,此时会进入如图1-1所示的图形化配置界面。

{%}

图 1-1 Kickstart Configurator配置界面

通过Kickstart Configurator工具,我们可以选择需要安装的软件包,选择完成后,即可将其保存为.cfg结尾的符合Kickstart规范的定制化安装配置文件。将生成的配置文件保存为/var/www/cfg/CentOS-ks-noraid-minidesktop-virtualization.cfg,其内容如下:

#  platform=x86, AMD64, or Intel EM64T
#  version=DEVEL
#  Firewall configuration
firewall --disabled

# Install OS instead of upgrade
install

# Use network installation
url --url=http://172.16.112.40/CentOS                                       ①

# Root password
rootpw --iscrypted $1$NpEsMYw2$.qy.nwjRxbAU2NWZ.kCz9.
user --name="romi" --password="password"
#########zzf12345 crypted: $1$NpEsMYw2$.qy.nwjRxbAU2NWZ.kCz9.

# System authorization information
auth  --useshadow  --passalgo=sha512

# Use graphical install
graphical
firstboot --disable

# System keyboard
keyboard us

# System language
langen_US

# SELinux configuration
selinux --disabled

# Installation logging level
logging --level=info

# Reboot after installation
reboot

# System timezone
timezone --isUtc Asia/Chongqing

# Network information
network  --bootproto=dhcp --device=eth0 --onboot=on

# System bootloader configuration
bootloader --location=mbr

# Clear the Master Boot Record
zerombr

# Partition clearing information
clearpart --all -initlabel

# Disk partitioning information                                             ②
part /boot --asprimary --fstype="ext4" --ondisk=sda --size=100
part swap --fstype="swap" --ondisk=sda --size=8192                          ③
part pv.100 --size=20480  --grow                                            ④
volgroupmyvg pv.100                                                         ⑤
logvol / --fstype="ext4" --name=lv_root --vgname=myvg --size=20480 --grow   ⑥

%packages

####### CentOS mini desktop packages ############
@base
@basic-desktop
@chinese-support
@desktop-debugging
@desktop-platform
@directory-client
@fonts
@input-methods
@internet-browser
@java-platform
@legacy-x
@network-file-system-client
@remote-desktop-clients
@server-platform
@x11


######## graphic admin tools #############
@graphical-admin-tools
audit-viewer
firstaidkit-gui
policycoreutils-gui
sabayon
setroubleshoot
system-config-kickstart
system-config-lvm
wireshark-gnome

############ virtualization tools ########
@virtualization
@virtualization-client
@virtualization-platform
@virtualization-tools
fence-virtd-libvirt
fence-virtd-multicast
fence-virtd-serial
libguestfs-java
libguestfs-tools
libvirt-cim
libvirt-java
libvirt-snmp
perl-Sys-Virt
qemu-kvm-tools
virt-v2v

%post --interpreter=/bin/bash                                               ⑦
echo "nameserver 61.139.2.69" >> /etc/resolv.conf                           ⑧

上述配置文件相关要点解释如下。

  • 操作系统下载的文件位置指定。第①行代码即指明当操作系统安装时,从服务器的/var/www/CentOS目录下取CentOS相关的安装文件。

  • 硬盘分区与LVM。由于我们使用的服务器均自带RAID阵列,所以不需要使用软件阵列方法,直接将所有的磁盘当成一块大容量磁盘即可,分区处理如下。

    • 首先分出一个可以启动的主分区/boot与swap。注意SAS硬盘标记为sda,而如果是IDE或SATA硬盘,通常标记为had,详见第②行至第③行代码。

    • 将余下的硬盘空间做成一个pv并创建卷组,将其初始大小设为20GB,且可增长,具体如第④行和第⑤行代码所示。

    • 在此卷组上创建各个分区,其中每个分区都可指定初始值与最大值,具体如第⑥行代码所示。

  • %packages 标记的后续行指定需要安装的软件包。

  • 安装操作系统时,可以提前预配置某个文件,这样我们有机会为操作系统做更多定制,具体如第⑦行和第⑧行代码所示。

  • 指定grub 引导程序的安装位置。如果没有额外的语句指定,系统会自动安装到 (hd0,0)的硬盘上。但对一些软件RAID来说,有时我们需要同时也安装到第二块硬盘的引导分区上,此时可以添加如下语句:

    grub> device (hd1) /dev/sdb
    grub> root (hd1,0)
    grub> setup (hd1)
    grub> quit
    
    

1.6 OpenStack计算节点的主机Preseed配置文件

本书中的OpenStack计算节点均采用Ubuntu操作系统,使用Preseed方法定制配置文件。

计算节点的服务器通常都自带RAID阵列,因此并不需要考虑软件阵列设置。Ubuntu安装配置文件/var/www/cfg/ubuntu-preseed-noraid.cfg具体如下所示:

### Localization.
d-i auto-install/enable boolean true
d-idebian-installer/locale string en_US
d-ilocalechooser/translation/warn-light boolean true
d-ilocalechooser/translation/warn-severe boolean true
d-i console-setup/ask_detectboolean false
d-i keyboard-configuration/layoutcode string us

### Net interface setting.
d-inetcfg/choose_interface select eth0                        ①
d-inetcfg/dhcp_timeout string 60
d-inetcfg/get_hostname string nova                            ②
d-inetcfg/get_domain string xinlixun.cn                       ③

### Mirror setting. use the http proxy.
d-i mirror/country string manual
d-i mirror/protocol string http
d-i mirror/http/hostname string cn.archive.ubuntu.com         ④
d-i mirror/http/directory string /ubuntu                      ⑤
d-i mirror/http/proxy string

### Clock and timezone setting. use local ntp.
d-i clock-setup/utcboolean true
d-i time/zone string Asia/Chongqing                           ⑥
d-i clock-setup/ntpboolean true
d-i clock-setup/ntp-server 210.72.145.44                      ⑦

### Partioning setting.
#d-ipartman-auto/disk string /dev/sda
d-ipartman-auto-lvm/guided_size string max
d-ipartman-auto/choose_recipe select atomic
d-ipartman-auto/method string lvm                             ⑧
d-ipartman-lvm/confirm boolean true
d-ipartman-lvm/confirm boolean true
d-ipartman-lvm/confirm_nooverwriteboolean true
d-ipartman-lvm/device_remove_lvmboolean true
d-ipartman/choose_partition select finish
d-ipartman/confirm boolean true
d-ipartman/confirm_nooverwriteboolean true
d-ipartman/confirm_write_new_labelboolean true

### Account setting.
d-ipasswd/root-login boolean false                            ⑨
d-ipasswd/user-fullname string Romi Zhang
d-ipasswd/username string romi
d-ipasswd/user-password password password
d-ipasswd/user-password-again password password               ⑩
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false

###After the Ubuntu12.10, preseedfile need live-installer.
d-i live-installer/net-image string http://172.16.112.40/ubuntu/install/filesystem.squashfs

### Package selection.
d-ipkgsel/include string openssh-server
d-ipkgsel/upgrade select none
d-ipkgsel/update-policy select none
taskseltasksel/first multiselect standard, ubuntu-server      ⑪

### Boot loader installation.
d-i grub-installer/only_debianboolean true                    ⑫
d-i grub-installer/with_other_osboolean true                  ⑬

### finishing up the installation.
d-i finish-install/reboot_in_progress note

### Running custom commands.
d-ipreseed/late_command string df> /target/home/romi/df.txt
d-ipreseed/late_command string \
in-target touch /root/pxetest ; \
in-targetcp /root/pxetest /tmp/pxetest

### Unmount the /dev/sda1.
d-ipreseed/early_command string umount /media

该配置文件中的要点说明如下。

  • 第①行代码指定客户端使用的PXE网卡。

  • 第②行和第③行代码指定客户端的主机名与域名。

  • 第④行代码指定Ubuntu安装源时,需要指向国内的Ubuntu源而不能直接指向mirrors.163.com,否则会出现在Ubuntu 基本软件包(base)安装时找不到内核(kernel)文件的情况。

  • 第⑤行代码指定Ubuntu操作系统文件下载目录,这里是指向PXE服务器的/var/www/ubuntu目录。

  • 第⑥行和第⑦行代码指定Ubuntu时区与授时中心,这里指向中国的授时中心IP地址:210.72.145.44。

  • 硬盘分区选项,这里采用标准的lvm方式,如第⑧行代码所示。

  • 用户系统目录加密选项,要注意第⑨行代码,这样才能不用加密。

  • 创建用户名及密码选项,与CentOS不同,Ubuntu安装时不会创建root用户,我们需要创建一个非root用户,并赋予密码,该用户具备使用sudo命令的权限,如第⑨~⑩行代码所示。

这里我们使用了明文密码,读者若要使用md5方法加密密码,可进一步参见官方文档此部分内容的相关语句。

  • 选择Ubuntu 安装包,这里选择安装标准的包,即standard,如第行代码所示。

  • 安装boot loader选项,这里是指grub引导程序,如第行和第行代码所示。

安装完Ubuntu系统后,使用fdisk -l命令查看分区的情况,得到的结果如下所示:

Disk /dev/sda: 1199.1 GB, 1199101181952 bytes
255 heads, 63 sectors/track, 145782 cylinders, total 2341994496 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000aa2b2

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      499711      248832   83  Linux
/dev/sda2          501758  2341992447  1170745345    5  Extended
/dev/sda5          501760  2341992447  1170745344   8e  Linux LVM

Disk /dev/mapper/ubuntu-root: 1164.5 GB, 1164493979648 bytes
255 heads, 63 sectors/track, 141574 cylinders, total 2274402304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/ubuntu-root doesn't contain a valid partition table

Disk /dev/mapper/ubuntu-swap_1: 34.3 GB, 34347155456 bytes
255 heads, 63 sectors/track, 4175 cylinders, total 67084288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/ubuntu-swap_1 doesn't contain a valid partition table

1.7 使用PXE安装CentOS 7的脚本

使用PXE安装操作系统CentOS 7也是相同的方法,只需要使用CentOS 7对应的Kickstart安装脚本即可。此处给出CentOS 7的配置脚本,仅作参考:

# platform=x86, AMD64, or Intel EM64T
# version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Reboot after installation
reboot
# Root password
rootpw --iscrypted $1$KEKVRRLj$GbaEa4dC8CirdAbuDvq9e1
user --name="romi" --password="password"
# System timezone
timezone Asia/Chongqing
# Network information
network ?--bootproto=dhcp --device=eth0 --onboot=on
# Use network installation
url --url="http://172.16.112.40/CentOS7.0"
# System language
langen_US
# Firewall configuration
firewall --disabled
# System authorization information
auth ?--useshadow ?--passalgo=sha512
# Use graphical install
graphical
firstboot --enable
ignoredisk --only-use=sda
# SELinux configuration
selinux --disabled
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr

autopart --type=lvm
# Partition clearing information
clearpart --all --initlabel --drives=sda

%packages
@base
@core
@desktop-debugging
@dial-up
@directory-client
@fonts
@gnome-apps
@gnome-desktop
@guest-agents
@guest-desktop-agents
@input-methods
@internet-browser
@java-platform
@multimedia
@network-file-system-client
@print-client
@remote-desktop-clients
@x11

######## graphic admin tools #############
@graphical-admin-tools
policycoreutils-gui
setroubleshoot
system-config-kickstart
wireshark-gnome

############ virtualization tools ########
@virtualization-client
@virtualization-platform
@virtualization-tools
fence-virtd-libvirt
fence-virtd-multicast
fence-virtd-serial
libguestfs-java
libguestfs-tools
libvirt-cim
libvirt-java
libvirt-snmp
perl-Sys-Virt
qemu-kvm-tools

%end

%post
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
mkdir /root/test
touch /root/test/testfile
echo "testfile in the root path" > /root/test/testfile
%end

在上述脚本中,%post后面的配置内容是希望在操作系统安装后直接生成/etc/resolv.conf,并将域名服务器指向8.8.8.8;同时为了便于测试,我们创建了/root/test目录,并在其下生成一个testfile文件。

1.8 常见问题与处理

CentOS上的虚拟机采用PXE安装操作系统时,创建虚拟机并采用PXE启动时,会出现如下问题:No filename or root path specified,即PXE客户端得不到用于下载启动引导文件的路径。

经查,在2010年,有人指出这是一个与qemu-kvm有关的bug,如下所示:

This is a qemu-kvm bug. When a guest obtains DHCP ACK from dnsmasq, instead of trying to get pxelinux.0 from dnsmasq (running as tftp server) it sends out more DHCP Requests to port 4011, which fails as nothing is listening there. After replacing /usr/share/qemu-kvm/pxe-rtl8139.bin with similar file from upstream qemu, PXE boot works as expacted.

上述内容表明当客户机从dnsmasq服务获得DHCP确认后,它并没从dnsmasq服务获得取pxelinux.o文件,从而无法引导PXE客户端启动。

在通过PXE启动虚拟机时,可以按 Ctrl+B组合键进入手动模式配置,如下所示:

So I tried manually:
- boot from pxe and type Ctrl+B
- dhcp net0 -->获得IP地址
- config
and set these:
    next-server 13.0.0.93 (DHCP服务器的IP地址)
    filename pxelinux.0
    root-path 13.0.0.93/var/tftproot
Ctrl+X to exit config
- autoboot

1.9 小结

本章中,我们提供了基于PXE自动化部署操作系统的方法,并且提供了一些配置文件的参考。我们相信,基于Preseed的配置方法对很多人会很有帮助。

从整个OpenStack系统自动部署的角度来看,我们建议读者进一步研究一下基于Chef的部署方案。这个方案对于操作系统部署完成后,快速部署上面的应用软件非常有帮助,虽然我们大多数人还是喜欢传统的脚本处理方法。

另外,单纯从脚本部署的角度来看,若能与Python的Fabric配合起来,我们也可以构建一套快速简洁的自动化部署OpenStack系统方案。

1.10 参考资源

本章的参考资源如下所示。

目录

  • 前言
  • 第 1 章 OpenStack基本操作系统环境的PXE自动部署
  • 第 2 章 OpenStack与网络
  • 第 3 章 OpenStack基本控制服务多点部署
  • 第 4 章 nova-network多机部署及企业应用
  • 第 5 章 OpenStack桌面虚拟化
  • 第 6 章 OpenStack Neutron 网络服务
  • 第 7 章 Neutron与SDN融合
  • 第 8 章 分布式存储系统
  • 第 9 章 OpenStack中央存储及虚拟机动态迁移
  • 第 10 章 Cinder卷服务
  • 第 11 章 Swift存储系统部署
  • 第 12 章 OpenStack与Docker
  • 第 13 章 Heat与弹性集群伸缩
  • 第 14 章 Sahara与弹性Hadoop集群
  • 第 15 章 OpenStack与VMware虚拟机迁移