在shell脚本或Perl中,是否有一种快速而简单的方式来判断路径是位于远程文件系统(nfs等)还是本地路径?或者是唯一的方法来解析/ etc/fstab并检查文件系统类型?
我正在尝试找到适当的方法来处理NFS客户端上的陈旧数据.考虑以下场景:
(另外,可能有用的是要知道,出于性能原因,两个服务器上的缓存安装选项都相当高).
我想要了解的是:
谢谢.
在Linux NFS共享装载上创建文件时,客户端是Linux或mac机器.文件的存在与否是下一步操作的关键,但检查并不总是返回正确的结果:
例如,我在perl中这样做,这仍然不能正常工作,尤其是mac机器
write_key_file(); # write a file that must be checked before proceeding
Run Code Online (Sandbox Code Playgroud)
当文件存在时,以下检查不能始终返回true
问题 - perl中的此命令未在NFS系统中返回正确的状态:
if( -e $file){}
Run Code Online (Sandbox Code Playgroud)
无法解决的无法解决的问题:
sleep(5); # wait 5 seconds
system("ls -ltr"); # force to cache?
if(-e $file){}
Run Code Online (Sandbox Code Playgroud)
我不打算检查这样的每个文件,但有几个关键位置,以获得正确的文件状态是很重要的.
我们是否有更好的方法在特定目录上的特定文件上强制刷新nfs缓存?谢谢.
我不确定这是一个XY问题,但有一些最薄弱的问题都可以解决.
A - NFS客户端设置
如果在这个阶段有解决方案,那就太好了!
B - exit_code或返回写入函数的代码
$exit_code = write_key_file();
Run Code Online (Sandbox Code Playgroud)
它的问题,而不是所有的写作都在代码块的范围内.这只能解决部分问题.
C - 禁用特定文件或目录的NFS缓存以进行文件检查
我需要确定这是可能的以及如何?如果没有,为什么?
我对所有可能的解决方案,没有解决方案或其他可能性持开放态度.
我有多节点kubernetes设置.我正在尝试使用带有NFS卷插件的存储类动态分配持久卷.我找到了glusterfs,aws-ebs等的存储类示例.但是,我没有找到任何NFS示例.如果我只创建PV和PVC,那么NFS工作得很好(没有存储类).我试图通过引用其他插件为NFS编写存储类文件.请参考下面,
NFS的存储class.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
namespace: kube-system
name: my-storage
annotations:
storageclass.beta.kubernetes.io/is-default-class: "true"
labels:
kubernetes.io/cluster-service: "true"
provisioner: kubernetes.io/nfs
parameters:
path: /nfsfileshare
server: <nfs-server-ip>
Run Code Online (Sandbox Code Playgroud)
NFS-PV-claim.yaml
apiVersion: v1
metadata:
name: demo-claim
annotations:
volume.beta.kubernetes.io/storage-class: my-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
Run Code Online (Sandbox Code Playgroud)
它没用.所以,我的问题是,我们可以为NFS编写存储类吗?它是否支持动态提供?
至少在我的用法中,我有时删除我的CMake构建文件夹并创建一个新文件夹,或者有多个构建文件夹(每台计算机一个)但只有一个源文件夹(nfs mount).
据我所知,QT Creator将设置保存到源树中的CMakeLists.txt.user ,将其他一些设置保存到build文件夹中的'project.cbp'文件中.如果我从GUI设置设置,它们会在擦除/创建构建文件夹后丢失.很公平,但我想在创建新版本时使用脚本再次设置它们.
那么,我该怎么做:
a)让QT Creator在源树之外的某处写入CMakeLists.txt.user文件夹,以便保留机器特定的设置(例如在开发计算机上调试,在测试计算机上发布)?
b)从QT Creator项目读取/编写构建和运行设置,例如每个可执行文件的调试参数和额外的构建命令(例如-j8)?
然后我会在CMakeLists.txt中执行类似"execute_process(...)"的操作,为QT Creator项目设置一些调试和构建参数.
我给了一个项目,唯一的目标是监控网络的NFS性能.我知道那里有很多开源工具,但我仍然希望得到基本的想法,以便更好地调整周围的人.因此,该网络由几百个Linux系统和几千个帐户组成,其中NFS安装了家庭目录; 脚本可以推送到每个站,服务器也是可能的,如果这样做有任何好处.Afaik,基本上所有脚本应该做的是几个dd并观察NFS上的IO速率.
我的问题是这样做的正确方法是什么?我是否仅为了运行脚本而向系统添加新帐户?
一些一般的想法非常感谢:)
我设法在一个ubuntu流浪盒中设置我的Symfony2项目.但是通过它的网络服务器加载网站大约需要20秒.经过一番研究,我想出了使用nfs作为同步文件夹.这是我在Vagrantfile中的设置:
config.vm.network "private_network", ip: "192.168.56.101"
config.vm.synced_folder ".", "/vagrant", :nfs => true, :mount_options => ["dmode=777","fmode=777"]
Run Code Online (Sandbox Code Playgroud)
启动de vagrant box后,我收到以下错误
==> default: Mounting NFS shared folders...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
mount -o 'dmode=777,fmode=777' 192.168.56.1:'/Users/marcschenk/Projects/teleboy.ch' /vagrant
Stdout from the command:
Stderr from the command:
stdin: is not a tty
mount.nfs: an incorrect mount option was specified
Run Code Online (Sandbox Code Playgroud)
VM似乎工作,但同步文件夹显然是空的.我错了什么?
我的设置:
我问的是类似的东西,但不完全一样,因为我想知道的是依赖于rename()使用NFS时的原子性是否安全?
这是我正在处理的一个场景 - 我有一个必须始终存在的'索引'文件.
所以:
独立客户:
这假设rename()是原子意味着 - 总会有一个'索引'文件(尽管它可能是一个过时的版本,因为缓存和时间)
然而我遇到的问题是 - 这是在NFS上发生的 - 并且正在工作 - 但是我的几个NFS客户端偶尔会报告"ENOENT" - 没有这样的文件或目录.(例如,在以5米间隔发生的数百次操作中,我们每隔几天就会收到此错误).
所以我希望是否有人可以启发我 - 在这种情况下,实际上是否真的无法获得'ENOENT'?
我问的原因是RFC 3530中的这个条目:
RENAME操作必须是客户端的原子操作.
我想知道这是否只是发出重命名的客户端,而不是查看目录的客户端?(我对缓存/过时的目录结构没问题,但是这个操作的重点是这个文件总是以某种形式"存在")
操作顺序(来自执行写操作的客户端)是:
21401 14:58:11 open("fleeg.ext", O_RDWR|O_CREAT|O_EXCL, 0666) = -1 EEXIST (File exists) <0.000443>
21401 14:58:11 open("fleeg.ext", O_RDWR) = 3 <0.000547>
21401 14:58:11 fstat(3, {st_mode=S_IFREG|0600, st_size=572, ...}) = 0 <0.000012>
21401 14:58:11 fadvise64(3, 0, 572, POSIX_FADV_RANDOM) = 0 <0.000008> …Run Code Online (Sandbox Code Playgroud) 尝试挂载nfs导出时出现以下错误.
sudo mount 192.168.1.175:/mnt/nas /mnt/c/nas
mount.nfs: No such device
Run Code Online (Sandbox Code Playgroud)
有想法该怎么解决这个吗?
什么时候在Linux 2.6内核和NFSv3中确实open("fname", O_CREAT|O_EXCL)有效?当前的规范open(2)系统调用文档(http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html)说一切都很好:
- O_EXCL
- ...
On NFS, O_EXCL is only supported when using NFSv3 or later on kernel
2.6 or later. In NFS environments where O_EXCL support is not
provided, programs that rely on it for performing locking tasks will
contain a race condition. Portable programs that want to perform
atomic file locking using a lockfile, and need to avoid reliance on NFS
support for O_EXCL, can ...
Run Code Online (Sandbox Code Playgroud)
这看起来好像所有2.6内核都没问题,但是手册页面更改日志(ca late …
nfs ×10
linux ×5
perl ×2
atomicity ×1
c ×1
cmake ×1
docker ×1
file-io ×1
filesystems ×1
glibc ×1
kubernetes ×1
macos ×1
monitoring ×1
performance ×1
qt ×1
qt-creator ×1
shell ×1
ubuntu-12.04 ×1
vagrant ×1