Linux 环境下使用 KVM + Vagrant 创建虚拟机
packer 用于打包 box,vagrant 用于管理创建虚拟机,KVM 是虚拟化平台。
开始
- 准备工作:
- 确保 Vagrant 已安装:Download Vagrant 并安装
- 确保 KVM 已安装:搭建 KVM 虚拟化平台
- 安装 vagrant-libvirt 插件
sudo apt install libvirt-dev
vagrant plugin install --plugin-clean-sources --plugin-source https://gems.ruby-china.com/ vagrant-libvirt
- 卸载插件:
vagrant plugin uninstall vagrant-libvirt
- 有一个用于创建 KVM 虚拟机的 Vagrant Box:使用 Packer 定制 vagrant base box
- 有一个用于管理与配置虚拟机的 Vagrantfile 文件:怎么写好 Vagrantfile ?
- 开始创建虚拟机
- 添加适用于 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
- 添加适用于 KVM 的 Box:
- 连接虚拟机:
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 需要先删除 vagrant-libvirt:
- Fedora 上非 root 用户打开 virt-manager 要输入密码
- 将当前用户添加到 libvirt 组:
sudo usermod -aG libvirt $USER
- 重启 libvirtd:
sudo systemctl restart libvirtd
即可不用输入密码打开 virt-manager
- 将当前用户添加到 libvirt 组:
- 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 runvagrant 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
- bash
<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
,发现可登录,这样就排除密钥配置错误
- vagrant up --debug 查看详细的报错日志,发现日志报错:
- 错误原因
- openssh 8 以后不支持 rsa-sha2-256", "rsa-sha2-512 加密算法
- 解决办法
- 添加
PubkeyAcceptedKeyTypes=+ssh-rsa
到虚拟机/etc/ssh/sshd_config
- 添加
- 参考:
- 开启 debug 模式: