|  | // Copyright 2020 The Monogon Project Authors. | 
|  | // | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | // mkimage is a tool to generate Metropolis node disk images. | 
|  | // It can be used both to initialize block devices and to create image | 
|  | // files. | 
|  | // | 
|  | // The tool takes a path to an EFI payload (--efi), and a path to a | 
|  | // Metropolis system image (--system) as its only required inputs. In | 
|  | // addition, an output path must be supplied (--out). | 
|  | // Node parameters file path (--node_parameters) may also be supplied, in | 
|  | // which case the file will be copied to the EFI system partition. | 
|  | // Partition sizes are fixed and may be overridden by command line flags. | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "flag" | 
|  | "log" | 
|  | "os" | 
|  |  | 
|  | "source.monogon.dev/metropolis/node/build/mkimage/osimage" | 
|  | ) | 
|  |  | 
|  | func main() { | 
|  | // Fill in the image parameters based on flags. | 
|  | var ( | 
|  | efiPayload  string | 
|  | systemImage string | 
|  | nodeParams  string | 
|  | cfg         osimage.Params | 
|  | ) | 
|  | flag.StringVar(&efiPayload, "efi", "", "Path to the UEFI payload used") | 
|  | flag.StringVar(&systemImage, "system", "", "Path to the system partition image used") | 
|  | flag.StringVar(&nodeParams, "node_parameters", "", "Path to Node Parameters to be written to the ESP (default: don't write Node Parameters)") | 
|  | flag.StringVar(&cfg.OutputPath, "out", "", "Path to the resulting disk image or block device") | 
|  | flag.Uint64Var(&cfg.PartitionSize.Data, "data_partition_size", 2048, "Override the data partition size (default 2048 MiB). Used only when generating image files.") | 
|  | flag.Uint64Var(&cfg.PartitionSize.ESP, "esp_partition_size", 128, "Override the ESP partition size (default: 128MiB)") | 
|  | flag.Uint64Var(&cfg.PartitionSize.System, "system_partition_size", 1024, "Override the System partition size (default: 1024MiB)") | 
|  | flag.StringVar(&cfg.DiskGUID, "GUID", "", "Disk GUID marked in the resulting image's partition table (default: randomly generated)") | 
|  | flag.Parse() | 
|  |  | 
|  | // Open the input files for osimage.Create, fill in reader objects and | 
|  | // metadata in osimage.Params. | 
|  | // Start with the EFI Payload the OS will boot from. | 
|  | p, err := os.Open(efiPayload) | 
|  | if err != nil { | 
|  | log.Fatalf("while opening the EFI payload at %q: %v", efiPayload, err) | 
|  | } | 
|  | defer p.Close() | 
|  | cfg.EFIPayload = p | 
|  |  | 
|  | // Attempt to open the system image if its path is set. In case the path | 
|  | // isn't set, the system partition will still be created, but no | 
|  | // contents will be written into it. | 
|  | if systemImage != "" { | 
|  | img, err := os.Open(systemImage) | 
|  | if err != nil { | 
|  | log.Fatalf("while opening the system image at %q: %v", systemImage, err) | 
|  | } | 
|  | defer img.Close() | 
|  | cfg.SystemImage = img | 
|  | } | 
|  |  | 
|  | // Attempt to open the node parameters file if its path is set. | 
|  | if nodeParams != "" { | 
|  | np, err := os.Open(nodeParams) | 
|  | if err != nil { | 
|  | log.Fatalf("while opening node parameters at %q: %v", nodeParams, err) | 
|  | } | 
|  | defer np.Close() | 
|  | cfg.NodeParameters = np | 
|  | } | 
|  |  | 
|  | // Write the parametrized OS image. | 
|  | if _, err := osimage.Create(&cfg); err != nil { | 
|  | log.Fatalf("while creating a Metropolis OS image: %v", err) | 
|  | } | 
|  | } |