feat: add support for installing to SBCs

This introduces the notion of a "board" in Talos. A board is an interface that is capable
of modifying the installation in specific ways for a given SBC. This also adds support for the
libretech_all_h3_cc_h5.

Signed-off-by: Andrew Rynhard <andrew@rynhard.io>
This commit is contained in:
Andrey Smirnov 2020-11-25 18:00:02 +03:00 committed by talos-bot
parent f96cffd2b2
commit 1eac88e470
23 changed files with 386 additions and 119 deletions

View File

@ -495,6 +495,8 @@ local release = {
'_out/gcp-arm64.tar.gz',
'_out/initramfs-amd64.xz',
'_out/initramfs-arm64.xz',
'_out/metal-amd64.tar.gz',
'_out/metal-arm64.tar.gz',
'_out/openstack-amd64.tar.gz',
'_out/openstack-arm64.tar.gz',
'_out/talos-amd64.iso',

View File

@ -29,6 +29,7 @@ FROM ghcr.io/talos-systems/xfsprogs:${PKGS} AS pkg-xfsprogs
FROM ghcr.io/talos-systems/util-linux:${PKGS} AS pkg-util-linux
FROM ghcr.io/talos-systems/kmod:${PKGS} AS pkg-kmod
FROM ghcr.io/talos-systems/kernel:${PKGS} AS pkg-kernel
FROM ghcr.io/talos-systems/u-boot:${PKGS} AS pkg-u-boot
# Resolve package images using ${EXTRAS} to be used later in COPY --from=.
@ -470,6 +471,7 @@ COPY --from=unicode-pf2 /usr/share/grub/unicode.pf2 /usr/share/grub/unicode.pf2
ARG TARGETARCH
COPY --from=kernel /vmlinuz-${TARGETARCH} /usr/install/vmlinuz
COPY --from=initramfs /initramfs-${TARGETARCH}.xz /usr/install/initramfs.xz
COPY --from=pkg-u-boot / /usr/install/u-boot
COPY --from=installer-build /installer /bin/installer
RUN ln -s /bin/installer /bin/talosctl
ARG TAG

View File

@ -7,8 +7,8 @@ REGISTRY_AND_USERNAME := $(REGISTRY)/$(USERNAME)
DOCKER_LOGIN_ENABLED ?= true
ARTIFACTS := _out
TOOLS ?= ghcr.io/talos-systems/tools:v0.3.0-10-g83dc352
PKGS ?= v0.3.0-27-g7a64952
TOOLS ?= ghcr.io/talos-systems/tools:v0.3.0-11-g84c834e
PKGS ?= v0.3.0-35-g6b7be81
EXTRAS ?= v0.1.0-5-gcc2df81
GO_VERSION ?= 1.15
GOFUMPT_VERSION ?= abc0db2c416aca0f60ea33c23c76665f6e7ba0b6
@ -173,7 +173,7 @@ talosctl: $(TALOSCTL_DEFAULT_TARGET) ## Builds the talosctl binary for the local
image-%: ## Builds the specified image. Valid options are aws, azure, digital-ocean, gcp, and vmware (e.g. image-aws)
@docker run --rm -v /dev:/dev --privileged $(REGISTRY)/$(USERNAME)/installer:$(TAG) image --platform $* --tar-to-stdout | tar xz -C $(ARTIFACTS)
images: image-aws image-azure image-digital-ocean image-gcp image-openstack image-vmware ## Builds all known images (AWS, Azure, Digital Ocean, GCP, Openstack, and VMware).
images: image-aws image-azure image-digital-ocean image-gcp image-metal image-openstack image-vmware ## Builds all known images (AWS, Azure, Digital Ocean, GCP, Metal, Openstack, and VMware).
.PHONY: iso
iso: ## Builds the ISO and outputs it to the artifact directory.

View File

@ -86,7 +86,7 @@ func runImageCmd() (err error) {
if options.ConfigSource == "" {
switch p.Name() {
case "aws", "azure", "digital-ocean", "gcp":
options.ConfigSource = "none"
options.ConfigSource = constants.ConfigNone
case "vmware":
options.ConfigSource = constants.ConfigGuestInfo
default:
@ -148,6 +148,16 @@ func finalize(platform runtime.Platform, img string) (err error) {
if err = ova.CreateOVAFromRAW(name, img, outputArg); err != nil {
return err
}
case "metal":
name := fmt.Sprintf("metal-%s.tar.gz", stdruntime.GOARCH)
if options.Board != "" {
name = fmt.Sprintf("metal-%s-%s.tar.gz", options.Board, stdruntime.GOARCH)
}
if err = tar(name, file, dir); err != nil {
return err
}
}
return nil

View File

@ -36,6 +36,7 @@ func init() {
rootCmd.PersistentFlags().StringVar(&options.ConfigSource, "config", "", "The value of "+constants.KernelParamConfig)
rootCmd.PersistentFlags().StringVar(&options.Disk, "disk", "", "The path to the disk to install to")
rootCmd.PersistentFlags().StringVar(&options.Platform, "platform", "", "The value of "+constants.KernelParamPlatform)
rootCmd.PersistentFlags().StringVar(&options.Board, "board", constants.BoardNone, "The value of "+constants.KernelParamBoard)
rootCmd.PersistentFlags().StringArrayVar(&options.ExtraKernelArgs, "extra-kernel-arg", []string{}, "Extra argument to pass to the kernel")
rootCmd.PersistentFlags().BoolVar(&options.Bootloader, "bootloader", true, "Install a booloader to the specified disk")
rootCmd.PersistentFlags().BoolVar(&options.Upgrade, "upgrade", false, "Indicates that the install is being performed by an upgrade")

View File

@ -6,7 +6,9 @@ package install
import (
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
"github.com/talos-systems/go-blockdevice/blockdevice/probe"
@ -14,6 +16,7 @@ import (
"golang.org/x/sys/unix"
"github.com/talos-systems/talos/internal/app/machined/pkg/runtime"
"github.com/talos-systems/talos/internal/app/machined/pkg/runtime/v1alpha1/board"
"github.com/talos-systems/talos/internal/app/machined/pkg/runtime/v1alpha1/bootloader"
"github.com/talos-systems/talos/internal/app/machined/pkg/runtime/v1alpha1/bootloader/grub"
"github.com/talos-systems/talos/internal/pkg/mount"
@ -26,6 +29,7 @@ type Options struct {
ConfigSource string
Disk string
Platform string
Board string
ExtraKernelArgs []string
Bootloader bool
Upgrade bool
@ -37,7 +41,10 @@ type Options struct {
func Install(p runtime.Platform, seq runtime.Sequence, opts *Options) (err error) {
cmdline := procfs.NewCmdline("")
cmdline.Append(constants.KernelParamPlatform, p.Name())
cmdline.Append(constants.KernelParamConfig, opts.ConfigSource)
if opts.ConfigSource != "" {
cmdline.Append(constants.KernelParamConfig, opts.ConfigSource)
}
if err = cmdline.AppendAll(p.KernelArgs().Strings()); err != nil {
return err
@ -152,6 +159,17 @@ func (i *Installer) probeBootPartition() error {
//
// nolint: gocyclo
func (i *Installer) Install(seq runtime.Sequence) (err error) {
if i.options.Board != constants.BoardNone {
var b runtime.Board
b, err = board.NewBoard(i.options.Board)
if err != nil {
return err
}
i.cmdline.Append(constants.KernelParamBoard, b.Name())
}
if err = i.manifest.Execute(); err != nil {
return err
}
@ -220,6 +238,54 @@ func (i *Installer) Install(seq runtime.Sequence) (err error) {
return err
}
if i.options.Board != constants.BoardNone {
var b runtime.Board
b, err = board.NewBoard(i.options.Board)
if err != nil {
return err
}
log.Printf("installing U-Boot for %q board", b.Name())
var f *os.File
if f, err = os.OpenFile(i.options.Disk, os.O_RDWR|unix.O_CLOEXEC, 0o666); err != nil {
return err
}
// nolint: errcheck
defer f.Close()
bin, off := b.UBoot()
var uboot []byte
uboot, err = ioutil.ReadFile(bin)
if err != nil {
return err
}
log.Printf("writing %s to %s at offset %d", bin, i.options.Disk, off)
var n int
n, err = f.WriteAt(uboot, off)
if err != nil {
return err
}
log.Printf("wrote %d bytes", n)
// NB: In the case that the block device is a loopback device, we sync here
// to esure that the file is written before the loopback device is
// unmounted.
err = f.Sync()
if err != nil {
return err
}
}
if seq == runtime.SequenceUpgrade {
var meta *bootloader.Meta

View File

@ -9,6 +9,7 @@ import (
"bytes"
"compress/gzip"
"context"
"errors"
"fmt"
"io"
"log"
@ -18,13 +19,13 @@ import (
"time"
"github.com/talos-systems/go-blockdevice/blockdevice"
"github.com/talos-systems/go-blockdevice/blockdevice/table"
"github.com/talos-systems/go-blockdevice/blockdevice/table/gpt/partition"
"github.com/talos-systems/go-blockdevice/blockdevice/partition/gpt"
"github.com/talos-systems/go-blockdevice/blockdevice/util"
"github.com/talos-systems/go-retry/retry"
"golang.org/x/sys/unix"
"github.com/talos-systems/talos/internal/app/machined/pkg/runtime"
"github.com/talos-systems/talos/internal/app/machined/pkg/runtime/v1alpha1/board"
"github.com/talos-systems/talos/internal/pkg/mount"
"github.com/talos-systems/talos/pkg/archiver"
"github.com/talos-systems/talos/pkg/machinery/constants"
@ -34,8 +35,9 @@ import (
// Manifest represents the instructions for preparing all block devices
// for an installation.
type Manifest struct {
Devices map[string]Device
Targets map[string][]*Target
PartitionOptions *runtime.PartitionOptions
Devices map[string]Device
Targets map[string][]*Target
}
// Device represents device options.
@ -138,6 +140,17 @@ func NewManifest(label string, sequence runtime.Sequence, bootPartitionFound boo
Targets: map[string][]*Target{},
}
if opts.Board != constants.BoardNone {
var b runtime.Board
b, err = board.NewBoard(opts.Board)
if err != nil {
return nil, err
}
manifest.PartitionOptions = b.PartitionOptions()
}
// TODO: legacy, to support old Talos initramfs, assume force if boot partition not found
if !bootPartitionFound {
opts.Force = true
@ -345,14 +358,48 @@ func (m *Manifest) executeOnDevice(device Device, targets []*Target) (err error)
var bd *blockdevice.BlockDevice
if bd, err = blockdevice.Open(device.Device, blockdevice.WithNewGPT(device.ResetPartitionTable)); err != nil {
if bd, err = blockdevice.Open(device.Device); err != nil {
return err
}
// nolint: errcheck
defer bd.Close()
if device.ResetPartitionTable {
var pt *gpt.GPT
created := false
pt, err = bd.PartitionTable()
if err != nil {
if !errors.Is(err, blockdevice.ErrMissingPartitionTable) {
return err
}
log.Printf("creating new partition table on %s", device.Device)
gptOpts := []gpt.Option{}
if m.PartitionOptions != nil {
gptOpts = append(gptOpts, gpt.WithPartitionEntriesStartLBA(m.PartitionOptions.PartitionsOffset))
}
pt, err = gpt.New(bd.Device(), gptOpts...)
if err != nil {
return err
}
if err = pt.Write(); err != nil {
return err
}
if bd, err = blockdevice.Open(device.Device); err != nil {
return err
}
created = true
}
if !created && device.ResetPartitionTable {
log.Printf("resetting partition table on %s", device.Device)
// TODO: how should it work with zero option above?
@ -365,13 +412,6 @@ func (m *Manifest) executeOnDevice(device Device, targets []*Target) (err error)
}
} else {
// clean up partitions which are going to be recreated
var pt table.PartitionTable
pt, err = bd.PartitionTable()
if err != nil {
return err
}
keepPartitions := map[string]struct{}{}
for _, target := range targets {
@ -387,8 +427,8 @@ func (m *Manifest) executeOnDevice(device Device, targets []*Target) (err error)
missingPartitions[label] = struct{}{}
}
for _, part := range pt.Partitions() {
delete(missingPartitions, part.Label())
for _, part := range pt.Partitions().Items() {
delete(missingPartitions, part.Name)
}
if len(missingPartitions) > 0 {
@ -396,9 +436,9 @@ func (m *Manifest) executeOnDevice(device Device, targets []*Target) (err error)
}
// delete all partitions which are not skipped
for _, part := range pt.Partitions() {
if _, ok := keepPartitions[part.Label()]; !ok {
log.Printf("deleting partition %s", part.Label())
for _, part := range pt.Partitions().Items() {
if _, ok := keepPartitions[part.Name]; !ok {
log.Printf("deleting partition %s", part.Name)
if err = pt.Delete(part); err != nil {
return err
@ -415,8 +455,6 @@ func (m *Manifest) executeOnDevice(device Device, targets []*Target) (err error)
}
}
var pt table.PartitionTable
pt, err = bd.PartitionTable()
if err != nil {
return err
@ -507,7 +545,7 @@ func (m *Manifest) preserveContents(device Device, targets []*Target) (err error
}
var (
sourcePart table.Partition
sourcePart *gpt.Partition
fileSystemType FileSystemType
fnmatchFilters []string
)
@ -521,8 +559,8 @@ func (m *Manifest) preserveContents(device Device, targets []*Target) (err error
for _, source := range sources {
// find matching existing partition table entry
for _, part := range pt.Partitions() {
if part.Label() == source.Label {
for _, part := range pt.Partitions().Items() {
if part.Name == source.Label {
sourcePart = part
fileSystemType = source.FileSystemType
fnmatchFilters = source.FnmatchFilters
@ -600,11 +638,11 @@ func (m *Manifest) zeroDevice(device Device) (err error) {
// Partition creates a new partition on the specified device.
// nolint: dupl, gocyclo
func (t *Target) Partition(pt table.PartitionTable, pos int, bd *blockdevice.BlockDevice) (err error) {
func (t *Target) Partition(pt *gpt.GPT, pos int, bd *blockdevice.BlockDevice) (err error) {
if t.Skip {
for _, part := range pt.Partitions() {
if part.Label() == t.Label {
t.PartitionName, err = util.PartPath(t.Device, int(part.No()))
for _, part := range pt.Partitions().Items() {
if part.Name == t.Label {
t.PartitionName, err = util.PartPath(t.Device, int(part.Number))
if err != nil {
return err
}
@ -620,17 +658,17 @@ func (t *Target) Partition(pt table.PartitionTable, pos int, bd *blockdevice.Blo
log.Printf("partitioning %s - %s\n", t.Device, t.Label)
opts := []interface{}{
partition.WithPartitionType(t.PartitionType),
partition.WithPartitionName(t.Label),
opts := []gpt.PartitionOption{
gpt.WithPartitionType(t.PartitionType),
gpt.WithPartitionName(t.Label),
}
if t.Size == 0 {
opts = append(opts, partition.WithMaximumSize(true))
opts = append(opts, gpt.WithMaximumSize(true))
}
if t.LegacyBIOSBootable {
opts = append(opts, partition.WithLegacyBIOSBootableAttribute(true))
opts = append(opts, gpt.WithLegacyBIOSBootableAttribute(true))
}
part, err := pt.InsertAt(pos, t.Size, opts...)
@ -638,7 +676,7 @@ func (t *Target) Partition(pt table.PartitionTable, pos int, bd *blockdevice.Blo
return err
}
t.PartitionName, err = util.PartPath(t.Device, int(part.No()))
t.PartitionName, err = util.PartPath(t.Device, int(part.Number))
if err != nil {
return err
}
@ -755,8 +793,8 @@ func withTemporaryMounted(partPath string, flags uintptr, fileSystemType FileSys
}
// SaveContents saves contents of partition to the target (in-memory).
func (t *Target) SaveContents(device Device, source table.Partition, fileSystemType FileSystemType, fnmatchFilters []string) error {
partPath, err := util.PartPath(device.Device, int(source.No()))
func (t *Target) SaveContents(device Device, source *gpt.Partition, fileSystemType FileSystemType, fnmatchFilters []string) error {
partPath, err := util.PartPath(device.Device, int(source.Number))
if err != nil {
return err
}

View File

@ -16,7 +16,7 @@ import (
"github.com/stretchr/testify/suite"
"github.com/talos-systems/go-blockdevice/blockdevice"
"github.com/talos-systems/go-blockdevice/blockdevice/loopback"
"github.com/talos-systems/go-blockdevice/blockdevice/table/gpt/partition"
"github.com/talos-systems/go-blockdevice/blockdevice/partition/gpt"
"github.com/talos-systems/go-blockdevice/blockdevice/util"
"github.com/talos-systems/talos/cmd/installer/pkg/install"
@ -111,34 +111,34 @@ func (suite *manifestSuite) verifyBlockdevice(manifest *install.Manifest, curren
suite.Assert().Len(table.Partitions(), 6)
part := table.Partitions()[0]
suite.Assert().Equal(install.EFISystemPartition, strings.ToUpper(part.(*partition.Partition).Type.String()))
suite.Assert().Equal(constants.EFIPartitionLabel, part.Label())
suite.Assert().EqualValues(0, part.(*partition.Partition).Flags)
part := table.Partitions().Items()[0]
suite.Assert().Equal(install.EFISystemPartition, strings.ToUpper(part.Type.String()))
suite.Assert().Equal(constants.EFIPartitionLabel, part.Name)
suite.Assert().EqualValues(0, part.Attributes)
suite.Assert().EqualValues(install.EFISize/lbaSize, part.Length())
part = table.Partitions()[1]
suite.Assert().Equal(install.BIOSBootPartition, strings.ToUpper(part.(*partition.Partition).Type.String()))
suite.Assert().Equal(constants.BIOSGrubPartitionLabel, part.Label())
suite.Assert().EqualValues(4, part.(*partition.Partition).Flags)
part = table.Partitions().Items()[1]
suite.Assert().Equal(install.BIOSBootPartition, strings.ToUpper(part.Type.String()))
suite.Assert().Equal(constants.BIOSGrubPartitionLabel, part.Name)
suite.Assert().EqualValues(4, part.Attributes)
suite.Assert().EqualValues(install.BIOSGrubSize/lbaSize, part.Length())
part = table.Partitions()[2]
suite.Assert().Equal(install.LinuxFilesystemData, strings.ToUpper(part.(*partition.Partition).Type.String()))
suite.Assert().Equal(constants.BootPartitionLabel, part.Label())
suite.Assert().EqualValues(0, part.(*partition.Partition).Flags)
part = table.Partitions().Items()[2]
suite.Assert().Equal(install.LinuxFilesystemData, strings.ToUpper(part.Type.String()))
suite.Assert().Equal(constants.BootPartitionLabel, part.Name)
suite.Assert().EqualValues(0, part.Attributes)
suite.Assert().EqualValues(install.BootSize/lbaSize, part.Length())
part = table.Partitions()[3]
suite.Assert().Equal(install.LinuxFilesystemData, strings.ToUpper(part.(*partition.Partition).Type.String()))
suite.Assert().Equal(constants.MetaPartitionLabel, part.Label())
suite.Assert().EqualValues(0, part.(*partition.Partition).Flags)
part = table.Partitions().Items()[3]
suite.Assert().Equal(install.LinuxFilesystemData, strings.ToUpper(part.Type.String()))
suite.Assert().Equal(constants.MetaPartitionLabel, part.Name)
suite.Assert().EqualValues(0, part.Attributes)
suite.Assert().EqualValues(install.MetaSize/lbaSize, part.Length())
part = table.Partitions()[4]
suite.Assert().Equal(install.LinuxFilesystemData, strings.ToUpper(part.(*partition.Partition).Type.String()))
suite.Assert().Equal(constants.StatePartitionLabel, part.Label())
suite.Assert().EqualValues(0, part.(*partition.Partition).Flags)
part = table.Partitions().Items()[4]
suite.Assert().Equal(install.LinuxFilesystemData, strings.ToUpper(part.Type.String()))
suite.Assert().Equal(constants.StatePartitionLabel, part.Name)
suite.Assert().EqualValues(0, part.Attributes)
if !upgradeFromLegacy {
suite.Assert().EqualValues(install.StateSize/lbaSize, part.Length())
@ -146,10 +146,10 @@ func (suite *manifestSuite) verifyBlockdevice(manifest *install.Manifest, curren
suite.Assert().EqualValues((diskSize-legacyEphemeralSize-install.EFISize-install.BIOSGrubSize-install.BootSize-install.MetaSize)/lbaSize-gptReserved, part.Length())
}
part = table.Partitions()[5]
suite.Assert().Equal(install.LinuxFilesystemData, strings.ToUpper(part.(*partition.Partition).Type.String()))
suite.Assert().Equal(constants.EphemeralPartitionLabel, part.Label())
suite.Assert().EqualValues(0, part.(*partition.Partition).Flags)
part = table.Partitions().Items()[5]
suite.Assert().Equal(install.LinuxFilesystemData, strings.ToUpper(part.Type.String()))
suite.Assert().Equal(constants.EphemeralPartitionLabel, part.Name)
suite.Assert().EqualValues(0, part.Attributes)
if !upgradeFromLegacy {
suite.Assert().EqualValues((diskSize-install.EFISize-install.BIOSGrubSize-install.BootSize-install.MetaSize-install.StateSize)/lbaSize-gptReserved, part.Length())
@ -189,7 +189,7 @@ func (suite *manifestSuite) verifyBlockdevice(manifest *install.Manifest, curren
suite.Assert().NoError(mount.Unmount(mountpoints))
}()
metaPath := fmt.Sprintf("%sp%d", suite.loopbackDevice.Name(), table.Partitions()[3].No())
metaPath := fmt.Sprintf("%sp%d", suite.loopbackDevice.Name(), table.Partitions().Items()[3].Number)
if verifyConfigPersistence {
suite.Assert().FileExists(filepath.Join(tempDir, "system", "state", "config.yaml"))
@ -383,7 +383,12 @@ func (suite *manifestSuite) TestTargetInstall() {
}
func (suite *manifestSuite) createTalosLegacyLayout() {
bd, err := blockdevice.Open(suite.loopbackDevice.Name(), blockdevice.WithNewGPT(true))
bd, err := blockdevice.Open(suite.loopbackDevice.Name())
suite.Require().NoError(err)
_, err = gpt.New(bd.Device())
suite.Require().NoError(err)
suite.Require().NoError(err)
defer bd.Close() //nolint: errcheck
@ -393,16 +398,16 @@ func (suite *manifestSuite) createTalosLegacyLayout() {
suite.Require().NoError(err)
partBoot, err := table.Add(512*install.MiB,
partition.WithLegacyBIOSBootableAttribute(true),
partition.WithPartitionName(constants.LegacyBootPartitionLabel),
partition.WithPartitionType("28732AC1-1FF8-D211-BA4B-00A0C93EC93B"),
gpt.WithLegacyBIOSBootableAttribute(true),
gpt.WithPartitionName(constants.LegacyBootPartitionLabel),
gpt.WithPartitionType("28732AC1-1FF8-D211-BA4B-00A0C93EC93B"),
)
suite.Require().NoError(err)
partEphemeral, err := table.Add(0,
partition.WithPartitionName(constants.EphemeralPartitionLabel),
partition.WithPartitionType("0FC63DAF-8483-4772-8E79-3D69D8477DE4"),
partition.WithMaximumSize(true),
gpt.WithPartitionName(constants.EphemeralPartitionLabel),
gpt.WithPartitionType("0FC63DAF-8483-4772-8E79-3D69D8477DE4"),
gpt.WithMaximumSize(true),
)
suite.Require().NoError(err)
@ -411,12 +416,12 @@ func (suite *manifestSuite) createTalosLegacyLayout() {
suite.Require().NoError(bd.Close())
// format partitions
partBootPath, err := util.PartPath(suite.loopbackDevice.Name(), int(partBoot.No()))
partBootPath, err := util.PartPath(suite.loopbackDevice.Name(), int(partBoot.Number))
suite.Require().NoError(err)
suite.Require().NoError(makefs.VFAT(partBootPath))
partEphemeralPath, err := util.PartPath(suite.loopbackDevice.Name(), int(partEphemeral.No()))
partEphemeralPath, err := util.PartPath(suite.loopbackDevice.Name(), int(partEphemeral.Number))
suite.Require().NoError(err)
suite.Require().NoError(makefs.XFS(partEphemeralPath, makefs.WithLabel(constants.EphemeralPartitionLabel)))

View File

@ -12,7 +12,7 @@ import (
const (
// RAWDiskSize is the minimum size disk we can create.
RAWDiskSize = 544
RAWDiskSize = 546
)
// CreateRawDisk creates a raw disk by invoking the `dd` command.

2
go.mod
View File

@ -59,7 +59,7 @@ require (
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2
github.com/talos-systems/bootkube-plugin v0.0.0-20201123195241-c59f3fa21116
github.com/talos-systems/crypto v0.2.1-0.20201112141136-12a489768a6b
github.com/talos-systems/go-blockdevice v0.1.1-0.20201120123651-2a1baadffdf8
github.com/talos-systems/go-blockdevice v0.1.1-0.20201126002059-98754ec2bb20
github.com/talos-systems/go-loadbalancer v0.1.0
github.com/talos-systems/go-procfs v0.0.0-20200219015357-57c7311fdd45
github.com/talos-systems/go-retry v0.1.1-0.20201113203059-8c63d290a688

22
go.sum
View File

@ -812,8 +812,6 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smira/bootkube-plugin v0.0.0-20201123172154-4071e320ca24 h1:bGtMDnyhJMMAPYzjH0W/U7FPrEgmnbnF2DxpXGDsSEE=
github.com/smira/bootkube-plugin v0.0.0-20201123172154-4071e320ca24/go.mod h1:AbdJAgHK5rJNDPUN3msPTfQJSR9b4DKb5xNN07uG8/Y=
github.com/smira/go-xz v0.0.0-20150414201226-0c531f070014 h1:tne8XW3soRDJn4DIiqBc4jw+DPashtFMTSC9G0pC3ug=
github.com/smira/go-xz v0.0.0-20150414201226-0c531f070014/go.mod h1:smSuTvETRIkX95VAIWBdKoGJuUxif7NT7FgbkpVqOiA=
github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E=
@ -865,14 +863,13 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8=
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/talos-systems/bootkube-plugin v0.0.0-20200915135634-229d57e818f3/go.mod h1:AbdJAgHK5rJNDPUN3msPTfQJSR9b4DKb5xNN07uG8/Y=
github.com/talos-systems/bootkube-plugin v0.0.0-20201123195241-c59f3fa21116 h1:ly3meWKF9LIVOv0BLI3y74jJAKluivEDymVVXTzAwIA=
github.com/talos-systems/bootkube-plugin v0.0.0-20201123195241-c59f3fa21116/go.mod h1:AbdJAgHK5rJNDPUN3msPTfQJSR9b4DKb5xNN07uG8/Y=
github.com/talos-systems/crypto v0.2.0/go.mod h1:KwqG+jANKU1FNQIapmioHQ5fkovY1DJkAqMenjYBGh0=
github.com/talos-systems/crypto v0.2.1-0.20201112141136-12a489768a6b h1:EctcXxyT5hTXnrUbdKvN8oxZLxc8HOJ9E8paAkv3yRg=
github.com/talos-systems/crypto v0.2.1-0.20201112141136-12a489768a6b/go.mod h1:KwqG+jANKU1FNQIapmioHQ5fkovY1DJkAqMenjYBGh0=
github.com/talos-systems/go-blockdevice v0.1.1-0.20201120123651-2a1baadffdf8 h1:D4NLy7uXLIWvhFaOAf1Olml5U76sNmaY03dNt2pHnOg=
github.com/talos-systems/go-blockdevice v0.1.1-0.20201120123651-2a1baadffdf8/go.mod h1:efEE9wjtgxiovqsZAV39xlOd/AOI/0sLuZqb5jEgeqo=
github.com/talos-systems/go-blockdevice v0.1.1-0.20201126002059-98754ec2bb20 h1:4RQ6fsV8rZ684Up6fep2hu/J/I2i2yQeb7MX+unrmso=
github.com/talos-systems/go-blockdevice v0.1.1-0.20201126002059-98754ec2bb20/go.mod h1:efEE9wjtgxiovqsZAV39xlOd/AOI/0sLuZqb5jEgeqo=
github.com/talos-systems/go-loadbalancer v0.1.0 h1:MQFONvSjoleU8RrKq1O1Z8CyTCJGd4SLqdAHDlR6o9s=
github.com/talos-systems/go-loadbalancer v0.1.0/go.mod h1:D5Qjfz+29WVjONWECZvOkmaLsBb3f5YeWME0u/5HmIc=
github.com/talos-systems/go-procfs v0.0.0-20200219015357-57c7311fdd45 h1:FND/LgzFHTBdJBOeZVzdO6B47kxQZvSIzb9AMIXYotg=
@ -925,7 +922,6 @@ github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
@ -987,12 +983,10 @@ golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgn
golang.org/x/exp v0.0.0-20191024150812-c286b889502e/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5 h1:FR+oGxGfbQu1d+jglI3rCkjAjUnhRSZcUxr+DqlDLNo=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@ -1004,7 +998,6 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
@ -1058,7 +1051,6 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb h1:mUVeFHoDKis5nxCAzoAi7E8Ghb86EXh/RK6wtvJIqRY=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@ -1134,14 +1126,10 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE=
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a h1:i47hUS795cOydZI4AwJQCKXOr4BvxzvikwDoDtHhP2Y=
golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f h1:6Sc1XOXTulBN6imkqo6XoAXDEzoQ4/ro6xy7Vn8+rOM=
golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM=
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201017003518-b09fb700fbb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY=
@ -1151,7 +1139,6 @@ golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fq
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@ -1214,7 +1201,6 @@ golang.org/x/tools v0.0.0-20201019175715-b894a3290fff h1:HiwHyqQ9ttqCHuTa++R4wNx
golang.org/x/tools v0.0.0-20201019175715-b894a3290fff/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -1225,7 +1211,6 @@ google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEn
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
@ -1261,7 +1246,6 @@ google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfG
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8=
google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
@ -1276,7 +1260,6 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.29.0 h1:2pJjwYOdkZ9HlN4sWRYBg9ttH5bCOlsueaM+b/oYjwo=
google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
@ -1337,7 +1320,6 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=

View File

@ -66,10 +66,14 @@ func RunInstallerContainer(disk, platform, ref string, reg config.Registries, op
// TODO(andrewrynhard): To handle cases when the newer version changes the
// platform name, this should be determined in the installer container.
var config *string
if config = procfs.ProcCmdline().Get(constants.KernelParamConfig).First(); config == nil {
c := "none"
config = &c
config := constants.ConfigNone
if c := procfs.ProcCmdline().Get(constants.KernelParamConfig).First(); c != nil {
config = *c
}
board := constants.BoardNone
if c := procfs.ProcCmdline().Get(constants.KernelParamBoard).First(); c != nil {
board = *c
}
upgrade := strconv.FormatBool(options.Upgrade)
@ -81,7 +85,8 @@ func RunInstallerContainer(disk, platform, ref string, reg config.Registries, op
"install",
"--disk=" + disk,
"--platform=" + platform,
"--config=" + *config,
"--board=" + board,
"--config=" + config,
"--upgrade=" + upgrade,
"--force=" + force,
"--zero=" + zero,

View File

@ -0,0 +1,18 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package runtime
// PartitionOptions are the board specific options for customizing the
// partition table.
type PartitionOptions struct {
PartitionsOffset uint64
}
// Board defines the requirements for a SBC.
type Board interface {
Name() string
UBoot() (string, int64)
PartitionOptions() *PartitionOptions
}

View File

@ -0,0 +1,54 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package board
import (
"errors"
"fmt"
"os"
"github.com/talos-systems/go-procfs/procfs"
"github.com/talos-systems/talos/internal/app/machined/pkg/runtime"
libretechallh3cch5 "github.com/talos-systems/talos/internal/app/machined/pkg/runtime/v1alpha1/board/libretech_all_h3_cc_h5"
"github.com/talos-systems/talos/pkg/machinery/constants"
)
// CurrentBoard is a helper func for discovering the current board.
//
// nolint: gocyclo
func CurrentBoard() (b runtime.Board, err error) {
var board string
if p := procfs.ProcCmdline().Get(constants.KernelParamBoard).First(); p != nil {
board = *p
}
if p, ok := os.LookupEnv("BOARD"); ok {
board = p
}
if board == "" {
return nil, errors.New("failed to determine board")
}
return newBoard(board)
}
// NewBoard initializes and returns a runtime.Board.
func NewBoard(board string) (b runtime.Board, err error) {
return newBoard(board)
}
func newBoard(board string) (b runtime.Board, err error) {
switch board {
case constants.BoardLibretechAllH3CCH5:
b = &libretechallh3cch5.LibretechAllH3CCH5{}
default:
return nil, fmt.Errorf("unsupported board: %q", board)
}
return b, nil
}

View File

@ -0,0 +1,32 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package libretechallh3cch5
import (
"fmt"
"github.com/talos-systems/talos/internal/app/machined/pkg/runtime"
"github.com/talos-systems/talos/pkg/machinery/constants"
)
// LibretechAllH3CCH5 represents the Libre Computer ALL-H3-CC (Tritium).
//
// Reference: https://libre.computer/products/boards/all-h3-cc/
type LibretechAllH3CCH5 struct{}
// Name implenents the runtime.Board.
func (l *LibretechAllH3CCH5) Name() string {
return constants.BoardLibretechAllH3CCH5
}
// UBoot implenents the runtime.Board.
func (l *LibretechAllH3CCH5) UBoot() (string, int64) {
return fmt.Sprintf("/usr/install/u-boot/%s/u-boot-sunxi-with-spl.bin", constants.BoardLibretechAllH3CCH5), 1024 * 8
}
// PartitionOptions implenents the runtime.Board.
func (l *LibretechAllH3CCH5) PartitionOptions() *runtime.PartitionOptions {
return &runtime.PartitionOptions{PartitionsOffset: 2048}
}

View File

@ -53,8 +53,8 @@ terminal_output console
{{ range $label := .Labels -}}
menuentry "{{ $label.Root }}" {
set gfxmode=auto
set gfxpayload=text
set gfxmode=auto
set gfxpayload=text
linux {{ $label.Kernel }} {{ $label.Append }}
initrd {{ $label.Initrd }}
}

View File

@ -25,7 +25,7 @@ import (
multierror "github.com/hashicorp/go-multierror"
"github.com/talos-systems/go-blockdevice/blockdevice"
"github.com/talos-systems/go-blockdevice/blockdevice/table"
"github.com/talos-systems/go-blockdevice/blockdevice/partition/gpt"
"github.com/talos-systems/go-blockdevice/blockdevice/util"
"github.com/talos-systems/go-procfs/procfs"
"github.com/talos-systems/go-retry/retry"
@ -815,7 +815,7 @@ func partitionAndFormatDisks(logger *log.Logger, r runtime.Runtime) (err error)
// nolint: errcheck
defer bd.Close()
var pt table.PartitionTable
var pt *gpt.GPT
pt, err = bd.PartitionTable()
if err != nil {
@ -830,7 +830,7 @@ func partitionAndFormatDisks(logger *log.Logger, r runtime.Runtime) (err error)
// - a partition table does not exist
if pt != nil {
if len(pt.Partitions()) > 0 {
if len(pt.Partitions().Items()) > 0 {
logger.Printf(("skipping setup of %q, found existing partitions"), disk.Device())
continue

View File

@ -329,8 +329,8 @@ func (p *Point) ResizePartition() (resized bool, err error) {
return false, err
}
for _, partition := range pt.Partitions() {
if partition.Label() == constants.EphemeralPartitionLabel {
for _, partition := range pt.Partitions().Items() {
if partition.Name == constants.EphemeralPartitionLabel {
resized, err := pt.Resize(partition)
if err != nil {
return false, err

View File

@ -20,10 +20,23 @@ const (
// to the config.
KernelParamConfig = "talos.config"
// ConfigNone indicates no config is required.
ConfigNone = "none"
// KernelParamPlatform is the kernel parameter name for specifying the
// platform.
KernelParamPlatform = "talos.platform"
// KernelParamBoard is the kernel parameter name for specifying the
// SBC.
KernelParamBoard = "talos.board"
// BoardNone indicates that the install is not for a specific board.
BoardNone = "none"
// BoardLibretechAllH3CCH5 is the name of the Libre Computer board ALL-H3-CC.
BoardLibretechAllH3CCH5 = "libretech_all_h3_cc_h5"
// KernelParamHostname is the kernel parameter name for specifying the
// hostname.
KernelParamHostname = "talos.hostname"

View File

@ -16,8 +16,7 @@ import (
"regexp"
"github.com/talos-systems/go-blockdevice/blockdevice/filesystem/vfat"
"github.com/talos-systems/go-blockdevice/blockdevice/table"
"github.com/talos-systems/go-blockdevice/blockdevice/table/gpt"
"github.com/talos-systems/go-blockdevice/blockdevice/partition/gpt"
"github.com/talos-systems/talos/pkg/machinery/constants"
"github.com/talos-systems/talos/pkg/provision/internal/vmlinuz"
@ -114,7 +113,7 @@ func (b *BootLoader) Close() error {
}
func (b *BootLoader) findBootPartition() error {
diskTable, err := gpt.NewGPT("vda", b.diskF)
diskTable, err := gpt.Open(b.diskF)
if err != nil {
return fmt.Errorf("error creating GPT object: %w", err)
}
@ -123,11 +122,11 @@ func (b *BootLoader) findBootPartition() error {
return fmt.Errorf("error reading GPT: %w", err)
}
var bootPartition table.Partition
var bootPartition *gpt.Partition
for _, part := range diskTable.Partitions() {
for _, part := range diskTable.Partitions().Items() {
// TODO: should we do better matching here
if part.No() == 1 {
if part.Number == 1 {
bootPartition = part
break
@ -138,7 +137,7 @@ func (b *BootLoader) findBootPartition() error {
return fmt.Errorf("no boot partition found")
}
b.bootPartitionReader = io.NewSectionReader(b.diskF, bootPartition.Start()*diskImageSectorSize, bootPartition.Length()*diskImageSectorSize)
b.bootPartitionReader = io.NewSectionReader(b.diskF, int64(bootPartition.FirstLBA)*diskImageSectorSize, int64(bootPartition.Length())*diskImageSectorSize)
return nil
}

View File

@ -6,6 +6,7 @@ package qemu
import (
"context"
"errors"
"fmt"
"log"
"net"
@ -19,7 +20,7 @@ import (
"github.com/containernetworking/plugins/pkg/ns"
"github.com/containernetworking/plugins/pkg/testutils"
"github.com/google/uuid"
"github.com/talos-systems/go-blockdevice/blockdevice/table/gpt"
"github.com/talos-systems/go-blockdevice/blockdevice/partition/gpt"
"github.com/talos-systems/talos/pkg/provision"
"github.com/talos-systems/talos/pkg/provision/internal/cniutils"
@ -167,8 +168,12 @@ func checkPartitions(config *LaunchConfig) (bool, error) {
defer disk.Close() //nolint: errcheck
diskTable, err := gpt.NewGPT("vda", disk)
diskTable, err := gpt.Open(disk)
if err != nil {
if errors.Is(err, gpt.ErrPartitionTableDoesNotExist) {
return false, nil
}
return false, fmt.Errorf("error creating GPT object: %w", err)
}
@ -176,7 +181,7 @@ func checkPartitions(config *LaunchConfig) (bool, error) {
return false, nil
}
return len(diskTable.Partitions()) > 0, nil
return len(diskTable.Partitions().Items()) > 0, nil
}
// launchVM runs qemu with args built based on config.

View File

@ -0,0 +1,34 @@
---
title: "Libre Computer Board ALL-H3-CC"
---
## Generating the Image
Using the Talos installer container, we can generate an image for the libretech_all_h3_cc_h5 by running:
```bash
docker run \
--rm \
-v /dev:/dev \
--privileged \
ghcr.io/talos-systems/installer:latest image --platform metal --board libretech_all_h3_cc_h5 --tar-to-stdout | tar xz
```
## Writing the Image
Once the image generation is done, extract the raw disk and `dd` it your SD card (be sure to update `x` in `mmcblkx`):
```bash
tar -xvf metal-libretech_all_h3_cc_h5-arm64.tar.gz
sudo dd if=disk.raw of=/dev/mmcblkx
```
## Bootstrapping the Node
Now insert the SD card, turn on the board, and wait for the console to show you the instructions for bootstrapping the node.
Following the instructions in the console output, generate the configuration files and apply the `init.yaml`:
```bash
talosctl gen config libre https://<node IP or DNS name>:6443
talosctl apply-config --insecure --file init.yaml --nodes <node IP or DNS name>
```

View File

@ -85,6 +85,7 @@ module.exports = {
{ title: "Virtualized Platforms", method: "alphabetical" },
{ title: "Cloud Platforms", method: "alphabetical" },
{ title: "Local Platforms", method: "alphabetical" },
{ title: "Single Board Computers", method: "alphabetical" },
{ title: "Guides", method: "alphabetical" },
{ title: "Reference", method: "alphabetical" },
{ title: "Learn More", method: "weighted" },