github.com/xyproto/u-root@v6.0.1-0.20200302025726-5528e0c77a3c+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  //
    18  // --device is required to kexec installed ESXi instance.
    19  // You don't need it if you kexec ESXi installer.
    20  //
    21  // The config file has the following syntax:
    22  //
    23  // kernel=PATH
    24  // kernelopt=OPTS
    25  // modules=MOD1 [ARGS] --- MOD2 [ARGS] --- ...
    26  //
    27  // Lines starting with '#' are ignored.
    28  
    29  package main
    30  
    31  import (
    32  	"log"
    33  	"os"
    34  
    35  	flag "github.com/spf13/pflag"
    36  
    37  	"github.com/u-root/u-root/pkg/boot"
    38  	"github.com/u-root/u-root/pkg/boot/esxi"
    39  )
    40  
    41  var (
    42  	cfg     = flag.StringP("config", "c", "", "ESXi config file")
    43  	cdrom   = flag.StringP("cdrom", "r", "", "ESXi CDROM boot device")
    44  	diskDev = flag.StringP("device", "d", "", "ESXi disk boot device")
    45  	dryRun  = flag.Bool("dry-run", false, "dry run (just mount + load the kernel, don't kexec)")
    46  )
    47  
    48  func main() {
    49  	flag.Parse()
    50  	if *diskDev == "" && *cfg == "" && *cdrom == "" {
    51  		log.Printf("Either --config, --device, or --cdrom must be specified")
    52  		flag.PrintDefaults()
    53  		os.Exit(1)
    54  	}
    55  
    56  	if len(*diskDev) > 0 {
    57  		imgs, err := esxi.LoadDisk(*diskDev)
    58  		if err != nil {
    59  			log.Fatalf("Failed to load ESXi configuration: %v", err)
    60  		}
    61  
    62  		loaded := false
    63  		for _, img := range imgs {
    64  			if err := img.Load(false); err != nil {
    65  				log.Printf("Failed to load ESXi image (%v) into memory: %v", img, err)
    66  			} else {
    67  				log.Printf("Loaded image: %v", img)
    68  				// We loaded one, that's it.
    69  				loaded = true
    70  				break
    71  			}
    72  		}
    73  		if !loaded {
    74  			log.Fatalf("Failed to load all ESXi images found.")
    75  		}
    76  	} else {
    77  		var err error
    78  		var img *boot.MultibootImage
    79  		if len(*cfg) > 0 {
    80  			img, err = esxi.LoadConfig(*cfg)
    81  		} else if len(*cdrom) > 0 {
    82  			img, err = esxi.LoadCDROM(*cdrom)
    83  		}
    84  		if err != nil {
    85  			log.Fatalf("Failed to load ESXi configuration: %v", err)
    86  		}
    87  		if err := img.Load(false); err != nil {
    88  			log.Fatalf("Failed to load ESXi image (%v) into memory: %v", img, err)
    89  		}
    90  		log.Printf("Loaded image: %v", img)
    91  	}
    92  
    93  	if *dryRun {
    94  		log.Printf("Dry run: not booting kernel.")
    95  		os.Exit(0)
    96  	}
    97  	if err := boot.Execute(); err != nil {
    98  		log.Fatalf("Failed to boot image: %v", err)
    99  	}
   100  }