我有三台机器在生产 -
machineA 10.66.136.129
machineB 10.66.138.181
machineC 10.66.138.183
Run Code Online (Sandbox Code Playgroud)
所有这些机器都安装了 Ubuntu 12.04,我对所有这三台机器都有 root 访问权限。
现在我应该在上面的机器上做下面的事情 -
Create mount point /opt/exhibitor/conf
Mount the directory in all servers.
sudo mount <NFS-SERVER>:/opt/exhibitor/conf /opt/exhibitor/conf/
Run Code Online (Sandbox Code Playgroud)
/opt/exhibitor/conf如上所述,我已经在所有这三台机器中创建了目录。
现在我正在尝试创建一个挂载点。所以我遵循了以下过程 -
以上三台机器都安装NFS支持文件和NFS内核服务器
$ sudo apt-get install nfs-common nfs-kernel-server
Run Code Online (Sandbox Code Playgroud)
在以上三台机器上创建共享目录
$ mkdir /opt/exhibitor/conf/
Run Code Online (Sandbox Code Playgroud)
/etc/exports在以上三台机器中编辑并添加了这样的条目 -
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for …Run Code Online (Sandbox Code Playgroud) 有时您必须确保同一时间只有一个 shell 脚本实例正在运行。
例如,通过 crond 执行的 cron 作业本身不提供锁定(例如默认的 Solaris crond)。
实现锁定的常见模式是这样的代码:
#!/bin/sh
LOCK=/var/tmp/mylock
if [ -f $LOCK ]; then # 'test' -> race begin
echo Job is already running\!
exit 6
fi
touch $LOCK # 'set' -> race end
# do some work
rm $LOCK
Run Code Online (Sandbox Code Playgroud)
当然,这样的代码有竞争条件。有一个时间窗口,其中两个实例的执行都可以在第 3 行之后才能访问$LOCK文件。
对于 cron 作业,这通常不是问题,因为两次调用之间有几分钟的间隔。
但是事情可能会出错——例如,当锁定文件在 NFS 服务器上时——挂起。在这种情况下,多个 cron 作业可以在第 3 行阻塞并排队。如果NFS服务器再次处于活动状态,那么你已经惊群并行运行的作业。
在网上搜索我发现工具lockrun似乎是该问题的一个很好的解决方案。使用它,您可以运行一个需要像这样锁定的脚本:
$ lockrun --lockfile=/var/tmp/mylock myscript.sh
Run Code Online (Sandbox Code Playgroud)
您可以将其放在包装器中或从您的 crontab 中使用它。
lockf()如果可用,它使用(POSIX) 并回退到flock()(BSD)。并且lockf()对 NFS …
我有 NFSv4 服务器(在 RHELv6.4 上)和 NFS 客户端(CentOSv6.4)。让我们说/etc/exports:
/shares/website1 <ip-client-1>(rw,sync,no_subtree_check,no_root_squash)
/shares/website2 <ip-client-2>(rw,sync,no_subtree_check,no_root_squash)
Run Code Online (Sandbox Code Playgroud)
然后每当我对此进行一些更改时(假设更改仅适用于client-2),例如:
/shares/website1 <ip-client-1>(rw,sync,no_subtree_check,no_root_squash)
/shares/xxxxxxxx <ip-client-2>(rw,sync,no_subtree_check,no_root_squash)
Run Code Online (Sandbox Code Playgroud)
然后我总是service nfs restart。然后最终..挂载点client-1没有响应 (无法打开其文件等)。(为什么?因为RESTART?)
但如上所述,我只修改了该行client-2。一切client-1都还没有改变。
所以我的问题是:
/etc/exports,我应该restart提供服务还是什么?service nfs restart,为什么其他客户端上的挂载点最终会受到影响?(对于那些没有对其进行任何更改的客户端机器/etc/exports。)这意味着,每当我做出改变/etc/exports和restart服务,我将需要去重新mount上的目录EVERY CLIENTS导出列表中,以具有安装点再次合作。
有什么想法吗?
Red Hat 5/6 当我挂载时它说类型 nfs,我想知道如果它没有在挂载选项或 fstab 中列出,我想知道如何确定版本。请不要说用版本选项重新挂载它,我想知道如何确定当前挂载的NFS版本。我猜它会根据 NFS 服务器/客户端设置默认,但我如何确定它当前是什么?我很确定它是 NFS v3,因为似乎不支持 nfs4_setfacl。
我解压了一个损坏的 tar 文件,并设法得到了一些我无法删除的目录,如果我尝试删除它,似乎找不到ls它,但显示它存在,无论是使用 bash 还是使用 python 我得到类似的行为,除了在我尝试用 删除它之后rm -rf, ls抱怨它找不到它,然后它列出它(见下文rm -rf)。该find命令显示文件存在,但我仍然想不出删除它的方法。
这是我的尝试:
在这里你看到了两者ls并find同意我们有一个目录,
rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0
./mikeaâcnt
Run Code Online (Sandbox Code Playgroud)
但我无法删除它:
rl]$ find -maxdepth 1 -type d -empty -print0 | xargs -0 rm -f -v
rm: cannot remove `./mikeaâ\302\201\302\204cnt': Is a directory
rl]$ ls
mikeaâ??cnt
Run Code Online (Sandbox Code Playgroud)
我可以cd,但它是空的:
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt
mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt …Run Code Online (Sandbox Code Playgroud) 如果我们使用,echo 1234 >> some-file则文档说明输出已附加。
我的猜测是,如果 some-file 不存在,那么 O_CREAT 将创建一个新文件。如果>使用,则 O_TRUNC 将截断现有文件。
的情况下 >>:文件是否会被打开为 O_WRONLY(或 O_RDWR)并寻求结束并完成写入操作,模拟 O_APPEND?还是将文件作为 O_APPEND 打开,将其留给内核以确保发生附加?
我问这个是因为当输出文件来自 NFS 挂载点时,保存进程正在覆盖由 echo 插入的一些标记,并且 NFS 文档说服务器不支持 O_APPEND,因此客户端内核将不得不处理它。我猜保护进程正在使用 O_APPEND ,但不确定 bash>>在 linux 上,因此在这里提出问题。
我只是想知道为什么 Linux NFS 服务器是在内核中实现的,而不是用户空间应用程序?
我知道存在用户空间 NFS 守护程序,但这不是提供 NFS 服务器服务的标准方法。
我认为将 NFS 服务器作为用户空间应用程序运行将是首选方法,因为它可以提供额外的安全性,让守护程序在用户空间而不是内核中运行。它也符合做一件事并做好它的常见 Linux 原则(并且守护进程不应该是内核的工作)。
事实上,我能想到的在内核中运行的唯一好处是上下文切换带来的性能提升(这是一个有争议的原因)。
那么是否有任何记录在案的原因,为什么它是这样实施的?我尝试谷歌搜索,但找不到任何东西。
我想使用 NFS 从工作中连接到我的家庭服务器。我试过 sshfs 但有人说它不如 NFS 可靠。
我知道 sshfs 流量是加密的。但是 NFS 呢?有人可以嗅探我的流量并查看我正在复制的文件吗?
我在 LAN 中使用 NFSv4,效果很好。
我在使用 NFS 时遇到了一些问题,我想尝试仅使用普通的旧 TCP。
不过,我不知道从哪里开始。
在硬件方面,我使用以太网交叉电缆连接两台上网本。
为了联网它们,我输入
$ sudo ifconfig eth0 192.168.1.1 up && ping -c 10 -s 10 192.168.1.2 && sudo /etc/init.d/nfs-kernel-server start
Run Code Online (Sandbox Code Playgroud)
在第一台上网本和
$ sudo ifconfig eth0 192.168.1.2 up
$ ping -c 10 -s 10 192.168.1.1
$ mount /mnt/network1
Run Code Online (Sandbox Code Playgroud)
在第二
其中/mnt/network1在 /etc/fstab 中指定为
192.168.1.1:/home /mnt/network1 nfs noauto,user,exec,soft,nfsvers=2 0 0
以及/etc/exports(使用该文件的语法),在第一台上网本上。
以上工作正常,但文件和目录很大。这些文件平均每块大约半 GB,目录大小都在 15 到 50 GB 之间。
我正在rsync用来传输它们,命令(上192.168.1.2)是
$ rsync -avxS /mnt/network1 ~/somedir
Run Code Online (Sandbox Code Playgroud)
我不确定是否有办法调整我的 NFS 设置以更好地处理大文件,但我想看看rsync在普通旧 TCP 上运行守护程序是否比 …
服务器使用选项通过 NFSA导出目录。内的子目录,是一个使用NFS服务器上的其他位置安装点的选择,像/srvnohide/srv/srv/foo--bind
server# mount --bind /bar/foo/ /srv/foo/
客户端使用 NFSB导入A:/srv并安装它/mnt/srv。的内容/mnt/srv是 的内容A:/srv。
问题是那/mnt/srv/foo是空的,而我期待看到A:/bar/foo/那里的内容。
如何正确导出和导入具有子目录作为挂载点的 NFS 共享?