kvm 的guest与host共享文件

来源:互联网 发布:网络大专快速本科 编辑:程序博客网 时间:2024/05/22 06:54

Linux kernel最早从2.6.23支持paravirt-ops接口,也就是所谓的半虚拟化。本文简单介绍一下利用libvirt的功能通过virtio的方式将host的一块local block device 'passthru'到guest os中。

方式1,通过KVM虚拟机的xml配置文件指定,下面是一个虚机xml文件的片段,用来将host的/dev/sda4这一块设备passthru到guest os中:

<domain>
   ...
  <disk type='block' device='disk'>
        <source dev='/dev/sda4'/>
        <target dev='vdb' bus='virtio'/>
  </disk>
</domain>

实验可以用

在virsh命令行中,通过"create '/etc/libvirt/qemu/odm.xml‘"来启动虚机odm,起来之后在odm的guest os中会发现多出了一个块设备/dev/vdb,可以正常mount该块设备,里面的数据应该同host中看到的完全一样。

方式2,可以动态挂载一个host上的块设备到一个正在running的VM中,比如:

virsh# attach-disk odm /dev/sda4 vdb 

在虚拟机中mount后会将原盘格式化 

方式3,通过libvirt API的方式,有两个API分别用来实现挂载和卸载操作:

virDomainAttachDevice(domain, xml)以及virDomainDetachDevice()




libgustfs

libgustfs 是一个想要一统天下的虚拟机镜像查看/修改工具, 号称支持几乎所有 类型的虚拟机镜像, 在它面前 qemu-nbd 弱爆了. 分析它显然超出了这篇文档的范围. 过后将会专门写一篇文章来分析它, 以下简单的提供一种利用 libguestfs 来访问 虚拟机镜像的方法.

首先, 安装它

# 在 Gentoo中, 使用 $ sudo emerge libguestfs # 在 redhat 家族的发行版中, 使用 $ yum install libguestfs libguestfs-tools*

然后使用以下指令启动 guestfs 的命令行,

# --rw 参数表示挂载后对镜像具有读写权限, 可能有点慢, 需要 # 等待, 注意对运行中的虚拟机, 有必要使用 --ro 只读挂载 $ guestfish --rw -i -a path/to/image/file   # 创建一个临时挂载点, guestfs 的命令行接口可以执行命令 # 命令前面加 ! 就可以了 $ !mkdir /tmp/mnt  # 导出镜像文件到 /tmp/mnt, 导出后需要执行 mount-local-run $ mount-local /tmp/mnt   # 进入 mount loop, 类似于 glib 的 g_main_loop_run # 卸载镜像后这个 loop 自动结束 $ mount-local-run

打开另外一个终端, 在 /tmp/mnt 里面就可以看到导出的文件了, 由于是读写方式的挂载, 可以在里面像在本地一样的读写文件, 完成后 使用下面指令卸载

$ fusermount -u /tmp/mnt

执行后, 上面的 loop 就会结束

启动虚拟机后, 所有的更改都会生效.

0 0