metropolis: unify utility packages

One last sweeping rename / reshuffle.

We get rid of //metropolis/node/common and //golibs, unifying them into
a single //metropolis/pkg meta-package.

This is to be documented somwhere properly, but here's the new logic
behind selecting where to place a new library package:

 - if it's specific to k8s-on-metropolis, put it in
   //metropolis/node/kubernetes/*. This is a self-contained tree that
   other paths cannot import from.
 - if it's a big new subsystem of the metropolis core, put it in
   //metropolis/node/core. This can be imported by anything in
   //m/n (eg the Kubernetes code at //m/n/kubernetes
 - otherwise, treat it as generic library that's part of the metropolis
   project, and put it in //metropolis/pkg. This can be imported by
   anything within //metropolis.

This will be followed up by a diff that updates visibility rules.

Test Plan: Pure refactor, CI only.

X-Origin-Diff: phab/D683
GitOrigin-RevId: 883e7f09a7d22d64e966d07bbe839454ed081c79
diff --git a/metropolis/cli/dbg/BUILD.bazel b/metropolis/cli/dbg/BUILD.bazel
index 51fa722..45464d6 100644
--- a/metropolis/cli/dbg/BUILD.bazel
+++ b/metropolis/cli/dbg/BUILD.bazel
@@ -6,7 +6,7 @@
     importpath = "git.monogon.dev/source/nexantic.git/metropolis/cli/dbg",
     visibility = ["//visibility:private"],
     deps = [
-        "//metropolis/node/core/logtree:go_default_library",
+        "//metropolis/pkg/logtree:go_default_library",
         "//metropolis/proto/api:go_default_library",
         "@com_github_spf13_pflag//:go_default_library",
         "@io_k8s_component_base//cli/flag:go_default_library",
diff --git a/metropolis/cli/dbg/main.go b/metropolis/cli/dbg/main.go
index 1bb6185..5b43cb4 100644
--- a/metropolis/cli/dbg/main.go
+++ b/metropolis/cli/dbg/main.go
@@ -33,7 +33,7 @@
 	"k8s.io/kubectl/pkg/util/logs"
 	"k8s.io/kubernetes/pkg/kubectl/cmd"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
 	apb "git.monogon.dev/source/nexantic.git/metropolis/proto/api"
 )
 
diff --git a/metropolis/node/core/BUILD.bazel b/metropolis/node/core/BUILD.bazel
index 2398205..004bbc8 100644
--- a/metropolis/node/core/BUILD.bazel
+++ b/metropolis/node/core/BUILD.bazel
@@ -15,18 +15,18 @@
     visibility = ["//visibility:private"],
     deps = [
         "//metropolis/node:go_default_library",
-        "//metropolis/node/common/supervisor:go_default_library",
         "//metropolis/node/core/cluster:go_default_library",
         "//metropolis/node/core/consensus/ca:go_default_library",
         "//metropolis/node/core/localstorage:go_default_library",
         "//metropolis/node/core/localstorage/declarative:go_default_library",
-        "//metropolis/node/core/logtree:go_default_library",
         "//metropolis/node/core/network:go_default_library",
         "//metropolis/node/core/network/dns:go_default_library",
-        "//metropolis/node/core/tpm:go_default_library",
         "//metropolis/node/kubernetes:go_default_library",
         "//metropolis/node/kubernetes/containerd:go_default_library",
         "//metropolis/node/kubernetes/pki:go_default_library",
+        "//metropolis/pkg/logtree:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
+        "//metropolis/pkg/tpm:go_default_library",
         "//metropolis/proto/api:go_default_library",
         "@org_golang_google_grpc//:go_default_library",
         "@org_golang_google_grpc//codes:go_default_library",
diff --git a/metropolis/node/core/cluster/BUILD.bazel b/metropolis/node/core/cluster/BUILD.bazel
index 70daba2..0e7a7b1 100644
--- a/metropolis/node/core/cluster/BUILD.bazel
+++ b/metropolis/node/core/cluster/BUILD.bazel
@@ -10,11 +10,11 @@
     visibility = ["//metropolis/node/core:__subpackages__"],
     deps = [
         "//metropolis/node:go_default_library",
-        "//metropolis/node/common/supervisor:go_default_library",
         "//metropolis/node/core/consensus:go_default_library",
         "//metropolis/node/core/localstorage:go_default_library",
         "//metropolis/node/core/localstorage/declarative:go_default_library",
         "//metropolis/node/core/network:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "//metropolis/proto/api:go_default_library",
         "//metropolis/proto/internal:go_default_library",
         "@com_github_cenkalti_backoff_v4//:go_default_library",
diff --git a/metropolis/node/core/cluster/manager.go b/metropolis/node/core/cluster/manager.go
index 5f072b8..4cb7ea9 100644
--- a/metropolis/node/core/cluster/manager.go
+++ b/metropolis/node/core/cluster/manager.go
@@ -32,11 +32,11 @@
 	"go.etcd.io/etcd/clientv3"
 
 	common "git.monogon.dev/source/nexantic.git/metropolis/node"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/consensus"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage/declarative"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/network"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 	apb "git.monogon.dev/source/nexantic.git/metropolis/proto/api"
 )
 
diff --git a/metropolis/node/core/consensus/BUILD.bazel b/metropolis/node/core/consensus/BUILD.bazel
index cab2c0a..464dc79 100644
--- a/metropolis/node/core/consensus/BUILD.bazel
+++ b/metropolis/node/core/consensus/BUILD.bazel
@@ -7,9 +7,9 @@
     visibility = ["//:__subpackages__"],
     deps = [
         "//metropolis/node:go_default_library",
-        "//metropolis/node/common/supervisor:go_default_library",
         "//metropolis/node/core/consensus/ca:go_default_library",
         "//metropolis/node/core/localstorage:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "@io_etcd_go_etcd//clientv3:go_default_library",
         "@io_etcd_go_etcd//clientv3/namespace:go_default_library",
         "@io_etcd_go_etcd//embed:go_default_library",
@@ -22,9 +22,9 @@
     srcs = ["consensus_test.go"],
     embed = [":go_default_library"],
     deps = [
-        "//golibs/common:go_default_library",
-        "//metropolis/node/common/supervisor:go_default_library",
         "//metropolis/node/core/localstorage:go_default_library",
         "//metropolis/node/core/localstorage/declarative:go_default_library",
+        "//metropolis/pkg/freeport:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
     ],
 )
diff --git a/metropolis/node/core/consensus/consensus.go b/metropolis/node/core/consensus/consensus.go
index b707a27..241ce03 100644
--- a/metropolis/node/core/consensus/consensus.go
+++ b/metropolis/node/core/consensus/consensus.go
@@ -44,10 +44,10 @@
 	"go.etcd.io/etcd/embed"
 	"go.uber.org/atomic"
 
-	common "git.monogon.dev/source/nexantic.git/metropolis/node"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
+	node "git.monogon.dev/source/nexantic.git/metropolis/node"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/consensus/ca"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 const (
@@ -118,7 +118,7 @@
 
 	port := s.config.Port
 	if port == 0 {
-		port = common.ConsensusPort
+		port = node.ConsensusPort
 	}
 
 	cfg := embed.NewConfig()
diff --git a/metropolis/node/core/consensus/consensus_test.go b/metropolis/node/core/consensus/consensus_test.go
index 22bcf20..a25ebef 100644
--- a/metropolis/node/core/consensus/consensus_test.go
+++ b/metropolis/node/core/consensus/consensus_test.go
@@ -26,10 +26,10 @@
 	"testing"
 	"time"
 
-	"git.monogon.dev/source/nexantic.git/golibs/common"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage/declarative"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/freeport"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 type boilerplate struct {
@@ -90,7 +90,7 @@
 		InitialCluster: "127.0.0.1",
 		ExternalHost:   "127.0.0.1",
 		ListenHost:     "127.0.0.1",
-		Port:           common.MustConsume(common.AllocateTCPPort()),
+		Port:           freeport.MustConsume(freeport.AllocateTCPPort()),
 	})
 
 	supervisor.New(b.ctx, etcd.Run)
@@ -116,7 +116,7 @@
 		InitialCluster: "127.0.0.1",
 		ExternalHost:   "127.0.0.1",
 		ListenHost:     "127.0.0.1",
-		Port:           common.MustConsume(common.AllocateTCPPort()),
+		Port:           freeport.MustConsume(freeport.AllocateTCPPort()),
 	})
 	supervisor.New(b.ctx, etcd.Run)
 	waitEtcd(t, etcd)
@@ -161,7 +161,7 @@
 			InitialCluster: "127.0.0.1",
 			ExternalHost:   "127.0.0.1",
 			ListenHost:     "127.0.0.1",
-			Port:           common.MustConsume(common.AllocateTCPPort()),
+			Port:           freeport.MustConsume(freeport.AllocateTCPPort()),
 		})
 		ctx, ctxC := context.WithCancel(b.ctx)
 		supervisor.New(ctx, etcd.Run)
@@ -207,7 +207,7 @@
 		InitialCluster: "127.0.0.1",
 		ExternalHost:   "127.0.0.1",
 		ListenHost:     "127.0.0.1",
-		Port:           common.MustConsume(common.AllocateTCPPort()),
+		Port:           freeport.MustConsume(freeport.AllocateTCPPort()),
 	})
 	supervisor.New(b.ctx, etcd.Run)
 	waitEtcd(t, etcd)
diff --git a/metropolis/node/core/debug_service.go b/metropolis/node/core/debug_service.go
index 8e81d2d..6866479 100644
--- a/metropolis/node/core/debug_service.go
+++ b/metropolis/node/core/debug_service.go
@@ -28,8 +28,8 @@
 	common "git.monogon.dev/source/nexantic.git/metropolis/node"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/cluster"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/consensus/ca"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
 	apb "git.monogon.dev/source/nexantic.git/metropolis/proto/api"
 )
 
diff --git a/metropolis/node/core/localstorage/BUILD.bazel b/metropolis/node/core/localstorage/BUILD.bazel
index 099a380..a38ae9f 100644
--- a/metropolis/node/core/localstorage/BUILD.bazel
+++ b/metropolis/node/core/localstorage/BUILD.bazel
@@ -13,7 +13,7 @@
     deps = [
         "//metropolis/node/core/localstorage/crypt:go_default_library",
         "//metropolis/node/core/localstorage/declarative:go_default_library",
-        "//metropolis/node/core/tpm:go_default_library",
+        "//metropolis/pkg/tpm:go_default_library",
         "@org_golang_x_sys//unix:go_default_library",
     ],
 )
diff --git a/metropolis/node/core/localstorage/crypt/BUILD.bazel b/metropolis/node/core/localstorage/crypt/BUILD.bazel
index 38e27d6..41cb78e 100644
--- a/metropolis/node/core/localstorage/crypt/BUILD.bazel
+++ b/metropolis/node/core/localstorage/crypt/BUILD.bazel
@@ -9,8 +9,8 @@
     importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage/crypt",
     visibility = ["//metropolis/node/core/localstorage:__subpackages__"],
     deps = [
-        "//metropolis/node/common/devicemapper:go_default_library",
-        "//metropolis/node/common/sysfs:go_default_library",
+        "//metropolis/pkg/devicemapper:go_default_library",
+        "//metropolis/pkg/sysfs:go_default_library",
         "@com_github_rekby_gpt//:go_default_library",
         "@org_golang_x_sys//unix:go_default_library",
     ],
diff --git a/metropolis/node/core/localstorage/crypt/blockdev.go b/metropolis/node/core/localstorage/crypt/blockdev.go
index 5abe60b..1a7c3d4 100644
--- a/metropolis/node/core/localstorage/crypt/blockdev.go
+++ b/metropolis/node/core/localstorage/crypt/blockdev.go
@@ -27,7 +27,7 @@
 	"github.com/rekby/gpt"
 	"golang.org/x/sys/unix"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/sysfs"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/sysfs"
 )
 
 var (
diff --git a/metropolis/node/core/localstorage/crypt/crypt.go b/metropolis/node/core/localstorage/crypt/crypt.go
index e0a8321..450f729 100644
--- a/metropolis/node/core/localstorage/crypt/crypt.go
+++ b/metropolis/node/core/localstorage/crypt/crypt.go
@@ -25,7 +25,7 @@
 
 	"golang.org/x/sys/unix"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/devicemapper"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/devicemapper"
 )
 
 func readDataSectors(path string) (uint64, error) {
diff --git a/metropolis/node/core/localstorage/directory_data.go b/metropolis/node/core/localstorage/directory_data.go
index 52abbea..3f41738 100644
--- a/metropolis/node/core/localstorage/directory_data.go
+++ b/metropolis/node/core/localstorage/directory_data.go
@@ -25,7 +25,7 @@
 
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage/crypt"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage/declarative"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/tpm"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/tpm"
 )
 
 var keySize uint16 = 256 / 8
diff --git a/metropolis/node/core/main.go b/metropolis/node/core/main.go
index 806cfef..d277fcd 100644
--- a/metropolis/node/core/main.go
+++ b/metropolis/node/core/main.go
@@ -33,17 +33,17 @@
 	"google.golang.org/grpc"
 
 	common "git.monogon.dev/source/nexantic.git/metropolis/node"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/cluster"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage/declarative"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/network"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dns"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/tpm"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/containerd"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/pki"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/tpm"
 	apb "git.monogon.dev/source/nexantic.git/metropolis/proto/api"
 )
 
diff --git a/metropolis/node/core/network/BUILD.bazel b/metropolis/node/core/network/BUILD.bazel
index 9ba56a9..eb3423a 100644
--- a/metropolis/node/core/network/BUILD.bazel
+++ b/metropolis/node/core/network/BUILD.bazel
@@ -6,11 +6,11 @@
     importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/core/network",
     visibility = ["//:__subpackages__"],
     deps = [
-        "//metropolis/node/common/supervisor:go_default_library",
-        "//metropolis/node/core/logtree:go_default_library",
         "//metropolis/node/core/network/dhcp4c:go_default_library",
         "//metropolis/node/core/network/dhcp4c/callback:go_default_library",
         "//metropolis/node/core/network/dns:go_default_library",
+        "//metropolis/pkg/logtree:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "@com_github_google_nftables//:go_default_library",
         "@com_github_google_nftables//expr:go_default_library",
         "@com_github_insomniacslk_dhcp//dhcpv4:go_default_library",
diff --git a/metropolis/node/core/network/dhcp4c/BUILD.bazel b/metropolis/node/core/network/dhcp4c/BUILD.bazel
index 19b4c70..c84bd05 100644
--- a/metropolis/node/core/network/dhcp4c/BUILD.bazel
+++ b/metropolis/node/core/network/dhcp4c/BUILD.bazel
@@ -10,8 +10,8 @@
     importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dhcp4c",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/node/common/supervisor:go_default_library",
         "//metropolis/node/core/network/dhcp4c/transport:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "@com_github_cenkalti_backoff_v4//:go_default_library",
         "@com_github_insomniacslk_dhcp//dhcpv4:go_default_library",
         "@com_github_insomniacslk_dhcp//iana:go_default_library",
diff --git a/metropolis/node/core/network/dhcp4c/dhcpc.go b/metropolis/node/core/network/dhcp4c/dhcpc.go
index 4352506..2ec2be0 100644
--- a/metropolis/node/core/network/dhcp4c/dhcpc.go
+++ b/metropolis/node/core/network/dhcp4c/dhcpc.go
@@ -34,8 +34,8 @@
 	"github.com/insomniacslk/dhcp/dhcpv4"
 	"github.com/insomniacslk/dhcp/iana"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dhcp4c/transport"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 type state int
diff --git a/metropolis/node/core/network/dns/BUILD.bazel b/metropolis/node/core/network/dns/BUILD.bazel
index 862d4cf..ac517cc 100644
--- a/metropolis/node/core/network/dns/BUILD.bazel
+++ b/metropolis/node/core/network/dns/BUILD.bazel
@@ -9,7 +9,7 @@
     importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dns",
     visibility = ["//metropolis/node:__subpackages__"],
     deps = [
-        "//metropolis/node/common/fileargs:go_default_library",
-        "//metropolis/node/common/supervisor:go_default_library",
+        "//metropolis/pkg/fileargs:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
     ],
 )
diff --git a/metropolis/node/core/network/dns/coredns.go b/metropolis/node/core/network/dns/coredns.go
index b6400f7..8403cf1 100644
--- a/metropolis/node/core/network/dns/coredns.go
+++ b/metropolis/node/core/network/dns/coredns.go
@@ -26,8 +26,8 @@
 	"sync"
 	"syscall"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/fileargs"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/fileargs"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 const corefileBase = `
diff --git a/metropolis/node/core/network/main.go b/metropolis/node/core/network/main.go
index 94bb4d4..63f600d 100644
--- a/metropolis/node/core/network/main.go
+++ b/metropolis/node/core/network/main.go
@@ -32,11 +32,11 @@
 	"github.com/vishvananda/netlink"
 	"golang.org/x/sys/unix"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dhcp4c"
 	dhcpcb "git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dhcp4c/callback"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dns"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 const (
diff --git a/metropolis/node/core/switchroot.go b/metropolis/node/core/switchroot.go
index c980a3a..d897ec7 100644
--- a/metropolis/node/core/switchroot.go
+++ b/metropolis/node/core/switchroot.go
@@ -27,7 +27,7 @@
 
 	"golang.org/x/sys/unix"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
 )
 
 // switchRoot moves the root from initramfs into a tmpfs
diff --git a/metropolis/node/kubernetes/BUILD.bazel b/metropolis/node/kubernetes/BUILD.bazel
index f1fa849..fe1d806 100644
--- a/metropolis/node/kubernetes/BUILD.bazel
+++ b/metropolis/node/kubernetes/BUILD.bazel
@@ -15,17 +15,17 @@
     visibility = ["//metropolis/node:__subpackages__"],
     deps = [
         "//metropolis/node:go_default_library",
-        "//metropolis/node/common/fileargs:go_default_library",
-        "//metropolis/node/common/fsquota:go_default_library",
-        "//metropolis/node/common/supervisor:go_default_library",
         "//metropolis/node/core/localstorage:go_default_library",
         "//metropolis/node/core/localstorage/declarative:go_default_library",
-        "//metropolis/node/core/logtree:go_default_library",
         "//metropolis/node/core/network/dns:go_default_library",
         "//metropolis/node/kubernetes/clusternet:go_default_library",
         "//metropolis/node/kubernetes/nfproxy:go_default_library",
         "//metropolis/node/kubernetes/pki:go_default_library",
         "//metropolis/node/kubernetes/reconciler:go_default_library",
+        "//metropolis/pkg/fileargs:go_default_library",
+        "//metropolis/pkg/fsquota:go_default_library",
+        "//metropolis/pkg/logtree:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "//metropolis/proto/api:go_default_library",
         "@com_github_container_storage_interface_spec//lib/go/csi:go_default_library",
         "@io_bazel_rules_go//proto/wkt:wrappers_go_proto",
diff --git a/metropolis/node/kubernetes/apiserver.go b/metropolis/node/kubernetes/apiserver.go
index aa706b4..e38c3b3 100644
--- a/metropolis/node/kubernetes/apiserver.go
+++ b/metropolis/node/kubernetes/apiserver.go
@@ -24,10 +24,10 @@
 	"os/exec"
 
 	common "git.monogon.dev/source/nexantic.git/metropolis/node"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/fileargs"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/pki"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/fileargs"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 type apiserverService struct {
diff --git a/metropolis/node/kubernetes/clusternet/BUILD.bazel b/metropolis/node/kubernetes/clusternet/BUILD.bazel
index 9e9cc01..49ad828 100644
--- a/metropolis/node/kubernetes/clusternet/BUILD.bazel
+++ b/metropolis/node/kubernetes/clusternet/BUILD.bazel
@@ -10,10 +10,10 @@
     visibility = ["//metropolis/node/kubernetes:__subpackages__"],
     deps = [
         "//metropolis/node:go_default_library",
-        "//metropolis/node/common/jsonpatch:go_default_library",
-        "//metropolis/node/common/supervisor:go_default_library",
         "//metropolis/node/core/localstorage:go_default_library",
-        "//metropolis/node/core/logtree:go_default_library",
+        "//metropolis/pkg/jsonpatch:go_default_library",
+        "//metropolis/pkg/logtree:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "@com_github_vishvananda_netlink//:go_default_library",
         "@com_zx2c4_golang_wireguard_wgctrl//:go_default_library",
         "@com_zx2c4_golang_wireguard_wgctrl//wgtypes:go_default_library",
diff --git a/metropolis/node/kubernetes/clusternet/clusternet.go b/metropolis/node/kubernetes/clusternet/clusternet.go
index cd78434..28b2ce9 100644
--- a/metropolis/node/kubernetes/clusternet/clusternet.go
+++ b/metropolis/node/kubernetes/clusternet/clusternet.go
@@ -44,10 +44,10 @@
 	"k8s.io/client-go/tools/cache"
 
 	common "git.monogon.dev/source/nexantic.git/metropolis/node"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/jsonpatch"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/jsonpatch"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 const (
diff --git a/metropolis/node/kubernetes/containerd/BUILD.bazel b/metropolis/node/kubernetes/containerd/BUILD.bazel
index 9e42595..b573588 100644
--- a/metropolis/node/kubernetes/containerd/BUILD.bazel
+++ b/metropolis/node/kubernetes/containerd/BUILD.bazel
@@ -6,8 +6,8 @@
     importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/containerd",
     visibility = ["//metropolis/node/core:__subpackages__"],
     deps = [
-        "//metropolis/node/common/supervisor:go_default_library",
         "//metropolis/node/core/localstorage:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "@com_github_containerd_containerd//:go_default_library",
         "@com_github_containerd_containerd//namespaces:go_default_library",
     ],
diff --git a/metropolis/node/kubernetes/containerd/main.go b/metropolis/node/kubernetes/containerd/main.go
index 366f902..af4a898 100644
--- a/metropolis/node/kubernetes/containerd/main.go
+++ b/metropolis/node/kubernetes/containerd/main.go
@@ -30,8 +30,8 @@
 	ctr "github.com/containerd/containerd"
 	"github.com/containerd/containerd/namespaces"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 const (
diff --git a/metropolis/node/kubernetes/controller-manager.go b/metropolis/node/kubernetes/controller-manager.go
index 487511f..107b98e 100644
--- a/metropolis/node/kubernetes/controller-manager.go
+++ b/metropolis/node/kubernetes/controller-manager.go
@@ -23,9 +23,9 @@
 	"net"
 	"os/exec"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/fileargs"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/pki"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/fileargs"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 type controllerManagerConfig struct {
diff --git a/metropolis/node/kubernetes/csi.go b/metropolis/node/kubernetes/csi.go
index 81a94fc..f1ccf8a 100644
--- a/metropolis/node/kubernetes/csi.go
+++ b/metropolis/node/kubernetes/csi.go
@@ -32,10 +32,10 @@
 	"google.golang.org/grpc/status"
 	pluginregistration "k8s.io/kubelet/pkg/apis/pluginregistration/v1"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/fsquota"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/fsquota"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 // Derived from K8s spec for acceptable names, but shortened to 130 characters to avoid issues with
diff --git a/metropolis/node/kubernetes/kubelet.go b/metropolis/node/kubernetes/kubelet.go
index e9c6ce5..fbd9177 100644
--- a/metropolis/node/kubernetes/kubelet.go
+++ b/metropolis/node/kubernetes/kubelet.go
@@ -28,12 +28,12 @@
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	kubeletconfig "k8s.io/kubelet/config/v1beta1"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/fileargs"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage/declarative"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/pki"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/reconciler"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/fileargs"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 type kubeletService struct {
diff --git a/metropolis/node/kubernetes/nfproxy/BUILD.bazel b/metropolis/node/kubernetes/nfproxy/BUILD.bazel
index 29124a6..313d79a 100644
--- a/metropolis/node/kubernetes/nfproxy/BUILD.bazel
+++ b/metropolis/node/kubernetes/nfproxy/BUILD.bazel
@@ -6,7 +6,7 @@
     importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/nfproxy",
     visibility = ["//metropolis/node/kubernetes:__subpackages__"],
     deps = [
-        "//metropolis/node/common/supervisor:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "@com_github_sbezverk_nfproxy//pkg/controller:go_default_library",
         "@com_github_sbezverk_nfproxy//pkg/nftables:go_default_library",
         "@com_github_sbezverk_nfproxy//pkg/proxy:go_default_library",
diff --git a/metropolis/node/kubernetes/nfproxy/nfproxy.go b/metropolis/node/kubernetes/nfproxy/nfproxy.go
index 5fc9a11..cfdfda4 100644
--- a/metropolis/node/kubernetes/nfproxy/nfproxy.go
+++ b/metropolis/node/kubernetes/nfproxy/nfproxy.go
@@ -38,7 +38,7 @@
 	"k8s.io/client-go/kubernetes/scheme"
 	"k8s.io/client-go/tools/record"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 type Service struct {
diff --git a/metropolis/node/kubernetes/pki/BUILD.bazel b/metropolis/node/kubernetes/pki/BUILD.bazel
index f82603d..029a85b 100644
--- a/metropolis/node/kubernetes/pki/BUILD.bazel
+++ b/metropolis/node/kubernetes/pki/BUILD.bazel
@@ -11,7 +11,7 @@
     visibility = ["//metropolis/node:__subpackages__"],
     deps = [
         "//metropolis/node:go_default_library",
-        "//metropolis/node/core/logtree:go_default_library",
+        "//metropolis/pkg/logtree:go_default_library",
         "@io_etcd_go_etcd//clientv3:go_default_library",
         "@io_k8s_client_go//tools/clientcmd:go_default_library",
         "@io_k8s_client_go//tools/clientcmd/api:go_default_library",
diff --git a/metropolis/node/kubernetes/pki/kubernetes.go b/metropolis/node/kubernetes/pki/kubernetes.go
index 979fec6..e11db29 100644
--- a/metropolis/node/kubernetes/pki/kubernetes.go
+++ b/metropolis/node/kubernetes/pki/kubernetes.go
@@ -30,7 +30,7 @@
 	configapi "k8s.io/client-go/tools/clientcmd/api"
 
 	common "git.monogon.dev/source/nexantic.git/metropolis/node"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
 )
 
 // KubeCertificateName is an enum-like unique name of a static Kubernetes certificate. The value of the name is used
diff --git a/metropolis/node/kubernetes/provisioner.go b/metropolis/node/kubernetes/provisioner.go
index a9dfa72..de94af4 100644
--- a/metropolis/node/kubernetes/provisioner.go
+++ b/metropolis/node/kubernetes/provisioner.go
@@ -39,10 +39,10 @@
 	ref "k8s.io/client-go/tools/reference"
 	"k8s.io/client-go/util/workqueue"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/fsquota"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/fsquota"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 // ONCHANGE(//metropolis/node/kubernetes/reconciler:resources_csi.go): needs to match csiProvisionerServerName declared.
diff --git a/metropolis/node/kubernetes/reconciler/BUILD.bazel b/metropolis/node/kubernetes/reconciler/BUILD.bazel
index d8f2db6..e4d4f17 100644
--- a/metropolis/node/kubernetes/reconciler/BUILD.bazel
+++ b/metropolis/node/kubernetes/reconciler/BUILD.bazel
@@ -13,7 +13,7 @@
     importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/reconciler",
     visibility = ["//metropolis/node:__subpackages__"],
     deps = [
-        "//metropolis/node/common/supervisor:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "@io_k8s_api//core/v1:go_default_library",
         "@io_k8s_api//node/v1beta1:go_default_library",
         "@io_k8s_api//policy/v1beta1:go_default_library",
diff --git a/metropolis/node/kubernetes/reconciler/reconciler.go b/metropolis/node/kubernetes/reconciler/reconciler.go
index 0ce84d7..d44a5fe 100644
--- a/metropolis/node/kubernetes/reconciler/reconciler.go
+++ b/metropolis/node/kubernetes/reconciler/reconciler.go
@@ -34,7 +34,7 @@
 	meta "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 // Sad workaround for all the pointer booleans in K8s specs
diff --git a/metropolis/node/kubernetes/scheduler.go b/metropolis/node/kubernetes/scheduler.go
index 21e6663..7b49963 100644
--- a/metropolis/node/kubernetes/scheduler.go
+++ b/metropolis/node/kubernetes/scheduler.go
@@ -22,9 +22,9 @@
 	"fmt"
 	"os/exec"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/fileargs"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/pki"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/fileargs"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 )
 
 type schedulerConfig struct {
diff --git a/metropolis/node/kubernetes/service.go b/metropolis/node/kubernetes/service.go
index 2917bfc..db174b6 100644
--- a/metropolis/node/kubernetes/service.go
+++ b/metropolis/node/kubernetes/service.go
@@ -29,13 +29,13 @@
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/tools/clientcmd"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/localstorage"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dns"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/clusternet"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/nfproxy"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/pki"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/kubernetes/reconciler"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 	apb "git.monogon.dev/source/nexantic.git/metropolis/proto/api"
 )
 
diff --git a/metropolis/node/common/devicemapper/BUILD.bazel b/metropolis/pkg/devicemapper/BUILD.bazel
similarity index 93%
rename from metropolis/node/common/devicemapper/BUILD.bazel
rename to metropolis/pkg/devicemapper/BUILD.bazel
index 12ca0b3..17c50cc 100644
--- a/metropolis/node/common/devicemapper/BUILD.bazel
+++ b/metropolis/pkg/devicemapper/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "go_default_library",
     srcs = ["devicemapper.go"],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/devicemapper",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/devicemapper",
     visibility = ["//visibility:public"],
     deps = [
         "@com_github_pkg_errors//:go_default_library",
diff --git a/metropolis/node/common/devicemapper/devicemapper.go b/metropolis/pkg/devicemapper/devicemapper.go
similarity index 100%
rename from metropolis/node/common/devicemapper/devicemapper.go
rename to metropolis/pkg/devicemapper/devicemapper.go
diff --git a/metropolis/node/common/fileargs/BUILD.bazel b/metropolis/pkg/fileargs/BUILD.bazel
similarity index 92%
rename from metropolis/node/common/fileargs/BUILD.bazel
rename to metropolis/pkg/fileargs/BUILD.bazel
index c4fffc2..fab70d7 100644
--- a/metropolis/node/common/fileargs/BUILD.bazel
+++ b/metropolis/pkg/fileargs/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "go_default_library",
     srcs = ["fileargs.go"],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/fileargs",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/fileargs",
     visibility = ["//visibility:public"],
     deps = ["@org_golang_x_sys//unix:go_default_library"],
 )
diff --git a/metropolis/node/common/fileargs/fileargs.go b/metropolis/pkg/fileargs/fileargs.go
similarity index 100%
rename from metropolis/node/common/fileargs/fileargs.go
rename to metropolis/pkg/fileargs/fileargs.go
diff --git a/metropolis/node/common/sysfs/BUILD.bazel b/metropolis/pkg/freeport/BUILD.bazel
similarity index 80%
copy from metropolis/node/common/sysfs/BUILD.bazel
copy to metropolis/pkg/freeport/BUILD.bazel
index a4c7f18..8ac6daf 100644
--- a/metropolis/node/common/sysfs/BUILD.bazel
+++ b/metropolis/pkg/freeport/BUILD.bazel
@@ -2,7 +2,7 @@
 
 go_library(
     name = "go_default_library",
-    srcs = ["uevents.go"],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/sysfs",
+    srcs = ["freeport.go"],
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/freeport",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/pkg/freeport/freeport.go b/metropolis/pkg/freeport/freeport.go
new file mode 100644
index 0000000..bd047b5
--- /dev/null
+++ b/metropolis/pkg/freeport/freeport.go
@@ -0,0 +1,51 @@
+// 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.
+
+package freeport
+
+import (
+	"io"
+	"net"
+)
+
+// AllocateTCPPort allocates a TCP port on the looopback address, and starts a temporary listener on it. That listener
+// is returned to the caller alongside with the allocated port number. The listener must be closed right before
+// the port is used by the caller. This naturally still leaves a race condition window where that port number
+// might be snatched up by some other process, but there doesn't seem to be a better way to do this.
+func AllocateTCPPort() (uint16, io.Closer, error) {
+	addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:0")
+	if err != nil {
+		return 0, nil, err
+	}
+
+	l, err := net.ListenTCP("tcp", addr)
+	if err != nil {
+		return 0, nil, err
+	}
+	return uint16(l.Addr().(*net.TCPAddr).Port), l, nil
+}
+
+// MustConsume takes the result of AllocateTCPPort, closes the listener and returns the allocated port.
+// If anything goes wrong (port could not be allocated or closed) it will panic.
+func MustConsume(port uint16, lis io.Closer, err error) int {
+	if err != nil {
+		panic(err)
+	}
+	if err := lis.Close(); err != nil {
+		panic(err)
+	}
+	return int(port)
+}
diff --git a/metropolis/node/common/fsquota/BUILD.bazel b/metropolis/pkg/fsquota/BUILD.bazel
similarity index 84%
rename from metropolis/node/common/fsquota/BUILD.bazel
rename to metropolis/pkg/fsquota/BUILD.bazel
index b16d39e..5f875a9 100644
--- a/metropolis/node/common/fsquota/BUILD.bazel
+++ b/metropolis/pkg/fsquota/BUILD.bazel
@@ -7,11 +7,11 @@
         "fsinfo.go",
         "fsquota.go",
     ],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/fsquota",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/fsquota",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/node/common/fsquota/fsxattrs:go_default_library",
-        "//metropolis/node/common/fsquota/quotactl:go_default_library",
+        "//metropolis/pkg/fsquota/fsxattrs:go_default_library",
+        "//metropolis/pkg/fsquota/quotactl:go_default_library",
         "@org_golang_x_sys//unix:go_default_library",
     ],
 )
diff --git a/metropolis/node/common/fsquota/fsinfo.go b/metropolis/pkg/fsquota/fsinfo.go
similarity index 100%
rename from metropolis/node/common/fsquota/fsinfo.go
rename to metropolis/pkg/fsquota/fsinfo.go
diff --git a/metropolis/node/common/fsquota/fsquota.go b/metropolis/pkg/fsquota/fsquota.go
similarity index 96%
rename from metropolis/node/common/fsquota/fsquota.go
rename to metropolis/pkg/fsquota/fsquota.go
index f702d23..b1305f8 100644
--- a/metropolis/node/common/fsquota/fsquota.go
+++ b/metropolis/pkg/fsquota/fsquota.go
@@ -28,8 +28,8 @@
 
 	"golang.org/x/sys/unix"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/fsquota/fsxattrs"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/fsquota/quotactl"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/fsquota/fsxattrs"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/fsquota/quotactl"
 )
 
 // SetQuota sets the quota of bytes and/or inodes in a given path. To not set a limit, set the
diff --git a/metropolis/node/common/fsquota/fsquota_test.go b/metropolis/pkg/fsquota/fsquota_test.go
similarity index 100%
rename from metropolis/node/common/fsquota/fsquota_test.go
rename to metropolis/pkg/fsquota/fsquota_test.go
diff --git a/metropolis/node/common/fsquota/fsxattrs/BUILD.bazel b/metropolis/pkg/fsquota/fsxattrs/BUILD.bazel
similarity index 89%
rename from metropolis/node/common/fsquota/fsxattrs/BUILD.bazel
rename to metropolis/pkg/fsquota/fsxattrs/BUILD.bazel
index 066200b..87f2617 100644
--- a/metropolis/node/common/fsquota/fsxattrs/BUILD.bazel
+++ b/metropolis/pkg/fsquota/fsxattrs/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "go_default_library",
     srcs = ["fsxattrs.go"],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/fsquota/fsxattrs",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/fsquota/fsxattrs",
     visibility = ["//visibility:public"],
     deps = ["@org_golang_x_sys//unix:go_default_library"],
 )
diff --git a/metropolis/node/common/fsquota/fsxattrs/fsxattrs.go b/metropolis/pkg/fsquota/fsxattrs/fsxattrs.go
similarity index 100%
rename from metropolis/node/common/fsquota/fsxattrs/fsxattrs.go
rename to metropolis/pkg/fsquota/fsxattrs/fsxattrs.go
diff --git a/metropolis/node/common/fsquota/quotactl/BUILD.bazel b/metropolis/pkg/fsquota/quotactl/BUILD.bazel
similarity index 89%
rename from metropolis/node/common/fsquota/quotactl/BUILD.bazel
rename to metropolis/pkg/fsquota/quotactl/BUILD.bazel
index c1582ad..406c784 100644
--- a/metropolis/node/common/fsquota/quotactl/BUILD.bazel
+++ b/metropolis/pkg/fsquota/quotactl/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "go_default_library",
     srcs = ["quotactl.go"],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/fsquota/quotactl",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/fsquota/quotactl",
     visibility = ["//visibility:public"],
     deps = ["@org_golang_x_sys//unix:go_default_library"],
 )
diff --git a/metropolis/node/common/fsquota/quotactl/quotactl.go b/metropolis/pkg/fsquota/quotactl/quotactl.go
similarity index 100%
rename from metropolis/node/common/fsquota/quotactl/quotactl.go
rename to metropolis/pkg/fsquota/quotactl/quotactl.go
diff --git a/metropolis/node/common/jsonpatch/BUILD.bazel b/metropolis/pkg/jsonpatch/BUILD.bazel
similarity index 93%
rename from metropolis/node/common/jsonpatch/BUILD.bazel
rename to metropolis/pkg/jsonpatch/BUILD.bazel
index bd77e0a..b733c57 100644
--- a/metropolis/node/common/jsonpatch/BUILD.bazel
+++ b/metropolis/pkg/jsonpatch/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "go_default_library",
     srcs = ["jsonpatch.go.go"],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/jsonpatch",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/jsonpatch",
     visibility = ["//visibility:public"],
 )
 
diff --git a/metropolis/node/common/jsonpatch/jsonpatch.go.go b/metropolis/pkg/jsonpatch/jsonpatch.go.go
similarity index 100%
rename from metropolis/node/common/jsonpatch/jsonpatch.go.go
rename to metropolis/pkg/jsonpatch/jsonpatch.go.go
diff --git a/metropolis/node/common/jsonpatch/jsonpatch_test.go b/metropolis/pkg/jsonpatch/jsonpatch_test.go
similarity index 100%
rename from metropolis/node/common/jsonpatch/jsonpatch_test.go
rename to metropolis/pkg/jsonpatch/jsonpatch_test.go
diff --git a/metropolis/node/common/logbuffer/BUILD.bazel b/metropolis/pkg/logbuffer/BUILD.bazel
similarity index 95%
rename from metropolis/node/common/logbuffer/BUILD.bazel
rename to metropolis/pkg/logbuffer/BUILD.bazel
index 2d4650d..57a85d8 100644
--- a/metropolis/node/common/logbuffer/BUILD.bazel
+++ b/metropolis/pkg/logbuffer/BUILD.bazel
@@ -6,7 +6,7 @@
         "linebuffer.go",
         "logbuffer.go",
     ],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/logbuffer",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/logbuffer",
     visibility = ["//visibility:public"],
     deps = ["//metropolis/proto/api:go_default_library"],
 )
diff --git a/metropolis/node/common/logbuffer/linebuffer.go b/metropolis/pkg/logbuffer/linebuffer.go
similarity index 100%
rename from metropolis/node/common/logbuffer/linebuffer.go
rename to metropolis/pkg/logbuffer/linebuffer.go
diff --git a/metropolis/node/common/logbuffer/linebuffer_test.go b/metropolis/pkg/logbuffer/linebuffer_test.go
similarity index 100%
rename from metropolis/node/common/logbuffer/linebuffer_test.go
rename to metropolis/pkg/logbuffer/linebuffer_test.go
diff --git a/metropolis/node/common/logbuffer/logbuffer.go b/metropolis/pkg/logbuffer/logbuffer.go
similarity index 100%
rename from metropolis/node/common/logbuffer/logbuffer.go
rename to metropolis/pkg/logbuffer/logbuffer.go
diff --git a/metropolis/node/common/logbuffer/logbuffer_test.go b/metropolis/pkg/logbuffer/logbuffer_test.go
similarity index 100%
rename from metropolis/node/common/logbuffer/logbuffer_test.go
rename to metropolis/pkg/logbuffer/logbuffer_test.go
diff --git a/metropolis/node/core/logtree/BUILD.bazel b/metropolis/pkg/logtree/BUILD.bazel
similarity index 89%
rename from metropolis/node/core/logtree/BUILD.bazel
rename to metropolis/pkg/logtree/BUILD.bazel
index 120bf9f..bb07e99 100644
--- a/metropolis/node/core/logtree/BUILD.bazel
+++ b/metropolis/pkg/logtree/BUILD.bazel
@@ -14,10 +14,10 @@
         "logtree_entry.go",
         "logtree_publisher.go",
     ],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/node/common/logbuffer:go_default_library",
+        "//metropolis/pkg/logbuffer:go_default_library",
         "//metropolis/proto/api:go_default_library",
     ],
 )
diff --git a/metropolis/node/core/logtree/doc.go b/metropolis/pkg/logtree/doc.go
similarity index 100%
rename from metropolis/node/core/logtree/doc.go
rename to metropolis/pkg/logtree/doc.go
diff --git a/metropolis/node/core/logtree/journal.go b/metropolis/pkg/logtree/journal.go
similarity index 100%
rename from metropolis/node/core/logtree/journal.go
rename to metropolis/pkg/logtree/journal.go
diff --git a/metropolis/node/core/logtree/journal_entry.go b/metropolis/pkg/logtree/journal_entry.go
similarity index 98%
rename from metropolis/node/core/logtree/journal_entry.go
rename to metropolis/pkg/logtree/journal_entry.go
index 61619b3..2a60aa1 100644
--- a/metropolis/node/core/logtree/journal_entry.go
+++ b/metropolis/pkg/logtree/journal_entry.go
@@ -16,7 +16,7 @@
 
 package logtree
 
-import "git.monogon.dev/source/nexantic.git/metropolis/node/common/logbuffer"
+import "git.monogon.dev/source/nexantic.git/metropolis/pkg/logbuffer"
 
 // entry is a journal entry, representing a single log event (encompassed in a Payload) at a given DN.
 // See the journal struct for more information about the global/local linked lists.
diff --git a/metropolis/node/core/logtree/journal_subscriber.go b/metropolis/pkg/logtree/journal_subscriber.go
similarity index 100%
rename from metropolis/node/core/logtree/journal_subscriber.go
rename to metropolis/pkg/logtree/journal_subscriber.go
diff --git a/metropolis/node/core/logtree/journal_test.go b/metropolis/pkg/logtree/journal_test.go
similarity index 100%
rename from metropolis/node/core/logtree/journal_test.go
rename to metropolis/pkg/logtree/journal_test.go
diff --git a/metropolis/node/core/logtree/leveled.go b/metropolis/pkg/logtree/leveled.go
similarity index 100%
rename from metropolis/node/core/logtree/leveled.go
rename to metropolis/pkg/logtree/leveled.go
diff --git a/metropolis/node/core/logtree/leveled_payload.go b/metropolis/pkg/logtree/leveled_payload.go
similarity index 100%
rename from metropolis/node/core/logtree/leveled_payload.go
rename to metropolis/pkg/logtree/leveled_payload.go
diff --git a/metropolis/node/core/logtree/logtree.go b/metropolis/pkg/logtree/logtree.go
similarity index 98%
rename from metropolis/node/core/logtree/logtree.go
rename to metropolis/pkg/logtree/logtree.go
index fab72ba..8523569 100644
--- a/metropolis/node/core/logtree/logtree.go
+++ b/metropolis/pkg/logtree/logtree.go
@@ -21,7 +21,7 @@
 	"strings"
 	"sync"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/logbuffer"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logbuffer"
 )
 
 // LogTree is a tree-shaped logging system. For more information, see the package-level documentation.
diff --git a/metropolis/node/core/logtree/logtree_access.go b/metropolis/pkg/logtree/logtree_access.go
similarity index 100%
rename from metropolis/node/core/logtree/logtree_access.go
rename to metropolis/pkg/logtree/logtree_access.go
diff --git a/metropolis/node/core/logtree/logtree_entry.go b/metropolis/pkg/logtree/logtree_entry.go
similarity index 98%
rename from metropolis/node/core/logtree/logtree_entry.go
rename to metropolis/pkg/logtree/logtree_entry.go
index 635e5a8..321406d 100644
--- a/metropolis/node/core/logtree/logtree_entry.go
+++ b/metropolis/pkg/logtree/logtree_entry.go
@@ -20,7 +20,7 @@
 	"fmt"
 	"strings"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/logbuffer"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logbuffer"
 	apb "git.monogon.dev/source/nexantic.git/metropolis/proto/api"
 )
 
diff --git a/metropolis/node/core/logtree/logtree_publisher.go b/metropolis/pkg/logtree/logtree_publisher.go
similarity index 98%
rename from metropolis/node/core/logtree/logtree_publisher.go
rename to metropolis/pkg/logtree/logtree_publisher.go
index c4880bc..3e2711a 100644
--- a/metropolis/node/core/logtree/logtree_publisher.go
+++ b/metropolis/pkg/logtree/logtree_publisher.go
@@ -23,7 +23,7 @@
 	"strings"
 	"time"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/logbuffer"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logbuffer"
 )
 
 // LeveledFor returns a LeveledLogger publishing interface for a given DN. An error may be returned if the DN is
diff --git a/metropolis/node/core/logtree/logtree_test.go b/metropolis/pkg/logtree/logtree_test.go
similarity index 100%
rename from metropolis/node/core/logtree/logtree_test.go
rename to metropolis/pkg/logtree/logtree_test.go
diff --git a/metropolis/node/common/supervisor/BUILD.bazel b/metropolis/pkg/supervisor/BUILD.bazel
similarity index 89%
rename from metropolis/node/common/supervisor/BUILD.bazel
rename to metropolis/pkg/supervisor/BUILD.bazel
index ae95892..40b0469 100644
--- a/metropolis/node/common/supervisor/BUILD.bazel
+++ b/metropolis/pkg/supervisor/BUILD.bazel
@@ -9,13 +9,13 @@
         "supervisor_support.go",
         "supervisor_testhelpers.go",
     ],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor",
     visibility = [
         "//metropolis/node:__subpackages__",
         "//metropolis/test:__subpackages__",
     ],
     deps = [
-        "//metropolis/node/core/logtree:go_default_library",
+        "//metropolis/pkg/logtree:go_default_library",
         "@com_github_cenkalti_backoff_v4//:go_default_library",
         "@org_golang_google_grpc//:go_default_library",
     ],
diff --git a/metropolis/node/common/supervisor/supervisor.go b/metropolis/pkg/supervisor/supervisor.go
similarity index 98%
rename from metropolis/node/common/supervisor/supervisor.go
rename to metropolis/pkg/supervisor/supervisor.go
index 41d208d..ed79c69 100644
--- a/metropolis/node/common/supervisor/supervisor.go
+++ b/metropolis/pkg/supervisor/supervisor.go
@@ -25,7 +25,7 @@
 	"io"
 	"sync"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
 )
 
 // A Runnable is a function that will be run in a goroutine, and supervised throughout its lifetime. It can in turn
diff --git a/metropolis/node/common/supervisor/supervisor_node.go b/metropolis/pkg/supervisor/supervisor_node.go
similarity index 100%
rename from metropolis/node/common/supervisor/supervisor_node.go
rename to metropolis/pkg/supervisor/supervisor_node.go
diff --git a/metropolis/node/common/supervisor/supervisor_processor.go b/metropolis/pkg/supervisor/supervisor_processor.go
similarity index 100%
rename from metropolis/node/common/supervisor/supervisor_processor.go
rename to metropolis/pkg/supervisor/supervisor_processor.go
diff --git a/metropolis/node/common/supervisor/supervisor_support.go b/metropolis/pkg/supervisor/supervisor_support.go
similarity index 100%
rename from metropolis/node/common/supervisor/supervisor_support.go
rename to metropolis/pkg/supervisor/supervisor_support.go
diff --git a/metropolis/node/common/supervisor/supervisor_test.go b/metropolis/pkg/supervisor/supervisor_test.go
similarity index 100%
rename from metropolis/node/common/supervisor/supervisor_test.go
rename to metropolis/pkg/supervisor/supervisor_test.go
diff --git a/metropolis/node/common/supervisor/supervisor_testhelpers.go b/metropolis/pkg/supervisor/supervisor_testhelpers.go
similarity index 100%
rename from metropolis/node/common/supervisor/supervisor_testhelpers.go
rename to metropolis/pkg/supervisor/supervisor_testhelpers.go
diff --git a/metropolis/node/common/sysfs/BUILD.bazel b/metropolis/pkg/sysfs/BUILD.bazel
similarity index 91%
rename from metropolis/node/common/sysfs/BUILD.bazel
rename to metropolis/pkg/sysfs/BUILD.bazel
index a4c7f18..0cea1f8 100644
--- a/metropolis/node/common/sysfs/BUILD.bazel
+++ b/metropolis/pkg/sysfs/BUILD.bazel
@@ -3,6 +3,6 @@
 go_library(
     name = "go_default_library",
     srcs = ["uevents.go"],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/common/sysfs",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/sysfs",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/node/common/sysfs/uevents.go b/metropolis/pkg/sysfs/uevents.go
similarity index 100%
rename from metropolis/node/common/sysfs/uevents.go
rename to metropolis/pkg/sysfs/uevents.go
diff --git a/metropolis/node/core/tpm/BUILD.bazel b/metropolis/pkg/tpm/BUILD.bazel
similarity index 84%
rename from metropolis/node/core/tpm/BUILD.bazel
rename to metropolis/pkg/tpm/BUILD.bazel
index fd42681..d06ff37 100644
--- a/metropolis/node/core/tpm/BUILD.bazel
+++ b/metropolis/pkg/tpm/BUILD.bazel
@@ -6,11 +6,11 @@
         "credactivation_compat.go",
         "tpm.go",
     ],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/core/tpm",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/tpm",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/node/common/sysfs:go_default_library",
-        "//metropolis/node/core/logtree:go_default_library",
+        "//metropolis/pkg/logtree:go_default_library",
+        "//metropolis/pkg/sysfs:go_default_library",
         "@com_github_gogo_protobuf//proto:go_default_library",
         "@com_github_google_go_tpm//tpm2:go_default_library",
         "@com_github_google_go_tpm//tpmutil:go_default_library",
diff --git a/metropolis/node/core/tpm/credactivation_compat.go b/metropolis/pkg/tpm/credactivation_compat.go
similarity index 100%
rename from metropolis/node/core/tpm/credactivation_compat.go
rename to metropolis/pkg/tpm/credactivation_compat.go
diff --git a/metropolis/node/core/tpm/eventlog/BUILD.bazel b/metropolis/pkg/tpm/eventlog/BUILD.bazel
similarity index 81%
rename from metropolis/node/core/tpm/eventlog/BUILD.bazel
rename to metropolis/pkg/tpm/eventlog/BUILD.bazel
index 64fa1ff..94a7ee9 100644
--- a/metropolis/node/core/tpm/eventlog/BUILD.bazel
+++ b/metropolis/pkg/tpm/eventlog/BUILD.bazel
@@ -7,10 +7,10 @@
         "eventlog.go",
         "secureboot.go",
     ],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/core/tpm/eventlog",
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/tpm/eventlog",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/node/core/tpm/eventlog/internal:go_default_library",
+        "//metropolis/pkg/tpm/eventlog/internal:go_default_library",
         "@com_github_google_certificate_transparency_go//x509:go_default_library",
         "@com_github_google_go_tpm//tpm2:go_default_library",
     ],
diff --git a/metropolis/node/core/tpm/eventlog/LICENSE-3RD-PARTY.txt b/metropolis/pkg/tpm/eventlog/LICENSE-3RD-PARTY.txt
similarity index 100%
rename from metropolis/node/core/tpm/eventlog/LICENSE-3RD-PARTY.txt
rename to metropolis/pkg/tpm/eventlog/LICENSE-3RD-PARTY.txt
diff --git a/metropolis/node/core/tpm/eventlog/compat.go b/metropolis/pkg/tpm/eventlog/compat.go
similarity index 100%
rename from metropolis/node/core/tpm/eventlog/compat.go
rename to metropolis/pkg/tpm/eventlog/compat.go
diff --git a/metropolis/node/core/tpm/eventlog/eventlog.go b/metropolis/pkg/tpm/eventlog/eventlog.go
similarity index 100%
rename from metropolis/node/core/tpm/eventlog/eventlog.go
rename to metropolis/pkg/tpm/eventlog/eventlog.go
diff --git a/metropolis/node/core/tpm/eventlog/internal/BUILD.bazel b/metropolis/pkg/tpm/eventlog/internal/BUILD.bazel
similarity index 77%
rename from metropolis/node/core/tpm/eventlog/internal/BUILD.bazel
rename to metropolis/pkg/tpm/eventlog/internal/BUILD.bazel
index 48e1e81..a73bcba 100644
--- a/metropolis/node/core/tpm/eventlog/internal/BUILD.bazel
+++ b/metropolis/pkg/tpm/eventlog/internal/BUILD.bazel
@@ -3,8 +3,8 @@
 go_library(
     name = "go_default_library",
     srcs = ["events.go"],
-    importpath = "git.monogon.dev/source/nexantic.git/metropolis/node/core/tpm/eventlog/internal",
-    visibility = ["//metropolis/node/core/tpm/eventlog:__subpackages__"],
+    importpath = "git.monogon.dev/source/nexantic.git/metropolis/pkg/tpm/eventlog/internal",
+    visibility = ["//metropolis/pkg/tpm/eventlog:__subpackages__"],
     deps = [
         "@com_github_google_certificate_transparency_go//asn1:go_default_library",
         "@com_github_google_certificate_transparency_go//x509:go_default_library",
diff --git a/metropolis/node/core/tpm/eventlog/internal/events.go b/metropolis/pkg/tpm/eventlog/internal/events.go
similarity index 100%
rename from metropolis/node/core/tpm/eventlog/internal/events.go
rename to metropolis/pkg/tpm/eventlog/internal/events.go
diff --git a/metropolis/node/core/tpm/eventlog/secureboot.go b/metropolis/pkg/tpm/eventlog/secureboot.go
similarity index 98%
rename from metropolis/node/core/tpm/eventlog/secureboot.go
rename to metropolis/pkg/tpm/eventlog/secureboot.go
index f117d30..46e1f95 100644
--- a/metropolis/node/core/tpm/eventlog/secureboot.go
+++ b/metropolis/pkg/tpm/eventlog/secureboot.go
@@ -24,7 +24,7 @@
 
 	"github.com/google/certificate-transparency-go/x509"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/tpm/eventlog/internal"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/tpm/eventlog/internal"
 )
 
 // SecurebootState describes the secure boot status of a machine, as determined
diff --git a/metropolis/node/core/tpm/tpm.go b/metropolis/pkg/tpm/tpm.go
similarity index 98%
rename from metropolis/node/core/tpm/tpm.go
rename to metropolis/pkg/tpm/tpm.go
index 4106a66..29bd208 100644
--- a/metropolis/node/core/tpm/tpm.go
+++ b/metropolis/pkg/tpm/tpm.go
@@ -40,8 +40,8 @@
 	"github.com/pkg/errors"
 	"golang.org/x/sys/unix"
 
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/sysfs"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/sysfs"
 )
 
 var (
diff --git a/metropolis/proto/api/debug.proto b/metropolis/proto/api/debug.proto
index 5648ae7..82f4a2c 100644
--- a/metropolis/proto/api/debug.proto
+++ b/metropolis/proto/api/debug.proto
@@ -30,7 +30,7 @@
     // GetLogs Returns historical and/or streaming logs for a given DN with given filters from the system global
     // LogTree.
     //
-    // For more information about this API, see //metropolis/node/core/logtree. But, in summary:
+    // For more information about this API, see //metropolis/pkg/logtree. But, in summary:
     //   - All logging is performed to a DN (distinguished name), which is a dot-delimited string like foo.bar.baz.
     //   - Log entries can be either raw (coming from unstructured logging from an external service, like a running
     //     process) or leveled (emitted by Metropolis code with a source line, timestamp, and severity).
@@ -57,7 +57,7 @@
     string debug_kubeconfig = 1;
 }
 
-// Severity level corresponding to //metropolis/node/core/logtree.Severity.
+// Severity level corresponding to //metropolis/pkg/logtree.Severity.
 enum LeveledLogSeverity {
     INVALID = 0;
     INFO = 1;
diff --git a/metropolis/test/launch/BUILD.bazel b/metropolis/test/launch/BUILD.bazel
index b6245e1..d4bf4cb 100644
--- a/metropolis/test/launch/BUILD.bazel
+++ b/metropolis/test/launch/BUILD.bazel
@@ -6,8 +6,8 @@
     importpath = "git.monogon.dev/source/nexantic.git/metropolis/test/launch",
     visibility = ["//metropolis:__subpackages__"],
     deps = [
-        "//golibs/common:go_default_library",
         "//metropolis/node:go_default_library",
+        "//metropolis/pkg/freeport:go_default_library",
         "//metropolis/proto/api:go_default_library",
         "@com_github_golang_protobuf//proto:go_default_library",
         "@com_github_grpc_ecosystem_go_grpc_middleware//retry:go_default_library",
diff --git a/metropolis/test/launch/cli/launch-multi2/BUILD.bazel b/metropolis/test/launch/cli/launch-multi2/BUILD.bazel
index 6507ae4..4b51824 100644
--- a/metropolis/test/launch/cli/launch-multi2/BUILD.bazel
+++ b/metropolis/test/launch/cli/launch-multi2/BUILD.bazel
@@ -7,7 +7,7 @@
     visibility = ["//visibility:private"],
     deps = [
         "//metropolis/node:go_default_library",
-        "//metropolis/node/common/logbuffer:go_default_library",
+        "//metropolis/pkg/logbuffer:go_default_library",
         "//metropolis/proto/api:go_default_library",
         "//metropolis/test/launch:go_default_library",
         "@com_github_grpc_ecosystem_go_grpc_middleware//retry:go_default_library",
diff --git a/metropolis/test/launch/cli/launch-multi2/main.go b/metropolis/test/launch/cli/launch-multi2/main.go
index 1596e60..553e4ae 100644
--- a/metropolis/test/launch/cli/launch-multi2/main.go
+++ b/metropolis/test/launch/cli/launch-multi2/main.go
@@ -30,7 +30,7 @@
 	"google.golang.org/grpc"
 
 	common "git.monogon.dev/source/nexantic.git/metropolis/node"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/logbuffer"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logbuffer"
 	apb "git.monogon.dev/source/nexantic.git/metropolis/proto/api"
 	"git.monogon.dev/source/nexantic.git/metropolis/test/launch"
 )
diff --git a/metropolis/test/launch/launch.go b/metropolis/test/launch/launch.go
index 0cf11bd..21d066b 100644
--- a/metropolis/test/launch/launch.go
+++ b/metropolis/test/launch/launch.go
@@ -39,8 +39,8 @@
 	"golang.org/x/sys/unix"
 	"google.golang.org/grpc"
 
-	freeport "git.monogon.dev/source/nexantic.git/golibs/common"
-	common "git.monogon.dev/source/nexantic.git/metropolis/node"
+	"git.monogon.dev/source/nexantic.git/metropolis/node"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/freeport"
 	apb "git.monogon.dev/source/nexantic.git/metropolis/proto/api"
 )
 
@@ -135,8 +135,8 @@
 }
 
 // NodePorts is the list of ports a fully operational Metropolis node listens on
-var NodePorts = []uint16{common.ConsensusPort, common.NodeServicePort, common.MasterServicePort,
-	common.ExternalServicePort, common.DebugServicePort, common.KubernetesAPIPort, common.DebuggerPort}
+var NodePorts = []uint16{node.ConsensusPort, node.NodeServicePort, node.MasterServicePort,
+	node.ExternalServicePort, node.DebugServicePort, node.KubernetesAPIPort, node.DebuggerPort}
 
 // IdentityPortMap returns a port map where each given port is mapped onto itself on the host. This is mainly useful
 // for development against Metropolis. The dbg command requires this mapping.
@@ -465,9 +465,9 @@
 
 // NanoswitchPorts contains all ports forwarded by Nanoswitch to the first VM
 var NanoswitchPorts = []uint16{
-	common.ExternalServicePort,
-	common.DebugServicePort,
-	common.KubernetesAPIPort,
+	node.ExternalServicePort,
+	node.DebugServicePort,
+	node.KubernetesAPIPort,
 }
 
 // ClusterOptions contains all options for launching a Metropolis cluster
@@ -524,7 +524,7 @@
 	copts := []grpcretry.CallOption{
 		grpcretry.WithBackoff(grpcretry.BackoffExponential(100 * time.Millisecond)),
 	}
-	conn, err := portMap.DialGRPC(common.DebugServicePort, grpc.WithInsecure(),
+	conn, err := portMap.DialGRPC(node.DebugServicePort, grpc.WithInsecure(),
 		grpc.WithUnaryInterceptor(grpcretry.UnaryClientInterceptor(copts...)))
 	if err != nil {
 		return nil, nil, fmt.Errorf("failed to dial debug service: %w", err)
diff --git a/metropolis/test/nanoswitch/BUILD b/metropolis/test/nanoswitch/BUILD
index ee8c2c2..fa7e271 100644
--- a/metropolis/test/nanoswitch/BUILD
+++ b/metropolis/test/nanoswitch/BUILD
@@ -8,10 +8,10 @@
     visibility = ["//visibility:private"],
     deps = [
         "//metropolis/node:go_default_library",
-        "//metropolis/node/common/supervisor:go_default_library",
-        "//metropolis/node/core/logtree:go_default_library",
         "//metropolis/node/core/network/dhcp4c:go_default_library",
         "//metropolis/node/core/network/dhcp4c/callback:go_default_library",
+        "//metropolis/pkg/logtree:go_default_library",
+        "//metropolis/pkg/supervisor:go_default_library",
         "//metropolis/test/launch:go_default_library",
         "@com_github_google_nftables//:go_default_library",
         "@com_github_google_nftables//expr:go_default_library",
diff --git a/metropolis/test/nanoswitch/nanoswitch.go b/metropolis/test/nanoswitch/nanoswitch.go
index 2569ab6..91d270b 100644
--- a/metropolis/test/nanoswitch/nanoswitch.go
+++ b/metropolis/test/nanoswitch/nanoswitch.go
@@ -39,10 +39,10 @@
 	"golang.org/x/sys/unix"
 
 	common "git.monogon.dev/source/nexantic.git/metropolis/node"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/common/supervisor"
-	"git.monogon.dev/source/nexantic.git/metropolis/node/core/logtree"
 	"git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dhcp4c"
 	dhcpcb "git.monogon.dev/source/nexantic.git/metropolis/node/core/network/dhcp4c/callback"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/logtree"
+	"git.monogon.dev/source/nexantic.git/metropolis/pkg/supervisor"
 	"git.monogon.dev/source/nexantic.git/metropolis/test/launch"
 )