aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-06-17 17:06:29 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-06-17 17:06:29 +0200
commite130d95518bd1be7a1c24438bec60643119e5754 (patch)
treee4e739d1a90064156b895a14f089a3d4a7393ea8 /pkg
parentde258e6d7ebf13facf7df8e92eb1a9bdf3391808 (diff)
vm/gce: accept un-tar-ed image
vm/gce differs from other VM types in that it accepts image in a weird, GCE-specific format (namely, image named disk.raw is put into .tar.gz file). This makes it impossible to write generic code that creates images for any VM types. Make vm/gce accept just image like e.g. vm/qemu and handle own specifics internally.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/gcs/gcs.go22
-rw-r--r--pkg/kernel/generated.go15
-rw-r--r--pkg/kernel/kernel.go14
3 files changed, 26 insertions, 25 deletions
diff --git a/pkg/gcs/gcs.go b/pkg/gcs/gcs.go
index 0121d2aeb..97883256a 100644
--- a/pkg/gcs/gcs.go
+++ b/pkg/gcs/gcs.go
@@ -80,25 +80,35 @@ func (client *Client) Read(gcsFile string) (*File, error) {
}
func (client *Client) UploadFile(localFile, gcsFile string) error {
- bucket, filename, err := split(gcsFile)
+ local, err := os.Open(localFile)
if err != nil {
return err
}
- local, err := os.Open(localFile)
+ defer local.Close()
+
+ w, err := client.FileWriter(gcsFile)
if err != nil {
return err
}
- defer local.Close()
- bkt := client.client.Bucket(bucket)
- f := bkt.Object(filename)
- w := f.NewWriter(client.ctx)
defer w.Close()
+
if _, err := io.Copy(w, local); err != nil {
return err
}
return nil
}
+func (client *Client) FileWriter(gcsFile string) (io.WriteCloser, error) {
+ bucket, filename, err := split(gcsFile)
+ if err != nil {
+ return nil, err
+ }
+ bkt := client.client.Bucket(bucket)
+ f := bkt.Object(filename)
+ w := f.NewWriter(client.ctx)
+ return w, nil
+}
+
func split(file string) (bucket, filename string, err error) {
pos := strings.IndexByte(file, '/')
if pos == -1 {
diff --git a/pkg/kernel/generated.go b/pkg/kernel/generated.go
index 0e6ba5b89..e9b00b345 100644
--- a/pkg/kernel/generated.go
+++ b/pkg/kernel/generated.go
@@ -8,17 +8,12 @@ const createImageScript = `#!/bin/bash
set -eux
if [ ! -e $1/sbin/init ]; then
- echo "usage: create-gce-image.sh /dir/with/user/space/system /path/to/bzImage /path/to/vmlinux 'image tag'"
+ echo "usage: create-gce-image.sh /dir/with/user/space/system /path/to/bzImage"
exit 1
fi
if [ "$(basename $2)" != "bzImage" ]; then
- echo "usage: create-gce-image.sh /dir/with/user/space/system /path/to/bzImage /path/to/vmlinux 'image tag'"
- exit 1
-fi
-
-if [ "$(basename $3)" != "vmlinux" ]; then
- echo "usage: create-gce-image.sh /dir/with/user/space/system /path/to/bzImage /path/to/vmlinux 'image tag'"
+ echo "usage: create-gce-image.sh /dir/with/user/space/system /path/to/bzImage"
exit 1
fi
@@ -75,10 +70,4 @@ sudo grub-install --boot-directory=disk.mnt/boot --no-floppy /dev/nbd0
sudo umount disk.mnt
rm -rf disk.mnt
sudo qemu-nbd -d /dev/nbd0
-tar -Szcf disk.tar.gz disk.raw
-mkdir -p obj
-cp $3 obj/
-echo -n "$4" > tag
-tar -czvf image.tar.gz disk.tar.gz key tag obj/vmlinux
-rm -rf tag obj
`
diff --git a/pkg/kernel/kernel.go b/pkg/kernel/kernel.go
index 9e9b4b32d..5992900f7 100644
--- a/pkg/kernel/kernel.go
+++ b/pkg/kernel/kernel.go
@@ -60,8 +60,8 @@ func Build(dir, compiler, config string, fullConfig bool) error {
// CreateImage creates a disk image that is suitable for syzkaller.
// Kernel is taken from kernelDir, userspace system is taken from userspaceDir.
-// The resulting image is marked with tag and copied to the specified image file.
-func CreateImage(kernelDir, userspaceDir, tag, image string) error {
+// Produces image and root ssh key in the specified files.
+func CreateImage(kernelDir, userspaceDir, image, sshkey string) error {
tempDir, err := ioutil.TempDir("", "syz-build")
if err != nil {
return err
@@ -71,12 +71,14 @@ func CreateImage(kernelDir, userspaceDir, tag, image string) error {
if err := ioutil.WriteFile(scriptFile, []byte(createImageScript), 0700); err != nil {
return fmt.Errorf("failed to write script file: %v", err)
}
- vmlinux := filepath.Join(kernelDir, "vmlinux")
- bzImage := filepath.Join(kernelDir, "arch/x86/boot/bzImage")
- if _, err := osutil.RunCmd(time.Hour, tempDir, scriptFile, userspaceDir, bzImage, vmlinux, tag); err != nil {
+ bzImage := filepath.Join(kernelDir, filepath.FromSlash("arch/x86/boot/bzImage"))
+ if _, err := osutil.RunCmd(time.Hour, tempDir, scriptFile, userspaceDir, bzImage); err != nil {
return fmt.Errorf("image build failed: %v", err)
}
- if err := os.Rename(filepath.Join(tempDir, "image.tar.gz"), image); err != nil {
+ if err := os.Rename(filepath.Join(tempDir, "disk.raw"), image); err != nil {
+ return err
+ }
+ if err := os.Rename(filepath.Join(tempDir, "key"), sshkey); err != nil {
return err
}
return nil