Filesystems

網路安裝軟體如何執行?

  • November 2, 2013

我想了解網路安裝軟體的工作原理。例如,在我的工作地點,我們有一個軟體伺服器。每台客戶端機器(數百台)在啟動時自動從軟體伺服器掛載目錄。例如,像 Matlab 這樣的程序在軟體伺服器上只安裝一次,但每台客戶機都可以啟動一個 Matlab 實例。

引擎蓋下發生了什麼?

假設我從軟體伺服器執行/opt/bin/matlab/opt/掛載,當我按 Enter 在客戶端電腦上執行 Matlab 時會發生什麼?該過程在客戶端機器上,我已經通過在磁碟空間幾乎為零的電腦上執行 Matlab 來縮小沒有任何隱式或隱藏文件傳輸(即臨時將 Matlab 複製到我的機器上)(即沒有足夠的空間轉移)。

  • 由於 Matlab 安裝在伺服器上,我的客戶端電腦如何執行它?
  • 什麼機制在控制這個?
  • 幕後發生了什麼?

他們用來實現這一目標的技術稱為NFS - 網路文件系統。他們可能還使用另一種 NFS 技術,稱為 automounts,如果是 Linux ,則特別是Autofs 。

NFS

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 十幾年的人年。

如果您真的很好奇,本網站將幫助您完成這項工作:

引用自:https://unix.stackexchange.com/questions/98514