diff --git a/src/vmm_unix.ml b/src/vmm_unix.ml index a877a4b..d219826 100644 --- a/src/vmm_unix.ml +++ b/src/vmm_unix.ml @@ -150,7 +150,18 @@ let prepare name vm = Bos.OS.File.write (Name.image_file name) (Cstruct.to_string image) >>= fun () -> Ok (List.rev taps) +let vm_device vm = + match Lazy.force uname with + | x when x = "FreeBSD" -> Ok ("solo5-" ^ string_of_int vm.Unikernel.pid) + | _ -> Error (`Msg "don't know what you mean, sorry") + let shutdown name vm = + (* since solo5 0.4.1, it drops privileges on FreeBSD *) + (* this results in solo5-hvt not being able to sysctl hw.vmm.destroy *) + (match Lazy.force uname, vm_device vm with + | x, Ok name when x = "FreeBSD" -> + ignore (Bos.OS.Cmd.run Bos.Cmd.(v "bhyvectl" % "--destroy" % ("--vm=" ^ name))) + | _ -> ()) ; (* same order as prepare! *) Bos.OS.File.delete (Name.image_file name) >>= fun () -> Bos.OS.File.delete (Name.fifo_file name) >>= fun () -> diff --git a/src/vmm_unix.mli b/src/vmm_unix.mli index 81fbf8b..6ca016b 100644 --- a/src/vmm_unix.mli +++ b/src/vmm_unix.mli @@ -24,3 +24,5 @@ val find_block_devices : unit -> ((Name.t * int) list, [> R.msg ]) result val dump : Cstruct.t -> (unit, [> R.msg ]) result val restore : unit -> (Cstruct.t, [> R.msg | `NoFile ]) result + +val vm_device : Unikernel.t -> (string, [> R.msg ]) result diff --git a/src/vmm_vmmd.ml b/src/vmm_vmmd.ml index 4a4a245..e618f2d 100644 --- a/src/vmm_vmmd.ml +++ b/src/vmm_vmmd.ml @@ -108,11 +108,12 @@ let dump_unikernels t = let setup_stats t name vm = let stat_out = - let pid = vm.Unikernel.pid in - let name = "solo5-" ^ string_of_int pid + let name = match Vmm_unix.vm_device vm with + | Error _ -> "" + | Ok name -> name and ifs = Unikernel.(List.combine vm.config.network_interfaces vm.taps) in - `Stats_add (name, pid, ifs) + `Stats_add (name, vm.Unikernel.pid, ifs) in let header = Vmm_commands.{ version = t.wire_version ; sequence = t.stats_counter ; name } in let t = { t with stats_counter = Int64.succ t.stats_counter } in