Sometimes companies have multiple file servers/shares
they want to have mounted up on boot of their OSX machines.
The following shows a boot script for OSX that uses subroutines
to handle the details of mounting, to make it easier to manage
multiple mounts, so that there's just one mount command per line, eg:
Mount 192.168.1.2:/jobs /net/jobs "intr,bg,resvport,vers=3"
Mount 192.168.1.3:/Volumes/Prod1 /net/prod1 "intr,bg,tcp,vers=3"
Mount 192.168.1.3:/Volumes/Prod2 /net/prod2 "intr,bg,tcp,vers=3"
Mount 192.168.1.3:/Volumes/Prod3 /net/prod3 "intr,bg,tcp,vers=3"
This is better for multiple mounts than the previous examples
I posted last year, where to mount multiple servers you needed
to have a paragraph of code for each mount, c.f.
http://seriss.com/cgi-bin/rush/newsgroup-threaded.cgi?-view+1710+1710+1731+1783
Use of IP addresses is recommended in place of hostnames
when specifying mounts, as DNS is often unstable during
the boot process.
The following describes how to create and install this boot script.
Once working, the script can be copied to all your OSX machines to
ensure each boots up with the same mounting scheme.
* * *
1) Login as root, create a boot script directory called "MountFileServers":
mkdir -m 755 /Library/StartupItems/MountFileServers
chown 0:0 /Library/StartupItems/MountFileServers
It's important the perms are 755 and owned by root/wheel, as shown.
2) 'cd' into that directory and create a "StartupParameters.plist" file:
with the perms carefully set to 644 and owned by root/wheel:
cd /Library/StartupItems/MountFileServers
touch StartupParameters.plist
chown 0:0 StartupParameters.plist
chmod 644 StartupParameters.plist
vi StartupParameters.plist
Here's what to paste into that file (leave out the 'snip' lines!).
--------------------------------------------------------- snip
{
Description = "Mounts the File Servers";
Provides = ("MountFileServers");
Requires = ("Network", "System Log", "Resolver");
OrderPreference = "Last";
Messages =
{
start = "Mounting local file server";
stop = "Unmounting local file server";
};
}
--------------------------------------------------------- snip
3) While you're in that same directory, create an executable
script called "MountFileServers", with the perms 755, root/wheel:
cd /Library/StartupItems/MountFileServers
touch MountFileServers
chown 0:0 MountFileServers
chmod 755 MountFileServers
vi MountFileServers
What follows is the contents of the "MountFileServers" script.
Be sure to customize the "Mount" and "Umount" lines to suit your environment.
When specifying mounts, it's best to use IP addresses instead of
hostnames, as DNS lookups might not be fully operational at boot time, eg:
Mount helium:/jobs /net/jobs "intr,bg" # BAD
^^^^^^
Mount 192.168.0.2:/jobs /net/jobs "intr,bg" # GOOD
^^^^^^^^^^^
Here's the script:
--------------------------------------------------------- snip
#!/bin/sh
###
### Mount File Servers -- Set up local mounts for our file server
###
### Save this file as /Library/StartupItems/MountFileServers/MountFileServers
### and make sure the files/dirs are owned by root/wheel and modes are 755
### (rwx-r-xr-x).
###
### 05/27/2009 erco@(email surpressed)
###
# SUBROUTINE: MOUNT A REMOTE DRIVE
#
# NOTE: Use ip addresses in the remote device name, do NOT use hostnames.
# This avoids assuming DNS fully operational during boot.
# Often DNS is unstable during boot, even with boot dependencies.
#
Mount()
{
remdrive="$1" # $1 -- the remote drive, eg. "192.168.1.10:/jobs"
localdir="$2" # $2 -- local mount point, eg. "/net/jobs"
nfsflags="$3" # $3 -- nfs flags, eg. "rw,intr,bg,vers=3"
# ENSURE MOUNT POINT EXISTS
if [ ! -d "$localdir" ]; then
$LOGGER "Creating mount point $localdir"
mkdir -p -m 755 "$localdir"
fi
# ALREADY MOUNTED? DONT MOUNT TWICE
if mount | grep -q "$localdir"; then
$LOGGER "$localdir already mounted"
else
$LOGGER "Mounting '$remdrive' on '$localdir'"
( mount -t nfs -o "$nfsflags" "$remdrive" "$localdir" ) 2>&1 | $LOGGER
fi
}
# SUBROUTINE: UNMOUNT THE SPECIFIED DRIVE
Umount()
{
localdir="$1" # $1 -- local mount point, eg. "/net/jobs"
$LOGGER "Un-mounting '$localdir'"
umount "$localdir" 2>&1 | $LOGGER
}
###
### MAIN
###
if [ -x /etc/rc.common ]; then . /etc/rc.common; fi
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/libexec
if [ "`tty`" = "not a tty" ]; then LOGGER="logger -t MountFileServers"
else LOGGER="logger -s -t MountFileServers"; fi
# Handle stop/start/restart
ARG1=${1:-start} # assume 'start' if unset
case "$ARG1" in
start)
### MOUNT ALL SERVERS ON BOOT
Mount 192.168.1.2:/jobs /net/jobs "intr,bg,resvport,vers=3" # LINUX
Mount 192.168.1.3:/Volumes/Prod1 /net/prod1 "intr,bg,tcp,vers=3" # OSX/TCP
Mount 192.168.1.3:/Volumes/Prod2 /net/prod2 "intr,bg,tcp,vers=3" # OSX/TCP
Mount 192.168.1.3:/Volumes/Prod3 /net/prod3 "intr,bg,tcp,vers=3" # OSX/TCP
Mount 192.168.1.3:/Volumes/STOCK /net/stock "intr,bg,tcp,vers=3" # OSX/TCP
Mount 192.168.1.4:/Volumes/admin /net/admin "intr,bg,vers=3" # OSX
Mount 192.168.1.4:/Volumes/personal /net/personal "intr,bg,vers=3" # OSX
;;
stop)
### UN-MOUNT ALL SERVERS ON SHUTDOWN
Umount /net/jobs
Umount /net/prod1
Umount /net/prod2
Umount /net/prod3
Umount /net/stock
Umount /net/admin
Umount /net/personal
;;
restart)
$0 stop
$0 start
;;
*)
echo "usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
--------------------------------------------------------- snip
4) Now configure Rush to start *after* your mount script.
Edit the Rush boot file /Library/StartupItems/Rush/StartupParameters.plist:
vi /Library/StartupItems/Rush/StartupParameters.plist
..then find the line that reads:
Requires = ("Network", "System Log", "Resolver");
..and add "MountFileServer" to the list, so that it now reads:
Requires = ("Network", "System Log", "Resolver", "MountFileServers");
Be sure to include the extra comma, so that the syntax is consistent.
5) That's it.
You can test if the script works by running it as root
from your terminal with the start/stop options.
To test the script to see that it mounts properly:
/Library/StartupItems/MountFileServers/MountFileServers start
..and to test that it unmounts properly, run:
/Library/StartupItems/MountFileServers/MountFileServers stop
After each command, run 'mount' to verify the mounts appear
and disappear correctly.
Once working, test by actually rebooting the machine,
and when you get a login, check the /var/log/system.log
to make sure there are no errors, eg:
grep MountFileServers /var/log/system.log
This is where any errors from your mount commands will appear,
if there are any.
Then you can install the boot script directory on the other
OSX machines with a simple scp command, eg:
scp -rp /Library/StartupItems/MountFileServers HOST1:/Library/StartupItems/MountFileServers
scp -rp /Library/StartupItems/MountFileServers HOST2:/Library/StartupItems/MountFileServers
...etc..
If you modified the Rush StartupParameters.plist file, you'll want to
copy that change to the network as well:
scp -p /Library/StartupItems/Rush/StartupParameters.plist HOST1:/Library/StartupItems/Rush/
scp -p /Library/StartupItems/Rush/StartupParameters.plist HOST2:/Library/StartupItems/Rush/
...etc..
Replace "HOST1" and "HOST2" with the remote hostnames.
[The above has been tested to work equally well on Tiger (10.4),
Leopard (10.5), Snow Leopard (10.6), Lion (10.7).. -erco 07/11/12]
|