call waitpid() earlier, separate freebsd kludge (chmod g+rw), fixes #9

This commit is contained in:
Hannes Mehnert 2018-03-22 00:41:41 +01:00
parent db8ae1ee37
commit b9d5fa94f9
3 changed files with 14 additions and 9 deletions

View file

@ -58,12 +58,13 @@ let handle ca state t =
(match cont !state t with (match cont !state t with
| Ok (state', outs, vm) -> | Ok (state', outs, vm) ->
state := state' ; state := state' ;
process state outs >>= fun () ->
Lwt.async (fun () -> Lwt.async (fun () ->
Vmm_lwt.wait_and_clear vm.Vmm_core.pid vm.Vmm_core.stdout >>= fun r -> Vmm_lwt.wait_and_clear vm.Vmm_core.pid vm.Vmm_core.stdout >>= fun r ->
let state', outs = Vmm_engine.handle_shutdown !state vm r in let state', outs = Vmm_engine.handle_shutdown !state vm r in
state := state' ; state := state' ;
process state outs) ; process state outs) ;
process state outs >>= fun () ->
let _ = Vmm_commands.setup_freebsd_kludge vm.Vmm_core.pid in
Lwt.return_unit Lwt.return_unit
| Error (`Msg e) -> | Error (`Msg e) ->
Logs.err (fun m -> m "error while cont %s" e) ; Logs.err (fun m -> m "error while cont %s" e) ;

View file

@ -186,14 +186,6 @@ let exec dir vm tmpfile taps =
Logs.debug (fun m -> m "creating process"); Logs.debug (fun m -> m "creating process");
let pid = create_process prog line stdout stdout in let pid = create_process prog line stdout stdout in
Logs.debug (fun m -> m "created process %d: %a" pid Bos.Cmd.pp cmd) ; Logs.debug (fun m -> m "created process %d: %a" pid Bos.Cmd.pp cmd) ;
(* on FreeBSD we need to chmod g+rw /dev/vmm/ukvm$pid to run
bhyvectl --get-stats --vm=ukvm$pid as non-priviliged user *)
(Lazy.force (uname ()) >>= fun (sys, _) ->
match sys with
| x when x = "FreeBSD" ->
let dev = "/dev/vmm/ukvm" ^ string_of_int pid in
Bos.OS.Cmd.run Bos.Cmd.(v "chmod" % "g+rw" % dev)
| _ -> Ok ()) >>= fun () ->
(* this should get rid of the vmimage from vmmd's memory! *) (* this should get rid of the vmimage from vmmd's memory! *)
let config = { vm with vmimage = (fst vm.vmimage, Cstruct.create 0) } in let config = { vm with vmimage = (fst vm.vmimage, Cstruct.create 0) } in
Ok { config ; cmd ; pid ; taps ; stdout ; tmpfile } Ok { config ; cmd ; pid ; taps ; stdout ; tmpfile }
@ -203,3 +195,13 @@ let exec dir vm tmpfile taps =
R.error_msgf "cmd %a exits: %a" Bos.Cmd.pp cmd pp_unix_error e R.error_msgf "cmd %a exits: %a" Bos.Cmd.pp cmd pp_unix_error e
let destroy vm = Unix.kill vm.pid 15 (* 15 is SIGTERM *) let destroy vm = Unix.kill vm.pid 15 (* 15 is SIGTERM *)
let setup_freebsd_kludge pid =
(* on FreeBSD we need to chmod g+rw /dev/vmm/ukvm$pid to run
bhyvectl --get-stats --vm=ukvm$pid as non-priviliged user *)
Lazy.force (uname ()) >>= fun (sys, _) ->
match sys with
| x when x = "FreeBSD" ->
let dev = "/dev/vmm/ukvm" ^ string_of_int pid in
Bos.OS.Cmd.run Bos.Cmd.(v "chmod" % "g+rw" % dev)
| _ -> Ok ()

View file

@ -17,3 +17,5 @@ val close_no_err : Unix.file_descr -> unit
val create_tap : string -> (string, [> R.msg ]) result val create_tap : string -> (string, [> R.msg ]) result
val create_bridge : string -> (unit, [> R.msg ]) result val create_bridge : string -> (unit, [> R.msg ]) result
val setup_freebsd_kludge : int -> (unit, [> R.msg ]) result