github.com/system-transparency/u-root@v6.0.1-0.20190919065413-ed07a650de4c+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/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  )
    46  
    47  func main() {
    48  	flag.Parse()
    49  	if *diskDev == "" && *cfg == "" && *cdrom == "" {
    50  		log.Printf("Either --config, --device, or --cdrom must be specified")
    51  		flag.PrintDefaults()
    52  		os.Exit(1)
    53  	}
    54  
    55  	if len(*diskDev) > 0 {
    56  		imgs, err := esxi.LoadDisk(*diskDev)
    57  		if err != nil {
    58  			log.Fatalf("Failed to load ESXi configuration: %v", err)
    59  		}
    60  
    61  		loaded := false
    62  		for _, img := range imgs {
    63  			if err := img.Load(false); err != nil {
    64  				log.Printf("Failed to load ESXi image (%v) into memory: %v", img, err)
    65  			} else {
    66  				// We loaded one, that's it.
    67  				loaded = true
    68  				break
    69  			}
    70  		}
    71  		if !loaded {
    72  			log.Fatalf("Failed to load all ESXi images found.")
    73  		}
    74  	} else {
    75  		var err error
    76  		var img *boot.MultibootImage
    77  		if len(*cfg) > 0 {
    78  			img, err = esxi.LoadConfig(*cfg)
    79  		} else if len(*cdrom) > 0 {
    80  			img, err = esxi.LoadCDROM(*cdrom)
    81  		}
    82  		if err != nil {
    83  			log.Fatalf("Failed to load ESXi configuration: %v", err)
    84  		}
    85  		if err := img.Load(false); err != nil {
    86  			log.Fatalf("Failed to load ESXi image (%v) into memory: %v", img, err)
    87  		}
    88  	}
    89  
    90  	if err := boot.Execute(); err != nil {
    91  		log.Fatalf("Failed to boot image: %v", err)
    92  	}
    93  }