第 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系统时,需要从美国的软件源下载并更新各软件模块,但网络下载速度非常慢,基本上处于不可接受的状态。我们更期望能直接从国内下载,这样会快很多,而如果要做这种调整,不得不学习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公司针对自动安装Red Hat、Fedora与CentOS这3种同一体系的操作系统而制定的问答规范。它一般会以.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的kickstart机制可以很好地支持CentOS客户机安装,但若客户机需要安装Ubuntu,则仅仅能提供最基础的支持。一旦我们需要调整Ubuntu的安装源、预安装包等设置时,kickstart就无能为力了,此时我们需要使用Ubuntu本身的preseed机制。因此,在我们的测试中,如果我们选择Ubuntu作为PXE服务器的操作系统,那么它不仅可以支持自身的安装,也可以很好地支持CentOS的安装。

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

在本书中,我们选择的Ubuntu操作系统均指Ubuntu 12.04LTS版本。它的基本安装信息请参考其他资料。这里需要说明的是,在Ubuntu安装完成后应禁用iptables及SELinux以简化后续过程。

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

1. 设置服务器IP地址

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

auto eth0
iface eth0 inet static
    address 13.0.0.93
    netmask 255.0.0.0
    gateway 13.1.1.1
    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# cp sources.list sources.list.00

将Ubuntu源文件sources.list 更新为国内的源(以搜狐为例),下面是更新后的文件信息:

deb http://mirrors.sohu.com/ubuntu/ precise main restricted
deb-src http://mirrors.sohu.com/ubuntu/ precise main restricted
deb http://mirrors.sohu.com/ubuntu/ precise-updates main restricted
deb-src http://mirrors.sohu.com/ubuntu/ precise-updates main restricted
deb http://mirrors.sohu.com/ubuntu/ precise universe
deb-src http://mirrors.sohu.com/ubuntu/ precise universe
deb http://mirrors.sohu.com/ubuntu/ precise-updates universe
deb-src http://mirrors.sohu.com/ubuntu/ precise-updates universe
deb http://mirrors.sohu.com/ubuntu/ precise multiverse
deb-src http://mirrors.sohu.com/ubuntu/ precise multiverse
deb http://mirrors.sohu.com/ubuntu/ precise-updates multiverse
deb-src http://mirrors.sohu.com/ubuntu/ precise-updates multiverse
deb http://mirrors.sohu.com/ubuntu/ precise-backports main restricted universe multiverse
deb-src http://mirrors.sohu.com/ubuntu/ precise-backports main restricted universe multiverse
deb http://mirrors.sohu.com/ubuntu/ precise-security main restricted
deb-src http://mirrors.sohu.com/ubuntu/ precise-security main restricted
deb http://mirrors.sohu.com/ubuntu/ precise-security universe
deb-src http://mirrors.sohu.com/ubuntu/ precise-security universe
deb http://mirrors.sohu.com/ubuntu/ precise-security multiverse
deb-src http://mirrors.sohu.com/ubuntu/ precise-security multiverse
deb http://extras.ubuntu.com/ubuntu precise main
deb-src http://extras.ubuntu.com/ubuntu precise main

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. 安装与配置DHCP、TFTP服务

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

apt-get install dnsmasq tftpd-hpa

配置TFTP服务时,只需要创建TFTP服务的根目录,这里我们指定/var/tftproot为根目录,操作指令如下所示:

cd /var/
mkdir tftproot

接着配置dnsmasq的DHCP服务,其配置文件/etc/dnsmasq.conf的信息如下所示:

bogus-priv
filterwin2k
interface=eth0
domain=nova.com
dhcp-range=13.0.0.100,13.0.0.150,12h
dhcp-option=3,13.1.1.1
dhcp-option=6,61.139.2.69
dhcp-option=121,13.0.0.0/8
dhcp-boot=/var/tftproot/pxelinux.0
enable-tftp
tftp-root=/var/tftproot
dhcp-authoritative

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

  • 13.0.0.100~13.0.0.150为客户端通过DHCP获得的IP地址范围。

  • 13.1.1.1是互联网的网关。

  • 61.139.2.69 是域名服务器。

  • 网络掩码是 8,netmask=255.0.0.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,使用默认的配置即可。

7. kickstart与preseed配置文件的生成

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

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-12.04-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的第二张光盘复制到PXE操作系统中。

这里需要说明的是,CentOS的第二张光盘也应装入PXE操作系统中,这样在安装图形桌面时文件才齐全。具体方法是将第二张光盘中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 ubuntu comput 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文件回应给客户端,相关信息如下所示:

{%}

这里简要说明一下上述代码中需要注意的要点。

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

代码段中的kspreseed语句用于给出客户端取得的安装配置文件的URL地址。cfg文件实际存放在服务器的/var/www/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 或 Intel EM64T
#version=DEVEL
# Firewall configuration
firewall --disabled
# Install OS instead of upgrade
install
# Use network installation
url --url="http://13.0.0.9/CentOS"
# Root password
rootpw --iscrypted $1$NpEsMYw2$.qy.nwjRxbAU2NWZ.kCz9.
user --name="romi" --password="zzf12345"
#########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
lang en_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 / --fstype="ext4" --grow --ondisk=sda --size=1
#part / --fstype="ext4" --ondisk=sda --size=20480

part pv.100 --size=1 --grow
volgroup myvg pv.100
logvol / --fstype="ext4" --name=lv_root --vgname=myvg --size=1 --grow

#logvol /usr --fstype="ext4" --name=usr --vgname=myvg --size=5120 --grow
#logvol /home --fstype="ext4" --name=home --vgname=myvg --size=5120 --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-qmf
libvirt-snmp
perl-Sys-Virt
#qemu-guest-agent
qemu-kvm-tools
virt-v2v

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

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

  • 指定安装操作系统时安装文件的位置。url --url="http://13.0.0.9/CentOS"即指明当安装操作系统时,从服务器的/var/www/CentOS目录下读取CentOS相关的安装文件。

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

    • 首先分出一个可以启动的主分区/boot与swap。注意SAS硬盘标记为sda,而如果是IDE或SATA硬盘,通常标记为had,相关命令如下:

      # Disk partitioning information
      part /boot --asprimary --fstype="ext4" --ondisk=sda --size=100
      part swap --fstype="swap" --ondisk=sda --size=8192
      
    • 将余下的硬盘空间做成一个PV并创建卷组,将其初始大小设为20 GB,且空间大小可增长,相关命令如下:

      part pv.100 --size=20480 --grow
      volgroup myvg pv.100
      
    • 在此卷组上创建各个分区,每个分区都可指定初始值与最大值,相关命令如下:

      logvol / --fstype="ext4" --name=root --vgname=myvg --size=5120 --grow
      logvol /usr --fstype="ext4" --name=usr --vgname=myvg --size=5120 --grow
      logvol /home --fstype="ext4" --name=home --vgname=myvg --size=5120 --grow
      
  • %packages标记的后续行指定需要安装的软件包。

  • 安装操作系统时,可以提前预配置某个文件,预设文件配置的方法使得我们有机会为操作系统做更多的定制。预配置某个文件的代码如下:

    %post --interpreter=/bin/bash
    echo "nameserver 61.139.2.69" >> /etc/resolv.conf
    
  • 指定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                                                             ###
################################################################################

# Auto installation
d-i auto-install/enable boolean true

# Preseeding only locale sets language, country and locale
#d-i debian-installer/locale string en_US
#d-i debian-installer/locale string en_GBUTF-8
d-i debian-installer/locale string en_US

# Sets language
#d-i debian-installer/language string en
#d-i debian-installer/language string de

# Sets country
#d-i debian-installer/country string US
#d-i debian-installer/country string DE

# Optionally specify additional locales to be generated
#d-i localechooser/supported-locales en_US.UTF-8

# Continue the installation in the selected language?
#d-i localechooser/translation/warn-light boolean false
d-i localechooser/translation/warn-light boolean true
#d-i localechooser/translation/warn-severe boolean false
d-i localechooser/translation/warn-severe boolean true

################################################################################
### Keyboard                                                                 ###
################################################################################
# Disable automatic (interactive) keymap detection
d-i console-setup/ask_detect boolean false

# Keyboard model code (for 2.6 kernels normally a "pc105" model should be
# selected)
#d-i keyboard-configuration/modelcode string pc105

# X layout name, as would be used in the XkbLayout option in /etc/X11/xorg.conf
d-i keyboard-configuration/layoutcode string us
#d-i keyboard-configuration/layoutcode string gb
#d-i keyboard-configuration/layoutcode string de

# To select a variant of the selected layout (if you leave this out, the
# basic form of the layout will be used)
#d-i keyboard-configuration/variantcode string dvorak

################################################################################
### Network configuration                                                    ###
################################################################################
# Disable network configuration entirely
#d-i netcfg/enable boolean false

# Netcfg will choose an interface that has link if possible
#d-i netcfg/choose_interface select auto

# Pick a particular interface instead
d-i netcfg/choose_interface select eth0

# If you have a slow dhcp server and the installer times out waiting for
# it, this might be useful
d-i netcfg/dhcp_timeout string 60

# If you prefer to configure the network manually, uncomment this line and
# the static network configuration below
#d-i netcfg/disable_autoconfig boolean true

# 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
#d-i netcfg/get_ipaddress string 192.168.10.100
#d-i netcfg/get_netmask string 255.255.255.0
#d-i netcfg/get_gateway string 192.168.10.2
#d-i netcfg/get_nameservers string 192.168.10.1
#d-i netcfg/confirm_static boolean true

# Any hostname and domain names assigned from dhcp take precedence over
# values set here. However, setting the values still prevents the questions
# from being shown, even if values come from dhcp
d-i netcfg/get_hostname string nova
d-i netcfg/get_domain string xinlixun.com

# Disable that annoying WEP key dialog
#d-i netcfg/wireless_wep string

# The wacky dhcp hostname that some ISPs use as a password of sorts
#d-i netcfg/dhcp_hostname string radish

# If non-free firmware is needed for the network or other hardware, you can
# configure the installer to always try to load it, without prompting. Or
# change to false to disable asking
#d-i hw-detect/load_firmware boolean true

################################################################################
### Network console                                                          ###
################################################################################
# Use the following settings if you wish to make use of the network-console
# component for remote installation over SSH. This only makes sense if you
# intend to perform the remainder of the installation manually
#d-i anna/choose_modules string network-console
#d-i network-console/password password r00tme
#d-i network-console/password-again password r00tme

################################################################################
### Mirror settings                                                          ###
################################################################################
# If you select ftp, the mirror/country string does not need to be set
#d-i mirror/country string manual

# HTTP mirror configuration
d-i mirror/protocol string http
#d-i mirror/http/hostname string mirrors.sohu.com
d-i mirror/http/hostname string cn.archive.ubuntu.com
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string

# FTP mirror configuration
#d-i mirror/protocol string ftp
#d-i mirror/ftp/hostname string mirror.home.lan
#d-i mirror/ftp/directory string /pub/linux/ubuntu
#d-i mirror/ftp/proxy string

# Alternatively: by default, the installer uses CC.archive.ubuntu.com where
# CC is the ISO-3166-2 code for the selected country. You can preseed this
# so that it does so without asking
#d-i mirror/http/mirror select CC.archive.ubuntu.com
#d-i mirror/http/mirror select DE.archive.ubuntu.com

# Suite to install
#d-i mirror/suite string squeeze

# Suite to use for loading installer components (optional)
#d-i mirror/udeb/suite string squeeze

# Components to use for loading installer components (optional)
#d-i mirror/udeb/components multiselect main, restricted

################################################################################
### Clock and time zone setup                                                ###
################################################################################
# Controls whether or not the hardware clock is set to UTC
#d-i clock-setup/utc boolean false
d-i clock-setup/utc boolean true

# You may set this to any valid time zone (check /usr/share/zoneinfo/)
#d-i time/zone string US/Eastern
d-i time/zone string Asia/Chongqing

# Controls whether to use NTP to set the clock during the install
#d-i clock-setup/ntp boolean false
d-i clock-setup/ntp boolean true

# NTP server to use. The default is almost always fine here
d-i clock-setup/ntp-server 210.72.145.44

################################################################################
### Partitioning                                                             ###
################################################################################

d-i partman-auto/method string lvm
#d-i partman-auto/purge_lvm_from_device boolean true

d-i partman-lvm/confirm boolean true
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman-md/device_remove_md boolean true

d-i partman/confirm_write_new_label boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto-lvm/guided_size string max

################################################################################
# Configure APT to not install recommended packages by default. Use of this
# option can result in an incomplete system and should only be used by very
# experienced users
#d-i base-installer/install-recommends boolean false

# The kernel image (meta) package to be installed; "none" can be used if no
# kernel is to be installed
#d-i base-installer/kernel/image string linux-generic

################################################################################
### Account setup                                                            ###
################################################################################
# Skip creation of a root account (normal user account will be able to
# use sudo). The default is false; preseed this to true if you want to set
# a root password
d-i passwd/root-login boolean false

# Alternatively, to skip creation of a normal user account
#d-i passwd/make-user boolean false

# Root password, either in clear text
#d-i passwd/root-password password r00tme
#d-i passwd/root-password-again password r00tme

# or encrypted using an MD5 hash
#d-i passwd/root-password-crypted password [MD5 hash]
# Generate MD5-hash: printf "r00tme" | mkpasswd -s -m md5
#d-i passwd/root-password-crypted password $1$ZGW8Hqa4$uhAyNQTJtKFdR.TBw58dc1

# To create a normal user account
d-i passwd/user-fullname string Romi Zhang
d-i passwd/username string romi

# Normal user's password, either in clear text
d-i passwd/user-password password zzf12345
d-i passwd/user-password-again password zzf12345

# or encrypted using an MD5 hash
#d-i passwd/user-password-crypted password [MD5 hash]
# Generate MD5-hash: printf "mypass" | mkpasswd -s -m md5
#d-i passwd/user-password-crypted password $1$Vzqk4pNx$seOGxYuFcJTPhVSRXVWtS

# Permit the created user to have an empty password The default is false
# Preseed this to true if the created user may have an empty password
#d-i passwd/allow-password-empty boolean false

# Create the first user with the specified UID instead of the default
#d-i passwd/user-uid string 1010

# The installer will warn about weak passwords. If you are sure you know
# what you're doing and want to override it, uncomment this
d-i user-setup/allow-password-weak boolean true

# The user account will be added to some standard initial groups. To
# override that, use this
#d-i passwd/user-default-groups string audio cdrom video

# Set to true if you want to encrypt the first user's home directory
d-i user-setup/encrypt-home boolean false

################################################################################
### Apt setup                                                                ###
################################################################################
# You can choose to install restricted and universe software, or to install
# software from the backports repository
#d-i apt-setup/restricted boolean true
#d-i apt-setup/universe boolean true
#d-i apt-setup/backports boolean true

# Uncomment this if you don't want to use a network mirror
#d-i apt-setup/use_mirror boolean false

# Select which update services to use; define the mirrors to be used
# Values shown below are the normal defaults
d-i apt-setup/services-select multiselect security
d-i apt-setup/security_host string security.ubuntu.com
d-i apt-setup/security_path string /ubuntu

# Additional repositories, local[0-9] available
#d-i apt-setup/local0/repository string http://local.server/ubuntu squeeze main
#d-i apt-setup/local0/comment string local server

# Enable deb-src lines
#d-i apt-setup/local0/source boolean true

# URL to the public key of the local repository; you must provide a key or
# apt will complain about the unauthenticated repository and so the
# sources.list line will be left commented out
#d-i apt-setup/local0/key string http://localserver/key

# By default the installer requires that repositories be authenticated
# using a known gpg key. This setting can be used to disable that
# authentication. Warning: Insecure, not recommended
#d-i debian-installer/allow_unauthenticated boolean true

################################################################################
### Package selection                                                        ###
################################################################################
# Selected packages
#tasksel tasksel/first multiselect ubuntu-desktop
#tasksel tasksel/first multiselect lamp-server, print-server
#tasksel tasksel/first multiselect kubuntu-desktop
tasksel tasksel/first multiselect standard

# Individual additional packages to install
#d-i pkgsel/include string openssh-server build-essential
#d-i pkgsel/include string openssh-server

#d-i pkgsel/include string
#     openssh-server             \
#     gnome-panel                \
#     firefox-locale-de          \
#     thunderbird-locale-de      \
#     libreoffice-l10n-de        \
#     libreoffice-help-de        \
#     flashplugin-installer      \
#     gstreamer0.10-ffmpeg       \
#     gstreamer0.10-fluendo-mp3  \
#     gstreamer0.10-plugins-bad  \
#     gstreamer0.10-plugins-ugly \
#     openjdk-6-jre              \
#     icedtea-plugin             \
#     nmap                       \
#     wireshark                  \
#     tshark                     \
#     iptraf

# Whether to upgrade packages after debootstrap
# Allowed values: none, safe-upgrade, full-upgrade
d-i pkgsel/upgrade select none

# Language pack selection
#d-i pkgsel/language-packs multiselect de, en

# Policy for applying updates. May be "none" (no automatic updates),
# "unattended-upgrades" (install security updates automatically), or
# "landscape" (manage system with Landscape)
d-i pkgsel/update-policy select none

# Some versions of the installer can report back on what software you have
# installed, and what software you use. The default is not to report back,
# but sending reports helps the project determine what software is most
# popular and include it on CDs
#popularity-contest popularity-contest/participate boolean false

# By default, the system's locate database will be updated after the
# installer has finished installing most packages. This may take a while, so
# if you don't want it, you can set this to "false" to turn it off
#d-i pkgsel/updatedb boolean true

################################################################################
### Boot loader installation                                                 ###
################################################################################
# Grub is the default boot loader (for x86). If you want lilo installed
# instead, uncomment this
#d-i grub-installer/skip boolean true

# To also skip installing lilo, and install no bootloader, uncomment this too
#d-i lilo-installer/skip boolean true

# With a few exceptions for unusual partitioning setups, GRUB 2 is now the
# default If you need GRUB Legacy for some particular reason, then

# uncomment this
#d-i grub-installer/grub2_instead_of_grub_legacy boolean false

# This is fairly safe to set, it makes grub install automatically to the MBR
# if no other operating system is detected on the machine
d-i grub-installer/only_debian boolean true

# This one makes grub-installer install to the MBR if it also finds some other
# OS, which is less safe as it might not be able to boot that other OS
d-i grub-installer/with_other_os boolean true

# Alternatively, if you want to install to a location other than the mbr,
# uncomment and edit these lines
#d-i grub-installer/only_debian boolean false
#d-i grub-installer/with_other_os boolean false
#d-i grub-installer/bootdev string (hd0,0)

# To install grub to multiple disks
d-i grub-installer/bootdev string (hd0,0) (hd1,0)

# Optional password for grub, either in clear text
#d-i grub-installer/password password r00tme
#d-i grub-installer/password-again password r00tme

# or encrypted using an MD5 hash, see grub-md5-crypt(8)
#d-i grub-installer/password-crypted password [MD5 hash]
# Generate MD5-hash: printf "grubpass" | mkpasswd -s -m md5
#d-i grub-installer/password-crypted password $1$/tfwIz0W$yozAIjbiDuDwRA2NGNe8H1

# Use the following option to add additional boot parameters for the
# installed system (if supported by the bootloader installer)
# Note: options passed to the installer will be added automatically
#d-i debian-installer/add-kernel-opts string nousb

################################################################################
### Finishing up the installation                                            ###
################################################################################
# During installations from serial console, the regular virtual consoles
# (VT1-VT6) are normally disabled in /etc/inittab Uncomment the next
# line to prevent this
#d-i finish-install/keep-consoles boolean true

# Avoid that last message about the install being complete
d-i finish-install/reboot_in_progress note

# This will prevent the installer from ejecting the CD during the reboot,
# which is useful in some situations
#d-i cdrom-detect/eject boolean false

# This is how to make the installer shutdown when finished, but not
# reboot into the installed system
#d-i debian-installer/exit/halt boolean true

# This will power off the machine instead of just halting it
#d-i debian-installer/exit/poweroff boolean true

################################################################################
### X configuration                                                          ###
################################################################################
# X can detect the right driver for some cards, but if you're preseeding,
# you override whatever it chooses. Still, vesa will work most places
#xserver-xorg xserver-xorg/config/device/driver select vesa

# A caveat with mouse autodetection is that if it fails, X will retry it
# over and over. So if it's preseeded to be done, there is a possibility of
# an infinite loop if the mouse is not autodetected
#xserver-xorg xserver-xorg/autodetect_mouse boolean true

# Monitor autodetection is recommended
#xserver-xorg xserver-xorg/autodetect_monitor boolean true

# Uncomment if you have an LCD display
#xserver-xorg xserver-xorg/config/monitor/lcd boolean true

# X has three configuration paths for the monit.or. Here's how to preseed
# the "medium" path, which is always available. The "simple" path may not
# be available, and the "advanced" path asks too many questions
#xserver-xorg xserver-xorg/config/monitor/selection-method select medium
#xserver-xorg xserver-xorg/config/monitor/mode-list select 1024x768 @ 60 Hz

################################################################################
### Preseeding other packages                                                ###
################################################################################
# Depending on what software you choose to install, or if things go wrong
# during the installation process, it's possible that other questions may
# be asked. You can preseed those too, of course To get a list of every
# possible question that could be asked during an install, do an
# installation, and then run these commands
#debconf-get-selections --installer > file
#debconf-get-selections >> file

################################################################################
### Advanced options                                                         ###
################################################################################

################################################################################
### Running custom commands during the installation                          ###
################################################################################
# d-i preseeding is inherently not secure. Nothing in the installer checks
# for attempts at buffer overflows or other exploits of the values of a
# preconfiguration file like this one. Only use preconfiguration files from
# trusted locations! To drive that home, and because it's generally useful,
# here's a way to run any shell command you'd like inside the installer,
# automatically

# This first command is run as early as possible, just after
# preseeding is read
#d-i preseed/early_command string anna-install some-udeb

# This command is run immediately before the partitioner starts. It may be
# useful to apply dynamic partitioner preseeding that depends on the state
# of the disks (which may not be visible when preseed/early_command runs)
#d-i partman/early_command \
#     string debconf-set partman-auto/disk "$(list-devices disk | head -n1)"

# This command is run just before the install finishes, but when there is
# still a usable /target directory You can chroot to /target and use it
# directly, or use the apt-install and in-target commands to easily install
# packages and run commands in the target system
#d-i preseed/late_command string apt-install zsh; in-target chsh -s /bin/zsh
d-i preseed/late_command string \
    sed -i 's/http:\/\/mirror/ftp:\/\/mirror/g' /target/etc/apt/sourceslist

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

  • 指定客户端使用的PXE网卡的代码如下所示:

    d-i netcfg/choose_interface select eth0
    
  • 指定客户端的主机名与域名的代码如下所示:

    d-i netcfg/get_hostname string nova
    d-i netcfg/get_domain string xinlixun.com
    
  • 指定Ubuntu安装源时,需要指向国内的搜狐软件源而不能直接指向mirrors.163.com,否则会出现在Ubuntu基本软件包(base)安装时找不到内核文件的情况,相关命令如下所示:

    d-i mirror/http/hostname string cn.archive.ubuntu.com
    
  • 指定Ubuntu操作系统文件的下载目录,这里指向PXE服务器的/var/www/ubuntu目录,相关代码如下所示:

    d-i mirror/http/directory string /ubuntu
    
  • 指定Ubuntu时区与授时中心,这里指向中国的授时中心IP地址(210.72.145.44),相关代码如下所示:

    d-i time/zone string Asia/Chongqing
    d-i clock-setup/ntp-server 210.72.145.44
    
  • 用户系统目录加密选项,要注意下面这行代码是正确的,这样才能不用加密:

    d-i user-setup/encrypt-home boolean false
    
  • 硬盘分区选项,这里采用标准的IVM方式,如下所示:

    d-i partman-auto/method string lvm
    
  • 创建用户名及密码选项。与CentOS系统不同,Ubuntu安装时不会创建root用户,我们需要创建一个非root用户并赋予它密码,使该用户具备使用sudo命令的权限,如下所示:

    d-i passwd/root-login boolean false
    d-i passwd/user-fullname string Romi Zhang
    d-i passwd/username string romi
     
    # Normal user's password, either in clear text
    d-i passwd/user-password password mypassword
    d-i passwd/user-password-again password mypassword
    
    

    这里我们使用了明文密码,若想使用MD5方法加密密码,可进一步参考此部分后续的语句。

  • 选择Ubuntu安装包,这里选择安装标准的包,即standard,如下所示:

    tasksel tasksel/first multiselect standard
    
  • 安装boot loader选项,这里是指GRUB引导程序。在下面的代码中,第二条语句是当准备将GRUB引导程序安装到更多块硬盘时的选项指定,注意这里的hd0hd1可能会随机器的不同而有所变化:

    d-i grub-installer/only_debian boolean true
    d-i grub-installer/bootdev string (hd0,0) (hd1,0)
    
    

安装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 常见问题与处理

当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.8 小结

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

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

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

1.9 参考资源

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

目录

  • 前言
  • 第 1 章 OpenStack 基本操作系统环境的 PXE 自动部署
  • 第 2 章 OpenStack 与网络
  • 第 3 章 OpenStack nova-network 多主机部署
  • 第 4 章 OpenStack 中小企业应用部署
  • 第 5 章 OpenStack Quantum VLAN 部署模式
  • 第 6 章 满足中型企业的 OpenStack 部署模式
  • 第 7 章 大型企业的 OpenStack GRE 部署模式
  • 第 8 章 OpenStack 卷服务——Cinder
  • 第 9 章 OpenStack 中央存储及虚拟机动态迁移
  • 第 10 章 OpenStack EC2 接口与 Quota 分配
  • 第 11 章 OpenStack Web 管理界面与云虚拟桌面
  • 第 12 章 OpenStack RabbitMQ 冗余处理
  • 第 13 章 OpenStack 的新组件