Ubuntu server 22.04 安装kvm

2023-05-16

本人有一台工控机, 5500u cpu, 8g 内存,本来是打算用来跑docker的, 但是因为要装
k8s, 虚拟机会更加合适方便,

宿主机的系统是ubuntu server 22.04.1 LTS, 没有安装GUI。 所以vmware virtualbox就不考虑了。 纯命令行估计kvm 会更加合适。 一台机当两三台机用了。



Step 1 检查cpu是否开启虚拟化

国际惯例, 首先检查cpu有没开启虚拟化。
现在市面上估计都买不到不支持虚拟化的cpu了, 问题是我们也要检查下bios上有没enable虚拟化特性。

gateman@homeserver2:~$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used



Step 2 安装kvm

sudo apt update
sudo apt install qemu qemu-kvm libvirt-bin  bridge-utils  virt-manager

问题是 这个 libvirt-bin, 提供了virsh等命令工具帮助我们更好地管理kvm 实例。

而且比我以前用kvm时多了个系统服务libvirtd.service, 简单来讲,这个服务会用1个common的账号 libvirt 去启动kvm 实例进程。

所以我们的iso文件, 虚拟硬盘文件都必须放在能让libvirt 账号可以访问的地方。

如果是ubuntu 20.04 则有可能找不到libvirt-bin的包, 要分开安装

libvirt-daemon-system libvirt-clients

安装上面的东西后, 检查libvirtd服务有没有启动.

sudo systemctl status libvirtd.service

## if not started
sudo systemctl start libvirtd.service
sudo systemctl enable libvirtd.service



Step 3 设置桥接网卡

kvm 支持多种网络模式

桥接模式 (bridge)
NAT模式
路由模式
直接分配设备模式

第4种太奢侈, 而其他3种只有桥接模式能令虚拟机和局域网其他主机相互通信(ip 在同1个网段)

所以我们会选择桥接模式。

当我们用vmware virtualbox时, 桥接网卡都会自动配置好, 而kvm需要我们事先手动配置。

每个linux发型版的网络管理方式都不同, 而ubuntu 22.04.1 用的是自家的netplan 来管理的。 当然,如果我们启动用GUI, 则很可能会用NetworkManager.

既然我的机器是没有GUI的, 那就是netplan了
检查 /etc/netplan 文件夹, 是否存在yaml文件, 如果不存在, 而你台机器还能上网的话, 则肯定不是用netplan 方式。



3.1 检查netplan配置

gateman@homeserver2:/etc/netplan$ pwd
/etc/netplan
gateman@homeserver2:/etc/netplan$ ls *yaml
00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp1s0:
      dhcp4: false
    enp2s0:
      dhcp4: true
  version: 2

先备份和查看原来的配置文件, 可以看到, 我台机器只有两个有线端口, 其中只有1个插了网线启用的dhcp, 这里的4指的是 ip4

3.2 检查虚拟桥接设备

输入ifconfig 回车
会见到输出除了上面两个有线网卡外, 多了1个设备virbr0,这是安装完kvm后系统自动创建的

	    virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:89:a9:72  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

其实这个virbr0 并不是一块虚拟网卡, 而是1个块虚拟桥接设备(bridge), 我们还必须基于它再创建1个虚拟桥接网卡。

3.3 编辑/etc/netplan/00-xxx.yaml 添加一个桥接网卡

before that,
我手绘了1个kvm 桥接的大概原理图, 不会是百分百准确, 将就看就行

我们需要做的是创建1个关键的虚拟桥接网卡 br0 , 如下图, 它桥接 宿主机的真正物理卡, 而且, 我们之后创建的虚拟机都会通过这个br0 桥接网卡与外部沟通。

也就是讲即使我们后面会创建多台虚拟机, 对于宿主机来讲, 1个虚拟桥接网卡就足够了。
在这里插入图片描述

编辑 /etc/netplan/00-xxxx.yaml

# This is the network config written by 'subiquity'
network:
  ethernets:
    enp1s0:
      dhcp4: false
    enp2s0:
      dhcp4: false # 真正的物理显卡要关闭dhcp
  bridges:
    br0:
      interfaces: [enp2s0]
      dhcp4: no
      addresses: [10.0.1.107/24] # ip地址
      routes:            
        - to: default
          via: 10.0.1.1           # 路由其地址
      nameservers:
        addresses: [119.29.29.29, 8.8.8.8]   # DNS 119.29.29.29 是疼讯的DNS
  version: 2

保存后
执行

sudo netplan apply

注意这里我们不在从路由器动态申请ip, 而是设置静态ip, 如国修改前后的ip不同,我们的ssh connection会断开, 需要重新连接。

修改后我们再查看ifconfig
我们会发现

  1. 多了个网卡br0, 地址就是我们设置的静态ip地址
  2. 物理网卡没有地址, 这是正常的, 如上图, 连物理网卡也会通过这个虚拟网桥连接外部。。
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.1.107  netmask 255.255.255.0  broadcast 10.0.1.255
        inet6 fe80::b4a2:82ff:fe35:d8d8  prefixlen 64  scopeid 0x20<link>
        ether b6:a2:82:35:d8:d8  txqueuelen 1000  (Ethernet)
        RX packets 61997  bytes 8192346 (8.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 82925  bytes 21320864 (21.3 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:e0:0a:f2:12:26  txqueuelen 1000  (Ethernet)
        RX packets 338034  bytes 418401126 (418.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 115940  bytes 24050924 (24.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



Step 4 新建虚拟硬盘

上面说了,虚拟硬盘为了要让libvirt 访问, 最好创建再公共的地方.
我在根目录创建了1个folder /kvmdisks …

命令:

qemu-img create ./kvm0.img 20G



Step 5 准备系统安装文件iso

我为了省事, 直接套娃安装ubuntu server 22.04 本身
同样地, iso 最好放在公共地方

gateman@homeserver2:/isos$ ls
ubuntu-22.04.1-live-server-amd64.iso



Step 6 编写虚拟机配置文件

对于新增加一台虚拟机, 无非修改下面几个地方
1, cpu 数量和内存大小
2. uuid 用uuid-rumtime 包下的 uuidgen命令生成
3. 修改新的随机mac地址, 自己google怎么生成 echo $RANDOM | md5sum | sed ‘s/…/&:/g’ | cut -c1-17
4. 修改虚拟机名称。
5. 修改虚拟硬盘路径
6. 反注释光驱启动那行
7. 没了

gateman@homeserver2:~/kvmxmls/vm1$ cat vm1.xml 
<domain type='kvm'>  //如果是Xen,则type=‘xen’
  <name>vm1</name> //虚拟机名称,同一物理机唯一
  <uuid>4b942306-76b0-4174-9371-a0485fdc8093</uuid>  //同一物理机唯一,可用uuidgen生成
  <memory>4096000</memory>
  <currentMemory>2048000</currentMemory>  //memory这两个值最好设成一样
  <vcpu>2</vcpu>            //虚拟机可使用的cpu个数,查看物理机可用CPU个数:cat /proc/cpuinfo |grep processor | wc -l
  <os>
   <type arch='x86_64' machine='ubuntu'>hvm</type> //arch指出系统架构类型,machine 则是机器类型,查看机器类型:qemu-system-x86_64 -M ?
   <!-- 第一次运行要 反注释这行
   <boot dev='cdrom'/>  //启动介质,第一次需要装系统可以选择cdrom光盘启动
   -->
   <bootmenu enable='yes'/>  //表示启动按F12进入启动菜单
  </os>
  <features>
   <acpi/>  //Advanced Configuration and Power Interface,高级配置与电源接口
   <apic/>  //Advanced Programmable Interrupt Controller,高级可编程中断控制器
   <pae/>   //Physical Address Extension,物理地址扩展
  </features>
  <clock offset='localtime'/>  //虚拟机时钟设置,这里表示本地本机时间
  <on_poweroff>destroy</on_poweroff>  //突发事件动作
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>   //设备配置/
   <emulator>/usr/bin/kvm</emulator> //如果是Xen则是/usr/lib/xen/binqemu-dm
   <disk type='file' device='disk'> //硬盘
      <driver name='qemu' type='raw'/>
      <source file='/kvmdisks/kvm1.img'/>
      <target dev='vda' bus='virtio'/>  // if windows must ide   else virtio
   </disk>
   <disk type='file' device='cdrom'>//光盘
      <driver name='qemu' type='raw'/>
      <source file='/isos/ubuntu-22.04.1-live-server-amd64.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
   </disk>
   /* 利用Linux网桥连接网络 */
   <interface type='bridge'>
      <mac address='40:00:02:04:19:ef'/>
      <source bridge='br0'/>  //配置的网桥网卡名称
      <target dev='vnet0'/>     //同一网桥下相同
      <alias name='net0'/>      //别名,同一网桥下相同
   </interface>

  <graphics type='vnc' port='5901' autoport='yes' listen='0.0.0.0' keymap='en-us'>  //配置vnc,windows下可以使用vncviewer登录,获取vnc端口号:virsh vncdisplay vm0
   <listen type='address' address='0.0.0.0'/>
  </graphics>
  </devices>
</domain>



Step 7 启动虚拟机

保存后. 有两种方式启动

  1. virsh create vm0.xml
  2. virsh define vm0.xml
    virsh start vm0 # 主机名

第一种一旦关闭虚拟机就会消失, 建议用于测试
第二种除非 执行virsh undefine 主机名, 否则一直存在与虚拟机列表。

如果遇到错误:XML error: expected unicast mac address, found multicast ‘23:F6:7F:2B:67:5D’
那是因为所造的mac地址是组播地址,要非组播的mac地址才行,开头大于24即可



Step 8, 连接启动后的虚拟机, 安装系统

两种方式,

  1. 用vnc viewer(linux /win 通用)
  2. 在另一台linux机上安装virt-manager

不得不说virt-manager 真是个神奇, 可以在一台有GUI的linux 主机去管理另1台没有GUI的KVM 宿主机的kvm 子系统。
在这里插入图片描述
缺点:
3. 需要GUI
4. 没有windows 版, 硬气!
接着就可以安装系统了
在这里插入图片描述



Step 9, 移除cdrom启动方式, 重启

如果用virsh create vm0.xml 方式启动安装的, 安装后可以修改vm0.xml(或者另建一份copy), 把cdrom 启动注销掉

然后 再重新 virsh define …



Step 10,检查kvm虚拟机 网卡地址

如果一切顺利, 虚拟机dhcp生成的网卡会与物理机同一个网段

gateman@vm:~$ ifconfig
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.1.151  netmask 255.255.255.0  broadcast 10.0.1.255
        inet6 fe80::f892:1ff:fe33:d4fa  prefixlen 64  scopeid 0x20<link>
        ether fa:92:01:33:d4:fa  txqueuelen 1000  (Ethernet)
        RX packets 2540  bytes 145750 (145.7 KB)
        RX errors 0  dropped 477  overruns 0  frame 0
        TX packets 423  bytes 30596 (30.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 324

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 164  bytes 14048 (14.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 164  bytes 14048 (14.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

其实这时就可以通过局域网物理机ssh过去了

为了方便管理, 还是建议修改虚拟机网卡设置, 设置成静态ip

gateman@vm:~$ cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens3:
      dhcp4: no
      addresses: [10.0.1.151/24]
      gateway4: 10.0.1.1
      nameservers:
        addresses: [119.29.29.29, 8.8.8.8]



虚拟机网卡地址不与物理机同一网段的原因

如果发现虚拟机ip地址是192.168.122.xxx

则这时 其他局域网的主机是访问不了这些虚拟机的。

原因是vm0.xml 的网络设置错误

 /* 利用Linux网桥连接网络 */
   <interface type='bridge'>
      <mac address='40:00:02:04:19:ef'/>
      <source bridge='br0'/>  //配置的网桥网卡名称
      <target dev='vnet0'/>     //同一网桥下相同
      <alias name='net0'/>      //别名,同一网桥下相同
   </interface>

把上面的 source briidge = ‘virbr0’ 改回来 br0 就ok!
我把自己踩过的坑都写出来了。

virt-manager

最后再推荐一下这个神器, 它可以很方便的完成本文的step4 to step9
跟virtbox的gui 界面用起来差距不大了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu server 22.04 安装kvm 的相关文章

随机推荐

  • JDK19虚拟线程

    JDK 19引入的虚拟线程 xff0c 是JDK 实现的轻量级线程 xff0c 他可以避免上下文切换带来的的额外耗费 他的实现原理其实是JDK不再是每一个线程都一对一的对应一个操作系统的线程了 xff0c 而是会将多个虚拟线程映射到少量操作
  • 如何实现下层函数要让上层函数感知异常

    可以通过future get 的方法获取下层的函数抛出的异常
  • 线程安全的体现

    原子性 xff1a 提供互斥访问 xff0c 同一时刻只能有一个线程对数据进行操作 xff0c xff08 atomic synchronized xff09 xff1b 可见性 xff1a 一个线程对主内存的修改可以及时地被其他线程看到
  • 程序访问中什么是临界区

    临界区是指并发进程中访问共享变量的程序段 临界区指的是一个访问共用资源的程序片段 xff0c 而这些共用资源又无法同时被多个线程访问的特性 每次只准许一个进程进入临界区 xff0c 进入后不允许其他进程进入
  • Latex Section 段落标题编号设置的问题

    Table of Contents 问题 xff1a 解决方法 xff1a 1 有数字 xff0c 不想要数字 2 没有数字 xff0c 想自动编排数字 3 references 没数字 问题 xff1a 在撰写论文时 xff0c 有些会议
  • 什么是数据存储过程

    存储过程 xff08 Stored Procedure xff09 是在大型数据库系统中 xff0c 一组为了完成特定功能的SQL语句集 xff0c 它存储在数据库中 xff0c 一次编译后永久有效 xff0c 用户通过指定存储过程的名字并
  • 为什么Springboot调用main()方法后程序会一直运行

    因为调用Main方法运行以后JVM不是立马结束退出 xff0c 取决于是否有进程一直在运行 常见的普通的Main方法里若有while xff08 true xff09 xff0c 也是不会退出的 springboot本质上也是这个原理 xf
  • JVM内存模型与JAVA内存模型

    区别 xff1a JVM内存模型则是指JVM的内存分区 xff0c Java代码是要运行在虚拟机上的 xff0c 而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域 xff0c 这些区域都有各自的用途 JVM内存结
  • 用Java实现两个有序数组合并成一个有序数组

    需求 有序数组a 和b xff0c 将它们合并成有序数组c 思路 xff1a 新建一个以两个集合长度之和为长度的新数组 xff0c 从两数组最左边开始比起 xff0c 把小的放入新集合 xff0c 并用变量标记后一位置 xff0c 每次比较
  • Spring Bean加载的8种方式

    一 在xml文件中通过标签 lt bean gt 实现 二 使用 64 Component以及其衍生的三种注解 64 Controller 64 Service 64 Repository 三 加载第三方bean 复制代码 64 Confi
  • 非对称加密分段处理加密大量数据

    基于RSA非对称加密 属于轻量型加密 加密数据的大小有严格限制 我们可以通过对分段加密方式 实现对大量数据的非对称加密 本文在参考非对称的加密的资料基础之上 实现了大数据的非对称加密 因此少量数据于大量数据都可以实现加密处理 如果仅想实现这
  • 如何理解反向代理

    通常的代理服务器 xff0c 只用于代理内部网络对Internet的连接请求 xff0c 客户机必须指定代理服务器 并将本来要直接发送到Web服务器上的http请求发送到代理服务器中 由于外部网络上的主机并不会配置并使用这个代理服务器 xf
  • ping: www.baidu.com: 未知的名称或服务

    如果如何怎么都连不上外网 可以照搬下面配置 一定可以连通 VMc16 centos7 NAT模式下 注意子网IP和子网掩码的设置 这个决定的IP的取值范围 文件配置如下
  • 权限精确到按钮级别

    在使用sa token轻量级框架下 如何将权限精确到按钮级别 权限精确到按钮级的意思就是指 xff1a 权限范围可以控制到页面上的每一个按钮是否显示 思路 xff1a 如此精确的范围控制只依赖后端已经难以完成 xff0c 此时需要前端进行一
  • 单点登录的发展与应用

    早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的 所有的功能 所有的业务 后台管理 门户界面 都是由这一个war来支持的 这样的单应用 也称之为单体应用 因为十分不好扩展和拆分 在单体应用下 用户的登录
  • The command could not be located because '/sbin' is not included in the PATH environment variable.

    问题来源 重启Ubuntu后习惯性的执行ifconfig 报错如下 Command span class hljs string 39 ifconfig 39 span span class hljs keyword is span ava
  • bean实例化的方式

    1 最常见 使用构造方法 2 早些年 使用静态工厂的方式 3 更早些年的 使用实例化工厂的方式 4 spring框架常用 实现FactoryBean接口的方式
  • @Autowired

    1 Autowired依赖注入底层是通过反射暴力获取对象并赋值给属性 2 setter与构造器注入是通过给IOC容器提供入口注入的
  • C语言 Hanoi(汉诺)塔问题,用递归解决

    问题 古代有一个梵塔 xff0c 塔内有3个座A xff0c B xff0c C 开始时A座上有64个盘子 xff0c 盘子大小不等 xff0c 大的在下 xff0c 小的在上 有一个老和尚想把64个盘子从A作移到C座 xff0c 但规定每
  • Ubuntu server 22.04 安装kvm

    本人有一台工控机 xff0c 5500u cpu xff0c 8g 内存 xff0c 本来是打算用来跑docker的 xff0c 但是因为要装 k8s 虚拟机会更加合适方便 xff0c 宿主机的系统是ubuntu server 22 04