@@ -52,6 +52,7 @@ const (
5252 defaultDiskNumber = - 1
5353 defaultVirtio9p = false
5454 defaultQcow2 = false
55+ defaultRawDisk = false
5556)
5657
5758type 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+
702751func (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