@@ -213,26 +213,6 @@ func (h Handler) Start(cmd *cobra.Command, args []string) error {
213213 return batchVMCmd (ctx , "start" , "started" , hyper .Start , args )
214214}
215215
216- // recoverNetwork recreates the network namespace and TC redirect for VMs
217- // whose netns was lost (e.g. after host reboot). Best-effort: failures are
218- // logged but do not block start — hyper.Start will report the real error.
219- func (h Handler ) recoverNetwork (ctx context.Context , hyper hypervisor.Hypervisor , net network.Network , refs []string ) {
220- logger := log .WithFunc ("cmd.recoverNetwork" )
221- for _ , ref := range refs {
222- vm , err := hyper .Inspect (ctx , ref )
223- if err != nil || vm == nil || len (vm .NetworkConfigs ) == 0 {
224- continue
225- }
226- if net .Verify (ctx , vm .ID ) == nil {
227- continue // netns exists, no recovery needed
228- }
229- logger .Warnf (ctx , "netns missing for VM %s, recovering network" , vm .ID )
230- if _ , recoverErr := net .Config (ctx , vm .ID , len (vm .NetworkConfigs ), & vm .Config , vm .NetworkConfigs ... ); recoverErr != nil {
231- logger .Warnf (ctx , "recover network for VM %s: %v (start will fail)" , vm .ID , recoverErr )
232- }
233- }
234- }
235-
236216func (h Handler ) Stop (cmd * cobra.Command , args []string ) error {
237217 ctx , conf , err := h .Init (cmd )
238218 if err != nil {
@@ -498,14 +478,30 @@ func (h Handler) Debug(cmd *cobra.Command, args []string) error {
498478 balloon = memoryMB / 2 //nolint:mnd
499479 }
500480
501- if boot .KernelPath != "" {
502- printRunOCI (storageConfigs , boot , vmCfg .Name , vmCfg .Image , cowPath , chBin , vmCfg .CPU , maxCPU , memoryMB , balloon , cowSizeGB , vmCfg .Windows )
503- } else {
504- printRunCloudimg (storageConfigs , boot , vmCfg .Name , vmCfg .Image , cowPath , chBin , vmCfg .CPU , maxCPU , memoryMB , balloon , cowSizeGB , vmCfg .Windows )
505- }
481+ printDebugRun (storageConfigs , boot , vmCfg .Name , vmCfg .Image , cowPath , chBin , vmCfg .CPU , maxCPU , memoryMB , balloon , cowSizeGB , vmCfg .Windows , boot .KernelPath != "" )
506482 return nil
507483}
508484
485+ // recoverNetwork recreates the network namespace and TC redirect for VMs
486+ // whose netns was lost (e.g. after host reboot). Best-effort: failures are
487+ // logged but do not block start — hyper.Start will report the real error.
488+ func (h Handler ) recoverNetwork (ctx context.Context , hyper hypervisor.Hypervisor , net network.Network , refs []string ) {
489+ logger := log .WithFunc ("cmd.recoverNetwork" )
490+ for _ , ref := range refs {
491+ vm , err := hyper .Inspect (ctx , ref )
492+ if err != nil || vm == nil || len (vm .NetworkConfigs ) == 0 {
493+ continue
494+ }
495+ if net .Verify (ctx , vm .ID ) == nil {
496+ continue // netns exists, no recovery needed
497+ }
498+ logger .Warnf (ctx , "netns missing for VM %s, recovering network" , vm .ID )
499+ if _ , recoverErr := net .Config (ctx , vm .ID , len (vm .NetworkConfigs ), & vm .Config , vm .NetworkConfigs ... ); recoverErr != nil {
500+ logger .Warnf (ctx , "recover network for VM %s: %v (start will fail)" , vm .ID , recoverErr )
501+ }
502+ }
503+ }
504+
509505// initHyper is the shared init for methods that only need the hypervisor.
510506func (h Handler ) initHyper (cmd * cobra.Command ) (context.Context , hypervisor.Hypervisor , error ) {
511507 ctx , conf , err := h .Init (cmd )
@@ -733,59 +729,57 @@ func printBashArray(name string, nics []nicHint, field func(nicHint) string) {
733729 fmt .Println (")" )
734730}
735731
736- func printRunOCI (configs []* types.StorageConfig , boot * types.BootConfig , vmName , image , cowPath , chBin string , cpu , maxCPU , memory , balloon , cowSize int , windows bool ) {
737- if cowPath == "" {
738- cowPath = fmt .Sprintf ("cow-%s.raw" , vmName )
739- }
740-
741- debugConfigs := append (append ([]* types.StorageConfig (nil ), configs ... ),
742- & types.StorageConfig {Path : cowPath , RO : false , Serial : cloudhypervisor .CowSerial })
743- diskArgs := cloudhypervisor .DebugDiskCLIArgs (debugConfigs , cpu )
732+ func printDebugRun (configs []* types.StorageConfig , boot * types.BootConfig , vmName , image , cowPath , chBin string , cpu , maxCPU , memory , balloon , cowSize int , windows , directBoot bool ) {
733+ if directBoot {
734+ if cowPath == "" {
735+ cowPath = fmt .Sprintf ("cow-%s.raw" , vmName )
736+ }
744737
745- cocoonLayers := strings .Join (cloudhypervisor .ReverseLayerSerials (configs ), "," )
738+ debugConfigs := append (append ([]* types.StorageConfig (nil ), configs ... ),
739+ & types.StorageConfig {Path : cowPath , RO : false , Serial : cloudhypervisor .CowSerial })
740+ diskArgs := cloudhypervisor .DebugDiskCLIArgs (debugConfigs , cpu )
746741
747- cmdline := fmt .Sprintf (
748- "console=hvc0 loglevel=3 boot=cocoon-overlay cocoon.layers=%s cocoon.cow=%s clocksource=kvm-clock rw" ,
749- cocoonLayers , cloudhypervisor .CowSerial )
742+ cocoonLayers := strings .Join (cloudhypervisor .ReverseLayerSerials (configs ), "," )
743+ cmdline := fmt .Sprintf (
744+ "console=hvc0 loglevel=3 boot=cocoon-overlay cocoon.layers=%s cocoon.cow=%s clocksource=kvm-clock rw" ,
745+ cocoonLayers , cloudhypervisor .CowSerial )
750746
751- fmt .Println ("# Prepare COW disk" )
752- fmt .Printf ("truncate -s %dG %s\n " , cowSize , cowPath )
753- fmt .Printf ("mkfs.ext4 -F -m 0 -q -E lazy_itable_init=1,lazy_journal_init=1,discard %s\n " , cowPath )
754- fmt .Println ()
747+ fmt .Println ("# Prepare COW disk" )
748+ fmt .Printf ("truncate -s %dG %s\n " , cowSize , cowPath )
749+ fmt .Printf ("mkfs.ext4 -F -m 0 -q -E lazy_itable_init=1,lazy_journal_init=1,discard %s\n " , cowPath )
750+ fmt .Println ()
755751
756- fmt .Printf ("# Launch VM: %s (image: %s, boot: direct kernel)\n " , vmName , image )
757- fmt .Printf ("%s \\ \n " , chBin )
758- fmt .Printf (" --kernel %s \\ \n " , boot .KernelPath )
759- fmt .Printf (" --initramfs %s \\ \n " , boot .InitrdPath )
760- fmt .Printf (" --disk" )
761- for _ , d := range diskArgs {
762- fmt .Printf (" \\ \n \" %s\" " , d )
763- }
764- fmt .Printf (" \\ \n " )
765- fmt .Printf (" --cmdline \" %s\" \\ \n " , cmdline )
766- printCommonCHArgs (cpu , maxCPU , memory , balloon , windows )
767- }
752+ fmt .Printf ("# Launch VM: %s (image: %s, boot: direct kernel)\n " , vmName , image )
753+ fmt .Printf ("%s \\ \n " , chBin )
754+ fmt .Printf (" --kernel %s \\ \n " , boot .KernelPath )
755+ fmt .Printf (" --initramfs %s \\ \n " , boot .InitrdPath )
756+ fmt .Printf (" --disk" )
757+ for _ , d := range diskArgs {
758+ fmt .Printf (" \\ \n \" %s\" " , d )
759+ }
760+ fmt .Printf (" \\ \n " )
761+ fmt .Printf (" --cmdline \" %s\" \\ \n " , cmdline )
762+ } else {
763+ if cowPath == "" {
764+ cowPath = fmt .Sprintf ("cow-%s.qcow2" , vmName )
765+ }
768766
769- func printRunCloudimg (configs []* types.StorageConfig , boot * types.BootConfig , vmName , image , cowPath , chBin string , cpu , maxCPU , memory , balloon , cowSize int , windows bool ) {
770- if cowPath == "" {
771- cowPath = fmt .Sprintf ("cow-%s.qcow2" , vmName )
772- }
767+ basePath := configs [0 ].Path
773768
774- basePath := configs [0 ].Path
769+ fmt .Println ("# Prepare COW overlay" )
770+ fmt .Printf ("qemu-img create -f qcow2 -F qcow2 -b %s %s\n " , basePath , cowPath )
771+ if cowSize > 0 {
772+ fmt .Printf ("qemu-img resize %s %dG\n " , cowPath , cowSize )
773+ }
774+ fmt .Println ()
775775
776- fmt .Println ("# Prepare COW overlay" )
777- fmt .Printf ("qemu-img create -f qcow2 -F qcow2 -b %s %s\n " , basePath , cowPath )
778- if cowSize > 0 {
779- fmt .Printf ("qemu-img resize %s %dG\n " , cowPath , cowSize )
776+ fmt .Printf ("# Launch VM: %s (image: %s, boot: UEFI firmware)\n " , vmName , image )
777+ fmt .Printf ("%s \\ \n " , chBin )
778+ fmt .Printf (" --firmware %s \\ \n " , boot .FirmwarePath )
779+ fmt .Printf (" --disk \\ \n " )
780+ diskArgs := cloudhypervisor .DebugDiskCLIArgs ([]* types.StorageConfig {{Path : cowPath , RO : false }}, cpu )
781+ fmt .Printf (" \" %s\" \\ \n " , diskArgs [0 ])
780782 }
781- fmt .Println ()
782-
783- fmt .Printf ("# Launch VM: %s (image: %s, boot: UEFI firmware)\n " , vmName , image )
784- fmt .Printf ("%s \\ \n " , chBin )
785- fmt .Printf (" --firmware %s \\ \n " , boot .FirmwarePath )
786- fmt .Printf (" --disk \\ \n " )
787- diskArgs := cloudhypervisor .DebugDiskCLIArgs ([]* types.StorageConfig {{Path : cowPath , RO : false }}, cpu )
788- fmt .Printf (" \" %s\" \\ \n " , diskArgs [0 ])
789783 printCommonCHArgs (cpu , maxCPU , memory , balloon , windows )
790784}
791785
0 commit comments