|  | #!/bin/bash | 
|  | # | 
|  | # Copyright (c) 2005-2009 Wind River Systems, Inc. | 
|  | # | 
|  | # This program is free software; you can redistribute it and/or modify | 
|  | # it under the terms of the GNU General Public License version 2 as | 
|  | # published by the Free Software Foundation. | 
|  | # | 
|  | # This program is distributed in the hope that it will be useful, | 
|  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | # See the GNU General Public License for more details. | 
|  | # | 
|  | # You should have received a copy of the GNU General Public License | 
|  | # along with this program; if not, write to the Free Software | 
|  | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 
|  |  | 
|  | usage() { | 
|  | echo "Usage: $0 {start|stop|restart} <nfs-export-dir>" | 
|  | } | 
|  |  | 
|  | if [ $# != 2 ]; then | 
|  | usage | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | if [[ "$1" != "start" && "$1" != "stop" && "$1" != "restart" ]]; then | 
|  | echo "Unknown command '$1'" | 
|  | usage | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | if [ ! -d "$2" ]; then | 
|  | echo "Error: '$2' does not exist" | 
|  | usage | 
|  | exit 1 | 
|  | fi | 
|  | # Ensure the nfs-export-dir is an absolute path | 
|  | NFS_EXPORT_DIR=$(cd "$2" && pwd) | 
|  |  | 
|  | SYSROOT_SETUP_SCRIPT=`which oe-find-native-sysroot 2> /dev/null` | 
|  | if [ -z "$SYSROOT_SETUP_SCRIPT" ]; then | 
|  | echo "Error: Unable to find the oe-find-native-sysroot script" | 
|  | echo "Did you forget to source your build environment setup script?" | 
|  | exit 1 | 
|  | fi | 
|  | . $SYSROOT_SETUP_SCRIPT | 
|  |  | 
|  | if [ ! -e "$OECORE_NATIVE_SYSROOT/usr/bin/unfsd" ]; then | 
|  | echo "Error: Unable to find unfsd binary in $OECORE_NATIVE_SYSROOT/usr/bin/" | 
|  |  | 
|  | if [ "x$OECORE_DISTRO_VERSION" = "x" ]; then | 
|  | echo "Have you run 'bitbake meta-ide-support'?" | 
|  | else | 
|  | echo "This shouldn't happen - something is missing from your toolchain installation" | 
|  | fi | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | if [ ! -d ~/.runqemu-sdk ]; then | 
|  | mkdir -p ~/.runqemu-sdk | 
|  | fi | 
|  |  | 
|  | NFS_INSTANCE=${NFS_INSTANCE:=0} | 
|  | EXPORTS=~/.runqemu-sdk/exports$NFS_INSTANCE | 
|  | RMTAB=~/.runqemu-sdk/rmtab$NFS_INSTANCE | 
|  | NFSPID=~/.runqemu-sdk/nfs$NFS_INSTANCE.pid | 
|  | MOUNTPID=~/.runqemu-sdk/mount$NFS_INSTANCE.pid | 
|  |  | 
|  | PSEUDO_OPTS="-P $OECORE_NATIVE_SYSROOT/usr" | 
|  | PSEUDO_LOCALSTATEDIR="$NFS_EXPORT_DIR/../$(basename $NFS_EXPORT_DIR).pseudo_state" | 
|  | export PSEUDO_LOCALSTATEDIR | 
|  |  | 
|  | if [ ! -d "$PSEUDO_LOCALSTATEDIR" ]; then | 
|  | echo "Error: $PSEUDO_LOCALSTATEDIR does not exist." | 
|  | echo "Did you create the export directory using runqemu-extract-sdk?" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | # rpc.mountd RPC port | 
|  | NFS_MOUNTPROG=$[ 21111 + $NFS_INSTANCE ] | 
|  | # rpc.nfsd RPC port | 
|  | NFS_NFSPROG=$[ 11111 + $NFS_INSTANCE ] | 
|  | # NFS port number | 
|  | NFS_PORT=$[ 3049 + 2 * $NFS_INSTANCE ] | 
|  | # mountd port number | 
|  | MOUNT_PORT=$[ 3048 + 2 * $NFS_INSTANCE ] | 
|  |  | 
|  | ## For debugging you would additionally add | 
|  | ## --debug all | 
|  | UNFSD_OPTS="-p -N -i $NFSPID -e $EXPORTS -x $NFS_NFSPROG -n $NFS_PORT -y $NFS_MOUNTPROG -m $MOUNT_PORT" | 
|  |  | 
|  | # Setup the exports file | 
|  | if [ "$1" = "start" ]; then | 
|  | echo "Creating exports file..." | 
|  | echo "$NFS_EXPORT_DIR (rw,async,no_root_squash,no_all_squash,insecure)" > $EXPORTS | 
|  | fi | 
|  |  | 
|  | # See how we were called. | 
|  | case "$1" in | 
|  | start) | 
|  | PORTMAP_RUNNING=`ps -ef | grep portmap | grep -v grep` | 
|  | RPCBIND_RUNNING=`ps -ef | grep rpcbind | grep -v grep` | 
|  | if [[ "x$PORTMAP_RUNNING" = "x" && "x$RPCBIND_RUNNING" = "x" ]]; then | 
|  | echo "=======================================================" | 
|  | echo "Error: neither rpcbind nor portmap appear to be running" | 
|  | echo "Please install and start one of these services first" | 
|  | echo "=======================================================" | 
|  | echo "Tip: for recent Ubuntu hosts, run:" | 
|  | echo "  sudo apt-get install rpcbind" | 
|  | echo "Then add OPTIONS=\"-i -w\"  to /etc/default/rpcbind and run" | 
|  | echo "  sudo service portmap restart" | 
|  |  | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | echo "Starting User Mode nfsd" | 
|  | echo "  $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/bin/unfsd $UNFSD_OPTS" | 
|  | $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/bin/unfsd $UNFSD_OPTS | 
|  | if [ ! $? = 0 ]; then | 
|  | echo "Error starting nfsd" | 
|  | exit 1 | 
|  | fi | 
|  | # Check to make sure everything started ok. | 
|  | if [ ! -f $NFSPID ]; then | 
|  | echo "rpc.nfsd did not start correctly" | 
|  | exit 1 | 
|  | fi | 
|  | ps -fp `cat $NFSPID` > /dev/null 2> /dev/null | 
|  | if [ ! $? = 0 ]; then | 
|  | echo "rpc.nfsd did not start correctly" | 
|  | exit 1 | 
|  | fi | 
|  | echo " " | 
|  | echo "On your target please remember to add the following options for NFS" | 
|  | echo "nfsroot=IP_ADDRESS:$NFS_EXPORT_DIR,nfsvers=3,port=$NFSD_PORT,mountprog=$MOUNTD_RPCPORT,nfsprog=$NFSD_RPCPORT,udp,mountport=$MOUNTD_PORT" | 
|  | ;; | 
|  | stop) | 
|  | if [ -f "$NFSPID" ]; then | 
|  | echo "Stopping rpc.nfsd" | 
|  | kill `cat $NFSPID` | 
|  | rm -f $NFSPID | 
|  | else | 
|  | echo "No PID file, not stopping rpc.nfsd" | 
|  | fi | 
|  | if [ -f "$EXPORTS" ]; then | 
|  | echo "Removing exports file" | 
|  | rm -f $EXPORTS | 
|  | fi | 
|  | ;; | 
|  | restart) | 
|  | $0 stop $NFS_EXPORT_DIR | 
|  | $0 start $NFS_EXPORT_DIR | 
|  | if [ ! $? = 0 ]; then | 
|  | exit 1 | 
|  | fi | 
|  | ;; | 
|  | *) | 
|  | echo "$0 {start|stop|restart} <nfs-export-dir>" | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | exit 0 |