0x0034's Blog.

vagrant创建虚拟机

字数统计: 672阅读时长: 3 min
2022/07/31

参考: https://cloud-atlas.readthedocs.io/zh_CN/latest/kvm/kvm_vdisk_live.html

CentOS7 安装libvirtd+ vagrant

1
2
3
4
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install libvirt-daemon-kvm libvirt-client vagrant gcc-c++ make libstdc++-devel libvirt-devel
sudo systemctl enable --now libvirtd
vagrant plugin install vagrant-libvirt

创建存储池(可选)

因为vagrant 的默认镜像路径在/var/lib, 大量的虚拟机可能会导致根目录存储爆炸所以建议单挂盘

ssd1.xml 文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<pool type='dir'>
<!-- 存储池名称 -->
<name>ssd1</name>
<source>
</source>
<target>
<!--存储池实际存储目录-->
<path>/ssd1/kvm/</path>
<permissions>
<mode>0755</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>
1
2
3
4
mkdir -p /ssd1/kvm/
virsh pool-define --file pool-ssd1.xml
virsh pool-start ssd1
virsh pool-autostart ssd1

创建虚拟机

Vagrantfile文件内容如下
PS: 已知问题, 如果在provision执行的初始化脚本中重启网络,会导致vagrant up卡住并超时, 建议直接异步执行, 回调通知即可

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
# 指定使用libvirt虚拟化引擎
ENV['VAGRANT_DEFAULT_PROVIDER'] = 'libvirt'


Vagrant.configure("2") do |config|
# 指定虚拟机名称
# 我的虚拟机的命名逻辑是nickname+ IP的后16位
# 这里的nickname 假设为test
config.vm.define "test001143" do |node|
# 指定Box镜像
node.vm.box = "anolis79"
# 设置网络桥接至物理网络
# PS: 我的物理网络也就是宿主机网络为192.168.1.1/24 所以可以在这剩下8位中任选不冲突的IP地址, 我宿主机的出口网卡为em1 所以本处为em1
node.vm.network "public_network", ip: '192.168.1.143', :bridge => 'em1', :dev => 'em1'
# 设置虚拟机的hostname
node.vm.hostname = "test001143"
node.vm.provider :libvirt do |v|
# 设置资源大小
v.memory = 8192
v.cpus = 4
v.machine_virtual_size = 100
# 指定存储池(可选),默认为default 存储池
v.storage_pool_name = "ssd1"
end
end
end

启动虚拟机

1
vagrant up

虚拟机附加磁盘

  • 宿主机创建磁盘镜像

创建一个50G的的Qcow2磁盘

1
2
3
4
5
6
# 1. 创建数据磁盘镜像
qemu-img create -f qcow2 data.qcow2 50G
# 2. 挂载磁盘镜像
# --target vdb 指定挂载设备为vdb
# --driver qemu --subdriver qcow2 指定磁盘格式
virsh attach-disk test001143 --source /ssd1/kvm/data.qcow2 --target vdb --persistent --driver qemu --subdriver qcow2
  • 虚拟机内挂载磁盘
1
2
3
4
5
6
mkfs.ext4 /dev/vdb
mkdir /data

# 获取设备的UUID
ll /dev/*/by-uuid/|grep vdd| awk '{print $9}'
# 记录返回值

将以下内容写入/etc/fstab
UUID为上面命令的输出

1
UUID=$UUID /data                   ext4    defaults        0 0

挂载磁盘

1
mount -a
CATALOG
  1. 1. CentOS7 安装libvirtd+ vagrant
  2. 2. 创建存储池(可选)
  3. 3. 创建虚拟机
  4. 4. 启动虚拟机
  5. 5. 虚拟机附加磁盘