Final update, hopefully. Here's a gist with a script, service unit, and readme. <https://gist.github.com/legowerewolf/1b1670457cfac9201ee9d67840952147>
On Sun, Oct 9, 2022 at 11:10 AM Duncan Gibson <legowerew...@gmail.com> wrote: > After doing some more looking, it seems like the /etc folder is overlaid > with /var/lib/overlays/etc/upper, meaning that changes to /etc/ get saved > in the overlay, which should survive updates. I've added the service > definition there and the binaries to my home directory (and updated the > service definition to point there), and it seems to just work. I might look > into putting the binaries in a system extension, and update the service > definition to require the extension be running, but it seems to work as-is. > Time to wait for the next system update and see if it breaks. > > On Sat, Oct 8, 2022 at 2:02 PM Luca Boccassi <bl...@debian.org> wrote: > >> On Sat, 8 Oct 2022 at 18:51, Duncan Gibson <legowerew...@gmail.com> >> wrote: >> > >> > Hm. Actually, no, I don't think it will. Services installed the normal >> way won't survive the A/B update system. >> >> I don't know what that is and how it works. >> >> > On Sat, Oct 8, 2022 at 12:23 PM Duncan Gibson <legowerew...@gmail.com> >> wrote: >> >> >> >> Oh, now that's a new way of doing it. I'll definitely give that a >> shot. That sounds like it has the best chance of working. >> >> >> >> On Sat, Oct 8, 2022 at 12:20 PM Luca Boccassi <bl...@debian.org> >> wrote: >> >>> >> >>> On Sat, 2022-10-08 at 11:13 -0400, Duncan Gibson wrote: >> >>> > The problem wasn't mounting the system extension automatically. That >> >>> > worked >> >>> > just fine. It was that systemd would try to start the service before >> >>> > the >> >>> > system extension mounted, which would fail, for obvious reasons. >> This >> >>> > weekend I think I'm going to try the BindReadOnlyPaths option and >> see >> >>> > if I >> >>> > can get that to work. >> >>> >> >>> Don't do that. system-wide extensions are not supposed to add units, >> >>> and it will not work. Portable services are for distributors - for >> >>> locally built extensions, you can simply use a normal service with >> >>> ExtensionImages= that points to your extension, and it will be >> >>> overlayed with the rootfs. >> >>> >> >>> > On Fri, Oct 7, 2022 at 3:35 PM David Anderson <d...@natulte.net> >> >>> > wrote: >> >>> > >> >>> > > Yeah, so far we (tailscale) haven't found a good way to run on the >> >>> > > Steam >> >>> > > Deck at bootup, and also survive the A/B OS updates. Systemd >> system >> >>> > > extensions _can_ be activated during bootup, if you place the >> >>> > > extension in >> >>> > > one of the well-known locations (/var/lib/extensions would be the >> >>> > > one to >> >>> > > use on Deck, as iirc it survives A/B upgrades), and the systemd- >> >>> > > sysext >> >>> > > service is enabled. >> >>> > > >> >>> > > I would check if systemd-sysext.service is enabled on the deck, >> and >> >>> > > if >> >>> > > not, file a request with Valve to enable that service in a future >> >>> > > update. >> >>> > > You should present it as enabling further customization of their >> >>> > > platform. >> >>> > > >> >>> > > Another possible reason that sysexts aren't working for you, is >> >>> > > that the >> >>> > > Deck's /etc/os-release doesn't define a SYSEXT_LEVEL, and the >> >>> > > VERSION_ID >> >>> > > changes with every OS update. Because of this, the system >> extension >> >>> > > will >> >>> > > refuse to activate after every update (either SYSEXT_LEVEL or >> >>> > > VERSION_ID >> >>> > > must match exactly), until you rebuild a new image with the right >> >>> > > OS >> >>> > > metadata. Asking Valve to set SYSEXT_LEVEL to a stable value would >> >>> > > make it >> >>> > > even easier to provide Deck OS extensions reliably :) >> >>> > > >> >>> > > - Dave >> >>> > > >> >>> > > On Thu, Oct 6, 2022, at 12:08, Arian van Putten wrote: >> >>> > > >> >>> > > Afaik Portable services run in an isolated root and dont have >> >>> > > access to >> >>> > > the hosts rootfs. You'd have go include iptables and all its >> >>> > > dependencies >> >>> > > in the portable services directory. If you don't want to do that >> >>> > > you'd have >> >>> > > to use BindReadOnlyPaths= to give the service access to the >> >>> > > required host >> >>> > > paths or you'd have to use a system extension. >> >>> > > >> >>> > > That's probably why they advice running as a system extension. >> >>> > > >> >>> > > I think there are mechanisms for setting up system extensions on >> >>> > > startup >> >>> > > but I'm not familiar enough with the details. Maybe someone else >> in >> >>> > > the >> >>> > > list knows. >> >>> > > >> >>> > > >> >>> > > >> >>> > > >> >>> > > On Thu, 6 Oct 2022, 20:21 Duncan Gibson, <legowerew...@gmail.com> >> >>> > > wrote: >> >>> > > >> >>> > > Hi, everyone. >> >>> > > >> >>> > > The high-level overview: I'm trying to install Tailscale as a >> >>> > > portable >> >>> > > service on my Steam Deck. >> >>> > > >> >>> > > Tailscale is a point-to-point VPN service, essentially a wrapper >> >>> > > around >> >>> > > Wireguard that helps with network setup and management. The Steam >> >>> > > Deck is >> >>> > > Valve's handheld PC running SteamOS 3, which is derived from Arch. >> >>> > > It uses >> >>> > > an A/B partition system for system files, meaning you can't >> install >> >>> > > a >> >>> > > service the normal way. >> >>> > > >> >>> > > There *is* a guide to do this, posted on their own blog, but it >> >>> > > uses >> >>> > > system extensions which aren't good for services that you want to >> >>> > > run on >> >>> > > startup. Indeed, following that guide puts me in a state where I >> >>> > > have to >> >>> > > manually start the daemon every time I reboot my Deck, even with >> >>> > > the >> >>> > > service enabled. >> >>> > > >> >>> > > Let's move on to how I've started to do this. >> >>> > > >> >>> > > Tailscale is available through most package managers, but they >> also >> >>> > > publish static binaries with systemd unit files. >> >>> > > >> >>> > > This script grabs that binary, extracts it, and moves it into a >> >>> > > portable >> >>> > > service directory structure. >> >>> > > >> >>> > > # download and extract Tailscale >> >>> > > tarball="$(curl -s 'https://pkgs.tailscale.com/stable/?mode=json' >> | >> >>> > > jq -r >> >>> > > .Tarballs.amd64)" >> >>> > > version="$(echo ${tarball} | cut -d_ -f2)" >> >>> > > tar_dir="$(echo ${tarball} | cut -d. -f1-3)" >> >>> > > curl -s "https://pkgs.tailscale.com/stable/${tarball}" -o >> >>> > > tailscale.tgz >> >>> > > tar xzf tailscale.tgz >> >>> > > test -d $tar_dir >> >>> > > >> >>> > > # Set up our target directory structure >> >>> > > mkdir -p >> >>> > > >> tailscaled/{usr/{bin,sbin,lib/systemd/system},etc,proc,sys,dev,run, >> >>> > > /var/tmp} >> >>> > > >> >>> > > # Copy tailscale-distributed files to the right place >> >>> > > cp -rf $tar_dir/tailscaled tailscaled/usr/sbin/tailscaled >> >>> > > cp -rf $tar_dir/systemd/tailscaled.service >> >>> > > tailscaled/usr/lib/systemd/system/tailscaled.service >> >>> > > >> >>> > > # Write service os-release file >> >>> > > source /etc/os-release >> >>> > > cp -rf /etc/os-release tailscaled/etc/os-release >> >>> > > >> >>> > > Not automated yet is patching the provided unit file - you need to >> >>> > > remove >> >>> > > the EnvironmentFile line and "--port $PORT $FLAGS" options, and >> add >> >>> > > [Exec] >> >>> > > Environment="PATH=/usr/bin" >> >>> > > >> >>> > > Attach the portable service: sudo portablectl attach ./tailscaled >> >>> > > --profile=trusted >> >>> > > and try starting it: sudo systemctl start tailscaled >> >>> > > >> >>> > > It fails, leaving this in the logs: >> >>> > > >> >>> > > logtail started >> >>> > > Program starting: v1.30.2-t24c524c78-gc399ae6fa, Go 1.19.1- >> >>> > > tsb13188dd36: >> >>> > > []string{"/usr/sbin/tailscaled", >> >>> > > "--state=/var/lib/tailscale/tailscaled.state", >> >>> > > "--socket=/run/tailscale/tailscaled.sock"} >> >>> > > LogID: >> >>> > > 0f59ed267a2b19cc28aac9ee7119914000ca478234af8d56893a025ae72cc647 >> >>> > > logpolicy: using $STATE_DIRECTORY, "/var/lib/tailscale" >> >>> > > wgengine.NewUserspaceEngine(tun "tailscale0") ... >> >>> > > wgengine.NewUserspaceEngine(tun "tailscale0") error: creating >> >>> > > router: >> >>> > > could not get iptables version: fork/exec /usr/bin/iptables: no >> >>> > > such file >> >>> > > or directory flushing log. >> >>> > > logger closing down >> >>> > > createEngine: creating router: could not get iptables version: >> >>> > > fork/exec >> >>> > > /usr/bin/iptables: no such file or directory >> >>> > > >> >>> > > iptables is, in fact, at /usr/bin/iptables, so what am I missing? >> >>> > > Before I >> >>> > > added the Environment line, I was getting errors that iptables >> >>> > > wasn't on >> >>> > > the PATH, so I suspect that now tailscaled can *see* iptables, but >> >>> > > systemd isn't letting tailscaled run it. >> >>> > > >> >>> > > Thanks for having a look at this. >> >>> > > >> >>> > > >> >>> > > >> >>> >> >>> -- >> >>> Kind regards, >> >>> Luca Boccassi >> >