
我了解 Linux 中的安裝是什麼,也了解裝置檔案。但是我不明白為什麼我們需要安裝。
例如,正如中所解釋的該問題的已接受答案,使用此命令:
mount /dev/cdrom /media/cdrom
我們正在掛載 CDROM 設備/media/cdrom
並最終能夠使用以下命令存取 CDROM 的文件
ls /media/cdrom
這將列出 CDROM 的內容。
為什麼不完全跳過安裝並執行以下操作?
ls /dev/cdrom
並已列出 CDROM 的內容。我希望答案之一是:「Linux 就是這樣設計的」。但是如果是的話,那為什麼要這樣設計呢?為什麼不直接訪問/dev/cdrom
目錄呢?掛載的真正目的是什麼?
答案1
原因之一是區塊級存取的層級比ls
能夠使用的層級要低一些。/dev/cdrom
, 或者dev/sda1
可能分別是您的 CD ROM 驅動器和硬碟的分區 1,但它們沒有實現 ISO 9660 / ext4 - 它們只是指向那些稱為裝置檔案。
mount 確定的事情之一是如何使用原始存取 - 哪些檔案系統邏輯/驅動程式/核心模組將管理讀取/寫入,或轉換ls /mnt/cdrom
為需要讀取的區塊,以及如何解釋這些區塊的內容阻止諸如file.txt
.
其他時候,這種低階存取就足夠了;我剛剛讀取和寫入了串行埠、USB 設備、tty 終端機和其他相對簡單的設備。我永遠不會嘗試從 /dev/sda1 手動讀取/寫入來編輯文字文件,因為我基本上必須重新實現 ext4 邏輯,其中可能包括:查找文件 inode,找到儲存區塊,讀取完整區塊,進行更改,寫入完整區塊,然後更新索引節點(也許),或者將所有這些寫入日誌- 太困難了。
親自了解這一點的一種方法就是嘗試:
[root@ArchHP dev]# cd /dev/sda1
bash: cd: /dev/sda1: Not a directory
/dev
是一個目錄,您可以cd
隨心所欲ls
。/dev/sda1
不是目錄;它是一種特殊類型的文件,核心提供該文件作為該設備的“句柄”。
看設備檔案上的維基百科條目以便進行更深入的治療。
答案2
基本上,簡單地說,作業系統需要知道如何存取該裝置上的檔案。
mount
不僅是“允許您存取檔案”,它還告訴作業系統磁碟機具有的檔案系統,是否是唯讀或讀取/寫入存取權限等。
/dev/cdrom
是一個低階設備,作業系統功能不知道如何存取它們...想像一下,您在其中放入了一個格式奇怪的 CDROM(甚至是音訊 CD),如何ls
知道上面有哪些檔案(如果有) CD-ROM沒有先「安裝」它?
請注意,這種情況在許多作業系統(甚至某些發行版和圖形介面上的 Linux)中會自動發生,但這並不意味著其他作業系統不會「安裝」驅動器。
答案3
我稱之為歷史原因。並不是說其他答案是錯誤的,但這個故事還有更多內容。
比較 Windows:Windows 最初是作為單一電腦、單一使用者作業系統。那台電腦可能只有一個軟碟機和一個硬碟,沒有網路連接,沒有 USB,什麼都沒有。 (Windows 3.11 具有本機網路功能;Windows 3.1 沒有.)
Windows 誕生時的設定非常簡單,無需花哨:只需每次自動安裝所有內容(所有兩個裝置),不會出現很多問題。
相比之下,Unix 從一開始就被設計為在具有多個用戶的伺服器網路上運行。
Unix 的設計決策之一是,檔案系統對於最終用戶來說應該顯示為一個統一的實體,無論實體磁碟分佈在多少台電腦上,無論哪種磁碟,也無論數十台電腦中的哪一台用戶將從中訪問它。使用者檔案的邏輯路徑將保持不變,即使這些檔案的實體位置會在一夜之間發生變化(例如由於伺服器維護)。
他們從儲存這些檔案的實體設備中抽像出邏輯檔案系統、檔案路徑。假設伺服器 A 通常託管 /home,但伺服器 A 需要維護:只需卸載伺服器 A 並將備份伺服器 B 安裝在 /home 上,除了管理員之外,沒有人會注意到。
(與為不同實體裝置賦予不同名稱的 Windows 約定不同 - C:、D: 等 - 這不利於 Unix 所追求的透明度。)
在那種環境下,你不能隨心所欲地把所有看到的東西都裝上去,
在大型網路中,個別磁碟和電腦經常出現故障。管理員需要能夠說出在何時何地安裝了什麼,例如對一台電腦進行受控關閉,同時另一台電腦透明地接管託管相同的檔案。
這就是為什麼從歷史的角度來看:Windows 和 Unix 來自不同的背景。如果您願意,您可以將其稱為文化差異:
- Unix誕生於管理員需要控制掛載的環境;在網路上的數十個儲存設備中,管理員必須決定在何處以及何時安裝什麼。
- Windows 誕生於沒有管理員、只有兩個儲存裝置的環境中,使用者可能知道他們的檔案是在磁碟上還是硬碟上。
- (當然,Linux 是作為單機作業系統誕生的,但它從一開始就被明確設計為在家用電腦上盡可能模仿 Unix。)
最近,作業系統之間的距離越來越近:
- Linux 增加了更多單一電腦、單一使用者的功能(例如自動掛載);因為它在單機設定中經常使用。
- Windows 增加了更多的安全性、網路、多用戶支援等;隨著網路變得越來越普遍,微軟也開始為伺服器開發作業系統。
但還是很容易看出兩者是不同傳統的結果。
答案4
問題標題問:為什麼我們需要在Linux上掛載?
解釋這個問題的一種方法:為什麼我們需要發出明確mount
命令才能使檔案系統在 Linux 上可用?
答案是:我們不這樣做。
您不需要明確掛載檔案系統,您可以安排它自動完成,Linux 發行版已經為大多數裝置執行此操作,就像 Windows 和 Mac 一樣。
所以這可能不是你想問的。
第二種解釋:為什麼我們有時需要發出明確mount
命令以使檔案系統在 Linux 上可用? 為什麼不做作業系統總是為我們做,並對用戶隱藏?
這是我在問題文本中讀到的問題,當你問:
為什麼不完全跳過安裝並執行以下操作
ls /dev/cdrom
並列出 CD-ROM 的內容嗎?
想必,您的意思是:為什麼不讓該命令執行以下操作
ls /media/cdrom
現在呢?
好吧,在這種情況下,/dev/cdrom
將是目錄樹,而不是設備檔案。所以你真正的問題似乎是:為什麼首先要有一個設備文件?
我想對已經給出的答案添加一個答案。
為什麼使用者可以看到設備文件?
每當您使用 CD-ROM 或任何其他儲存檔案的裝置時,都會使用軟體將 CD-ROM 上的任何內容解釋為檔案的目錄樹。每當您使用ls
存取 CD-ROM 上的檔案的任何其他類型的命令或應用程式時,都會呼叫它。該軟體是用於將檔案寫入 CD-ROM 的特定檔案系統的檔案系統驅動程式。每當您在檔案系統上列出、讀取或寫入檔案時,該軟體的工作就是確保在相關裝置上執行相應的低階讀取和寫入操作。每當您mount
使用檔案系統時,您都會告訴系統該裝置使用哪個檔案系統驅動程式。無論您是使用mount
命令明確執行此操作,還是將其留給作業系統自動完成,都需要完成此操作,當然,檔案系統驅動程式軟體首先需要存在。
文件系統驅動程式如何完成其工作?答:它透過讀取和寫入設備檔案來實現。為什麼?答案,正如您已經說過的:Unix 就是這樣設計的。在 Unix 中,裝置檔案是裝置的常見低階抽象。特定設備的真正設備特定軟體(設備驅動程式)應該將設備上的開啟、關閉、讀取和寫入作為對設備文件的操作來實現。這樣,更高層級的軟體(例如檔案系統驅動程式)就不需要了解各個裝置的內部運作原理。低階設備驅動程式和檔案系統驅動程式可以由不同的人單獨編寫,只要他們同意彼此互動的通用方式,這就是裝置檔案的用途。
因此檔案系統驅動程式需要設備文件。
但是我們一般用戶為什麼能看到設備文件呢?答案是 Unix 是為作業系統程式設計師而設計的。它的設計目的是允許用戶編寫設備驅動程式和檔案系統驅動程式。事實上它們就是這樣寫的。
Linux也是如此:你可以編寫自己的檔案系統驅動程式(或裝置驅動程式),安裝它,然後使用它。它使Linux(或Unix 的任何其他變體)易於擴展(這實際上是Linux 誕生的原因):當市場上出現某種新硬體時,或者設計一種新的、更聰明的方式來實現檔案系統時,有人可以編寫程式碼來支援它,使其工作,並將其貢獻給 Linux。
設備文件使這變得更容易。