在移至永久儲存之前將檔案上傳到 /tmp 的優點是什麼?

在移至永久儲存之前將檔案上傳到 /tmp 的優點是什麼?

在建立處理檔案上傳的功能時,程式設計的常見趨勢似乎是首先將檔案上傳到臨時目錄/資料夾(例如 Linux 上的 /tmp)。檔案完成後,將其從暫存目錄中移出,並放置到指定目錄中進行儲存。某些程式設計/腳本語言預設將正在進行的上傳放置在/tmp 中,而其他語言則不然,但通常的做法是明確將/tmp 設為佔位符目錄,直到上傳完成,此時它會被移動到單獨的目錄。

在將檔案移至另一個分割區/目錄進行長期儲存之前,使用臨時「保留」目錄上傳內容有什麼好處?

我工作的環境中(內部)網路儲存透過 NFS 安裝到虛擬機,以持久儲存大量資料(TB)。隨著科技的進步,我們能夠更快、更大量地獲取數據。幾年前,這是一次簡單的 HTTP 上傳一個檔案(檔案大小相對較小,兆位元組?),然後我們轉向 Flash 上傳。現在我們可以拖放上傳,甚至可以在某些瀏覽器中上傳千兆位元組的檔案/資料夾結構。現在已經到了這樣的地步:如果一個用戶確實想一次上傳足夠多的文件,那麼他們很容易就會超出為 /tmp 預留的分區。除了透過 NFS 安裝的網路延遲之外,擴展 /tmp 與直接將其發送到檔案伺服器相比有何優勢?由於科技讓我們獲得十年前無法想像的大量數據,這種傳統(現在是糟糕的)做法是否已經過時了?

答案1

  1. 如果指定的存儲目錄是網路存儲,是否是為了效能?
    • 是的,可能是這樣,儘管通常不是這樣。實際上傳的效能很少是程式碼的主要效能問題。
  2. Linux 是否會定期掃描 /tmp 目錄以刪除舊文件,從而使開發人員/管理員不必在其他地方對此進行解釋?
    • 是的,通常是這樣。這也涵蓋了上傳管理器進程崩潰並留下部分檔案的情況,否則這些檔案不會被清理。
  3. 難道就因為這樣嗎?
    • 是的。 :-)
  4. 如果有機會簡單地將檔案寫入最終將儲存在其中的目錄(例如使用node.js 的 fs 模組),我應該這樣做嗎?
    • 使用臨時暫存目錄以及將其放置在與目標目錄相同的檔案系統上有充分的理由。許多應用程式將此目錄放在與最終目標目錄相同的檔案樹中,因此最終的「移動」操作將幾乎是瞬時的(並且可能是原子的)。因此,您會經常看到類似/var/spool/myapp/tmp和 的內容/var/spool/myapp/data。但隨後應用程式通常會添加一個cron任務來清理.../tmp.

答案2

這實際上取決於系統上還有什麼以及它們的使用方式。

在某些系統上,/tmp通常用於系統檔案或交換空間。如果你在 Solaris 上填滿/tmp壞事發生以及相關軼事)。在這種情況下,如果有人上傳填滿該磁碟區的文件,可能會使您的系統崩潰。其他可能發生的情況是某些應用程式將無法寫入自己的臨時檔案。

在過去,你可以合理地相信人們不會愚蠢(至少在九月之外),而且惡意也相當低。今天……那是一個不同的故事。

優勢寫入的/tmp原因是它被保證是機器上的本機檔案系統,存在並且被巡邏(腳本將自動刪除舊檔案)。系統需要的啟動/tmp和快速存取它對於系統的合理性能是必要的。因此,您想在某處快速寫入文件然後將其移除嗎?把它放進去/tmp

考慮到/tmp滿載時會發生不好的事情,人們應該考慮提供相同優勢的其他替代方案 - 例如創建一個安裝的分區來上傳文件,當滿載時不會使機器崩潰。

另一個考慮因素是「快」位。自古以來,驅動器變得越來越快。速度快了很多 - 一個漂亮的 SSD 可以摧毀當時的任何東西......但是你知道嗎?真的需要 SSD 寫入上傳檔案嗎?不僅潛水變得更快,網路也變得更快。將上傳檔案寫入網路儲存區域可以在單一點上提供協助,您可以讓多個系統將其檔案上傳到一個中心點,然後其他進程可以負責掃描它們並將它們移動到正確的位置。

所以...總結一下:

  • 以前就有優勢
    • 比網路更快,永遠存在
  • 可能會導致問題
  • 昔日的日子已不復存在
    • 驅動器和網路速度更快
    • 人都傻了,攻擊者多了

所以,我會說不......不要再寫信/tmp作為預設答案。請諮詢您的系統管理員,以了解適合其磁碟使用策略的正確寫入位置,並考慮將它們寫入完全脫離本機系統的某個位置。

答案3

/tmp只是一個放置檔案的方便位置,並且您可以相當有信心將清理某個地方(例如,如果網頁應用程式未能執行此操作)。所以這是一個合理的預設值。

如果您確實可以選擇指定自己的上傳檔案的路徑,則有充分的理由將其設定為與最終目的地相同的安裝路徑,因為這樣您就可以使用原子重命名將其放入最終目標地方。 (如果是交叉安裝,則需要複製一份)。

我不會將其上傳到最終目的地,因為(例如)如果上傳在中間中止,您可能會在那裡留下部分文件。或者,如果您的腳本失敗,您可能會留下一個資料庫未引用的孤立檔案。

順便一提:請記住,客戶端提供的檔案名稱是不受信任的資料。惡意使用者可以輕鬆地向您提供檔案名../../../something,如果您不小心,您可能會寫入您不希望寫入的內容。

相關內容