diff --git a/cmd/tailscaled/tailscaled.go b/cmd/tailscaled/tailscaled.go index 42126f0c9..ef2b5ed1d 100644 --- a/cmd/tailscaled/tailscaled.go +++ b/cmd/tailscaled/tailscaled.go @@ -87,6 +87,16 @@ func defaultTunName() string { // See https://github.com/tailscale/tailscale-synology/issues/35 return "tailscale0,userspace-networking" } + if buildfeatures.HasNetstack && distro.Get() == distro.Crostini { + // cros-garcon NULL-derefs on cold-boot netlink interface + // enumeration when tailscale0 is present, preventing the + // Crostini container and ChromeOS Terminal from starting + // cleanly. Default to userspace-networking until the + // upstream ChromiumOS bug is fixed. + // See https://github.com/tailscale/tailscale/issues/12090 + // See https://issuetracker.google.com/issues/517069318 + return "userspace-networking" + } } return "tailscale0" } diff --git a/ssh/tailssh/user.go b/ssh/tailssh/user.go index 0d2bf31e7..8d7775cfb 100644 --- a/ssh/tailssh/user.go +++ b/ssh/tailssh/user.go @@ -93,7 +93,7 @@ func defaultPathForUser(u *user.User) string { } isRoot := u.Uid == "0" switch distro.Get() { - case distro.Debian: + case distro.Debian, distro.Crostini: hi := hostinfo.New() if hi.Distro == "ubuntu" { // distro.Get's Debian includes Ubuntu. But see if it's actually Ubuntu. diff --git a/version/distro/distro.go b/version/distro/distro.go index 03c02ccab..5407f8dae 100644 --- a/version/distro/distro.go +++ b/version/distro/distro.go @@ -19,6 +19,7 @@ const ( Debian = Distro("debian") + Crostini = Distro("crostini") // ChromeOS Crostini Linux container; Debian-based Arch = Distro("arch") Synology = Distro("synology") OpenWrt = Distro("openwrt") @@ -84,6 +85,11 @@ func linuxDistro() Distro { // Currently supported product families: // - UDM (UniFi Dream Machine, UDM-Pro) return UBNT + case have("/opt/google/cros-containers/bin/garcon"): + // ChromeOS Crostini ships /opt/google/cros-containers/bin/garcon + // in every penguin container. MUST be checked before Debian since + // Crostini is Debian-based. + return Crostini case have("/etc/debian_version"): return Debian case have("/etc/arch-release"):