8e1cc16ab5
https://ext4.wiki.kernel.org/index.php/Ext4_VM_Images does not recommends to dd zero file and deletes it, but in case of enabling discards and qcow2 image we can recreate qcow2 file with less used space. Also qemu-img able to enable compression for qcow2 files, that sometimes may be useful because it natively supported by qemu. Signed-off-by: Vasiliy Tolstov <v.tolstov@selfip.ru>
68 lines
1.5 KiB
Go
68 lines
1.5 KiB
Go
package qemu
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
|
|
"github.com/mitchellh/multistep"
|
|
"github.com/mitchellh/packer/packer"
|
|
|
|
"os"
|
|
)
|
|
|
|
// This step converts the virtual disk that was used as the
|
|
// hard drive for the virtual machine.
|
|
type stepConvertDisk struct{}
|
|
|
|
func (s *stepConvertDisk) Run(state multistep.StateBag) multistep.StepAction {
|
|
config := state.Get("config").(*Config)
|
|
driver := state.Get("driver").(Driver)
|
|
diskName := state.Get("disk_filename").(string)
|
|
ui := state.Get("ui").(packer.Ui)
|
|
|
|
if config.SkipCompaction && !config.DiskCompression {
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
name := diskName + ".convert"
|
|
|
|
sourcePath := filepath.Join(config.OutputDir, diskName)
|
|
targetPath := filepath.Join(config.OutputDir, name)
|
|
|
|
command := []string{
|
|
"convert",
|
|
"-q",
|
|
}
|
|
|
|
if config.DiskCompression {
|
|
command = append(command, "-c")
|
|
}
|
|
|
|
command = append(command, []string{
|
|
"-f", config.Format,
|
|
"-O", config.Format,
|
|
sourcePath,
|
|
targetPath,
|
|
}...,
|
|
)
|
|
|
|
ui.Say("Converting hard drive...")
|
|
if err := driver.QemuImg(command...); err != nil {
|
|
err := fmt.Errorf("Error converting hard drive: %s", err)
|
|
state.Put("error", err)
|
|
ui.Error(err.Error())
|
|
return multistep.ActionHalt
|
|
}
|
|
|
|
if err := os.Rename(targetPath, sourcePath); err != nil {
|
|
err := fmt.Errorf("Error moving converted hard drive: %s", err)
|
|
state.Put("error", err)
|
|
ui.Error(err.Error())
|
|
return multistep.ActionHalt
|
|
}
|
|
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
func (s *stepConvertDisk) Cleanup(state multistep.StateBag) {}
|