Steam deck, Automount Network Share Library in Gamemode - eviltoast

https://pixelfed.de/p/cammelspit/657887422594974310

After using my Steam Deck for over a year, I had an idea regarding network storage when I was installing Emu Deck. Despite the portability of the Steam Deck, I wanted to mount ROMs, Media, and even a Steam Library from a network-attached storage (NAS) device at home.

Recently, due to health reasons, I find myself bed-bound, making the Steam Deck a great companion. However, It’s storage options are rather limited so I attempted to find a solution.

I faced challenges due to SteamOS’s immutable file system. To overcome these I explored using NFS shares for a Steam Library, as Samba shares had limitations and wouldnt work on Linux for a Steam Library. Mounting NFS shares worked as long as i used a specific option to make the files executable.

To automate this process I created a systemd service that loads on boot, triggering a script to mount the shares. However, SteamOS’s immutable file system posed challenges for typical auto-start methods like the KDE autostart tool and especially fstab.

The key was leveraging the service that loads even in in gamemode so you wont have to do anything manually, not even switch to desktop mode at all. The solution involved that service checking network connectivity before mounting the shares. This ensures the script doesn’t run before the wifi comes up, if it has no connectivity it rechecks every 30 seconds for connectivity until it does. Once this happens, the mount script itself is run. On a wired connectionwhile docked the mount is ready before Steam even loads for me so this hasnt been an issue but I felt it was a problem i needed to solve before putting it into production.

I’ve shared the service file and script as well as a handy script that I used to unmount those same shares during testing, noting that hard-coded paths will need to be modified. The script also logs successful and unsuccessful mounts for debugging but i liked the feature so i left it. Although not the final version, it offers a functional solution for now.

If you use Unraid, the script includes paths relevant to its shares. Server IP, share list, and mount points Will need to be modified to fit your needs or it likely won’t work. The script lacks support for authenticated shares, but it persists between reboots and has shown reliability in my testing. I also realize that the script is basically just dumped on my desktop, that’s where I created it and the pads are hard coded and I just don’t care to change it so if you want it somewhere else you’re going to have to do that alteration yourself.

Feel free to modify it or share improved versions and above all, have fun!!

  1. netmount.sh
#!/bin/sh

NFS_SERVER=10.10.10.99
SHARE_PATH="/mnt/user"
SHARES=("Media" "Emulation" "Steam" "Downloads" "DUMPBOX" "isos" "NSFWMedia" "Software" "Tools")

# Set up log file
LOG_FILE="/home/deck/Desktop/netmount.log"

# Loop through the shares and mount each one with -o exec
for SHARE_NAME in "${SHARES[@]}"; do
  MOUNT_POINT="/home/deck/mounts/$SHARE_NAME"
  mkdir -p $MOUNT_POINT  # Create the mount point directory

  TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
  mount -t nfs -o exec $NFS_SERVER:$SHARE_PATH/$SHARE_NAME $MOUNT_POINT

  # Log the results with timestamps
  if [ $? -eq 0 ]; then
    echo "$TIMESTAMP: NFS share '$SHARE_NAME' mounted successfully at $MOUNT_POINT" >> $LOG_FILE
  else
    echo "$TIMESTAMP: Failed to mount NFS share '$SHARE_NAME'" >> $LOG_FILE
  fi
done
  1. unmount.sh
#!/bin/sh

# Unmount all NFS shares
for MOUNT_POINT in /home/deck/mounts/*; do
  umount $MOUNT_POINT
done

echo "All NFS shares unmounted."

  1. netmount.service
[Unit]
Description=Netmount Script at Boot
After=graphical.target

[Service]
Type=simple
ExecStart=/bin/sh -c 'for i in {1..20}; do ping -c 1 google.com && /home/deck/Desktop/netmount.sh && break || sleep 30; done'

[Install]
WantedBy=default.target

You can use these clean versions for your scripts and service file. Adjust paths and configurations as needed.

  • cammelspit@lemm.eeOP
    link
    fedilink
    arrow-up
    5
    ·
    10 months ago

    I actually did try that but I messed it up somehow and didn’t get it working. I then sawanexample similar to what I did here and since it seemed to work for them, I copied it. Would also be able to ping the NAS itself instead so you can not only confirm the network is up but also confirm the NAS is listening and replying properly. 100% sure there are better ways to do almost everything here but it was my first big win and I had to share. 😂

    • Lupec@lemm.ee
      link
      fedilink
      arrow-up
      4
      ·
      edit-2
      10 months ago

      That’s totally valid, just wanted to share my two cents from having messed with systemd a fair bit. At any rate, congrats, that’s a win for sure! :)