这个示例安装Ubuntu 14.04 (Trusty Tahr) 版本镜像。创建其他版本的Ubuntu镜像,注意下面安装过程的标记不同的地方。
由于我们的目标是制作一个最小化的可用基础镜像,本示例使用网络安装 ISO。Ubuntu 14.04 64位版本的网络安装 ISO 位于 http://archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/mini.iso。
使用在之前示例中讲解的 virt-manager 或者 virt-install 命令。如果你使用virt-install ,记得使用 VNC 客户端连接到虚拟机。
假设你的虚拟机名称是 trusty
,当你使用 virsh 命令操作虚拟机状态的时候你需要虚拟机名称。
如果你使用 virt-manager 命令,示例命令如下:
# qemu-img create -f qcow2 /tmp/trusty.qcow2 10G # virt-install --virt-type kvm --name trusty --ram 1024 \ --cdrom=/data/isos/trusty-64-mini.iso \ --disk /tmp/trusty.qcow2,format=qcow2 \ --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole \ --os-type=linux --os-variant=ubuntutrusty
目前有几个分区选项。默认的安装程序使用 LVM 分区,将创建三个分区 (/boot
, /
, swap),使用默认的即可。作为可选的,你也可以创建单个 ext4 分区,挂载 "/
"。
如果你不太确定如何分区,我们推荐你使用安装程序默认的分区方案,因为目前也没有任何方案完全优于其他分区方案。
Ubuntu 安装程序询问你如何设置系统更新。这个选项依赖于你的使用环境,如果将来创建的虚拟机能链接到因特网,我们推荐 "Install security updates automatically"。
剩下的步骤中,选择默认的值即可。当安装完成时,你会看到提示移除 CD-ROM。
注意 | |
---|---|
在 Ubuntu 14.04中有一个已知bug;当你选择 "Continue", 虚拟机将关机,即使它显示它将重启。 |
使用 virsh 弹出光驱时,libvirt 要求你挂一个空磁盘在光驱相同的位置。在之前盘符是 hdc
。你可以使用 virsh dumpxml vm-image
命令来完成。
# virsh dumpxml trusty <domain type='kvm'> <name>trusty</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>
在宿主机上以 root 用户运行以下命令暂停虚拟机,弹出磁盘然后恢复虚拟机。如果你使用 virt-manager ,你需要在图形界面完成这个过程。
# virsh start trusty --paused # virsh attach-disk --type cdrom --mode readonly trusty "" hdc # virsh resume trusty
注意 | |
---|---|
在前面的示例中,你暂停虚拟机,弹出磁盘,然后恢复虚拟机,理论上,你在 Installation complete 屏幕显示的时候就能弹出磁盘,然后我们测试显示 Ubuntu 安装程序锁定了磁盘,因此,不能弹出磁盘。 |
cloud-init 脚本将在虚拟机启动的时候搜寻元数据服务获取公钥。公钥将会放在镜像默认用户内。
安装 cloud-init 软件包:
# apt-get install cloud-init
在创建 Ubuntu 镜像时,cloud-init 必须明确的配置元数据源。OpenStack 元数据服务仿效 Amazon EC2 元数据服务。
运行 dpkg-reconfigure 命令设置镜像 cloud-init 软件包使用的元数据源。当屏幕出现提示时,选择 EC2
数据源。
# dpkg-reconfigure cloud-init
不同的发行版保存的账户不同,在基于 Ubuntu 的虚拟机,账户是 ubuntu
,基于 Fedora 的虚拟机,账户是 ec2-user
。
你可以编辑 /etc/cloud/cloud.cfg
文件添加一行修改 cloud-init
使用的账户名,例如,添加以下这行到配置文件,来配置 cloud-init
存放公钥到admin账户。
user: admin
操作系统会在/etc/sysconfig/network-scripts/ifcfg-eth0
和 /etc/udev/rules.d/70-persistent-net.rules
这类文件记录下网卡MAC地址,但是,虚拟机的网卡MAC地址在每次虚拟机创建的时候都会不同,因此这些信息必须从配置文件删除掉。
目前有 virt-sysprep 工具可以完成清理虚拟机镜像内的 MAC 地址相关的信息。
# virt-sysprep -d trusty
现在你可以上传虚拟机镜像到镜像服务了,所以不再需要 libvirt 来管理虚拟机镜像,使用 virsh undefine vm-image
命令来完成。
# virsh undefine trusty