CentOS镜像 资源下载地址
制作镜像 准备环境 1 2 3 4 5 6 7 8 # ---------------- # 宿主机 # ---------------- # 基础环境准备 yum install -y qemu-kvm qemu-img virt-manager virt-install libvirt # kvm内核支持(宿主机为虚机时需要开启CPU嵌套虚拟化) lsmod | grep kvm
命令方式创建虚机 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 基础准备 mkdir -p /data/kvm/disk mkdir -p /data/kvm/image NAME=centos DISK=/data/kvm/disk/centos.qcow2 CDROM=/data/kvm/image/CentOS-7-x86_64-Minimal-7.8.2003.iso # 创建空镜像文件 qemu-img create -f qcow2 /data/kvm/image/centos.qcow2 10G # 创建虚机 virt-install --virt-type kvm --name $NAME \ --ram 1024 --disk $DISK,format=qcow2 \ --network network=default --graphics vnc,listen=0.0.0.0 \ --noautoconsole --os-type=linux --os-variant=rhel7 --location=$CDROM # 查看vnc端口 virsh vncdisplay $NAME # :0 0代表是5900,大于0的从5900之后递增。例如,显示:1,则代表5901
图形方式创建虚机 参考下文章节:windows镜像 - 图形方式创建虚机。需注意以下几点:
CPU Model 选择 Hypervisor Default
Disk、NIC 类型均选择 VirtIO
Display 选择 VNC
Video 选择 Cirrus
基础设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 # ---------------- # 虚机 # ---------------- # 1. 配置192.168.122.0/24网段ip,即可通过宿主机的virbr0网桥,与宿主机通讯 # 2. 外网通讯,需配置网关:192.168.122.1,DNS:114.114.114.114 # # ACPID # PS: # 如果虚机安装系统重启没有成功,可以在宿主机执行virsh reboot centos命令 # 再连接,安装acpi。acpid服务是用于可以让hypervisior可以重启或关闭虚拟机 yum install -y acpid systemctl start acpid.service systemctl enable acpid.service # SSH # 修改/etc/ssh/sshd_config如下参数后,重启sshd服务: PermitRootLogin yes PasswordAuthentication yes UseDNS no # qemu guest agent yum -y install qemu-guest-agent # 防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld sed -i 's/enforcing/disabled/' /etc/selinux/config # 优化Linux句柄数 # vi /etc/security/limits.conf 文件尾加 * soft nofile 65535 * hard nofile 65535 # 关闭zeroconf route echo "NOZEROCONF=yes" >> /etc/sysconfig/network # 配置控制台(可选) # 如果希望在仪表盘界面查看nova控制台的日志,需要做以下配置: # vi /etc/default/grub,修改GRUB_CMDLINE_LINUX为以下内容 GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8" # 更新grub(若更新grub后执行) grub2-mkconfig -o /boot/grub2/grub.cfg # 清除缓存 yum clean all && rm -rf /var/cache/yum
配置Cloud-init 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 # 安装cloud-init相关工具 # - epel-release: yum源 # - cloud-init: 云镜像初始化工具 # - cloud-utils-growpart: 支持虚拟机磁盘扩容 yum install -y epel-release cloud-init cloud-utils-growpart # 配置cloud-init vi /etc/cloud/cloud.cfg # 1. 配置agent访问OpenStack数据源 # 在“/etc/cloud/cloud.cfg”最后一行添加如下内容,配置agent访问OpenStack数据源。 datasource_list: [ OpenStack ] datasource: OpenStack: metadata_urls: ['http://169.254.169.254'] max_wait: 120 timeout: 5 # 2. (可选)在“/etc/cloud/cloud.cfg”中配置“apply_network_config”为“false ” # 对于使用Cloud-Init 18.3及以上版本的用户,需执行本操作。 datasource_list: [ OpenStack ] datasource: OpenStack: metadata_urls: ['http://169.254.169.254'] max_wait: 120 timeout: 5 apply_network_config: false # 3. 设置开放root密码远程登录并开启root用户的ssh权限。 # 以CentOS 6.7系列操作系统为例,配置文件参数含义如下: # “disable_root”字段为“1”表示为禁用,为“0”表示不禁用(部分OS的Cloud-Init配置使用“true ”表示禁用,“false ”表示不禁用)。 # 设置“disable_root”值为“0”,“ssh_pwauth”为“1”,“lock_passwd”设置为“false ”,“false ”表示不锁住用户密码。 users: - name: root lock_passwd: False disable_root: 0 ssh_pwauth: 1 # 4. 在配置文件“/etc/cloud/cloud.cfg”中禁用Cloud-Init接管网络。 # 当Cloud-Init版本等于或高于0.7.9版本时,在配置文件“/etc/cloud/cloud.cfg”中增加如下内容,禁用Cloud-Init接管网络。 network: config: disabled # 5. 防止启动云服务器时,系统长时间卡在“Waiting for cloudResetPwdAgent”状态。 manage_etc_hosts: localhost # 6. 自动扩容vda2,并扩容至/目录 growpart: mode: auto devices: [/dev/vda2] ignore_growroot_disabled: false runcmd: - [pvresize,/dev/vda2] - [lvextend,-l,+100%FREE,/dev/mapper/centos-root] - [xfs_growfs,/dev/mapper/centos-root] # 7. 检查Cloud-Init工具相关配置是否成功 # 执行以下命令,无错误发生,说明Cloud-Init配置成功。 cloud-init init --local # 正确安装的Cloud-Init会显示Cloud-Init的版本详细信息,并且无任何错误信息。
CentOS 官方镜像Cloud-init配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 users: - default disable_root: 1 ssh_pwauth: 0 mount_default_fields: [~ , ~ , 'auto' , 'defaults,nofail,x-systemd.requires=cloud-init.service' , '0' , '2' ]resize_rootfs_tmp: /dev ssh_deletekeys: 1 ssh_genkeytypes: ~ syslog_fix_perms: ~ disable_vmware_customization: false cloud_init_modules: - disk_setup - migrator - bootcmd - write-files - growpart - resizefs - set_hostname - update_hostname - update_etc_hosts - rsyslog - users-groups - ssh cloud_config_modules: - mounts - locale - set-passwords - rh_subscription - yum-add-repo - package-update-upgrade-install - timezone - puppet - chef - salt-minion - mcollective - disable-ec2-metadata - runcmd cloud_final_modules: - rightscale_userdata - scripts-per-once - scripts-per-boot - scripts-per-instance - scripts-user - ssh-authkey-fingerprints - keys-to-console - phone-home - final-message - power-state-change system_info: default_user: name: centos lock_passwd: true gecos: Cloud User groups: [adm , systemd-journal ] sudo: ["ALL=(ALL) NOPASSWD:ALL" ] shell: /bin/bash distro: rhel paths: cloud_dir: /var/lib/cloud templates_dir: /etc/cloud/templates ssh_svcname: sshd
镜像清理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 清理用户登录记录 echo > /var/log/wtmp echo > /var/log/btmp # 清理相应目录下的临时文件 rm -rf /var/log/cloud-init* rm -rf /var/lib/cloud/* rm -rf /var/log/network-config.log # 执行下面命令,清理残留配置信息 # - SUSE操作系统:查看“/etc/sysconfig/network/”文件夹下有哪些以“ifcfg”开头的文件,删除除了“ifcfg-lo及ifcfg.template”以外的以“ifcfg”开头的文件。 查看文件命令:ll /etc/sysconfig/network/ 删除文件命令:rm -rf /etc/sysconfig/network/ifcfgxxx # - RedHat/CentOS/Oracle/Euler操作系统:查看“/etc/sysconfig/network-scripts/”文件夹下有哪些以“ifcfg”开头的文件,删除除了“ifcfg-lo”以外的以“ifcfg”开头的文件。 查看文件命令:ll /etc/sysconfig/network-scripts/ 删除文件命令:rm -rf /etc/sysconfig/network-scripts/ifcfgxxx # - Ubuntu操作系统: rm -rf /etc/network/interfaces.d/50-cloud-init.cfg # 清除历史操作记录 history -w;echo > /root/.bash_history;history -c;history -c;history -c;
镜像压缩 1 2 3 4 # ---------------- # 宿主机 # ---------------- qemu-img convert -c -O qcow2 mongodb_4.2.qcow2.bak mongodb_4.2_cloudimg.qcow2
Red Hat镜像 资源下载地址
制作镜像 准备环境 参考CentOS流程
基础设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 # 由于Red Hat官方源需要激活才可以使用,这里使用USTC的CentOS yum源 # yum repo内容从如下地址获取: # - base源:http://mirrors.ustc.edu.cn/help /centos.html sed -i 's/$releasever/7/g' /etc/yum.repos.d/* # 获取CentOS RPM-GPG-KEY wget http://mirrors.ustc.edu.cn/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7 rpm -import RPM-GPG-KEY-CentOS-7 # 设置主机名 hostnamectl set-hostname rhel7 # 创建默认登录用户 useradd rhel # ACPID # PS: # 如果虚机安装系统重启没有成功,可以在宿主机执行virsh reboot centos命令 # 再连接,安装acpi。acpid服务是用于可以让hypervisior可以重启或关闭虚拟机 yum install -y acpid systemctl start acpid.service systemctl enable acpid.service # SSH # 修改/etc/ssh/sshd_config如下参数后,重启sshd服务: PermitRootLogin yes PasswordAuthentication yes UseDNS no # qemu guest agent yum -y install qemu-guest-agent # 允许ttyS0登录系统(virsh console) echo "ttyS0" >> /etc/securetty grubby --update-kernel=ALL --args="console=ttyS0" reboot # 优化Linux句柄数 # vi /etc/security/limits.conf 文件尾加 * soft nofile 65535 * hard nofile 65535 # 关闭zeroconf route echo "NOZEROCONF=yes" >> /etc/sysconfig/network # 清除缓存 yum clean all && rm -rf /var/cache/yum
配置Cloud-init 1 2 3 4 5 # 安装cloud-init相关工具 # - epel-release: yum源 # - cloud-init: 云镜像初始化工具 # - cloud-utils-growpart: 支持虚拟机磁盘扩容 yum install -y epel-release cloud-init cloud-utils-growpart
镜像清理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 清理用户登录记录 echo > /var/log/wtmp echo > /var/log/btmp # 清理相应目录下的临时文件 rm -rf /var/log/cloud-init* rm -rf /var/lib/cloud/* rm -rf /var/log/network-config.log # 执行下面命令,清理残留配置信息 # - SUSE操作系统:查看“/etc/sysconfig/network/”文件夹下有哪些以“ifcfg”开头的文件,删除除了“ifcfg-lo及ifcfg.template”以外的以“ifcfg”开头的文件。 查看文件命令:ll /etc/sysconfig/network/ 删除文件命令:rm -rf /etc/sysconfig/network/ifcfgxxx # - RedHat/CentOS/Oracle/Euler操作系统:查看“/etc/sysconfig/network-scripts/”文件夹下有哪些以“ifcfg”开头的文件,删除除了“ifcfg-lo”以外的以“ifcfg”开头的文件。 查看文件命令:ll /etc/sysconfig/network-scripts/ 删除文件命令:rm -rf /etc/sysconfig/network-scripts/ifcfgxxx # - Ubuntu操作系统: rm -rf /etc/network/interfaces.d/50-cloud-init.cfg # 清除历史操作记录 history -w;echo > /root/.bash_history;history -c;history -c;history -c;
镜像压缩 1 2 3 4 # ---------------- # 宿主机 # ---------------- qemu-img convert -c -O qcow2 rhel7.9.qcow2 rhel-7-x86_64-GenericCloud-7.9.qcow2
Window镜像 资源下载地址
PS:新版本的virtio需要下载iso文件,内部驱动全面
制作镜像 1 2 # 注意事项 1. 创建虚机时,磁盘要尽可能的小,减小镜像的虚拟空间大小。
准备环境 1 2 3 4 5 6 7 8 9 # 基础环境准备 yum install -y qemu-kvm qemu-img virt-manager virt-install libvirt # 下载所需文件 # 系统镜像: # - windows10 (cn_windows_10_business_editions_version_1903_updated_july_2019_x64_dvd_68b4eeaa.iso) # - windows server 2016 (cn_windows_server_2016_vl_x64_dvd_11636695.iso) # virtio驱动: # - virtio-win-0.1.190.iso
命令方式创建虚机 1 2 3 4 5 6 7 8 9 10 11 # 创建链接 ln -sv /usr/libexec/qemu-kvm /usr/bin/ # 创建磁盘 qemu-img create -f qcow2 cn_windows_server_2016_vl_x64_cloud_11636695.qcow2 15G # 创建虚机 qemu-kvm -m 1024 -cdrom cn_windows_server_2016_vl_x64_dvd_11636695.iso -drive file=cn_windows_server_2016_vl_x64_dvd_11636695.qcow2,if=virtio,boot=on -fda virtio-win_amd64.vfd -boot d -nographic -vnc :3 # VNC连接虚机 # 连接方式:`<server ip>:3
图形方式创建虚机
系统安装 需要注意以下两点:
系统安装时,初始无法识别硬盘,需要加载安装存储驱动后,方可识别出存储盘。
系统安装完成后,部分设备驱动需要手动安装,如:网卡驱动。
安装流程截图参考如下:
基础设置
安装Cloudbase-init(1.1.2)
配置Cloudbase-init(1.1.2) 修改 C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf
目录下的 cloudbase-init.conf
和 cloudbase-init-unattend.conf
配置文件
在 cloudbase-init.conf
末尾添加如下字段
1 2 3 4 5 6 7 metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService,cloudbaseinit.metadata.services.httpservice.HttpService,cloudbaseinit.metadata.services.ec2service.EC2Service,cloudbaseinit.metadata.services.maasservice.MaaSHttpService plugins=cloudbaseinit.plugins.common.mtu.MTUPlugin,cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin,cloudbaseinit.plugins.windows.setuserpassword.SetUserPasswordPlugin allow_reboot=false stop_service_on_exit=false check_latest_version=false
在 cloudbase-init.conf
和 cloudbase-init-unattend.conf
中增加以下配置:
1 2 3 4 5 6 # 配置获取metadata的重试次数和间隔 retry_count=40 retry_count_interval=5 # 不需要修改首次登录使用的密码时,可关闭此功能 first_logon_behaviour=no
将 cloudbase-init.conf
和 cloudbase-init-unattend.conf
中plugins字段替换成以下配置
1 2 3 4 cloudbaseinit.plugins.common.mtu.MTUPlugin, cloudbaseinit.plugins.windows.ntpclient.NTPClientPlugin, cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin, cloudbaseinit.plugins.windows.createuser.CreateUserPlugin, cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin, cloudbaseinit.plugins.windows.licensing.WindowsLicensingPlugin, cloudbaseinit.plugins.common.sshpublickeys.SetUserSSHPublicKeysPlugin, cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin, cloudbaseinit.plugins.common.userdata.UserDataPlugin, cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin, cloudbaseinit.plugins.windows.winrmlistener.ConfigWinRMListenerPlugin, cloudbaseinit.plugins.windows.winrmcertificateauth.ConfigWinRMCertificateAuthPlugin, cloudbaseinit.plugins.common.localscripts.LocalScriptsPlugin # cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin为密码注入插件 # cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin为磁盘扩展插件
修改SAN策略为OnlineAll类型否则可能导致使用镜像创建云服务器时磁盘处于脱机状态。
1 2 3 4 5 6 7 # 查询服务器当前san策略: cmd命令行执行diskpart,执行san # 如果SAN策略为OnlineAll,请执行exit 命令退出DiskPart # 执行以下命令修改云服务器SAN策略为OnlineAll。 san policy=onlineall
安装Virtio-win-guest-tools
安装完成后查看进程QEMU Guest Agent服务已经启动
执行sysprep
进入Cloudbase-Init工具安装路径。
以Cloudbase-Init工具安装在“C:\Program Files\Cloudbase Solutions\”目录下为例。请切换至C盘根目录下,执行以下命令,进入安装目录。
cd C:\Program Files\Cloudbase Solutions\Cloudbase-Init\conf
执行以下命令,对Windows系统进行封装。
C:\Windows\System32\sysprep\sysprep.exe /generalize /oobe /unattend:Unattend.xml
注意:
请务必在执行该命令时,包含“/unattend:Unattend.xml”,否则您当前云服务器的用户名密码等重要配置信息会被重置,后续使用该Windows私有镜像创建的云服务器启动后仍然需要手动执行操作系统设置。
执行完该命令后,云服务器会自动关机。请在关机后使用该云服务器创建镜像,可以保证后续使用该镜像创建的云服务器SID唯一。如果重新启动已经执行过Sysprep操作的Windows云服务器,则执行的Sysprep操作仅对当前云服务器生效,创建镜像前需要重新执行Sysprep操作。
对于Windows Server 2012以及Windows Server 2012 R2操作系统,当云服务器执行完Sysprep操作后,云服务器的Administrator帐号密码会被清除,请您登录云服务器后重新手动设置Administrator帐号的密码,此时在管理控制台界面中设置的云服务器密码将无效,请您妥善保管重新设置的密码。
使用的Windows操作系统需要采用域帐号登录时,请务必在创建私有镜像前执行Sysprep操作。执行Sysprep操作带来的影响请参考“Windows操作系统制作私有镜像为什么要执行Sysprep操作? ”。
Windows云服务器中的Cloudbase-Init帐户为Cloudbase-Init代理程序的内置帐户,用于云服务器启动的时候获取元数据并执行相关配置。如果用户修改、删除此帐户或者卸载Cloudbase-Init代理程序会导致由此云服务器创建的Windows私有镜像所生成新的云服务器初始化的自定义信息注入失败。因此,不建议修改或删除Cloudbase-Init帐户。
镜像压缩 1 qemu-img convert -c -O qcow2 winserver2016.qcow2 cn_windows_server_2016_vl_x64.qcow2
镜像上传 1 2 3 4 5 6 7 8 # PS: # 1. 镜像image元数据已经设置hw_qemu_guest_agent为yes,并且QEMU Guest Agent服务正在云主机中运行 # 2. 镜像image元数据设置了os_admin_user。例如,“Administrator”,如果未设置,则nova可能把一个windows guest的管理员误认为是root # 3. libvirt版本不低于1.2.16 openstack image create --disk-format qcow2 --public \ --property hw_qemu_guest_agent=yes \ --property os_admin_user=Administrator \ --file /root/cn_windows_server_2016_vl_x64.qcow2 windows2016
参考文档 cloud-init
cloudbase-init
官方文档
实践
常见问题