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!!
- 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
- 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."
- 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.
CapillaryUpgrade@lemmy.sdf.org 9 months ago
This is really cool!
Where did you put the service file?
I don’t mean this as critique, but as possible next project, since your solution works perfectly fine. Systemd has some cool features that could make this project have a bit fewer moving parts:
That way you would end up with a .mount file per mounted directory, with logging using journald, and no external scripts.
I really like systemd as it can be a great tool, when you start to break down the complexity of it.
I hope you get well soon and get the best you can from this time.
cammelspit@lemm.ee 9 months ago
Frankly, you are probably right. I am pretty new to all thisandwhat I have here is basically just cobbled together from nonsense examples I scrounged up off the internet. What’s funny is, a good 20% of this I habe no idea how it works! Lol
Originally i was juat going to make the script simply a list of all my mount commands and not even post anything about it at all. I spent a good two days playing around with about a dozen different ideas on how to accomplish my goal until this one, the first that worked at all. But yeah, I have been doinh a lot of fun stuff since I officially dropped Windows entirely a few weeks ago and a lot of the inner workings of how Linux works in general is just starting to make sense to me.
Pretty much the Arch wiki and the Gentoo wiki alongwith copious amounts of google fu have become an all encompasing hobby of mine as of late. I’ll get there eventually. 😁
CapillaryUpgrade@lemmy.sdf.org 9 months ago
Don’t put yourself down! Using systemd wouldn’t make it work “better”, it’s just more “proper” (and a great tool to know in general!)
Great job and keep going!
lupec@lemm.ee 9 months ago
It sounds to me the target you’d want here is network-online.target, going by the info here
cammelspit@lemm.ee 9 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. 😂