aboutsummaryrefslogtreecommitdiffstats
path: root/vm
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2019-12-03 18:46:24 +0100
committerDmitry Vyukov <dvyukov@google.com>2019-12-03 18:48:14 +0100
commita2d178996b0844c378dd013dde53a5c1f5a17fbd (patch)
tree7d883fb040026ee7cbe9048d3a5937497ad58e9b /vm
parentdfe2e9d84a64066fd15913c7cd02d1853adf3942 (diff)
vm: add workdir_template functionality
The new manager config argument workdir_template refers to a directory. Optional. Each VM will get a recursive copy of the files that are present in workdir_template. VM config can then use these private copies as needed. The copy directory can be referenced with "{{TEMPLATE}}" string. This is different from using the files directly in that each instance will get own clean, private, scratch copy of the files. Currently supported only for qemu_args argument of qemu VM type. Use example: Create a template dir with necessary files: $ mkdir /mytemplatedir $ truncate -s 64K /mytemplatedir/fd Then specify the dir in the manager config: "workdir_template": "/mytemplatedir" Then use these files in VM config: "qemu_args": "-fda {{TEMPLATE}}/fd"
Diffstat (limited to 'vm')
-rw-r--r--vm/qemu/qemu.go14
-rw-r--r--vm/vm.go16
2 files changed, 23 insertions, 7 deletions
diff --git a/vm/qemu/qemu.go b/vm/qemu/qemu.go
index 44e12246b..dae8f493b 100644
--- a/vm/qemu/qemu.go
+++ b/vm/qemu/qemu.go
@@ -337,9 +337,7 @@ func (inst *instance) boot() error {
"-serial", "stdio",
"-no-reboot",
}
- if inst.cfg.QemuArgs != "" {
- args = append(args, strings.Split(inst.cfg.QemuArgs, " ")...)
- }
+ args = append(args, splitArgs(inst.cfg.QemuArgs, filepath.Join(inst.workdir, "template"))...)
if inst.image == "9p" {
args = append(args,
"-fsdev", "local,id=fsdev0,path=/,security_model=none,readonly",
@@ -426,6 +424,16 @@ func (inst *instance) boot() error {
return nil
}
+func splitArgs(str, template string) (args []string) {
+ for _, arg := range strings.Split(str, " ") {
+ if arg == "" {
+ continue
+ }
+ args = append(args, strings.Replace(arg, "{{TEMPLATE}}", template, -1))
+ }
+ return
+}
+
func (inst *instance) Forward(port int) (string, error) {
addr := hostAddr
if inst.target.HostFuzzer {
diff --git a/vm/vm.go b/vm/vm.go
index 2e499f567..1b6e7eb2e 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -12,6 +12,7 @@ import (
"bytes"
"fmt"
"os"
+ "path/filepath"
"time"
"github.com/google/syzkaller/pkg/mgrconfig"
@@ -32,8 +33,9 @@ import (
)
type Pool struct {
- impl vmimpl.Pool
- workdir string
+ impl vmimpl.Pool
+ workdir string
+ template string
}
type Instance struct {
@@ -86,8 +88,9 @@ func Create(cfg *mgrconfig.Config, debug bool) (*Pool, error) {
return nil, err
}
return &Pool{
- impl: impl,
- workdir: env.Workdir,
+ impl: impl,
+ workdir: env.Workdir,
+ template: cfg.WorkdirTemplate,
}, nil
}
@@ -103,6 +106,11 @@ func (pool *Pool) Create(index int) (*Instance, error) {
if err != nil {
return nil, fmt.Errorf("failed to create instance temp dir: %v", err)
}
+ if pool.template != "" {
+ if err := osutil.CopyDirRecursively(pool.template, filepath.Join(workdir, "template")); err != nil {
+ return nil, err
+ }
+ }
impl, err := pool.impl.Create(workdir, index)
if err != nil {
os.RemoveAll(workdir)