Example: CentOS imageWe'll run through an example of installing a CentOS image.
This will focus mainly on CentOS 6.4. Because the CentOS
installation process may change across versions, if you are
using a different version of CentOS the installer steps may
differ.Download a CentOS install ISONavigate to the CentOS mirrors page.Click one of the HTTP
links in the right-hand column next to one of
the mirrors.Click the folder link of the CentOS version
you want to use. For example,
6.4/.Click the isos/ folder
link.Click the x86_64/ folder
link for 64-bit images.Click the ISO image you want to download.
The netinstall ISO. For example,
CentOS-6.4-x86_64-netinstall.iso
is a good choice since it's a smaller image
that will download missing packages from the
Internet during the install process.Start the install processStart the installation process using either
virt-manager or
virt-install as described in the
previous section. If using
virt-install, don't forget to connect
your VNC client to the virtual machine.We will assume the name of your virtual machine image is
centos-6.4, which we need to know
when using virsh commands to manipulate
the state of the image.If you're using virt-manager, the commands should look
something like
this:#qemu-img create -f qcow2 /tmp/centos-6.4.qcow2 10G#virt-install --virt-type kvm --name centos-6.4 --ram 1024 \
--cdrom=/data/isos/CentOS-6.4-x86_64-netinstall.iso \
--disk /tmp/centos-6.4.qcow2,format=qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole \
--os-type=linux --os-variant=rhel6Step through the installAt the initial Installer boot menu, choose the "Install
or upgrade an existing system" option. Step through the
install prompts, the defaults should be fine.Configure TCP/IPThe default TCP/IP settings are fine. In particular,
ensure that Enable IPv4 support is enabled with DHCP,
which is the default.Point the installer to a CentOS web serverChoose URL as the installation method.Depending on the version of CentOS, the net installer
requires that the user specify either a URL, or the web
site and a CentOS directory that corresponds to one of the
CentOS mirrors. If the installer asks for a single URL, an
example of a valid URL would be:
http://mirror.umd/centos/6/os/x86_64.Consider using other mirrors as an alternative
to mirror.umd.edu.If the installer asks for web site name and CentOS
directory separately, an example would be:Web site name:
mirror.umd.eduCentOS directory:
centos/6/os/x86_64See CentOS mirror page to get a full list of
mirrors, click on the "HTTP" link of a mirror to retrieve
the web site name of a mirror.Storage devicesIf asked about what type of devices your installation
involves, choose "Basic Storage Devices".HostnameThe installer may ask you to choose a hostname. The
default (localhost.localdomain) is
fine. We will install the cloud-init package later, which
will set the hostname on boot when a new instance is
provisioned using this image.Partition the disksThere are different options for partitioning the disks.
The default installation will use LVM partitions, and will
create three partitions (/boot,
/, swap), and this will work
fine. Alternatively, you may wish to create a single ext4
partition, mounted to "/", should also
work fine.If unsure, we recommend you use the installer's default
partition scheme, since there is no clear advantage to one
scheme or another.Step through the installStep through the install, using the default options. The
simplest thing to do is to choose the "Basic Server"
install (may be called "Server" install on older versions
of CentOS), which will install an SSH server.Detach the CD-ROM and rebootOnce the install completes, you will see the screen
"Congratulations, your CentOS installation is
complete".To eject a disk using virsh, libvirt
requires that you attach an empty disk at the same target
that the CDROM was previously attached, which should be
hdc. You can confirm the
appropriate target using the dom dumpxml
vm-image
command.#virsh dumpxml centos-6.4<domain type='kvm'>
<name>centos-6.4</name>
...
<disk type='block' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hdc' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='1' target='0' unit='0'/>
</disk>
...
</domain>
Run the following commands from the host to eject the
disk and reboot using virsh, as root. If you are using
virt-manager, the commands below will work, but you can
also use the GUI to detach and reboot it by manually
stopping and
starting.#virsh attach-disk --type cdrom --mode readonly centos-6.4 "" hdc#virsh destroy centos-6.4#virsh start centos-6.4In theory, the virsh reboot
centos-6.4 command can be used instead
of using destroy and start commands. However, in our
testing we were unable to reboot successfully using
the virsh reboot command.Log in to newly created imageWhen you boot for the first time after install, it may ask
you about authentication tools, you can just choose
"Exit". Then, log in as root using the root password you
specified.Configure to fetch metadataAn instance must perform several steps on start up by
interacting with the metadata service. For example,
retrieve ssh public key and execute user data script.
There are several ways to implement this functionality, including:Install a cloud-init RPM, which is a port of
the Ubuntu cloud-init package. This is the
recommended approach.Modify /etc/rc.local to
fetch desired information from the metadata
service, as described below.Use cloud-init to fetch the public keyThe cloud-init package will automatically fetch the
public key from the metadata server and place the key in
an account. You can install cloud-init inside the CentOS
guest by adding the EPEL
repo:#rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm#yum install cloud-initThe account varies by distribution. On Ubuntu-based
virtual machines, the account is called "ubuntu". On
Fedora-based virtual machines, the account is called
"ec2-user".You can change the name of the account used by
cloud-init by editing the
/etc/cloud/cloud.cfg file and
adding a line with a different user. For example, to
configure cloud-init to put the key in an account named
admin, edit the configuration file
so it has the line:user: adminWrite a script to fetch the public key (if no
cloud-init)If you are not able to install the cloud-init package in
your image, to fetch the ssh public key and add it to the
root account, edit the /etc/rc.local
file and add the following lines before the line
“touch
/var/lock/subsys/local”if [ ! -d /root/.ssh ]; then
mkdir -p /root/.ssh
chmod 700 /root/.ssh
fi
# Fetch public key using HTTP
ATTEMPTS=30
FAILED=0
while [ ! -f /root/.ssh/authorized_keys ]; do
curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key \
> /tmp/metadata-key 2>/dev/null
if [ \$? -eq 0 ]; then
cat /tmp/metadata-key >> /root/.ssh/authorized_keys
chmod 0600 /root/.ssh/authorized_keys
restorecon /root/.ssh/authorized_keys
rm -f /tmp/metadata-key
echo "Successfully retrieved public key from instance metadata"
echo "*****************"
echo "AUTHORIZED KEYS"
echo "*****************"
cat /root/.ssh/authorized_keys
echo "*****************"
doneSome VNC clients replace : (colon) with ;
(semicolon) and _ (underscore) with - (hyphen). Make
sure it's http: not http; and authorized_keys not
authorized-keys.The above script only retrieves the ssh public key
from the metadata server. It does not retrieve
user data,
which is optional data that can be passed by the user
when requesting a new instance. User data is often
used for running a custom script when an instance
comes up.As the OpenStack metadata service is compatible with
version 2009-04-04 of the Amazon EC2 metadata service,
consult the Amazon EC2 documentation on Using Instance Metadata for details on how
to retrieve user data.Disable the zeroconf routeIn order for the instance to access the metadata service, disable
the default zeroconf route:#echo "NOZEROCONF=yes" >> /etc/sysconfig/networkConfigure consoleIn order for nova console-log to work
properly on CentOS 6.x, guests you may need to add the
following lines to
/boot/grub/menu.lstserial --unit=0 --speed=115200
terminal --timeout=10 console serial
# Edit the kernel line to add the console entries
kernel ... console=tty0 console=ttyS0,115200n8Shut down the instanceFrom inside the instance, as
root:#/sbin/shutdown -h nowClean up (remove MAC address details)The operating system records the MAC address of the
virtual ethernet card in locations such as
/etc/sysconfig/network-scripts/ifcfg-eth0
and
/etc/udev/rules.d/70-persistent-net.rules
during the instance process. However, each time the image
boots up, the virtual ethernet card will have a different
MAC address, so this information must be deleted from the
configuration file.There is a utility called
virt-sysprep, that performs various
cleanup tasks such as removing the MAC address references.
It will clean up a virtual machine image in
place:#virt-sysprep -d centos-6.4Undefine the libvirt domainNow that the image is ready to be uploaded to the Image
Service, you no longer need to have this virtual machine
image managed by libvirt. Use the virsh undefine
vm-image
command to inform
libvirt.#virsh undefine centos-6.4Image is completeThe underlying image file you created with
qemu-img create. For example,
/tmp/centos-6.4.qcow2 is now
ready for uploading to the OpenStack Image Service.