您的位置:首页 > 产品设计 > UI/UE

kvm 的guest与host共享文件

2014-11-27 11:26 1241 查看
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 就会结束

启动虚拟机后, 所有的更改都会生效.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: