专栏首页皮振伟的专栏[qemu][block]qemu-nbd技术分析

[qemu][block]qemu-nbd技术分析

前言: 想要修改Guest中的文件,第一种办法可以把虚拟机启动虚拟机,在虚拟机内部修改。 还有一种办法,使用qemu的nbd功能。准确来说,是使用linux提供的nbd(Network Block Device),加上qemu提供的qemu-nbd作为后端的server共同实现。 本文先提供使用qemu-nbd修改镜像文件的方法,再分析qemu-nbd的实现。 分析: 1,qemu-nbd 使用qemu-nbd之前,需要先确认当前环境上是不是支持linux nbd: ls /dev/nbd*来确认是不是已经支持nbd了。如果支持,下面加载部分的操作可以省略。 modinfo nbd命令来确认nbd模块是不是在当前环境中已经存在。 modprobe nbd nbds_max=64命令用来加载nbd模块,后面的参数nbds_max=64是为了告诉linux默认生成64个nbd device。 qemu-nbd -c /dev/nbd0 ubuntu-server.qcow2命令是让/dev/nbd0连接到ubuntu-server.qcow2上。 那么,如果已经安装过操作系统的情况下,就可以看到/dev/nbd0p1,/dev/nbd0p2,/dev/nbd0p5类似的分区。这个分区情况和从操作系统内部看来是相同的。 继续执行,mkdir guest-root; mount -o rw /dev/nbd0p1 guest-root;就可以在guest-root目录下编辑镜像信息了。 编辑完成后,执行sync,再umount guest-root,最后qemu-nbd -d /dev/nbd0断开nbd连接。 2,detail 以向镜像中写数据为例子,如下图:

a,在挂载的nbd分区中写入数据,那么经过系统调用到kernel。 b,kernel找到对应的inode,并把它写入文件所在的分区,也就是nbd0。 c,nbd0的write函数被重载,实际上kernel会调用sendmsg写到unix-socket中。 d,qemu-nbd在 执行connect的时候,虽然自己退出了,但是会启动一个子进程作为daemon。daemon收到事件,调用recvmsg得到数据。 e,qemu-nbd daemon调用qcow2的库函数,计算出来对应的位置,把数据写入到ubuntu-server.qcow2文件中。 f,写入到ubuntu-server.qcow2,经过系统调用到vfs,最后把数据写入到真正的存储介质中。 那么,整个路径就走完了一遍,编辑分区中的文件,最后把它落地到存储中。那么接下来再具体分析几个细节。 3,unix socket 上述例子中,nbd使用unix socket,使用tcp行不行?答案是可以。linux的nbd设计上支持tcp后才支持unix socket。 Qemu-nbd的help选项中看起来也支持了,不过作者没有实验。 4,为什么写ndb0就会调用到对应的sendmsg 在qemu2.8/nbd/client.c中,

是qemu-nbd先创建了socket,再通过ioctl告诉kernel:具体的nbd dev绑定到对应的socket上。另外需要注意的是,这里的函数实现需要linux宏,也就是说其他平台上,很可能还没有实现。 5,使用loop行不行 对于raw格式,是可以使用loop的。 但是在loop的情况下,不能解析qcow2格式。 后记: Good luck。

文章分享自微信公众号:
AlwaysGeek

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 如何恢复故障KVM虚拟机qcow2磁盘镜像文件LVM分区中的数据

    下面以Fedora32 Cockpit方式安装的虚拟机为演示环境,介绍如何恢复故障KVM虚拟机qcow2磁盘镜像文件LVM分区中的数据

    yuanfan2012
  • VMware业务系统迁移上云方案

    客户要将业务从自建的虚拟化数据中心迁移至UCloud,希望能够将多年前的VMware体系换到公有云体系。其中:

    IT大咖说
  • RPM软件包管理机制之旅

        Linux下的man命令十分实用,可以查看Linux命令的手册。但这些手册只适用于忘记命令的选项时查询之用,如果用来学习Linux下类似于Git, RP...

    用户1214695
  • 一文读懂 Qemu 模拟器

    Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是...

    战神伽罗
  • 基于QMP实现对qemu虚拟机进行交互

    qemu对外提供了一个socket接口,称为qemu monitor,通过该接口,可以对虚拟机实例的整个生命周期进行管理,主要有如下功能

    小慢哥Linux运维
  • Qemu 简述

    Qemu 架构 Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打...

    Linux云计算网络
  • 虚机热迁移加密vm live migrate tls

    虚机内存或者硬盘里存有敏感信息,live migrate时网络抓包就会获取这些信息。

    惠伟
  • QEMU-IMG入门教程

    一台虚拟机的核心就是一个磁盘镜像,这个镜像可以理解成虚拟机的磁盘,里面有虚拟机的操作系统和驱动等重要文件,qemu-img就是quemu创建管理磁盘镜像的工具。

    zhangheng
  • QEMU/KVM磁盘在线备份

    tag: qemu, kvm, disk, live, backup, incremental, bitmap

    小慢哥Linux运维
  • ​[qemu][http]qemu的网络类型disk技术分析

    前言: qemu的disk设备后端存储支持了多种类型。 本文简单简单列举几种,对比一下其中的特点。再重点分析http类型。 分析: 1,disk types ...

    皮振伟
  • kvm环境下分析虚拟机crash

    云上环境运行虚拟机有qemu crash,qemu进程本身代码异常或者被host OOM了,gdb看qemu core或者看host上log,但更多的是wind...

    惠伟
  • [virt][scsi]SCSI设备虚拟化以及访问方式

    前言: 之前只闻其名,不懂其理。 刚刚看了一些代码,趁热打铁。 分析: 1,architectures ? 作者绘制了下图,大概体现一下思路,见谅。 Dis...

    皮振伟
  • [qemu][io]虚拟化IO latency监控

    前言: Linux的很多监控组件,主要针对IOPS和IO带宽进行监控。很多业务场景下,希望对IO的延迟做监控。单纯的await并不能反映出来IO的延迟具体情况。...

    皮振伟
  • [qemu][storage]qemu-img covnert的速度提高以及sparse file

    前言: 虚拟化场景下,测试的时候,经常为了省事,经常想跳过安装操作系统。因为作者使用的是iscsi的分布式存储方案,所以可以用iscsiadm把iscsi挂载到...

    皮振伟
  • KVM详解,学习kvm系列文章

    其中,KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Lin...

    菲宇
  • [kvm][virt]MMIO技术分析

    前言: 简单回顾一下前文,《内存映射技术分析》描述了虚拟内存的管理、内存映射;《物理内存管理》介绍了物理内存管理。《内存回收》介绍了一下PFRA内存回收。 上述...

    皮振伟
  • 本地windows2008R2镜像上腾讯云迁移解决方案--实践技术文档

    【实践目的】实现本地的windows2008R2等镜像上云迁移,让迁移后的云机保持本地的业务环境。

    TCS-F
  • QEMU3 - 使用ceph来存储QEMU镜像

    ceph简介 Ceph是一个PB级别的分布式软件定义存储系统,为用户提供了块存储、对象存储以及符合POSIX标准的文件系统接口。目前,Ceph已经成为Opens...

    用户1214695
  • [qemu][rbd]librbd连接overflow问题

    前言: 后端存储使用Ceph卷,在虚拟机中执行mkfs的时候,遇到卡顿。 卡顿位置不确定,有时候是卡在Guest内部执行discard,有时候执行写superb...

    皮振伟

扫码关注云+社区

领取腾讯云代金券