我想了解网络安装软件的工作原理。例如,在我的工作场所,我们有一个软件服务器。每台客户端计算机(数百台)都会在启动时自动从软件服务器挂载目录。例如,像Matlab这样的程序在软件服务器上只安装一次,但每个客户端计算机都可以启动一个Matlab实例。
幕后到底发生了什么?
假设我从软件服务器运行/opt/bin/matlab
并/opt/
安装,当我按 Enter 在客户端计算机上执行 Matlab 时会发生什么?该过程是在客户端计算机上进行的,并且我已经通过在磁盘空间几乎为零的计算机上运行 Matlab 来缩小范围,确定不存在任何隐式或隐藏的文件传输(即,为该会话临时将 Matlab 复制到我的计算机上)(即没有足够的空间来转移)。
- 由于 Matlab 安装在服务器上,我的客户端计算机如何执行它?
- 什么机制在控制这个?
- 幕后发生了什么?
答案1
他们用来实现这一目标的技术称为NFS-网络文件系统。他们还可能在 NFS 中使用另一种称为自动挂载的技术,特别是奥托夫斯如果是Linux的话。
网络文件系统
NFS 允许另一台计算机访问一台计算机上的文件夹。这并没有什么神奇之处。有一个客户端和服务器正在促进此连接。当您通过 NFS 客户端访问已安装在系统上的这些目录之一时,系统会发出调用来中继有关该目录及其内容的信息。
如果其中一个客户端访问目录中的文件,NFS 服务器也会将该文件的内容中继到 NFS 客户端。
奥托夫斯
自动挂载是一种允许客户端系统临时访问共享远程资源(例如 NFS)的技术。也就是说NFS客户端系统可以访问这个远程NFS共享。但在有人尝试访问共享目录之前,它不会主动“使用”它。只有这样,NFS 客户端才会尝试“挂载”此远程目录及其内容。
文件内容生命周期
无论哪种情况,都不会将文件隐式传输到 NFS 客户端。也就是说,它们不会以任何长期方式物理复制给客户端。当客户端尝试访问这些文件时,这些文件会流式传输到客户端。使用后它们就消失了;他们不会以任何长期形式坚持客户。
只是为了给您一个粗略的了解,您可以使用该程序strace
来查看程序运行时进行的一些系统调用。因此,例如使用此命令:
$ strace echo "hello world" > afile
我们可以看到文件是如何写入系统的。我们还可以使用此形式写入 NFS 安装目录:
$ strace echo "hello world" > /home/sam/afile
这两条痕迹几乎完全相同。
### 本地写入
$ cat strace_wr_local.log
execve("/bin/echo", ["echo", "hello world"], [/* 33 vars */]) = 0
...
fstat64(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f80000
write(1, "hello world\n", 12) = 12
close(1) = 0
### NFS 写入
$ cat strace_wr_remote.log
execve("/bin/echo", ["echo", "hello world"], [/* 33 vars */]) = 0
...
fstat64(1, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fbe000
write(1, "hello world\n", 12) = 12
close(1) = 0
阅读只是稍微有趣一些,但仍然基本相同。
### 本地阅读
$ cat strace_rd_local.log
execve("/bin/cat", ["cat", "afile"], [/* 33 vars */]) = 0
...
fstat64(1, {st_mode=S_IFREG|0644, st_size=1761, ...}) = 0
open("afile", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0
read(3, "hello world\n", 4096) = 12
write(1, "hello world\n", 12hello world
) = 12
read(3, "", 4096) = 0
close(3) = 0
### NFS 读取
$ cat strace_rd_remote.log
execve("/bin/cat", ["cat", "/home/sam/afile"], [/* 33 vars */]) = 0
...
fstat64(1, {st_mode=S_IFREG|0644, st_size=1771, ...}) = 0
open("/home/sam/afile", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0
read(3, "hello world\n", 4096) = 12
write(1, "hello world\n", 12hello world
) = 12
read(3, "", 4096) = 0
close(3) = 0
涉水进入泳池
如果您只是对 NFS 协议感到好奇,您可以在此处阅读有关其工作原理的更多信息,标题为:NFS 协议基础知识。通常很容易了解其工作原理的基本概念,并且有一个 NFS 请求的示例,只是为了让您大致了解其工作原理。
深入研究
如果您确实想窥视幕后,您可能需要引入一组用于收集网络流量的工具,以便您可以看到 NFS 服务器与其客户端之间来回的比特流。此类工具已经tcpdump
或wireshark
可能成为您进行更深入研究的朋友。
我会提醒你不要浪费时间,除非你真的是好奇的类型,因为像这样的深入研究需要大量的技能和对一套 Unix 工具的熟悉,我只会考虑那些已经使用 Unix 十几年的人年。
如果您真的很好奇,这个网站将帮助您实现这一目标:
答案2
LinuxTerminalServerProject“LTSP”和DisklessRemoteBootLinux“DRBL”都是免费的开源项目,许多学校和企业使用它们来 PXE 引导无盘客户端。简化管理劳动力成本和产品成本。由于一切都在 RAM 中运行,因此机器速度要快得多。如果您足够幸运,能够获得一批速度较慢的英特尔SATA 芯片组,那么访问 NFS 服务器的 DRBL 客户端就证明是非常值得的。我没有数字,但我敢打赌 DRBL PXE 启动的无盘客户端会击败本地启动的 SolidStateDrive。 NFS 的速度高于 SMB。