talos/pkg/makefs/makefs.go
Noel Georgi 8f2b337994
feat: imager support rootless builds
Also changes the bootloader interface.
Disks are formatted/created with pre-populated source directories in Install/Image mode.

Signed-off-by: Noel Georgi <git@frezbo.dev>
2025-12-24 11:02:37 +05:30

100 lines
2.5 KiB
Go

// 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 makefs provides function to format and grow filesystems.
package makefs
import (
"crypto/sha256"
"github.com/google/uuid"
)
// Option to control makefs settings.
type Option func(*Options)
// Options for makefs.
type Options struct {
Label string
ConfigFile string
SourceDirectory string
Force bool
Reproducible bool
UnsupportedFSOption bool
Printf func(string, ...any)
}
// WithLabel sets the label for the filesystem to be created.
func WithLabel(label string) Option {
return func(o *Options) {
o.Label = label
}
}
// WithForce forces creation of a filesystem even if one already exists.
func WithForce(force bool) Option {
return func(o *Options) {
o.Force = force
}
}
// WithReproducible sets the reproducible flag for the filesystem to be created.
// This should only be used when creating filesystems on raw disk images.
func WithReproducible(reproducible bool) Option {
return func(o *Options) {
o.Reproducible = reproducible
}
}
// WithUnsupportedFSOption sets the unsupported filesystem option.
func WithUnsupportedFSOption(unsupported bool) Option {
return func(o *Options) {
o.UnsupportedFSOption = unsupported
}
}
// WithConfigFile sets the config file for the filesystem to be created.
func WithConfigFile(configFile string) Option {
return func(o *Options) {
o.ConfigFile = configFile
}
}
// WithSourceDirectory sets the source directory for populating the filesystem.
func WithSourceDirectory(sourceDir string) Option {
return func(o *Options) {
o.SourceDirectory = sourceDir
}
}
// WithPrintf sets the printf function for logging.
func WithPrintf(printf func(string, ...any)) Option {
return func(o *Options) {
o.Printf = printf
}
}
// NewDefaultOptions builds options with specified setters applied.
func NewDefaultOptions(setters ...Option) Options {
var opt Options
for _, o := range setters {
o(&opt)
}
if opt.Printf == nil {
opt.Printf = func(string, ...any) {}
}
return opt
}
// GUIDFromLabel generates a deterministic partition GUID from a label by
// creating a version 8 UUID derived from a SHA-256 hash of the label bytes.
func GUIDFromLabel(label string) uuid.UUID {
// version 8 UUID since we're doing custom hashing
return uuid.NewHash(sha256.New(), uuid.Nil, []byte(label), 8)
}