Ubuntu8.04 和 8.10 NFS客户端 internal error BUG的解决[转]

在Ubuntu8.04和8.10下,NFS客户端有时会出现臭名昭著的”internal error” Bug。就是说,在用NFS客户机上mount server端的分区时,执行mount命令之后,会出现

mount.nfs: internal error

的错误。这个Bug出现时间地点不定,比如我同样的一台8.04服务器,其他机器都没有问题,自己的笔记本就出现这个问题。最关键的是,从去年下半年开始被报告,一直到8.10的推出,再到现在,这个bug居然都没有解决,要知道,这不是ubuntu本身的问题,在很早以前debian以及SUSE系就出现过这种问题了。而更糟糕的是,这个bug一点也不难解决。

这也是为什么Linux发展了这么久,还是没法吸引普通用户的原因吧。

好了,接下来阐述为什么还有一小撮人热爱linux的理由了。


很简单,一切都是开源的,你能得到源代码,出什么问题是不能解决的呢?一个叫Bill的用户就通过重新打包解决了这个问题。我也重新打了一个64位包,需要的朋友可以直接下载,如果你实在不想看下面的步骤的话。

这个问题是这样的,mount.nfs这个文件是通过mount.c代码文件创建的,而这个mount.nfs在只用tcp的机器上并不work,必须要求UDP和TCP一起使用,实际上这并不必要。下面就是修改源代码解决这个问题的过程。

首先,清除原有的nfs-common

sudo apt-get remove nfs-common

然后新建一个目录,随便叫什么名字,假设这里是nfs-right,下载源代码

sudo apt-get source nfs-common

接下来,安装一些打deb包需要的工具,以及编译需要的库,很有可能大多数机器上都有了,但还是执行一下保险

sudo apt-get install devscripts build-essential fakeroot

sudo apt-get build-dep nfs-common

好,现在进入源码目录下的子目录cd nfs-utils-1.1.2/utils/mount中,打开mount.c,找到这么几行

nfs_mount_data_version = NFS_MOUNT_VERSION;
else
if (kernel_version > MAKE_VERSION(2, 6, 22))
string++;
}

将其修改成

nfs_mount_data_version = NFS_MOUNT_VERSION;
else
if (kernel_version > MAKE_VERSION(2, 6, 22))
printf("not using string\n");
/* string++; */
}

在这里,”not using string\n”是自己定义的,你可以将其改成任何输出,或者没有输出。当然为了方便区分你用的nfs到底是自己改的还是官方的,建议还是定义一个输出。

之后就是打包了。用命令

debuild -us -uc

需要注意的是,此时可能还会提示有一些包你机器上没有,没关系,没有什么install什么就完了。一切顺利的话,2-4分钟,deb包就能打好了。之后怎么安装,应该不用说了吧。

另外,根据Bill的说法,最后还需要做这么一个工作

# cd /sbin
# ln -s mount.nfs /usr/local/sbin/mount.nfs

我没做,没问题,不过安全起见,还是做了吧。

OK,现在,你mount的时候再也不用害怕遇到internal error的错误信息了:)

你可能感兴趣的:(Ubuntu8.04 和 8.10 NFS客户端 internal error BUG的解决[转])