229 lines
13 KiB
Markdown
229 lines
13 KiB
Markdown
# misternfs
|
|
NFS support for MiSTer. This repository contains supporting scripts for use once the
|
|
MiSTer's Linux kernel gets NFS client support compiled in.
|
|
|
|
The script is based off the CIFS scripts already present in the project and modifications
|
|
as made by misterfpga.org user RealLarry.
|
|
|
|
The purpose of this repository is to eventually disappear so that the script can be adopted
|
|
into the mainline MiSTer project and live on there.
|
|
|
|
## Installing the script
|
|
|
|
Place the ```nfs_mount.sh``` and ```nfs_unmount.sh``` scripts inside your MiSTer's ```/media/fat/Scripts```
|
|
directory. You can run it from there through the OSD or from a (remote) Linux shell as you see fit.
|
|
|
|
## What it does: ..here be dragons
|
|
|
|
These two scripts do what they say on the box: mount and unmount your NFS-provided network storage. When
|
|
the sanity checks work out, the actual mount works as follows.
|
|
|
|
1. The script mounts your ```SERVER_PATH``` onto ```/tmp/nfs_mount``` on your MiSTer.
|
|
2. It then looks for directories inside your ```/tmp/nfs_mount``` and compares them to the directories
|
|
you have in ```/media/fat```.
|
|
3. If it finds directories that appear in both location, the NFS-version gets mounted on top of the
|
|
existing directory in ```/media/fat```.
|
|
|
|
### Wait.. what!?
|
|
|
|
Let's say you have a directory on your NAS named ```/storage/MiSTer``` that you export over NFS, then
|
|
that will end up mounted at ```/tmp/nfs_mount``` on your MiSTer and that will be that if it's empty.
|
|
|
|
If you have a ```games``` directory *inside* your ```/storage/MiSTer``` on the NAS, then the script will
|
|
pick up on that. If and *only* if you *also* have an pre-existing ```/media/fat/games``` directory, the
|
|
remote version will be mounted *on top of* your existing ```/media/fat/games```.
|
|
|
|
This goes for any and all directories that appear in *both* places at the time time script runs, which is once
|
|
at system boot and/or on demand when you run it from a shell or the MiSTer's OSD.
|
|
|
|
This trick permits you to keep your cores on the SD-card by not having ```/media/fat/_Arcade``` etc. on
|
|
your NAS. If it's not found on your NAS, then the directory won't be overlaid with anything and just left
|
|
alone as-is on your SD-card.
|
|
|
|
You can use this to keep a small-ish ```/media/fat/games``` directory on your SD-card for portable gaming fun,
|
|
while having the entire history of retrogaming and a plethora of Windows 95 installations on your NAS at home
|
|
by overlaying ```/media/fat/games``` via NFS.
|
|
|
|
## Configuration
|
|
|
|
The preferred method for configuring the script is through an INI file that sits in the same
|
|
directory as the main script itself and is named ```nfs_mount.ini```. In this file you can
|
|
define a number of variables of which ```SERVER``` and ```SERVER_PATH``` are mandatory.
|
|
|
|
| Variable name | Default | Description |
|
|
|----------------|-----------|-------------|
|
|
| SERVER | Undefined | DNS-name or IP-address of your NFS-server. |
|
|
| SERVER_PATH | Undefined | The remote directory to mount onto your MiSTer. |
|
|
| SERVER_TIMEOUT | 60 | Number of seconds to wait for both IP-connectivity and the NFS-server to become reachable. |
|
|
| MOUNT_AT_BOOT | yes | Set to "yes" if you want this script to run at every startup of your MiSTer. |
|
|
| MOUNT_OPTIONS | "noatime" | Client-side mount options for your NFS-mount. |
|
|
| WOL | "no | WakeOnLAN: set to "yes" to send a wake-up packet to your NFS-server to wake it up. |
|
|
|
|
An example for the contents of a valid INI file would be:
|
|
|
|
```
|
|
SERVER="192.168.0.4"
|
|
SERVER_PATH="/storage/mister"
|
|
MOUNT_AT_BOOT="yes"
|
|
MOUNT_OPTIONS="noatime,ro"
|
|
```
|
|
|
|
This example would try to mount the ```/storage/mister``` path from a server that lives at
|
|
IP-address ```192.168.0.4```. It'd install scripts to run at every boot and the MOUNT_OPTIONS
|
|
mount the directory as read-only (see below).
|
|
|
|
You can also modify the script itself, but that'll get clobbered when you update the script.
|
|
Using an INI file keeps the script and its configuration separate, which is good practice.
|
|
|
|
Just to be 100% clear here: you *must* define ```SERVER``` and ```SERVER_PATH``` yourself. The other
|
|
variables all have sensible defaults set.
|
|
|
|
## Troubleshooting
|
|
|
|
This script is entirely silent on the MiSTer's console. For troubleshooting, have a look at the syslog file in
|
|
```/var/log/messages```. The script logs status messages there.
|
|
|
|
## Concerning NFS: more dragons
|
|
|
|
The NFS protocol is ancient and it was conceived in the days of big-iron UNIX machines in
|
|
well-tended datacenters where grey-haired veteran geeks would carefully nurture, cultivate
|
|
and sacrifice the occasional goat to them. This is quite a different backdrop from a retro
|
|
computing appliance that simulates consumer devices which would habitually be turned off
|
|
and on again as legitimate troubleshooting steps without batting an eyelash.
|
|
|
|
### When to use NFS
|
|
|
|
Using the NFS protocol on your MiSTer allows you to use files that sit on your NAS or another
|
|
Linux/UNIX compatible device like a Raspberry Pi. The main advantage of NFS over all other options
|
|
is that it comes included with most Linux and other UNIX-like operating systems, unlike Samba for
|
|
example. NFS is also arguably more light-weight than Samba, which matters in case you're using an
|
|
old Raspberry Pi or similar board as a server. If you know and love UNIX, you'll feel more at home
|
|
with NFS than you do with Samba/CIFS.
|
|
|
|
### When not to use NFS
|
|
|
|
Don't use NFS if you don't already know what it is and have it running in your network. Really, it's
|
|
hardly worth the trouble and CIFS will service you just fine for your MiSTer needs. NFS should
|
|
be treated as an option for those who already know why they want to use it, which obviously includes
|
|
curious tinkerers. This is not a threat by any means, but do consider yourself warned.
|
|
|
|
## Potential issues
|
|
|
|
By virtue of being an old UNIX file-sharing protocol, you're exposing your MiSTer to the old world that
|
|
began with teletypes and punch cards. You'll need to be more careful with it than you'd be when using just
|
|
the plain local SD card or you'll run into issues that may seem hard to debug at first. Here's a few
|
|
pointers.
|
|
|
|
### Case sensitivity
|
|
|
|
MiSTer runs Linux, which is generally case-sensitive but not in the MiSTer's default case using just
|
|
the SD-card for storage. The SD-card is formatted using exFAT, which is case-insensitive. NFS, on the
|
|
other hand, generally has a Linux/UNIX backing store which *does* care about case. This means that on
|
|
your SD-card ```NeoGeo``` and ```NEOGEO``` are the same thing, while they're quite distinct via NFS.
|
|
|
|
Ensure that you test your update scripts etc. carefully before moving your stuff over to an NFS-based
|
|
network share.
|
|
|
|
### Mounting NFS may take a while
|
|
|
|
The ```SERVER_TIMEOUT``` value is used in two places, accumulating to a total timeout value of twice the number
|
|
of seconds you define for it. By default this means it can take up to two minutes for your MiSTer to have NFS
|
|
mounted and ready to go. These timeouts are *not blocking* to the rest of the system's startup process, so you
|
|
may get some glitchy behavior there if you have overlapping directories with differing contents. The contents
|
|
of the ```/media/fat``` hierarchy may suddenly appear different from how it after NFS gets mounted.
|
|
|
|
The mount should take hardly any time at all if your NFS-server is already up before you start your MiSTer,
|
|
but you could be in for a surprise if you're using the ```WOL``` flag for instance and your NFS-server needs
|
|
to boot up while your MiSTer proceeds to load from its SD-card. This is an advanced use case, so don't try
|
|
this if you're not comfortable with it.. or open a thread on the MiSTerFPGA.org forum and aks for guidance.
|
|
|
|
|
|
### Can't write to my network share
|
|
|
|
The MiSTer device runs everything as the ```root``` user. This is perfectly valid for an appliance
|
|
that has no concept of security contexts within its own operating system. For all intents and purposes,
|
|
the MiSTer doesn't concern itself with permissions: root can always do everything it wants, which is
|
|
the user-friendly option for a device like this.
|
|
|
|
NFS, by default, is not that forgiving because it was born in big datacenters where the resident
|
|
greybeards did care passionately about who could do what to their precious files. By virtue of
|
|
this, the default for NFS servers is to tell the MiSTer's ```root``` user to go play a fiddle
|
|
in a field somewhere instead of trying to write to the server's files as ```root``` no less.
|
|
|
|
MiSTer's ```root``` user will be mapped to the server's ```nobody``` user by default, which will most
|
|
likely mean a world of pain for MiSTer users: you can hardly access anything, let alone write to any
|
|
files from your MiSTer.
|
|
|
|
In order to change this, you can do one of generally two things:
|
|
|
|
- Adjust the ```/etc/exports``` file on your server so that ```root``` on a client gets mapped to
|
|
```root``` on the server as well. All NFS-servers are different so there's no one-size-fits-all
|
|
recipe to give for this. Consult the manual for your specific NFS-server of NAS device. Look for
|
|
terms like 'maproot' or 'root squash'.
|
|
- Look up the specific user and group that ```root``` gets mapped to and change the permissions on
|
|
your server's file system so that this mapped user, usually ```nobody```, is allowed the proper
|
|
access to both files and directories.
|
|
|
|
## Still can't write to my network share
|
|
|
|
Your server may have exported the directory itself as read-only. In that case the NFS-server will go
|
|
full-on Gandalf at your MiSTer: you shall not pass, not even if you are ```root```. Have a good look
|
|
at your ```/etc/exports``` file on the server, look for ```ro``` in the export definiton of the path
|
|
you are trying to mount and get rid of it.
|
|
|
|
## Can't write to this particular file
|
|
|
|
What if all files are fine except this one file or directory? That's almost always a permissions issue
|
|
combined with the ```root``` user being mapped to something else on the server. The files that refuse
|
|
to play ball are generally owned by the wrong user on the server's side, or they have the wrong
|
|
permissions set on them.
|
|
|
|
You're dealing with the dark underbelly of the 1970's world of UNIX here. Learn it, it's fun! Or use
|
|
something like a USB-drive or a bigger SD-card instead.
|
|
|
|
## Combinations with USB and CIFS storage
|
|
|
|
MiSTer provides alternative options for storage next to NFS. At the time of this writing, these options
|
|
have not been unified into any kind of Grand Unifying Storage Architecture for the MiSTer so this is
|
|
the observed behavior from initial testing.
|
|
|
|
USB trumps everything. When you attach USB-storage, its contents get overlaid onto everything else
|
|
including CIFS and NFS storage options.
|
|
|
|
CIFS and NFS do coexist fairly peacefully since they both have different mechanics of exposing their
|
|
contents to the user. The NFS-script overlays the NFS mounts onto the existing structures on the SD-card,
|
|
while CIFS exposes its own ```cifs``` directory which the cores prefer when they detect it, giving you
|
|
the option of navigating to the SD-card directory structures that sit alongside it.
|
|
|
|
At this point in time, these items are simply facts of life. If/when NFS sees any significat uptake it'd
|
|
probably be a good idea to unify alternative storage options into a predictable mechanism. For now the
|
|
user should note that these differences exist.
|
|
|
|
## General wonkiness after turning my MiSTer off
|
|
|
|
As mentioned before, NFS comes from datacenters where one does not simply power off a machine. NFS
|
|
was designed against a background of sysadmins knowing what they're doing and performing a clean
|
|
shutdown at the end of their session.
|
|
|
|
MiSTer, on the other hand, is an appliance. The computers it simulates have no notion of a clean
|
|
shutdown procedure. Back in the 1980's we just flipped the switch and that was it.
|
|
|
|
While the NFS-server will survive if you do this, chances are that some wonky behaviour ensues if
|
|
you turn it back on again very quickly. NFS simply wasn't made with this usage pattern in mind and
|
|
any problems have to do with files being "open" from the server's perspective and remaining that way
|
|
in the face of the client simply falling off the face of the planet.
|
|
|
|
These dangling references don't happen very often, but they do happen and they can corrupt any files
|
|
that *the NFS-server* thinks you were still writing to when you turned your MiSTer off.
|
|
|
|
You can prevent this whole issue from occurring by only using read-only mounts, which is perfectly
|
|
fine for immutable things like arcade ROM's and the like. It won't go over very well for hard disk
|
|
images for cores like PCXT/AO486 or Amiga. Those simulated machines expect their drives to be
|
|
writable at all times and things get hairy if they're not.
|
|
|
|
This is a fact of life when using a datacenter protocol with an appliance and will also happen if
|
|
you rudely hang up a CIFS server, so there's no real recourse against this. You really should always
|
|
call the ```nfs_unmount.sh``` script from the ```Scripts``` folder before shutting down your MiSTer.
|
|
The ```MOUNT_AT_BOOT``` flag installs a script that cleanly unmounts your NFS share upon clean
|
|
system shutdown. The main problem with that is that clean system shutdowns are so rare on MiSTer.
|