Both scripts now download and install GE-Proton10-34 if not already present: - setup-swbf2-linux.sh: installs to ~/.steam/root/compatibilitytools.d/ - setup-swbf2-wolf.sh: installs into the WolfSteam container via docker cp + tar Both pause after install and prompt the user to set GE-Proton in Steam (Compatibility → Force) before continuing, since that step requires the GUI. Update docs to reflect GE-Proton is now handled automatically. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
14 KiB
Star Wars Battlefront II (2017) — Linux Setup Guide
AppID: 1237950
Proton: GE-Proton10-34 or later (required)
This guide covers two setups:
The underlying fix is the same for both. The EA App MSI bundled with the game
fails to install in Wine due to a .NET custom action (JunoConfigureRegistry)
that Wine does not support, causing the installer to silently roll back. The
fix is to extract the EA Desktop files directly from the MSI on the Linux host
using msiextract, bypassing the installer entirely, then wire up a launch
wrapper to import the necessary registry entries on every launch.
Prerequisites (both setups)
- SWBF2 (AppID 1237950) installed via Steam and fully downloaded
- GE-Proton10-34 — the setup scripts install this automatically if not present
- An EA account created at ea.com and linked to your Steam account
msitoolsinstalled on the host:sudo apt-get install -y msitools # Debian / Ubuntu sudo dnf install -y msitools # Fedora
EA account requirement
SWBF2 (2017) requires EA account authentication on first launch. Steam handles the game files; EA App handles identity. First launch requires an internet connection and a valid EA account linked to your Steam account. After authenticating, EA App caches credentials locally and subsequent launches work without re-login until the token expires (typically weeks to months).
To link accounts: log in at ea.com, go to Connections, and link your Steam account. This is a one-time step that persists across reinstalls.
Native Linux Steam
Prerequisites (native)
- In Steam: SWBF2 → Properties → Compatibility → Force GE-Proton10-34 (the setup script installs GE-Proton10-34 automatically if not present)
Automated setup
chmod +x setup-swbf2-linux.sh
./setup-swbf2-linux.sh
Run after completing step 1 below.
Manual steps
1. Trigger Wine prefix creation
Launch SWBF2 from Steam. Wait approximately 10 seconds. You will see an "Origin is not installed" error — this is expected. Close it.
Verify the MSI appeared:
ls -lh ~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi
Expected: approximately 227 MB.
2. Extract EA Desktop files
mkdir -p /tmp/ea_app_extracted
msiextract -C /tmp/ea_app_extracted \
~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi
3. Copy EA Desktop files into the Wine prefix
PFX_C=~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c
EA_DEST_BASE="$PFX_C/Program Files/Electronic Arts/EA Desktop"
SYMLINK_TARGET=$(readlink "$EA_DEST_BASE/EA Desktop" 2>/dev/null || echo "14.2.0.3345")
mkdir -p "$EA_DEST_BASE/$SYMLINK_TARGET"
cp -r "/tmp/ea_app_extracted/Electronic Arts/EA Desktop/EA Desktop/." \
"$EA_DEST_BASE/$SYMLINK_TARGET/"
rm -f "$EA_DEST_BASE/EA Desktop"
ln -sf "$SYMLINK_TARGET" "$EA_DEST_BASE/EA Desktop"
# Verify
find "$EA_DEST_BASE" -name "Link2EA.exe"
4. Write registry fix files to drive_c
PFX_C=~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c
cat > "$PFX_C/link2ea_fix.reg" << 'EOF'
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\link2ea]
@="URL:link2ea Protocol"
"URL Protocol"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\link2ea\shell\open\command]
@="\"C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\Link2EA.exe\" \"%1\""
EOF
cat > "$PFX_C/ea_services.reg" << 'EOF'
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EALocalHostSvc]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"="C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\EALocalHostSvc.exe"
"DisplayName"="EA Local Host Service"
"ObjectName"="LocalSystem"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EABackgroundService]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"="C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\EABackgroundService.exe"
"DisplayName"="EA Background Service"
"ObjectName"="LocalSystem"
EOF
5. Write the launch wrapper
mkdir -p ~/.local/bin
cat > ~/.local/bin/ea_install.sh << 'EOF'
#!/bin/bash
echo "=== launch $(date) ===" >> /tmp/ea_install.log
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" regedit /S "C:\\link2ea_fix.reg"
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" regedit /S "C:\\ea_services.reg"
exec "$@"
EOF
chmod +x ~/.local/bin/ea_install.sh
6. Set Steam launch options
In Steam: right-click SWBF2 → Properties → Launch Options, enter:
~/.local/bin/ea_install.sh %command%
Alternatively, set it from the terminal. Close Steam first, then:
STEAM_UID=$(ls ~/.steam/steam/userdata/ | head -1)
CFG=~/.steam/steam/userdata/$STEAM_UID/config/localconfig.vdf
python3 - "$CFG" << 'PYEOF'
import sys, re, os
path = sys.argv[1]
opt = os.path.expanduser('~/.local/bin/ea_install.sh') + ' %command%'
with open(path) as f:
content = f.read()
new = re.sub(r'("1237950".*?"LaunchOptions"\s*)"[^"]*"', rf'\1"{opt}"', content, flags=re.DOTALL)
if new == content:
new = re.sub(r'("1237950"\s*\n\s*\{)', rf'\1\n\t\t\t\t"LaunchOptions"\t\t"{opt}"', content)
with open(path, 'w') as f:
f.write(new)
print("Done")
PYEOF
7. Launch the game
- Launch SWBF2 from Steam
- Let Vulkan shaders compile on first run — do not skip
- EA App authenticates via your linked Steam/EA account
- Game loads
Wolf / Games-on-Whales + Moonlight
Prerequisites (Wolf)
- Wolf is running and Steam is open in a Moonlight session
- In Steam (via Moonlight): SWBF2 → Properties → Compatibility → Force GE-Proton10-34 (the setup script installs GE-Proton10-34 into the container automatically if not present)
Automated setup
If you are using the ubuntu-post-install framework:
cd ~/docker/wolf
./manage.sh setup-swbf2
Run this after completing step 1 below. The script handles steps 2–6 automatically.
Manual steps
1. Trigger Wine prefix creation
Launch SWBF2 from Moonlight. Wait approximately 10 seconds. You will see an "Origin is not installed" error — this is expected. Close it and return to the terminal.
Verify the MSI appeared in the Wine prefix:
WOLF_CONTAINER=$(docker ps --format '{{.Names}}' | grep WolfSteam | head -1)
docker exec "$WOLF_CONTAINER" ls -lh \
/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi
Expected: approximately 227 MB.
2. Extract EA Desktop files on the host
WOLF_CONTAINER=$(docker ps --format '{{.Names}}' | grep WolfSteam | head -1)
docker cp \
"$WOLF_CONTAINER:/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi" \
/tmp/ea_app.msi
mkdir -p /tmp/ea_app_extracted
msiextract -C /tmp/ea_app_extracted /tmp/ea_app.msi
3. Copy EA Desktop files into the Wine prefix
SYMLINK_TARGET=$(docker exec "$WOLF_CONTAINER" readlink \
"/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/Program Files/Electronic Arts/EA Desktop/EA Desktop" \
2>/dev/null || echo "14.2.0.3345")
PFXBASE="/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/Program Files/Electronic Arts/EA Desktop"
docker exec "$WOLF_CONTAINER" bash -c "
rm -f '$PFXBASE/EA Desktop'
mkdir -p '$PFXBASE/$SYMLINK_TARGET'
ln -s '$SYMLINK_TARGET' '$PFXBASE/EA Desktop'
"
docker cp "/tmp/ea_app_extracted/Electronic Arts/EA Desktop/EA Desktop/." \
"$WOLF_CONTAINER:$PFXBASE/$SYMLINK_TARGET/"
# Verify
docker exec "$WOLF_CONTAINER" find "$PFXBASE" -name "Link2EA.exe"
4. Write registry fix files to drive_c
These files are imported into the Wine registry on every launch by the wrapper script. Storing them in drive_c ensures they survive wineserver restarts.
PFXC="$WOLF_CONTAINER:/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c"
cat > /tmp/link2ea_fix.reg << 'EOF'
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\link2ea]
@="URL:link2ea Protocol"
"URL Protocol"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\link2ea\shell\open\command]
@="\"C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\Link2EA.exe\" \"%1\""
EOF
cat > /tmp/ea_services.reg << 'EOF'
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EALocalHostSvc]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"="C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\EALocalHostSvc.exe"
"DisplayName"="EA Local Host Service"
"ObjectName"="LocalSystem"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EABackgroundService]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"="C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\EABackgroundService.exe"
"DisplayName"="EA Background Service"
"ObjectName"="LocalSystem"
EOF
docker cp /tmp/link2ea_fix.reg "$PFXC/link2ea_fix.reg"
docker cp /tmp/ea_services.reg "$PFXC/ea_services.reg"
5. Write the launch wrapper
cat > /tmp/ea_install.sh << 'EOF'
#!/bin/bash
echo "=== launch $(date) ===" >> /tmp/ea_install.log
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" regedit /S "C:\\link2ea_fix.reg"
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" regedit /S "C:\\ea_services.reg"
exec "$@"
EOF
chmod +x /tmp/ea_install.sh
docker cp /tmp/ea_install.sh "$WOLF_CONTAINER":/home/retro/ea_install.sh
6. Set Steam launch options
Stop Steam so it flushes its current state before editing:
STEAM_UID=$(docker exec "$WOLF_CONTAINER" ls /home/retro/.steam/steam/userdata/)
CONFIG_DIR="/home/retro/.steam/steam/userdata/$STEAM_UID/config"
CONFIG_FILE="$CONFIG_DIR/localconfig.vdf"
docker exec "$WOLF_CONTAINER" pkill -f steam.sh || true
sleep 5
Edit localconfig.vdf to add the launch option for AppID 1237950:
docker exec "$WOLF_CONTAINER" python3 - "$CONFIG_FILE" << 'PYEOF'
import sys, re
path = sys.argv[1]
with open(path) as f:
content = f.read()
opt = 'STEAM_UNIX_SOCKET=/tmp/steam.sock /home/retro/ea_install.sh %command%'
new = re.sub(r'("1237950".*?"LaunchOptions"\s*)"[^"]*"', rf'\1"{opt}"', content, flags=re.DOTALL)
if new == content:
new = re.sub(r'("1237950"\s*\n\s*\{)', rf'\1\n\t\t\t\t"LaunchOptions"\t\t"{opt}"', content)
with open(path, 'w') as f:
f.write(new)
print("Done")
PYEOF
Lock the config directory so Steam cannot overwrite localconfig.vdf on shutdown:
docker exec "$WOLF_CONTAINER" chmod 555 "$CONFIG_DIR"
Verify:
docker exec "$WOLF_CONTAINER" grep -A3 '"1237950"' "$CONFIG_FILE" | grep -i launch
7. Launch the game
- Reconnect to Moonlight and launch SWBF2
- Let Vulkan shaders compile — do not skip; takes several minutes on first run only
- EA App authenticates via your linked Steam/EA account
- Game loads
Fresh install behaviour (Wolf)
| Component | Survives reinstall? | Notes |
|---|---|---|
| EA Desktop files in Wine prefix | No | Re-run setup after prefix is recreated |
| Registry fix files in drive_c | No | Re-run setup after prefix is recreated |
| Launch options in localconfig.vdf | No | Re-run setup after prefix is recreated |
| Config dir lock | No | Re-run setup after prefix is recreated |
| ea_app.msi | No | Requires one launch to reappear |
| EA account link | Yes | Stored on EA's servers |
| EA auth token | No | Requires one re-login after prefix deletion |
If the Wine prefix (compatdata/1237950/) is deleted, run the setup again from
step 1. To preserve credentials when moving to a new machine, back up the prefix:
tar -czf swbf2-prefix-backup.tar.gz \
/path/to/wolf-state/Steam/.steam/steam/steamapps/compatdata/1237950/
Troubleshooting
"Origin is not installed" popup
The wrapper did not run, or ran but regedit failed.
- Verify launch options are set: Steam → SWBF2 → Properties → Launch Options
- Check the wrapper log:
tail /tmp/ea_install.log
link2ea:// fails — game exits silently after a moment
link2ea_fix.reg was not imported. Confirm link2ea_fix.reg exists in drive_c
and the wrapper ran both regedit commands.
RPC_S_SERVER_UNAVAILABLE (0x800706ba) in Proton log
ea_services.reg was not imported or the service entries were not written
correctly. Check the wrapper log and confirm ea_services.reg exists in drive_c.
Game exits immediately, no popup, no log entry
The wrapper is not being called at all.
Wolf:
docker exec "$WOLF_CONTAINER" stat "$CONFIG_DIR" | grep Access
docker exec "$WOLF_CONTAINER" grep -A5 '"1237950"' "$CONFIG_FILE" | grep -i launch
Native:
stat ~/.steam/steam/userdata/*/config | grep Access
grep -A5 '"1237950"' ~/.steam/steam/userdata/*/config/localconfig.vdf | grep -i launch
Collecting logs after a failure
Wolf:
docker exec "$WOLF_CONTAINER" bash -c "
tail -20 /tmp/ea_install.log
echo '---'
grep -E '(err:|link2ea|origin|RPC)' /home/retro/steam-1237950.log | tail -20
"
Native:
tail /tmp/ea_install.log
grep -E '(err:|link2ea|origin|RPC)' ~/.steam/steam/logs/steam_1237950.log 2>/dev/null | tail -20
Key paths
Wolf (inside WolfSteam container)
| Path | Description |
|---|---|
/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/ |
SWBF2 Wine prefix |
/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi |
EA App MSI (~227 MB) |
/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/link2ea_fix.reg |
link2ea protocol handler |
/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_services.reg |
EA service registrations |
/home/retro/.steam/steam/userdata/<uid>/config/localconfig.vdf |
Steam launch options |
/home/retro/ea_install.sh |
Launch wrapper |
/tmp/ea_install.log |
Wrapper log (resets on container restart) |
Native Linux Steam
| Path | Description |
|---|---|
~/.steam/steam/steamapps/compatdata/1237950/pfx/ |
SWBF2 Wine prefix |
~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi |
EA App MSI (~227 MB) |
~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/link2ea_fix.reg |
link2ea protocol handler |
~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_services.reg |
EA service registrations |
~/.steam/steam/userdata/<uid>/config/localconfig.vdf |
Steam launch options |
~/.local/bin/ea_install.sh |
Launch wrapper |
/tmp/ea_install.log |
Wrapper log |