Skip to content

Commit dcacfe3

Browse files
authored
Merge pull request #169 from dalehamel/raw-disk-support
Add support for using a raw disk for storage
2 parents f5d3697 + 8f678ef commit dcacfe3

1 file changed

Lines changed: 52 additions & 0 deletions

File tree

xhyve/xhyve.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const (
5252
defaultDiskNumber = -1
5353
defaultVirtio9p = false
5454
defaultQcow2 = false
55+
defaultRawDisk = false
5556
)
5657

5758
type Driver struct {
@@ -69,6 +70,7 @@ type Driver struct {
6970
MacAddr string
7071
UUID string
7172
Qcow2 bool
73+
RawDisk bool
7274
Virtio9p bool
7375
Virtio9pFolder string
7476
NFSShare bool
@@ -110,6 +112,7 @@ func NewDriver(hostName, storePath string) *Driver {
110112
DiskNumber: defaultDiskNumber,
111113
Virtio9p: defaultVirtio9p,
112114
Qcow2: defaultQcow2,
115+
RawDisk: defaultRawDisk,
113116
}
114117
}
115118

@@ -169,6 +172,11 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
169172
Name: "xhyve-qcow2",
170173
Usage: "Use qcow2 disk format",
171174
},
175+
mcnflag.BoolFlag{
176+
EnvVar: "XHYVE_RAW_DISK",
177+
Name: "xhyve-rawdisk",
178+
Usage: "Use a raw disk for attached volumes",
179+
},
172180
mcnflag.StringFlag{
173181
EnvVar: "XHYVE_UUID",
174182
Name: "xhyve-uuid",
@@ -228,6 +236,7 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
228236
d.Memory = flags.Int("xhyve-memory-size")
229237
d.NFSShare = flags.Bool("xhyve-experimental-nfs-share")
230238
d.Qcow2 = flags.Bool("xhyve-qcow2")
239+
d.RawDisk = flags.Bool("xhyve-rawdisk")
231240
d.SSHPort = 22
232241
d.SSHUser = "docker"
233242
d.SwarmDiscovery = flags.String("swarm-discovery")
@@ -405,6 +414,10 @@ func (d *Driver) Create() error {
405414
if err := d.generateQcow2Image(d.DiskSize); err != nil {
406415
return err
407416
}
417+
} else if d.RawDisk {
418+
if err := d.generateRawDiskImage(d.DiskSize); err != nil {
419+
return err
420+
}
408421
} else {
409422
if err := d.generateSparseBundleDiskImage(d.DiskSize); err != nil {
410423
return err
@@ -699,6 +712,42 @@ func (d *Driver) extractKernelImages() error {
699712
return nil
700713
}
701714

715+
func (d *Driver) generateRawDiskImage(size int64) error {
716+
diskPath := filepath.Join(d.ResolveStorePath("."), d.MachineName+".rawdisk")
717+
718+
f, err := os.OpenFile(diskPath, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644)
719+
if err != nil {
720+
if os.IsExist(err) {
721+
return nil
722+
}
723+
return err
724+
}
725+
f.Close()
726+
727+
if err := os.Truncate(diskPath, d.DiskSize * 1048576); err != nil {
728+
return err
729+
}
730+
731+
tarBuf, err := d.generateKeyBundle()
732+
if err != nil {
733+
return err
734+
}
735+
736+
file, err := os.OpenFile(diskPath, os.O_WRONLY, 0644)
737+
if err != nil {
738+
return err
739+
}
740+
defer file.Close()
741+
file.Seek(0, os.SEEK_SET)
742+
_, err = file.Write(tarBuf.Bytes())
743+
if err != nil {
744+
return err
745+
}
746+
file.Close()
747+
748+
return nil
749+
}
750+
702751
func (d *Driver) generateQcow2Image(size int64) error {
703752
diskPath := filepath.Join(d.ResolveStorePath("."), d.MachineName+".qcow2")
704753
opts := &qcow2.Opts{
@@ -1008,6 +1057,9 @@ func (d *Driver) xhyveArgs() []string {
10081057
if d.Qcow2 {
10091058
imgPath := fmt.Sprintf("file://%s", filepath.Join(d.ResolveStorePath("."), d.MachineName+".qcow2"))
10101059
diskImage = fmt.Sprintf("4:0,virtio-blk,%s,format=qcow", imgPath)
1060+
} else if d.RawDisk {
1061+
imgPath := fmt.Sprintf("%s", filepath.Join(d.ResolveStorePath("."), d.MachineName+".rawdisk"))
1062+
diskImage = fmt.Sprintf("4:0,virtio-blk,%s", imgPath)
10111063
} else {
10121064
imgPath := fmt.Sprintf("/dev/rdisk%d", d.DiskNumber)
10131065
diskImage = fmt.Sprintf("4:0,ahci-hd,%s", imgPath)

0 commit comments

Comments
 (0)