Linux的nfslock服务

http://home.lupaworld.com/home-space-uid-56821-do-blog-id-122091.html

 nfslock服务可以保证操作文件的完整性,程序通过/etc/init.d/nfslock中的daemon rpc.statd "$STATDARG"来运行.
也就是通过nice initlog -q -c rpc.statd来运行.


情况1,开启nfslock情况下:


步骤1)终端1 cat > test
test nfslock1
步骤2)终端2 cat > test
test nfslock2
步骤3)终端1 CTRL+D
步骤4)终端2 CTRL+D

result:
cat test
test nfslock1

结论:有nfslock服务的情况下,系统始终保证第一个打开文件操作的完整性.


情况2,关闭nfslock情况下:

进程向nfs文件写入数据
步骤1)终端1 cat > test
test nfslock1
步骤2)终端2 cat > test
test nfslock2
步骤3)终端1 CTRL+D
步骤4)终端2 CTRL+D

result:
cat test
test nfslock2

结论:没有nfslock服务的情况下,系统会用第二个文件写操作覆盖掉第一个文件.



. /etc/rc.d/init.d/functions            #加载funcation脚本,脚本里包括daemon及killproc等脚本函数

# Source networking configuration.
if [ ! -f /etc/sysconfig/network ]; then     #如果没有/etc/sysconfig/network文件,程序返回0,退出系统
    exit 0
fi


# Check for and source configuration file
[ -f /etc/sysconfig/nfs ] && . /etc/sysconfig/nfs    #如果有/etc/sysconfig/nfs文件,则执行

. /etc/sysconfig/network                        #执行/etc/sysconfig/network脚本,主要作用是当前任务中加入环境变量.如HOSTNAME,GATEWAY等

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0     #如果在当前任务中NETWORKING变量为"no",程序退出.这里的NETWORKING一般是在/etc/sysconfig/network中加载

# Start lockd from userland only if kernel <= 2.2.18
OS_RELEASE=`uname --release`      #提取当前系统的版本号,uname --release同uname -r,例如:OS_RELEASE=2.4.21
OS_RELEASE_MAJOR=`echo "$OS_RELEASE" | sed 's/\(^[0-9]\)\..*/\1/'`    #提取当前系统的主版本号,OS_RELEASE_MAJOR=2
OS_RELEASE_MINOR=`echo "$OS_RELEASE" | sed 's/\(^[0-9]\)\.\([0-9]*\)\..*/\2/'`  #提取当前系统的从版本号,OS_RELEASE_MINOR=4
OS_RELEASE_VERSION=`echo "$OS_RELEASE" | sed 's/\(^[0-9]\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'`    #提取当前系统的修订版本号,OS_RELEASE_VERSION=21


#当主版本号低于2,并且从版本号低于2,并且修订版本号低于18,USERLAND_LOCKD="yes"
#即低于2.2.18的版本内核,USERLAND_LOCK="yes",否则为空.
if [ "$OS_RELEASE_MAJOR" -le 2 -a "$OS_RELEASE_MINOR" -le 2 -a "$OS_RELEASE_VERSION" -le 18 ] ; then
    USERLAND_LOCKD="yes"
else
    USERLAND_LOCKD=
fi



#如果USERLAND_LOCK="yes",那么测试/sbin/rpc.lockd是否具有执行权限,如果没有执行权限,程序退出
if [ "$USERLAND_LOCKD" ] ; then
    [ -x /sbin/rpc.lockd ] || exit 0
fi


#如果/sbin/rpc.statd没有执行权限,那么程序退出
[ -x /sbin/rpc.statd ] || exit 0

#定义RETVAL变量,RETVAL在这里是退出返回的状态,默认为0
RETVAL=0
#如果STATD_HOSTNAME为空,STATDARG为空,否则STATDARG为STATD_HOSTNAME中的内容
if [ -n "${STATD_HOSTNAME}" ]; then
    STATDARG="-n ${STATD_HOSTNAME}"
else
    STATDARG=""
fi


start() {

#如果不存在/var/lock/subsys/nfslock文件,执行下面的脚本.
#/var/lock/subsys/nfslock是在每次启动nfslock中建立的,不存在这个文件说明还没有nfslock服务
    if [ ! -f /var/lock/subsys/nfslock ]; then
    # Start daemons.

        #如果USERLAND_LOCKD="yes",就是说内核版本低于2.2.18,执行daemon rpc.lockd,daemon函数是. /etc/rc.d/init.d/functions这条语句加载的
    if [ "$USERLAND_LOCKD" ]; then
      echo -n $"Starting NFS locking: "
      daemon rpc.lockd#
      echo
    fi

    #如果有定义STATD_PORT,则STATDARG="$STATDARG -p $STATD_PORT"
        #如果有定义STATD_OUTGOING_PORT,则STATDARG="$STATDARG -o $STATD_OUTGOING_PORT"
        #STATDARG即是daemon rpc.statd带入的参数
        echo -n $"Starting NFS statd: "
    # See if a statd's ports has been defined
    [ -n "$STATD_PORT" ] && STATDARG="$STATDARG -p $STATD_PORT"
    [ -n "$STATD_OUTGOING_PORT" ] \
        && STATDARG="$STATDARG -o $STATD_OUTGOING_PORT"
    daemon rpc.statd "$STATDARG"

        #将返回码赋值给RETVAL变量
    RETVAL=$?
    echo

        #如果daemon rpc.statd "$STATDARG"正确启动,并返回0,新建/var/lock/subsys/nfslock文件
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/nfslock
    fi

    返回$RETVAL给Shell
    return $RETVAL
}

你可能感兴趣的:(linux,职场,休闲,nfslock)