1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Copyright (c) 2005-2009 Wind River Systems, Inc. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun 8*4882a593Smuzhiyunusage() { 9*4882a593Smuzhiyun echo "Usage: $0 {start|stop|restart} <nfs-export-dir>" 10*4882a593Smuzhiyun} 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunif [ $# != 2 ]; then 13*4882a593Smuzhiyun usage 14*4882a593Smuzhiyun exit 1 15*4882a593Smuzhiyunfi 16*4882a593Smuzhiyun 17*4882a593Smuzhiyunif [[ "$1" != "start" && "$1" != "stop" && "$1" != "restart" ]]; then 18*4882a593Smuzhiyun echo "Unknown command '$1'" 19*4882a593Smuzhiyun usage 20*4882a593Smuzhiyun exit 1 21*4882a593Smuzhiyunfi 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunif [ ! -d "$2" ]; then 24*4882a593Smuzhiyun echo "Error: '$2' does not exist" 25*4882a593Smuzhiyun usage 26*4882a593Smuzhiyun exit 1 27*4882a593Smuzhiyunfi 28*4882a593Smuzhiyun# Ensure the nfs-export-dir is an absolute path 29*4882a593SmuzhiyunNFS_EXPORT_DIR=$(cd "$2" && pwd) 30*4882a593Smuzhiyun 31*4882a593SmuzhiyunSYSROOT_SETUP_SCRIPT=`which oe-find-native-sysroot 2> /dev/null` 32*4882a593Smuzhiyunif [ -z "$SYSROOT_SETUP_SCRIPT" ]; then 33*4882a593Smuzhiyun echo "Error: Unable to find the oe-find-native-sysroot script" 34*4882a593Smuzhiyun echo "Did you forget to source your build environment setup script?" 35*4882a593Smuzhiyun exit 1 36*4882a593Smuzhiyunfi 37*4882a593Smuzhiyun. $SYSROOT_SETUP_SCRIPT meta-ide-support 38*4882a593Smuzhiyun 39*4882a593Smuzhiyunif [ ! -e "$OECORE_NATIVE_SYSROOT/usr/bin/unfsd" ]; then 40*4882a593Smuzhiyun echo "Error: Unable to find unfsd binary in $OECORE_NATIVE_SYSROOT/usr/bin/" 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun if [ "x$OECORE_DISTRO_VERSION" = "x" ]; then 43*4882a593Smuzhiyun echo "Have you run 'bitbake meta-ide-support'?" 44*4882a593Smuzhiyun else 45*4882a593Smuzhiyun echo "This shouldn't happen - something is missing from your toolchain installation" 46*4882a593Smuzhiyun fi 47*4882a593Smuzhiyun exit 1 48*4882a593Smuzhiyunfi 49*4882a593Smuzhiyun 50*4882a593Smuzhiyunif [ ! -d ~/.runqemu-sdk ]; then 51*4882a593Smuzhiyun mkdir -p ~/.runqemu-sdk 52*4882a593Smuzhiyunfi 53*4882a593Smuzhiyun 54*4882a593SmuzhiyunNFS_INSTANCE=${NFS_INSTANCE:=0} 55*4882a593SmuzhiyunEXPORTS=~/.runqemu-sdk/exports$NFS_INSTANCE 56*4882a593SmuzhiyunRMTAB=~/.runqemu-sdk/rmtab$NFS_INSTANCE 57*4882a593SmuzhiyunNFSPID=~/.runqemu-sdk/nfs$NFS_INSTANCE.pid 58*4882a593SmuzhiyunMOUNTPID=~/.runqemu-sdk/mount$NFS_INSTANCE.pid 59*4882a593Smuzhiyun 60*4882a593SmuzhiyunPSEUDO_OPTS="-P $OECORE_NATIVE_SYSROOT/usr" 61*4882a593SmuzhiyunPSEUDO_LOCALSTATEDIR="$NFS_EXPORT_DIR/../$(basename $NFS_EXPORT_DIR).pseudo_state" 62*4882a593Smuzhiyunexport PSEUDO_LOCALSTATEDIR 63*4882a593Smuzhiyun 64*4882a593Smuzhiyunif [ ! -d "$PSEUDO_LOCALSTATEDIR" ]; then 65*4882a593Smuzhiyun echo "Error: $PSEUDO_LOCALSTATEDIR does not exist." 66*4882a593Smuzhiyun echo "Did you create the export directory using runqemu-extract-sdk?" 67*4882a593Smuzhiyun exit 1 68*4882a593Smuzhiyunfi 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun# NFS server port number 71*4882a593SmuzhiyunNFSD_PORT=${NFSD_PORT:=$[ 3049 + 2 * $NFS_INSTANCE ]} 72*4882a593Smuzhiyun# mountd port number 73*4882a593SmuzhiyunMOUNTD_PORT=${MOUNTD_PORT:=$[ 3048 + 2 * $NFS_INSTANCE ]} 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun## For debugging you would additionally add 76*4882a593Smuzhiyun## --debug all 77*4882a593SmuzhiyunUNFSD_OPTS="-p -N -i $NFSPID -e $EXPORTS -n $NFSD_PORT -m $MOUNTD_PORT" 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun# See how we were called. 80*4882a593Smuzhiyuncase "$1" in 81*4882a593Smuzhiyun start) 82*4882a593Smuzhiyun PORTMAP_RUNNING=`ps -ef | grep portmap | grep -v grep` 83*4882a593Smuzhiyun RPCBIND_RUNNING=`ps -ef | grep rpcbind | grep -v grep` 84*4882a593Smuzhiyun if [[ "x$PORTMAP_RUNNING" = "x" && "x$RPCBIND_RUNNING" = "x" ]]; then 85*4882a593Smuzhiyun echo "=======================================================" 86*4882a593Smuzhiyun echo "Error: neither rpcbind nor portmap appear to be running" 87*4882a593Smuzhiyun echo "Please install and start one of these services first" 88*4882a593Smuzhiyun echo "=======================================================" 89*4882a593Smuzhiyun echo "Tip: for recent Ubuntu hosts, run:" 90*4882a593Smuzhiyun echo " sudo apt-get install rpcbind" 91*4882a593Smuzhiyun echo "Then add OPTIONS=\"-i -w\" to /etc/default/rpcbind and run" 92*4882a593Smuzhiyun echo " sudo service portmap restart" 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun exit 1 95*4882a593Smuzhiyun fi 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun echo "Creating exports file..." 98*4882a593Smuzhiyun echo "$NFS_EXPORT_DIR (rw,no_root_squash,no_all_squash,insecure)" > $EXPORTS 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun echo "Starting User Mode nfsd" 101*4882a593Smuzhiyun echo " $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/bin/unfsd $UNFSD_OPTS" 102*4882a593Smuzhiyun $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/bin/unfsd $UNFSD_OPTS 103*4882a593Smuzhiyun if [ ! $? = 0 ]; then 104*4882a593Smuzhiyun echo "Error starting nfsd" 105*4882a593Smuzhiyun exit 1 106*4882a593Smuzhiyun fi 107*4882a593Smuzhiyun # Check to make sure everything started ok. 108*4882a593Smuzhiyun if [ ! -f $NFSPID ]; then 109*4882a593Smuzhiyun echo "rpc.nfsd did not start correctly" 110*4882a593Smuzhiyun exit 1 111*4882a593Smuzhiyun fi 112*4882a593Smuzhiyun ps -fp `cat $NFSPID` > /dev/null 2> /dev/null 113*4882a593Smuzhiyun if [ ! $? = 0 ]; then 114*4882a593Smuzhiyun echo "rpc.nfsd did not start correctly" 115*4882a593Smuzhiyun exit 1 116*4882a593Smuzhiyun fi 117*4882a593Smuzhiyun echo " " 118*4882a593Smuzhiyun echo "On your target please remember to add the following options for NFS" 119*4882a593Smuzhiyun echo "nfsroot=IP_ADDRESS:$NFS_EXPORT_DIR,nfsvers=3,port=$NFSD_PORT,udp,mountport=$MOUNTD_PORT" 120*4882a593Smuzhiyun ;; 121*4882a593Smuzhiyun stop) 122*4882a593Smuzhiyun if [ -f "$NFSPID" ]; then 123*4882a593Smuzhiyun echo "Stopping rpc.nfsd" 124*4882a593Smuzhiyun kill `cat $NFSPID` 125*4882a593Smuzhiyun rm -f $NFSPID 126*4882a593Smuzhiyun else 127*4882a593Smuzhiyun echo "No PID file, not stopping rpc.nfsd" 128*4882a593Smuzhiyun fi 129*4882a593Smuzhiyun if [ -f "$EXPORTS" ]; then 130*4882a593Smuzhiyun echo "Removing exports file" 131*4882a593Smuzhiyun rm -f $EXPORTS 132*4882a593Smuzhiyun fi 133*4882a593Smuzhiyun ;; 134*4882a593Smuzhiyun restart) 135*4882a593Smuzhiyun $0 stop $NFS_EXPORT_DIR 136*4882a593Smuzhiyun $0 start $NFS_EXPORT_DIR 137*4882a593Smuzhiyun if [ ! $? = 0 ]; then 138*4882a593Smuzhiyun exit 1 139*4882a593Smuzhiyun fi 140*4882a593Smuzhiyun ;; 141*4882a593Smuzhiyun *) 142*4882a593Smuzhiyun echo "$0 {start|stop|restart} <nfs-export-dir>" 143*4882a593Smuzhiyun ;; 144*4882a593Smuzhiyunesac 145*4882a593Smuzhiyun 146*4882a593Smuzhiyunexit 0 147