From a2d178996b0844c378dd013dde53a5c1f5a17fbd Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 3 Dec 2019 18:46:24 +0100 Subject: 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" --- vm/qemu/qemu.go | 14 +++++++++++--- vm/vm.go | 16 ++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) (limited to 'vm') 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) -- cgit mrf-deployment