github.com/andrewsun2898/u-root@v6.0.1-0.20200616011413-4b2895c1b815+incompatible/cmds/exp/esxiboot/esxiboot.go (about)

     1  // Copyright 2019 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // esxiboot executes ESXi kernel over the running kernel.
     6  //
     7  // Synopsis:
     8  //     esxiboot [-d --device] [-c --config] [-r --cdrom]
     9  //
    10  // Description:
    11  //     Loads and executes ESXi kernel.
    12  //
    13  // Options:
    14  //     --config=FILE or -c=FILE: set the ESXi config
    15  //     --device=FILE or -d=FILE: set an ESXi disk to boot from
    16  //     --cdrom=FILE or -r=FILE: set an ESXI CDROM to boot from
    17  //     --append: append kernel cmdline arguments
    18  //
    19  // --device is required to kexec installed ESXi instance.
    20  // You don't need it if you kexec ESXi installer.
    21  //
    22  // The config file has the following syntax:
    23  //
    24  // kernel=PATH
    25  // kernelopt=OPTS
    26  // modules=MOD1 [ARGS] --- MOD2 [ARGS] --- ...
    27  //
    28  // Lines starting with '#' are ignored.
    29  
    30  package main
    31  
    32  import (
    33  	"log"
    34  	"os"
    35  	"strings"
    36  
    37  	flag "github.com/spf13/pflag"
    38  	"github.com/u-root/u-root/pkg/boot"
    39  	"github.com/u-root/u-root/pkg/boot/esxi"
    40  )
    41  
    42  var (
    43  	cfg           = flag.StringP("config", "c", "", "ESXi config file")
    44  	cdrom         = flag.StringP("cdrom", "r", "", "ESXi CDROM boot device")
    45  	diskDev       = flag.StringP("device", "d", "", "ESXi disk boot device")
    46  	appendCmdline = flag.StringArray("append", nil, "Arguments to append to kernel cmdline")
    47  	dryRun        = flag.Bool("dry-run", false, "dry run (just mount + load the kernel, don't kexec)")
    48  )
    49  
    50  func main() {
    51  	flag.Parse()
    52  	if *diskDev == "" && *cfg == "" && *cdrom == "" {
    53  		log.Printf("Either --config, --device, or --cdrom must be specified")
    54  		flag.PrintDefaults()
    55  		os.Exit(1)
    56  	}
    57  
    58  	if len(*diskDev) > 0 {
    59  		imgs, err := esxi.LoadDisk(*diskDev)
    60  		if err != nil {
    61  			log.Fatalf("Failed to load ESXi configuration: %v", err)
    62  		}
    63  
    64  		loaded := false
    65  		for _, img := range imgs {
    66  			if len(*appendCmdline) > 0 {
    67  				img.Cmdline = img.Cmdline + " " + strings.Join(*appendCmdline, " ")
    68  			}
    69  			if err := img.Load(false); err != nil {
    70  				log.Printf("Failed to load ESXi image (%v) into memory: %v", img, err)
    71  			} else {
    72  				log.Printf("Loaded image: %v", img)
    73  				// We loaded one, that's it.
    74  				loaded = true
    75  				break
    76  			}
    77  		}
    78  		if !loaded {
    79  			log.Fatalf("Failed to load all ESXi images found.")
    80  		}
    81  	} else {
    82  		var err error
    83  		var img *boot.MultibootImage
    84  		if len(*cfg) > 0 {
    85  			img, err = esxi.LoadConfig(*cfg)
    86  		} else if len(*cdrom) > 0 {
    87  			img, err = esxi.LoadCDROM(*cdrom)
    88  		}
    89  		if err != nil {
    90  			log.Fatalf("Failed to load ESXi configuration: %v", err)
    91  		}
    92  		if len(*appendCmdline) > 0 {
    93  			img.Cmdline = img.Cmdline + " " + strings.Join(*appendCmdline, " ")
    94  		}
    95  		if err := img.Load(false); err != nil {
    96  			log.Fatalf("Failed to load ESXi image (%v) into memory: %v", img, err)
    97  		}
    98  		log.Printf("Loaded image: %v", img)
    99  	}
   100  
   101  	if *dryRun {
   102  		log.Printf("Dry run: not booting kernel.")
   103  		os.Exit(0)
   104  	}
   105  	if err := boot.Execute(); err != nil {
   106  		log.Fatalf("Failed to boot image: %v", err)
   107  	}
   108  }