使用云映像和 virt-install 版本 3 在 Fedora 服务器上设置 VM

本文探讨了使用virt-install版本 3 新引入的--cloud-init选项在 Fedora 33 Server Edition 中将 Fedora Cloud Base映像部署为 VM 的可能性。

为什么使用云映像?

Fedora Server的标准虚拟化工具是libvirt。很长一段时间以来,创建虚拟 Fedora 服务器实例的唯一方法是创建一个libvirt VM 并运行标准的 Anaconda 安装。有几种工具可以使此过程尽可能舒适和故障安全,例如驾驶舱模块。这个过程非常简单,每个 Fedora 系统管理员都习惯了。

随着云系统的出现,云图像也随之而来。这些是预先构建的即用型虚拟服务器。Fedora 为各种云系统提供专用映像,以及 Fedora Cloud Base 映像(一种通用的优化 VM)。映像将复制到服务器,并由虚拟机用作操作文件系统。

这些图像为系统管理员节省了通过Anaconda的许多个人传递的耗时过程。安装只需要调用具有合适参数的virt-install。它是一个CLI工具,因此很容易编写脚本和重现。在最坏的情况下,可以快速设置替换 VM。

Fedora Cloud Base 映像已集成到 Fedora QA 流程中。这可以防止在操作过程中可能导致不那么微妙的问题的细微不一致。对于任何关心安全性和可靠性的系统管理员来说,与来自第三方供应商的libvirt兼容VM映像相比,这是一个非常有价值的优势。云映像也加快了部署过程。

实现注意事项

像往常一样,没有免费的东西。云映像使用cloud-init进行自动初始配置,否则将作为 Anaconda 的一部分完成。云系统通常提供必要的信息。在没有云的情况下,系统管理员必须提供替换。

基本上,有两个实现选项。

首先,只需相对较少的额外工作,您就可以安装Vagrant和Vagrant libvirt插件。如果服务器也用于开发工作,则Vagrant可能已经在使用中,并且额外的工作量很小。然后,此选项是最佳选择。

其次,您可以直接使用virt-install。到目前为止,您必须通过几个额外的步骤创建一个云初始化的nocloud数据源iso。自 Fedora 33 以来包含的 virt-install版本 3 消除了这些附加步骤。新引入的 --cloud-init选项最初从云映像配置 VM,无需其他软件,也无需绕路。Virt-install负责驯服相当复杂的云初始化nocloud过程。

有两种方法可以使用virt-install:

  • 快速且(不是真的)脏:最小的 Cloud-init
    配置 这需要更多的安装后工作,并且只设置几个 VM 时适用。
  • 使用简单的配置文件
    精心设计基于云的配置 这需要更多的安装前工作,并且如果必须设置多个 VM,则效率更高。

准备

首先下载一个 Fedora 33 Cloud Base Image 文件,并将其存储在目录 /var/lib/libvirt/boot中。按照惯例,这是安装映像的位置。

# sudo wget https://download.fedoraproject.org/pub/fedora/linux/releases/33/Cloud/x86_64/images/Fedora-Cloud-Base-33-1.2.x86_64.qcow2  -O /var/lib/libvirt/boot/Fedora-Cloud-Base-33-1.2.x86_64.qcow2 
# sudo wget https://getfedora.org/static/checksums/Fedora-Cloud-33-1.2-x86_64-CHECKSUM -O   /var/lib/libvirt/boot/Fedora-Cloud-33-1.2-x86_64-CHECKSUM 
# sudo cd /var/lib/libvirt/boot
# sudo sha256sum --ignore-missing -c *-CHECKSUM 

*CHECKSUM 文件包含所有云映像的值。该检查应导致一个OK

完成这些准备工作后,以下两个示例(创建 VM应用Web)应该可以完美无缺地工作。

示例 1:快速和(不是真的)脏:最小的云初始化配置

应用程序VM 的安装首先在目录/var/lib/lib/libvirt/images中创建下载映像的副本作为(完全安装的)虚拟磁盘。按照惯例,这是虚拟磁盘池。virt-install程序执行安装。virt-install上的参数传递所有必需的信息。无需进一步的干预或准备 参数首先指定通常的一般属性,例如服务器的内存,CPU和(非图形)控制台。参数‐-graphics none强制重定向到终端窗口。引导后,您会收到 VM 终端提示,并立即从主机进行访问。参数‐-import会导致跳过安装任务并从‐-disk参数指定的第一个虚拟磁盘引导。VM"应用"将连接到内部虚拟网络,因此只有一个网络由‐-network参数指定。

唯一的新参数是‐-cloud-init,没有任何进一步的子参数。这会导致生成和显示 root 密码,从而启用一次性登录。cloud-init 使用合理的默认设置执行。最后,它将被停用,并且在后续引导过程中不会执行。

安装完成后,将显示 VM 终端。请注意,第一个 root 登录密码在此过程的早期显示,并用于初始登录。此密码是一次性使用的,必须在首次登录时替换。

# sudo cp  /var/lib/libvirt/boot/Fedora-Cloud-Base-33-1.2.x86_64.qcow2 \
      /var/lib/libvirt/images/app.qcow2 
# sudo virt-install  --name app \
    --memory 3074  --cpu host --vcpus 3 --graphics none\
    --os-type linux --os-variant fedora33  --import  \
    --disk /var/lib/libvirt/images/app.qcow2,format=qcow2,bus=virtio \
    --network bridge=virbr0,model=virtio  \
    --cloud-init
 WARNING  Defaulting to --cloud-init root-password-generate=yes,disable=yes
 Installation startet …
 Password for first root login is: OtMQshytI0E8xZGD
 Installation will continue in 10 seconds (press Enter to skip)…Running text console command: …
 Connected to Domain: app
 Escape character is ^] (Ctrl + ])
 [    0.000000] Linux version 5.8.15-301.fc33.x86_64 (mockbuild@bkernel01.iad2.fedoraproject …
 …
 …
 [   29.271451] cloud-init[721]: Cloud-init v. 19.4 finished … Datasource DataSourceNoCloud …
 [FAILED] Failed to start Execute cloud user/final scripts.
 See 'systemctl status cloud-final.service' for details.
 [  OK  ] Reached target Cloud-init target.
 Fedora 33 (Cloud Edition)
 Kernel 5.8.15-301.fc33.x86_64 on an x86_64 (ttyS0)
 localhost login: 

注:在Ubuntu 18.04.6 LTS (Bionic Beaver) bionic-server-cloudimg-amd64.img镜像测试也成功设置root密码。

错误消息不雅观,但不影响操作。(这可能是云初始化服务保持启用状态的原因。您可以手动禁用它或将其删除。

安装后任务

最初显示的密码启用root登录并强制设置新密码。

安装并重新启动完成后,使用<ctrl>+]退出并关闭控制台。

VM 将自动停用,并且在后续启动过程中不会执行。若要覆盖此设置,请在主机上启用应用VM 的自动启动

# sudo virsh autostart app

示例 2:实现复杂配置的简单方法

virt-install cloud-init 过程由两个子参数(元数据和用户数据)提供。每个都引用一个配置文件。这些文件以前被埋在一个特殊的iso映像中,现在由virt-install模拟。您可以自由选择存储这些文件的位置。但是,最好是系统化的,在引导目录中选择一个子目录是一个不错的选择。此示例将使用/var/lib/libvirt/boot/cloud-init

元数据参数引用的文件包含有关运行时环境的信息。在此示例中,名称是Web 元数据。此处它仅包含必需参数instance-id。它在云环境中必须是唯一的,但可以在这里任意选择,就像在无云环境中一样。

# sudo mkdir /var/lib/libvirt/boot/cloud-init
# sudo vim /var/lib/libvirt/boot/cloud-init/web-meta-data
instance-id: web-app

user-data 参数引用的文件包含主要的配置工作。此示例使用名称Web 用户数据。第一行必须包含某种shebang,cloud-init使用它来确定以下数据的格式。格式本身是yamlWeb 用户数据文件定义了几个步骤:

  1. 设置主机名
  2. 使用复制到文件中的公共 RSA 密钥以及回退帐户"hostmin"(或类似名称)设置用户根目录。后者可以通过密码登录并分配给组轮
  3. 为两个用户设置首次登录密码以进行初始登录,该密码必须在首次登录时更改
  4. 安装所需的其他软件包,例如防火墙,fail2ban,postfix(fail2ban需要)和web服务器
  5. 某些软件包需要额外的配置文件
  6. VM 需要更新所有程序包
  7. 需要多个配置命令
    1. 将受信任的区域分配给接口 eth1(dbus 路径中的第 2 个位置,因此调用libvirt时网络参数的顺序至关重要!)并根据命名约定对其进行重命名。修改也会保留到配置文件中(仍在 /etc/sysconfig/network-scripts/ 中)
    2. 启动防火墙并添加 web 服务
    3. 最后禁用云初始化

配置文件完成后,如果手动完成,它将消除耗时的过程。这种效率使得云图像的使用具有吸引力。网络用户数据的定义如下:

# vim /var/lib/libvirt/boot/cloud-init/web-user-data 
# cloud-config
# (1) setting hostname
preserve_hostname: False
hostname: web
fqdn: web.example.com

# (2) set up root and fallback account including rsa key copied into this file
users:
    - name: root
      ssh-authorized-keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQA…jSMt9rC4uKDPR8whgw==
    - name: hostmin 
      groups: users,wheel 
      ssh_pwauth: True 
      ssh-authorized-keys: 
      - ssh-rsa AAAAB3NzaC1yc2EAAAIAQDix...Mt9rC4uKDPR8whgw==
 
# (3) set up a first-time password for both accounts
chpasswd:
  list: |
    root:myPassword
    hostmin:topSecret
  expire: True

# (4) install additional required packages
packages:
  - firewalld
  - postfix
  - fail2ban
  - vim
  - httpd
  - mod_ssl
  - letsencrypt 

# (5) some packages need additional configuration files
write_files:
  - path: /etc/fail2ban/jail.local
    content: |
      # /etc/fail2ban/jail.local
      # Jail configuration local customization 

      # Adjust the default configuration's default values
      [DEFAULT]
      ##ignoreip = /24  /32
      bantime  = 6600
      backend = auto 
      # The main configuration file defines all services but
      # deactivates them by default. Activate those needed
      [sshd]
      enabled = true
      # detect password authentication failures
      [apache-auth]
      enabled = true
      # detect spammer robots crawling email addresses
      [apache-badbots]
      enabled = true
      # detect Apache overflow attempts
      [apache-overflows]
      enabled = true
  - path: /etc/httpd/conf.d/vhost_default.conf
    content: |
      <VirtualHost *:80>
          ServerAdmin     root@localhost
          DirectoryIndex  index.jsp 
          DocumentRoot    /var/www/html  
          <Directory "/var/www.html"> 
              Options Indexes FollowSymLinks 
              AllowOverride   none  
              # Allow open access: 
              Require all granted 
          </Directory>
          ProxyPass    /   http://app:8080/
      </VirtualHost>
 
# (6) perform a package upgrade
package_upgrade: true 

# (7) several configuration commands are executed on first boot
runcmd:
  # (a.) assign a zone to internal interface as well as some other adaptations.
  # results in the writing of a configuration file
  # IMPORTANT: internal interface have to be specified SECOND after external 
  - nmcli con mod path 2 con-name eth1  connection.zone trusted
  - nmcli con mod path 2 con-name 'System eth1' ipv6.method disabled
  - nmcli con up  path 2
  # (b.) activate and configure firewall and additional services
  - systemctl enable firewalld  --now
  - firewall-cmd  --permanent –add-service=http
  - firewall-cmd  --permanent –add-service=https
  - firewall-cmd  --reload
  - systemctl  enable  fail2ban  --now
  # compensate for a SELinux port handling issue
  - setsebool httpd_can_network_connect 1 -P
  - systemctl  enable  httpd –-now
  # (c.) finally disable cloud-init
  - systemctl  disable  cloud-init
  - reboot 
# done

云初始化项目文档的示例部分提供了用户数据配置选项的详细概述。

完成配置文件后,启动 virt 安装过程。根据需要调整CPU,内存,外部网络接口等的值。

# sudo virt-install   --name web \
     --memory 3072  --cpu host --vcpus 3  --graphics none \
     --os-type linux --os-variant fedora33  --import \
     --disk /var/lib/libvirt/images/web.qcow2,bus=virtio,size=20  \
     --network type=direct,source=enp1s0,source_mode=bridge,model=virtio \
     --network bridge=virbr0,model=virtio \
     --cloud-init meta-data=/var/lib/libvirt/boot/cloud-init/web-meta-data,user-data=/var/lib/libvirt/boot/cloud-init/web-user-data

返回主机启用 VM 的自动启动:

# virsh autostart web

配置静态地址

根据规范,在元数据中配置静态网络连接。配置如下所示:

# vim /var/lib/libdir/boot/cloud-init/web-meta-data
instance-id: web-app
network-interfaces: |
  iface eth0 inet static
  address 192.168.1.10
  netmask 255.255.255.0
  gateway 192.168.1.254

Cloud-init将相应地创建一个配置文件。但有2个问题

  • 配置文件是在通过 dhcp 默认初始化接口后创建的,并且不会重新初始化接口。
  • 生成的配置文件包括onboot=no设置,因此在重新启动后也没有连接。

有几个提示表明这是一个已经存在很长时间的错误,因此需要手动干预。

在元数据中没有网络规范,并根据用户数据中的默认初始化手动进行调整,可能会更容易,更有效。在配置内部网络之前,请执行以下操作:

# nmcli con mod path 1 ipv4.method static ipv4.addresses '192.168.158.240/24' ipv4.gateway '192.168.158.1' ipv4.dns '192.168.158.1'
# nmcli con mod path 1 ipv6.method static ipv6.addresses '2003:ca:7f06:2c00:5054:ff:fed6:5b27/64' ipv6.gateway 'fe80::1' ipv6.dns '003:ca:7f06:2c00::add:9999'
# nmcli con up path 1

这样做,连接将立即重置为新规范,并立即调整配置文件。请记住根据需要调整配置值。

或者,这 3 个语句可以作为用户数据文件的一部分,并根据需要进行调整或注释。文件的相应部分将如下所示

...
 # (7.) several configuration commands are executed on first  boot
 runcmd:
  # If needed,convert interface eth0 as static
  # comment in and modify as required
  #- nmcli con mod path 1 ipv4.method static ipv4.addresses '<IPv4>/24' ipv4.gateway '<IPv4>' ipv4.dns 'IPv4
  #- nmcli con mod path 1 ipv6.method static ipv6.addresses '<IPv6>/64' ipv6.gateway '<IPv6>' ipv6.dns '<IPv6>'
  #- nmcli con up path 1
  # (a) assign a zone to internal interface as well as some other adaptations.
  # results in the writing of a configuration file
  # IMPORTANT: internal interface have to be specified SECOND after external
  - nmcli con mod path 2 con-name eth1  connection.zone trusted
  - ...

同样,根据需要调整<IPv4>,<IPv6>等配置值!

通过 virt-install 版本 3 配置 cloud-init 过程非常高效且灵活。可以为每个 VM 创建一组专用文件,也可以保留一组通用文件,并根据需要通过注释来调整它们。可以使用两者的组合。您可以快速轻松地更改设置,以测试是否适合您的目的。

总而言之,虽然使用 Fedora Cloud Base Images 会带来一些不便,并且在文档中存在缺点,但 Fedora Cloud Base 镜像和 virt-install 版本 3 是快速高效地为 Fedora Server 创建虚拟机的绝佳组合。

原文地址:https://blog.csdn.net/allway2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340