TL;DR
I tried to install Google Antigravity (the new agent dev IDE) on a headless arm64 Ubuntu VM. It is a x86_64 Electron app. Three emulation layers later, I gave up and uninstalled everything. Here is the trail of pain so you do not repeat it.
The setup
- Oracle Cloud Ampere VM, aarch64, Ubuntu 24.04 LTS
- Headless (no display server, SSH only)
- 96GB disk, 24GB RAM
- Antigravity build:
linux-x64tarball, 168MB, Electron-based
The plan: install a desktop environment + RDP, emulate x86_64, run Antigravity, connect from my laptop. Sounds reasonable. It is not.
Round 1: qemu-user-static
The classic approach. Install qemu-user-static + binfmt-support, register qemu-x86_64 in binfmt_misc, point at an amd64 sysroot, run the binary.
sudo apt-get install -y qemu-user-static binfmt-support
First exec attempt:
x86_64-binfmt-P: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
No amd64 dynamic linker. Bootstrap one with debootstrap:
sudo debootstrap --arch=amd64 --variant=minbase noble /opt/amd64-sysroot \
http://archive.ubuntu.com/ubuntu
debootstrap finished extracting but post-install scripts crashed:
Setting up libpam-modules:amd64 (1.5.3-5ubuntu5) ...
x86_64-binfmt-P: QEMU internal SIGSEGV {code=MAPERR, addr=0x20}
Segmentation fault (core dumped)
qemu-user segfaulted on basic dpkg postinst. If passwd cannot configure itself, Chromium has zero chance. This is a known qemu-user limitation: threading + atomic ops + signal handling get exotic enough that complex binaries crash.
Verdict: dead.
Round 2: FEX-Emu
FEX-Emu is purpose-built for this: userspace x86_64 -> aarch64 translation, designed with Chromium and Wine in mind. There is a PPA.
sudo add-apt-repository -y ppa:fex-emu/fex
sudo apt-get install -y fex-emu-armv8.2 fex-emu-binfmt64
(Pick the armv8.X package matching your CPU — check /proc/cpuinfo features. Ampere Altra has lse, lrcpc, asimddp => armv8.2.)
FEX needs a rootfs. The shipped fetcher (FEXRootFSFetcher) opens a zenity GUI even with -y --assume-yes. On a headless box it hangs forever holding zero network connections.
Skip it. Pull the JSON manifest and fetch directly:
curl -fsSL https://rootfs.fex-emu.gg/RootFS_links.json | \
python3 -c "import json,sys; d=json.load(sys.stdin); \
[print(k, v['URL']) for k,v in d['v1'].items() if 'Ubuntu_24' in v['URL']]"
I grabbed the SquashFS image (~500MB), extracted it to a directory (no FUSE needed), pointed ~/.fex-emu/Config.json at it:
{ "Config": { "RootFS": "Ubuntu_24_04" } }
Started FEXServer -p 3600 (persistent for an hour), then:
FEXInterpreter /opt/antigravity/antigravity --version
First real progress:
FATAL:sandbox/linux/suid/client/setuid_sandbox_host.cc:166]
The SUID sandbox helper binary was found, but is not configured correctly.
Fixable. chmod 4755 + chown root:root on chrome-sandbox. Also disable AppArmor restricted userns (Ubuntu 24.04 added this):
sudo chown root:root /opt/antigravity/chrome-sandbox
sudo chmod 4755 /opt/antigravity/chrome-sandbox
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
Try again under xvfb with --no-sandbox:
xvfb-run -a FEXInterpreter /opt/antigravity/antigravity --no-sandbox --version
Result:
Trace/breakpoint trap (core dumped)
V8 JIT crashed. Electron's V8 generates x86_64 machine code at runtime and runs it. FEX must re-translate that emitted code on the fly. It works for many binaries; for Electron with modern V8 it does not. SIGTRAP every time.
Verdict: dead.
Round 3: there is no round 3
Options I considered and rejected:
- box64 — same userspace translation class, same V8 problems.
- Full-system KVM x86_64 VM — nested virt on arm64 Ampere is brutally slow, needs ~15GB disk, hours of setup, and you still need a display server inside.
- Wait for an arm64 Antigravity build — not on the roadmap.
The actual answer
Antigravity is an IDE. IDEs have Remote-SSH. The correct topology:
[Local laptop: Antigravity x86_64] --SSH--> [arm64 VM: your code]
The IDE runs on hardware that natively supports it. The VM stays headless and serves files + runs your stack. No emulation, no RDP, no zenity, no V8 JIT translation.
I should have done this in the first 30 seconds.
What it cost
- ~2 hours
- ~3GB of packages installed and then purged
- 168MB tarball + 836MB EroFS + 497MB SquashFS rootfs (also purged)
- A renewed appreciation for native binaries
Lessons
-
Check arch before download.
arch64 + linux-x64 .tar.gz = no. - Headless VM + Electron app = pick your pain. RDP into a heavy desktop, or admit the IDE belongs on your laptop.
- qemu-user is for static utilities, not Chromium.
- FEX-Emu is impressive but V8 self-modifying code is its kryptonite.
FEXRootFSFetcheris GUI-only; fetch the rootfs JSON directly on headless machines.
If you want to try anyway, the squashfs rootfs URL is in https://rootfs.fex-emu.gg/RootFS_links.json. Don't say I didn't warn you.
Top comments (0)