gokrazy, Makefile: improve appliance build tooling
Several improvements to the gokrazy appliance build and flash workflow:
gokrazy/build.go:
- Round Pi image size up to a power of 2 (QEMU raspi3b requires it)
- Use monogok's mkfs.Perm for the /perm ext4 partition (pure Go,
cross-platform, no e2fsprogs dependency)
gokrazy/mkfs:
- Accept optional PermFile entries to include in the freshly-created
ext4 filesystem (used for breakglass authorized_keys)
- Use progresstracking.Ticker for flush progress reporting
gokrazy/tsapp*/config.json:
- Point breakglass at /perm/breakglass.authorized_keys (not ec2)
- Fix Pi SerialConsole to serial0,115200 (not ttyS0)
cmd/tailscale/cli/configure-flash-appliance.go:
- Add --add-ssh-authorized-keys flag to write an authorized_keys
file into /perm during flash (for breakglass SSH access)
- Use progresstracking.CountingWriter + Ticker for write progress
Makefile:
- tsapp-build-and-flash-pi: auto-include ~/.ssh/id_ed25519.pub
- tsapp-qemu-pi: use virt machine + UEFI + ramfb + e1000 (working
network + framebuffer), with DTB watchdog patch and
gokrazy.log_to_serial for debugging
- Auto-detect UEFI firmware path across Debian/Homebrew/Fedora
Updates #1866
Change-Id: Ifa97ad34c509a81e1637d9bce12a788037dfe5ec
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
committed by
Brad Fitzpatrick
parent
4c22d22df5
commit
76eece2d15
+22
-4
@@ -30,7 +30,7 @@ var (
|
||||
gaf = flag.Bool("gaf", false, "if true, build a gokrazy archive format file instead of a full disk image")
|
||||
)
|
||||
|
||||
// imageSizeBytes is the size of the disk image we ask monogok to
|
||||
// baseImageSizeBytes is the size of the disk image we ask monogok to
|
||||
// produce (and that the AWS AMI import expects). It has to be large
|
||||
// enough to fit gokrazy's standard partition layout (see
|
||||
// github.com/bradfitz/monogok/disklayout):
|
||||
@@ -45,7 +45,25 @@ var (
|
||||
// file larger). The same value is passed to monogok via
|
||||
// --target_storage_bytes and to mkfs.Perm so the GPT and the ext4
|
||||
// inside it agree on the disk's size.
|
||||
const imageSizeBytes = 1258299392
|
||||
//
|
||||
// imageSizeBytesFor may round this up; callers should use that helper
|
||||
// instead of this constant.
|
||||
const baseImageSizeBytes = 1258299392
|
||||
|
||||
// imageSizeBytesFor returns the disk image size to use for app. For Raspberry
|
||||
// Pi appliances the size is rounded up to the next power of two because
|
||||
// qemu-system-aarch64's raspi3b machine rejects SD card images whose size
|
||||
// isn't a power of two.
|
||||
func imageSizeBytesFor(app string) int64 {
|
||||
if !strings.HasPrefix(app, "tsapp-pi.") {
|
||||
return baseImageSizeBytes
|
||||
}
|
||||
n := int64(1)
|
||||
for n < baseImageSizeBytes {
|
||||
n <<= 1
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
var conf gokrazyConfig
|
||||
|
||||
@@ -135,7 +153,7 @@ func buildImage() error {
|
||||
args = append(args,
|
||||
"overwrite",
|
||||
"--full", filepath.Join(dir, *app+".img"),
|
||||
fmt.Sprintf("--target_storage_bytes=%d", imageSizeBytes),
|
||||
fmt.Sprintf("--target_storage_bytes=%d", imageSizeBytesFor(*app)),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -156,7 +174,7 @@ func buildImage() error {
|
||||
return fmt.Errorf("open %s: %w", imgPath, err)
|
||||
}
|
||||
defer f.Close()
|
||||
if err := mkfs.Perm(f, imageSizeBytes); err != nil {
|
||||
if err := mkfs.Perm(f, imageSizeBytesFor(*app)); err != nil {
|
||||
return fmt.Errorf("formatting /perm in %s: %v", imgPath, err)
|
||||
}
|
||||
log.Printf("Wrote ext4 /perm filesystem to %s.", imgPath)
|
||||
|
||||
Reference in New Issue
Block a user