Mounting a .vhd disk image using blktap/tapdisk: Difference between revisions

From Xen
Jump to navigationJump to search
No edit summary
No edit summary
Line 22: Line 22:
This example assumes Ubuntu 12.04, but similar packages should be available for other distributions. First install the user-space tools and the blktap kernel module (via DKMS):
This example assumes Ubuntu 12.04, but similar packages should be available for other distributions. First install the user-space tools and the blktap kernel module (via DKMS):


sudo apt-get install blktap-utils
$ sudo apt-get install blktap-utils
sudo modprobe blktap
$ sudo modprobe blktap


== Attaching a disk ==
== Attaching a disk ==
Line 29: Line 29:
First, allocate a minor number in the kernel:
First, allocate a minor number in the kernel:


sudo tap-ctl allocate
$ sudo tap-ctl allocate
/dev/xen/blktap-2/tapdev0
/dev/xen/blktap-2/tapdev0


Line 36: Line 36:
Then, spawn a tapdisk process:
Then, spawn a tapdisk process:


sudo tap-ctl spawn
$ sudo tap-ctl spawn
tapdisk spawned with pid 5646
tapdisk spawned with pid 5646


Now, you need to attach the two together:
Now, you need to attach the two together:


sudo tap-ctl attach -m 0 -p 5646
$ sudo tap-ctl attach -m 0 -p 5646


(where -m <minor> and -p <tapdisk pid>)
(where -m <minor> and -p <tapdisk pid>)
Line 47: Line 47:
Finally, you can open a VHD:
Finally, you can open a VHD:


sudo tap-ctl open -m 0 -p 5646 -a vhd:/home/djs/smalltest.vhd
$ sudo tap-ctl open -m 0 -p 5646 -a vhd:/home/djs/smalltest.vhd

== Detaching a disk ==

Afterwards, you'll need to tear things down. Close the tapdisk image:

$ sudo tap-ctl close -m 0 -p 5646

Detach the tapdisk process from the kernel - this also kills the tapdisk process

$ sudo tap-ctl detach -m 0 -p 5646

Now free the kernel minor number:

$ sudo tap-ctl free -m 0

== Other useful commands ==

== Acknowledgements ==

Most of this information was taken from [http://lists.xen.org/archives/html/xen-api/2012-05/msg00145.html Jon Ludlam's xen-api post]

Revision as of 11:07, 25 November 2013

This page describes how to mount a .vhd disk image on a Linux system, using blktap/tapdisk. This page shows you how to modify and manipulate a .vhd disk image before booting a VM from it.

Overview

A .vhd disk image is a format originally created by Connectix for their Virtual PC and Virtual Server products, sold to Microsoft in 2003. The .vhd format is well-documented and supported by blktap/tapdisk. When using .vhd, blktap/tapdisk enable:

  • thin-provisioning of disks: blocks are only allocated on first write
  • snapshots, clones: gold master images can be used as read-only "parent" disks

Other similar formats exist, most notably [qcow2] used natively by qemu.

How blktap/tapdisk works

"blktap" is a kernel module which is like "tuntap for blocks": it exposes a kernel block device and sends requests to user-space over a shared-memory ring. The only consumer of this ring is "tapdisk": a user-space process which understands the .vhd format (via a shared library called libvhd) and which performs read and write operations via AIO.

Note: when a tapdisk is connected to a blktap, it's important not to interfere with tapdisk (e.g. by killing it) because this will cause in-flight requests on the block device to block.

When tapdisk starts it will call mlockall() to prevent any of its pages being swapped out, which would otherwise lead to deadlocks.

Prereqs

This example assumes Ubuntu 12.04, but similar packages should be available for other distributions. First install the user-space tools and the blktap kernel module (via DKMS):

$ sudo apt-get install blktap-utils
$ sudo modprobe blktap

Attaching a disk

First, allocate a minor number in the kernel:

$ sudo tap-ctl allocate           
/dev/xen/blktap-2/tapdev0

(the minor number is the number following "tapdev", i.e. 0 in this example). This is the path which will be the block device later.

Then, spawn a tapdisk process:

$ sudo tap-ctl spawn
tapdisk spawned with pid 5646

Now, you need to attach the two together:

$ sudo tap-ctl attach -m 0 -p 5646

(where -m <minor> and -p <tapdisk pid>)

Finally, you can open a VHD:

$ sudo tap-ctl open -m 0 -p 5646 -a vhd:/home/djs/smalltest.vhd

Detaching a disk

Afterwards, you'll need to tear things down. Close the tapdisk image:

$ sudo tap-ctl close -m 0 -p 5646

Detach the tapdisk process from the kernel - this also kills the tapdisk process

$ sudo tap-ctl detach -m 0 -p 5646

Now free the kernel minor number:

$ sudo tap-ctl free -m 0

Other useful commands

Acknowledgements

Most of this information was taken from Jon Ludlam's xen-api post