Linux 环境下使用 KVM + Vagrant 创建虚拟机

packer 用于打包 box,vagrant 用于管理创建虚拟机,KVM 是虚拟化平台。


开始

  • 准备工作:
  • 开始创建虚拟机
    • 添加适用于 KVM 的 Box:vagrant box add centos/7.9 centos-7.9.libvirt-kvm.box

      要添加带版本号的 Box:vagrant box add metadata-libvirt.json metadata-libvirt.json 示例

    • 进入 Vagrantfile 配置文件存放目录:cd ~/workfiles/KVM_Files/vagrant_apps_config/viewfiex
    • 开启虚拟机:vagrant up --provider=libvirt

      不想每次都输入 provider:export VAGRANT_DEFAULT_PROVIDER=libvirt

  • 连接虚拟机:ssh -i /home/iechoxu/.ssh/id_rsa_vagrant echoxu@192.168.121.89 -p 51888 或者 vagrant ssh
  • FAQ:
    • 开启 debug 模式:VAGRANT_LOG=debug vagrant up --provider=libvirt
    • 只开启某一个虚拟机:先用 vagrant status 找到虚拟机的名称,假如是:DB,再用 vagrant up DB 开启这个虚拟机。
    • Fedora35 安装 KVM
      • fedora 需要先删除 vagrant-libvirt:sudo dnf remove --noautoremove vagrant-libvirt
      • 安装依赖:
        • sudo dnf install libxslt-devel libxml2-devel libvirt-devel ruby-devel gcc
        • sudo dnf install gcc libvirt libvirt-devel libxml2-devel make ruby-devel libguestfs-tools
        • export CONFIGURE_ARGS="with-libvirt-include=/usr/include/libvirt with-libvirt-lib=/usr/lib64"
      • fedora 需要通过 virt-manager 手动添加名为 vagrant-libvirt 的网络
      • fedora 安装 kvm 文档
      • vagrant-libvirt 安装文档
    • Fedora 上非 root 用户打开 virt-manager 要输入密码
      • 将当前用户添加到 libvirt 组:sudo usermod -aG libvirt $USER
      • 重启 libvirtd:sudo systemctl restart libvirtd 即可不用输入密码打开 virt-manager
    • vagrant up 报错 “Unable to resolve dependency: user requested 'vagrant-libvirt (= 0.9.0)'”
      • 这是由于 sudo dnf update 更新了 vagrant-libvirt 版本
      • 删除旧的 vagrant-libvirt:vagrant plugin uninstall vagrant-libvirt
      • 安装最新的 vagrant-libvirt:vagrant plugin install --plugin-clean-sources --plugin-source https://gems.ruby-china.com/ vagrant-libvirt
    • name devops.com-CI-CD of domain about to create is already taken. Please try to run vagrant up command again
      • rm -rf .vagrant 再执行 vagrant up 看是否报错
      • 如果还报错就通过 virt-manager 删除 devops.com-CI-CD 这个虚拟机即可
    • Fedora 上没有权限打开 Cannot access storage file '/home/echoxu/workfiles/KVM_Files/vagrant_apps/devops.com-jenkins.img'
      • 先尝试使用 sudo usermod -a -G libvirt vagrant exec sg libvirt newgrp `id -gn`(未尝试)
      • 先创建存储目录:mkdir -p /home/echoxu/workfiles/KVM_Files/vagrant_apps
      • 编辑默认的存储池文件:sudo virsh pool-edit default,注意 修改 path、mode、ower 为你当前用户名,group 为 0,代表 root
        •   <target>
            	<path>/home/echoxu/workfiles/KVM_Files/vagrant_apps</path>
            	<permissions>
            	  <mode>0777</mode>
            	  <owner>1000</owner>
            	  <group>0</group>
            	  <label>system_u:object_r:virt_image_t:s0</label>
            	</permissions>
            </target>
              ```
          
      • 修改 qemu 配置文件:sudo vim /etc/libvirt/qemu.conf,添加: - bash user = "echoxu" group = "root"
      • 重启:sudo systemctl restart libvirtd
    • vagrant up 报错: Warning: Authentication failure. Retrying... 连接不了虚拟机
      • 问题描述:使用 vagrant up 时一直报错如上,但用 vagrant ssh 可以链接,且用 vagrant ssh-config 发现密钥配置正确
      • 环境:
        • 本地的 ssh 客户端(vagrant 提供) `SSH-2.0-Ruby/Net::SSH_6.1.0 x86_64-linux'
        • 虚拟机 ssh 服务端:remote is `SSH-2.0-OpenSSH_8.9p1 Ubuntu-3'
        • vagrant 版本:2.2.19
        • 系统版本:Fedora 35
        • 虚拟化:KVM
        • vagrant-libvirt 版本:vagrant plugin list 得出 vagrant-libvirt (0.8.2, global)
      • 问题排查:
        • vagrant up --debug 查看详细的报错日志,发现日志报错:net.ssh.transport.algorithms[153b0]: unsupported algorithm: ["rsa-sha2-256", "rsa-sha2-512"]'`
        • 先删除所有的密钥:ssh-add -D
        • 添加虚拟机密钥:ssh-add -l ~/.ssh/id_rsa_vagrant
        • 验证密钥是否正确:ssh echoxu@192.168.121.88 -p 51888 -i ~/.ssh/id_rsa_vagrant,发现可登录,这样就排除密钥配置错误
      • 错误原因
        • openssh 8 以后不支持 rsa-sha2-256", "rsa-sha2-512 加密算法
      • 解决办法
        • 添加 PubkeyAcceptedKeyTypes=+ssh-rsa 到虚拟机 /etc/ssh/sshd_config
      • 参考:
        • https://github.com/hashicorp/vagrant/issues/12344
        • https://github.com/hashicorp/vagrant/issues/12533
        • https://github.com/hashicorp/vagrant/issues/12751
        • https://www.openssh.com/txt/release-8.8
上次更新:
贡献者: iEchoxu