该系列文章为制作KVM虚拟机镜像的同时配置静态IP,为用户直接提供好固定IP,无需手动配置
系列文章目录
- Ubuntu16.04
- Ubuntu18.04
- Centos6
- Centos7
文章目录
- 系列文章目录
- 软件环境
- 一、安装Ubuntu16.04
- 二、镜像定制化
- 1. 安装必要软件
- 2. 进行虚拟机关闭配置
- 3. 修改虚拟机XML配置文件
- 4. 修改虚拟机GRUB配置文件
- 5. 测试是否成功
- 三、进行静态IP配置
- 1. 安装cloud-init
- 2. 重命名其他配置文件
- 3. 修改cloud-init配置文件
- 4. 编写网络配置脚本文件
- 四、将虚拟机制作成镜像
- 1. 清理镜像内的缓存信息
- 2. 压缩镜像文件
- 3. KVM虚拟机配置静态IP——Ubuntu16.04配置完成
- 参考内容
软件环境
- 服务器操作系统:Ubuntu 16.04
- 内核版本:4.15.0-142-generic
- QEMU版本:2.5.0
- virt-manager版本:1.3.2
一、安装Ubuntu16.04
在搭建好KVM环境的服务器上通过Ubuntu16.04的iso文件安装好一台虚拟机
二、镜像定制化
1. 安装必要软件
sudo apt-get install openssh-server vim
2. 进行虚拟机关闭配置
推荐使用qemu-guest-agent进行shutdown配置
sudo apt-get install qemu-guest-agent
sudo service qemu-guest-agent start
3. 修改虚拟机XML配置文件
关闭虚拟机,在服务器上修改虚拟机的XML配置文件
sudo virsh edit ubuntu16.04(虚拟机名称)
添加以下内容,并重启虚拟机
<channel type="unix">
<source mode="bind"/>
<target type="virtio" name="org.qemu.guest_agent.0"/>
</channel>
4. 修改虚拟机GRUB配置文件
修改虚拟机的/etc/default/grub文件,添加console=ttyS0到GRUB_CMDLINE_LINUX_DEFAULT参数
sudo vim /etc/default/grub
修改以下内容:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=ttyS0"
执行更新命令update-grub,重新启动虚拟机
5. 测试是否成功
在服务器上执行以下命令连接虚拟机,看是否可以成功连上
sudo virsh console ubuntu16.04(虚拟机名称)
三、进行静态IP配置
主要的思路主要是通过cloud-init工具,在虚拟机创建的时候进行初始化操作,执行脚本文件配置自动配置静态IP,以下操作在虚拟机中完成
1. 安装cloud-init
sudo apt-get install cloud-init
2. 重命名其他配置文件
进入/etc/cloud/cloud.cfg.d,将该目录的所有以.cfg结尾的文件重命名,这样做的原因为cloud-init在执行初始化的时候会执行/etc/cloud/下所有以.cfg结尾的文件,并以最后一个为准,所以其他文件会导致我们的配置文件执行失败
sudo mv 05_logging.cfg 05_logging.cfg.bak
sudo mv 90_dpkg.cfg 90_dpkg.cfg.bak
3. 修改cloud-init配置文件
进入/etc/cloud/,备份并修改cloud.cfg文件
sudo cp cloud.cfg cloud.cfg.bak
sudo vim cloud.cfg
将cloud.cfg中的所有内容修改为以下内容,该文件以yaml格式为准,需要注意格式
datasource_list: [ None ]
runcmd:
- sh /etc/cloud/network_static.sh
power_state:
delay: now
mode: reboot
# The modules that run in the 'init' stage
cloud_init_modules:
- migrator
- seed_random
- bootcmd
- write-files
- growpart
- resizefs
- disk_setup
- mounts
- set_hostname
- update_hostname
- update_etc_hosts
- ca-certs
- rsyslog
- users-groups
- ssh
# The modules that run in the 'config' stage
cloud_config_modules:
# Emit the cloud config ready event
# this can be used by upstart jobs for 'start on cloud-config'.
- emit_upstart
- snap
- ssh-import-id
- locale
- set-passwords
- grub-dpkg
- apt-pipelining
- apt-configure
- ubuntu-advantage
- ntp
- timezone
- disable-ec2-metadata
- runcmd
- byobu
# The modules that run in the 'final' stage
cloud_final_modules:
- package-update-upgrade-install
- fan
- landscape
- lxd
- ubuntu-drivers
- puppet
- chef
- mcollective
- salt-minion
- reset_rmc
- refresh_rmc_and_interface
- rightscale_userdata
- scripts-vendor
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
- ssh-authkey-fingerprints
- keys-to-console
- phone-home
- final-message
- power-state-change
以下为部分重要内容的解释:
1. datasource_list: [ None ]:设置获取源信息的数据源为空,如果不设置,则默认到外网下载,会导致虚拟机初始化失败
2. runcmd: 在配置模块中执行以下命令,即在初始化的时候执行我们编写的网络配置脚本文件进行静态IP配置
- sh /etc/cloud/network_static.sh
3. power_state: 设置虚拟机初始化后进行重启操作,因为ubuntu16.04系统的原因,修改网络后必须重启保证更新网络配置
delay: now
mode: reboot
4. 编写网络配置脚本文件
进入/etc/cloud,创建network_static.sh脚本文件并写入以下内容:
interface=ens3
ip=$(ifconfig $interface | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | tr -d "addr:")
broadcast=$(ifconfig $interface | grep Bcast | awk -F : '{print $3}' | awk -F " " '{print $1}')
mask=$(ifconfig $interface | grep Bcast | awk -F : '{print $4}')
route=$(route -n | grep $interface | awk 'NR==1' | awk '{print $2}')
echo "auto lo
iface lo inet loopback
auto $interface
iface $interface inet static
address $ip
netmask $mask
broadcast $broadcast
gateway $route
dns-nameservers 8.8.8.8" | sudo tee /etc/network/interfaces | cat > /dev/null
该脚本适用于虚拟机包含单个网卡的情况,多块网卡没有进行测试,其中interface参数需要根据自己的实际情况进行修改,进行以上操作后关闭虚拟机。
四、将虚拟机制作成镜像
在服务器上执行以下操作进行标准镜像的创建
1. 清理镜像内的缓存信息
sudo virt-sysprep -d ubuntu16.04(虚拟机名称)
2. 压缩镜像文件
进入到虚拟机镜像存储的位置,进行压缩操作
sudo virt-sparsify --compress ubuntu16.04.qcow2 Ubuntu16.04.qcow2
3. KVM虚拟机配置静态IP——Ubuntu16.04配置完成
参考内容
- Ubuntu镜像定制:链接
- cloud-init使用:链接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)