jjzjj

G027-OP-INS-RHEL-04 RedHat OpenStack 创建自定义的QCOW2格式镜像

CloudCS 2023-03-28 原文

1 您需要了解

  • 约定:我们称运行在 VMware Workstation 里面的虚拟机为客户虚拟机(以下简称虚机,采用 CentOS 7.8 图形化);我们称在虚机里面基于 KVM 运行的虚拟机为 KVM虚拟机(以下简称 KVM虚机,采用 CentOS 7.4),是的,两层套娃
  • 虚机在启动前,必须在 VMware Workstation 上为其开启虚拟化引擎 虚拟化 Intel VT-x/EPT 或 AMD-V
  • 建议虚机网络配置为 NAT桥接,因为未来 KVM虚机 需要借助 虚机 的外网能力进行联网安装软件包
  • 您可参考下列相关文章 G016 完成 CentOS 安装及 G019G020 完成 RedHat OpenStack 环境搭建及基础操作
  • 为有更好的浏览体验,您可以点击文章左上方目录按钮来显示文章整体目录结构

2 安装 KVM 虚机

2.1 虚机安装虚拟化软件包

注意:虚机 指的是 CentOS 7.8

#挂载光盘 [root@cloudcs ~]# mount /dev/cdrom /mnt mount: /dev/sr0 is write-protected, mounting read-only [root@cloudcs ~]# ls /mnt/ CentOS_BuildTag EULA images LiveOS repodata RPM-GPG-KEY-CentOS-Testing-7 EFI GPL isolinux Packages RPM-GPG-KEY-CentOS-7 TRANS.TBL #配置本地YUM源 [root@cloudcs ~]# mkdir /tmp/repo [root@cloudcs ~]# mv /etc/yum.repos.d/*.repo /tmp/repo/ [root@cloudcs ~]# vim /etc/yum.repos.d/local.repo [root@cloudcs ~]# cat /etc/yum.repos.d/local.repo [local_repo] name = local baseurl = file:///mnt/ gpgcheck = 0 #安装虚拟化软件包及虚拟机镜像管理工具 [root@cloudcs ~]# yum groupinstall -y "Virtualization*" [root@cloudcs ~]# yum install -y libguestfs-tools-c.x86_64

2.2 创建 KVM 虚机

注意:虚机 通过命令 ifconfig 可看到一张虚拟网卡 vritbr0,该虚拟网卡为 kvm虚机 default 默认的 NAT 网络类型网卡(192.168.122.1

#创建目录上传ISO镜像 [root@cloudcs ~]# mkdir -p /soft/disk #将 CentOS 7.4 上传到 /soft 目录下 [root@cloudcs ~]# ls /soft/ CentOS-7-x86_64-DVD-1708.iso disk #创建 kvm虚机 使用的磁盘文件 [root@cloudcs ~]# qemu-img create -f qcow2 /soft/disk/centos7.qcow2 15G Formatting '/soft/disk/centos7.qcow2', fmt=qcow2 size=16106127360 encryption=off cluster_size=65536 lazy_refcounts=off #创建 kvm 虚机 virt-install \ --name centos \ --disk path=/soft/disk/centos7.qcow2 \ --vcpus 1 \ --memory 2048 \ --location /soft/CentOS-7-x86_64-DVD-1708.iso \ --network network=default

2.3 安装 KVM 虚机

2.3.1 语言选择

2.3.2 自动分区

2.3.3 网络及主机名

注意:当开启网络后,必须可以通过 DHCP 自动获取到 IP 地址,如下图

2.3.4 配置 ROOT 密码

默认采用最小化 minimal 安装

2.3.5 重启并测试网络

重启 kvm 虚机,并以 root 身份登录,测试 kvm 虚机 能否连通外网

3 配置 KVM 虚拟机

3.1 修改 KVM 虚机网络配置文件

注意:修改的是 kvm虚机,不是 虚机,概念分不清?参考第一部分 约定

# 修改 kvm 虚机网卡配置文件,使其只包括以下 4 行内容 [root@local ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 [root@local ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=dhcp DEVICE=eth0 ONBOOT=yes

3.2 安装 cloud-init 软件包

根据 2.3.5 小节测试,kvm 虚机可正常连通外网,此时直接在线安装软件包即可。目的是为了可以获取到客户自定义元数据信息,如主机名及root密码等。

[root@local ~]# yum install -y cloud-utils-growpart cloud-init #输出 Loaded plugins: fastestmirror base | 3.6 kB 00:00 extras | 2.9 kB 00:00 updates | 2.9 kB 00:00 (1/4): extras/7/x86_64/primary_db | 247 kB 00:00 (2/4): base/7/x86_64/group_gz | 153 kB 00:00 (3/4): updates/7/x86_64/primary_db | 16 MB 00:31 (4/4): base/7/x86_64/primary_db | 6.1 MB 00:36 Determining fastest mirrors * base: mirrors.cn99.com * extras: mirrors.ustc.edu.cn * updates: mirrors.ustc.edu.cn Resolving Dependencies --> Running transaction check ---> Package cloud-init.x86_64 0:19.4-7.el7.centos.6 will be installed --> Processing Dependency: python-six for package: cloud-init-19.4-7.el7.centos.6.x86_64 --> Processing Dependency: python-setuptools for package: cloud-init-19.4-7.el7.centos.6.x86_64 --> Processing Dependency: python-requests for package: cloud-init-19.4-7.el7.centos.6.x86_64 --> Processing Dependency: python-prettytable for package: cloud-init-19.4-7.el7.centos.6.x86_64 ...省略... Dependency Updated: audit.x86_64 0:2.8.5-4.el7 audit-libs.x86_64 0:2.8.5-4.el7 libselinux.x86_64 0:2.5-15.el7 libselinux-python.x86_64 0:2.5-15.el7 libselinux-utils.x86_64 0:2.5-15.el7 libsemanage.x86_64 0:2.5-14.el7 libsepol.x86_64 0:2.5-10.el7 policycoreutils.x86_64 0:2.5-34.el7 Complete!

3.3 编辑 cloud.cfg 文件

编辑 /etc/cloud/cloud.cfg 配置文件,在 cloud_init_modules 下添加以下内容

#添加内容 - resolv-conf #最终配置文件效果 [root@local ~]# vi /etc/cloud/cloud.cfg [root@local ~]# cat /etc/cloud/cloud.cfg 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 - resolv-conf 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 # vim:syntax=yaml

3.4 编辑 network 文件

编辑 /etc/sysconfig/network 配置文件,使其包含以下内容,避免访问 EC2 元数据服务时出现问题。

#添加内容 NOZEROCONF=yes #最终配置文件效果 [root@local ~]# vi /etc/sysconfig/network [root@local ~]# cat /etc/sysconfig/network #Created by anaconda NOZEROCONF=yes

3.5 编辑 grub 文件

编辑 /etc/default/grub 配置文件,使其包含以下引导选项内容,为了确保控制台的信息出现在 dashboard 的日志标签页中,以及 nova console-log 日志的输出内容中。

#添加内容 GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8" #最终配置文件效果 [root@local ~]# vi /etc/default/grub [root@local ~]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet" GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8" GRUB_DISABLE_RECOVERY="true" #执行命令使参数生效 [root@local ~]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-c515a8f65bf14e138d99b2c451179327 Found initrd image: /boot/initramfs-0-rescue-c515a8f65bf14e138d99b2c451179327.img done

3.6 关闭 KVM 虚拟机

[root@local ~]# init 0

4 创建 QCOW2 镜像

注意:以下步骤在 虚机 中操作,不是 kvm 虚机,概念分不清?参考第一部分 约定

4.1 重置并清理镜像

[root@cloudcs ~]# virsh list --all Id Name State ---------------------------------------------------- - centos shut off [root@cloudcs ~]# virt-sysprep -d centos #输出 [ 0.0] Examining the guest ... [ 25.4] Performing "abrt-data" ... [ 25.4] Performing "backup-files" ... [ 26.3] Performing "bash-history" ... [ 26.4] Performing "blkid-tab" ... [ 26.4] Performing "crash-data" ... [ 26.4] Performing "cron-spool" ... [ 26.4] Performing "dhcp-client-state" ... [ 26.4] Performing "dhcp-server-state" ... [ 26.4] Performing "dovecot-data" ... [ 26.4] Performing "logfiles" ... [ 26.5] Performing "machine-id" ... [ 26.5] Performing "mail-spool" ... [ 26.5] Performing "net-hostname" ... [ 26.5] Performing "net-hwaddr" ... [ 26.5] Performing "pacct-log" ... [ 26.5] Performing "package-manager-cache" ... [ 26.5] Performing "pam-data" ... [ 26.5] Performing "passwd-backups" ... [ 26.5] Performing "puppet-data-log" ... [ 26.6] Performing "rh-subscription-manager" ... [ 26.6] Performing "rhn-systemid" ... [ 26.6] Performing "rpm-db" ... [ 26.6] Performing "samba-db-log" ... [ 26.6] Performing "script" ... [ 26.6] Performing "smolt-uuid" ... [ 26.6] Performing "ssh-hostkeys" ... [ 26.6] Performing "ssh-userdir" ... [ 26.6] Performing "sssd-db-log" ... [ 26.6] Performing "tmp-files" ... [ 26.6] Performing "udev-persistent-net" ... [ 26.6] Performing "utmp" ... [ 26.6] Performing "yum-uuid" ... [ 26.6] Performing "customize" ... [ 26.6] Setting a random seed [ 26.6] Setting the machine ID in /etc/machine-id [ 26.7] Performing "lvm-uuids" ...

4.2 创建并压缩镜像

#查找 centos 实例对应的磁盘文件 [root@cloudcs ~]# virsh domblklist centos Target Source ------------------------------------------------ vda /soft/disk/centos7.qcow2 hda - #创建并清理压缩镜像 [root@cloudcs ~]# virt-sparsify --compress /soft/disk/centos7.qcow2 /tmp/centos-cloud.qcow2 #输出 [ 0.0] Create overlay file in /tmp to protect source disk [ 0.1] Examine source disk 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 [ 13.6] Fill free space in /dev/centos/root with zero 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 [ 31.5] Clearing Linux swap on /dev/centos/swap [ 33.3] Fill free space in /dev/sda1 with zero [ 40.9] Copy to destination and make sparse [ 101.4] Sparsify operation completed with no errors. virt-sparsify: Before deleting the old disk, carefully check that the target disk boots and works correctly.

5 测试镜像启动

5.1 注册镜像

将镜像 centos-cloud.qcow2 注册到 OpenStack 平台,以下为图形化注册演示,命令行注册请参考博文 G020-OP-INS-RHEL-02 RedHat OpenStack 发放云主机(命令行)

5.2 创建云主机类型(规格)

5.3 开启添加ROOT密码

开启添加 ROOT 密码后,可通过命令行或 WebUI 界面进行 root 密码自定义

5.3.1 控制节点

/etc/openstack-dashboard/local_settings 文件中,把 can_set_password 参数的值设为 True

[root@controller ~]# vim /etc/openstack-dashboard/local_settings ... 'can_set_password': True ...
/etc/nova/nova.conf 文件中,把 inject_password 参数的值设为 True

[root@controller ~]# vim /etc/nova/nova.conf ... inject_password=true ...
重启服务

[root@controller ~]# systemctl restart openstack-nova-compute.service [root@controller ~]# systemctl restart httpd.service

5.3.2 计算节点

在计算节点上的 /etc/nova/nova.conf 文件中,把 inject_password 参数的值设为 True

[root@compute ~]# vim /etc/nova/nova.conf ... inject_password=true ...
重启服务

[root@compute ~]# systemctl restart openstack-nova-compute.service

5.4 发放云主机测试

注意:网络及路由请参考 G020 创建,务必保证路由及网关存在,否则无法获取到客户自定义主机名

观察启动流程及尝试登录,测试镜像正确无误


  • END

有关G027-OP-INS-RHEL-04 RedHat OpenStack 创建自定义的QCOW2格式镜像的更多相关文章

  1. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  2. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  3. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  4. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  5. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  6. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  7. ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们 - 2

    Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在

  8. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  9. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

  10. ruby-on-rails - 在 Rails 中自定义 "Password confirmation doesn' t 匹配密码 - 2

    有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword

随机推荐