官方文档:https://docs.openstack.org/image-guide/centos-image.html
基础环境准备
#安装libvirt相关工具
yum groupinstall Virtualization "Virtualization Client"
yum -y install libvirt
#启动服务
systemctl enable libvirtd; systemctl start libvirtd; systemctl status libvirtd
#下载或从本地上传系统镜像
mkdir /data
cd /data
wget https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-2003.iso
启动安装程序
如前所述,使用virt-manager 或virt-install命令启动安装过程。如果使用virt-install命令,请不要忘记将VNC客户端连接到虚拟机。
假使,假设:
-
您的虚拟机映像的名称为
centos
;使用virsh命令操作映像状态时,需要此名称。 -
您将netinstall ISO映像保存到该
/data/
目录。
如果使用virt-install命令,则这些命令应如下所示:
# qemu-img create -f qcow2 /data/centos.qcow2 10G
# virt-install --virt-type kvm --name kvm1 --ram 1024
--disk /tmp/centos.qcow2,format=qcow2
--network network=default
--graphics vnc,listen=0.0.0.0 --noautoconsole
--os-type=linux --os-variant=centos7.0
--location=/data/CentOS-7-x86_64-Minimal-2003.iso
主机名
安装程序允许您选择主机名。默认值(localhost.localdomain
)很好。cloud-init
稍后安装软件包,使用该映像配置新实例时,它将在引导时设置主机名
对磁盘分区
有不同的分区磁盘选项。默认安装使用LVM的分区,并创建三个分区(/boot
,/
,swap
),工作正常。另外,您可能想创建一个挂载到的ext4分区/
,它也可以正常工作。
如果不确定,请为安装程序使用默认分区方案。虽然没有一种方案从本质上比另一种方案更好,但是要在列表的末尾动态扩展的分区将使它可以扩展而不会越过另一个分区的边界。
取出CD-ROM并重新启动
等待安装完成。
要使用virsh命令弹出磁盘,libvirt要求您在与CD-ROM先前相同的目标上附加一个空磁盘,该目标可能是hda
。您可以使用virsh dumpxml vm-image命令确认适当的目标 。
# virsh dumpxml kvm1
<domain type='kvm' id='19'>
<name>centos</name>
...
<disk type='block' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hda' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='1' target='0' unit='0'/>
</disk>
...
</domain>
从主机运行以下命令以弹出磁盘,并virsh
以root用户身份重新启动。如果使用virt-manager
,下面的命令将起作用,但是您也可以使用GUI通过手动停止和启动来分离并重新引导它。
# virsh attach-disk --type cdrom --mode readonly kvm1 "" hda
# virsh start kvm1
安装ACPI服务
要使系统管理程序能够重新引导或关闭实例,必须acpid
在来宾系统上安装并运行该服务。
以root用户身份登录CentOS guest虚拟机,并运行以下命令来安装ACPI服务并将其配置为在系统启动时启动:
# yum install acpid
# systemctl enable acpid
配置获取元数据
实例必须与元数据服务交互才能在启动时执行多个任务。例如,该实例必须获取ssh公共密钥并运行用户数据脚本。为确保实例执行这些任务,请使用以下方法之一:
-
安装
cloud-init
RPM,这是Ubuntu cloud-init软件包的端口 。这是推荐的方法。 -
修改
/etc/rc.local
文件以从元数据服务中获取所需的信息,如下一节所述。
使用cloud-init来获取公钥
该cloud-init
软件包自动获取从元数据服务器的公钥并将其放在一个帐户的关键。cloud-init
通过运行以下命令在CentOS guest虚拟机中安装:
# yum install cloud-init
该帐户因分配而异。在基于CentOS的虚拟机上,该帐户称为centos
。
您可以cloud-init
通过编辑/etc/cloud/cloud.cfg
文件并添加其他用户的行来更改所使用帐户的名称。例如,要配置cloud-init
将密钥放入名为的帐户中admin
,请在配置文件中使用以下语法:
users:
- name: admin
(...)
安装cloud-utils-growpart以允许分区调整大小
为了正确调整根分区的大小,请安装该 cloud-utils-growpart
软件包,其中包含适当的工具,以允许使用cloud-init调整磁盘的大小。
# yum install cloud-utils-growpart
编写脚本以获取公钥(如果没有cloud-init)
如果您无法cloud-init
在映像中安装该软件包,则要获取ssh公钥并将其添加到根帐户,请编辑该/etc/rc.d/rc.local
文件并在该行之前添加以下行: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 "*****************"
fi
done
一些VNC客户端用分号(:
)代替冒号(),;
并_
用连字符(-
)代替下划线()。确保指定http:
而不是http;
。确保指定authorized_keys
而不是authorized-keys
。
先前的脚本仅从元数据服务器获取ssh公共密钥。它不获取用户数据,这是用户在请求新实例时可以传递的可选数据。实例启动时,用户数据通常用于运行自定义脚本。
由于OpenStack元数据服务与Amazon EC2元数据服务的2009-04-04版本兼容,因此请参阅有关使用实例元数据的Amazon EC2文档,以获取有关如何获取用户数据的详细信息。
配置控制台
为了使nova console-log命令在CentOS 7上正常工作,您可能需要执行以下步骤:
-
编辑
/etc/default/grub
文件并配置GRUB_CMDLINE_LINUX
选项。删除 和添加到选项。rhgb quiet
console=tty0 console=ttyS0,115200n8
例如:
... GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap console=tty0 console=ttyS0,115200n8"
-
运行以下命令以保存更改:
# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-229.14.1.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-229.14.1.el7.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-229.4.2.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-229.4.2.el7.x86_64.img Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-605f01abef434fb98dd1309e774b72ba Found initrd image: /boot/initramfs-0-rescue-605f01abef434fb98dd1309e774b72ba.img done
清理(删除MAC地址的详细信息)
操作系统在诸如/etc/sysconfig/network-scripts/ifcfg-eth0
实例处理期间的位置记录虚拟以太网卡的MAC地址。但是,每次启动映像时,虚拟以太网卡都会具有不同的MAC地址,因此必须从配置文件中删除此信息。
有一个名为virt-sysprep的实用程序,该实用程序执行各种清除任务,例如删除MAC地址引用。它将在适当位置清理虚拟机映像:
# virt-sysprep -d kvm1
#清除网络相关硬件生成信息
yum install /usr/bin/virt-sysprep
virt-sysprep -d kvm1
#压缩镜像
virt-sparsify --compress /data/centos.qcow2 centos7
从virsh删除image模版
确保您制作的状态已经可用。并且意味着您下次需要重新创建并安装系统。
virsh list --all
virsh undefine kvm1