Ict-創新/LPI/101.1
考生應該能夠透過在基於 x86 的系統中進行正確的 BIOS 設定來配置基本系統硬體。
關鍵知識領域
- 啟用和停用整合外設。
- 配置有或沒有外部外設(如鍵盤)的系統。
- 區分不同型別的海量儲存裝置。
- 為不同的裝置設定正確的硬體 ID,尤其是引導裝置。
- 瞭解冷插拔和熱插拔裝置之間的區別。
- 確定裝置的硬體資源。
- 列出各種硬體資訊的工具和實用程式(例如 lsusb、lspci 等)。
- 用於操作 USB 裝置的工具和實用程式。
- 對 sysfs、udev、hald、dbus 的概念性理解。
計算機系統由中央 CPU、主儲存器或記憶體、輔助儲存器或永久儲存器(如硬碟)以及各種輸入/輸出裝置組成。為了執行,CPU 需要能夠從記憶體載入指令和資料到 CPU 中,可能需要先從輔助儲存器中獲取資料,執行指令,然後將結果儲存回記憶體中。它透過稱為匯流排的datapath與各種輸入/輸出或外設通訊。計算機系統可能擁有不止一條匯流排,用於與不同的元件通訊。
這種現代計算機的簡化模型被稱為馮·諾依曼架構,以 20 世紀 40 年代開發了現代計算機基本架構的匈牙利裔數學家約翰·馮·諾依曼命名。
以這個基本的概念模型為基礎,我們可以開始瞭解 CPU 如何確定和配置構成計算機系統的眾多外設和裝置,以及作業系統如何管理和協調活動以共享系統資源並訪問其連線的外設和裝置。
這些資源和外設包括海量儲存裝置(輔助儲存器)和輸入/輸出裝置,如顯示器、鍵盤和網絡卡。一些外設整合在 PC 主機板中,如並行埠和序列埠,甚至在更新的 PC 中整合 VGA 卡或網絡卡,而另一些則是外部裝置,如 USB 儲存器或藍牙介面卡。所有這些裝置都需要一種方式來與 CPU 通訊,以便向其提供資訊,請求 CPU 提供服務或接收來自 CPU 的指令。
配置計算機系統時,您需要了解如何查詢這些外設的當前設定,它們的設定可能具有哪些值,以及如何在 BIOS 或作業系統中更改它們(如果有必要)。配置 PC 外設以使其與作業系統協同工作是在兩個地方完成的。第一個配置位置是系統韌體或 BIOS(基本輸入/輸出系統);第二個是作業系統。
BIOS(基本輸入/輸出系統)的目的是執行開機自檢(POST),識別和初始化系統裝置和外設,並透過從引導裝置載入引導載入程式來啟動載入作業系統的過程。BIOS 還為作業系統提供了一個抽象層,用於訪問系統裝置。此層的目的是將作業系統與當今眾多可用的裝置隔離開來,但它被大多數現代作業系統(包括 Linux)忽略,這些作業系統使用自己的裝置驅動程式來訪問裝置。
大多數 BIOS 製造商提供基於控制檯的使用者介面,允許您配置裝置的低階系統設定。BIOS 配置介面及其訪問方式因製造商而異,但通常透過在系統啟動期間按下某個鍵或組合鍵(如 Delete 或 Insert)來訪問。
在 BIOS 配置控制檯下,您可以
- 啟用或停用裝置,
- 分配資源,如 IRQ 和 IO 地址,
- 選擇裝置的引導順序,以及
- 更改影響裝置(如磁碟驅動器和網絡卡)工作模式的設定
除了主 BIOS 之外,許多外設還擁有自己的 BIOS 韌體和配置控制檯。一些網絡卡和大多數 SCSI 主機介面卡卡附帶自己的 BIOS,可用於設定其配置。與主系統 BIOS 一樣,這些韌體也會執行其裝置的一些低階檢查和初始化。
有時可能需要停用阻止作業系統正常安裝或工作的裝置。這種情況很少見,通常可以透過在啟動時向 Linux 核心傳遞正確的引數或更改 BIOS 中的引數設定來解決。通常,最容易出現問題的設定與硬碟訪問模式、電源管理和中斷控制器設定有關。通常,這些問題的原因是韌體本身的錯誤。
大多數 BIOS 控制檯允許您停用整合外設,如 COM 埠、影片卡或網絡卡。即使這些裝置沒有造成任何安裝或啟動問題,您可能也希望停用它們(如果它們未被使用),以便釋放原本不可用於其他目的的資源。
有時需要停用對外設(如鍵盤或滑鼠)的系統檢查,儘管這些外設對於桌上型電腦的正常執行必不可少,但它們在伺服器中往往不存在。沒有鍵盤、滑鼠或顯示器的機器被稱為“無頭”系統。某些 BIOS 在這些裝置不存在時會拒絕啟動,除非停用了這些系統檢查。(您可能想知道,如果無頭機器沒有鍵盤、滑鼠或顯示器,該如何訪問它們。答案是透過網路使用 SSH 等工具,本書後面會介紹。)當然,要訪問 BIOS 本身,就必須要有鍵盤和顯示器等外設!
要了解外設如何與 CPU 通訊,您需要了解中斷請求 (IRQ)、輸入/輸出 (IO) 地址和直接記憶體訪問 (DMA) 地址。CPU 負責處理系統中發生的 所有 指令 和 事件。要與裝置通訊,它需要知道裝置何時有事件需要處理,以及它需要能夠向裝置傳遞資訊和從裝置讀取資訊。
IRQ 是外設透過匯流排向 CPU 發出訊號,告訴 CPU 掛起其當前活動並處理其事件(如按鍵或磁碟讀取)的機制。IO 地址是對映到裝置的記憶體區域,CPU 可以向這些區域寫入設備註意資訊,以及從裝置讀取資訊。這是一種對外設如何與 CPU 通訊的簡化解釋,但足以滿足我們理解 IRQ 和 IO 地址的目的。
當裝置上發生事件(如滑鼠移動或資料從 USB 連線的驅動器到達)時,裝置透過在總線上生成中斷來向 CPU 發出訊號,表明它有資料需要處理。在即插即用技術出現之前,即插即用技術需要硬體(PCI 匯流排)和軟體元件才能工作,英特爾 PC 僅限於 16 種可能的 IRQ 設定,其中許多 IRQ 線是預先為裝置設定的,因此,只有少數 IRQ 線是可自由分配的。下表列出了以紅色顯示的不可使用的 IRQ,以橙色顯示的可以重新分配的 IRQ(前提是系統中不存在某些硬體),以及可以自由分配的 IRQ(以白色顯示)。
| 0 | 系統計時器 | 4 | COM1 | 8 | 即時時鐘 | 12 | PS2 滑鼠 |
| 1 | 鍵盤 | 5 | LPT2 / 音效卡 | 9 | 可用 | 13 | 浮點處理器 |
| 2 | 處理 IRQ 8 - 15 | 6 | 軟盤控制器 | 10 | 可用 | 14 | 主 IDE |
| 3 | COM2 | 7 | 並行埠 | 11 | 可用 | 15 | 輔助 IDE |
IRQ 0 系統計時器(不可更改);
IRQ 1 鍵盤控制器(不可更改);
IRQ 2 級聯訊號來自配置為使用 IRQ 2 的 IRQ 8-15 裝置將使用 IRQ 9
IRQ 3 序列埠控制器,用於 COM2(如果存在,與 COM4 共享);
IRQ 4 序列埠控制器,用於 COM1(如果存在,與 COM3 共享);
IRQ 5 LPT 埠 2 或 音效卡;
IRQ 6 軟盤控制器;
IRQ 7 LPT 埠 1 或 音效卡(8 位 Sound Blaster 及相容裝置)。
IRQ 8 即時時鐘;
IRQ 9 開放中斷 / 可用 或 SCSI 主機介面卡;
IRQ 10 開放中斷 / 可用 或 SCSI 或 NIC;
IRQ 11 開放中斷 / 可用 或 SCSI 或 NIC;
IRQ 12 PS/2 聯結器上的滑鼠;
IRQ 13 數學協處理器 / 整合浮點運算單元 或 程序間中斷(使用
IRQ 14 主 ATA 通道(磁碟驅動器或 CDROM);
IRQ 15 次要 ATA 通道
隨著外圍裝置的數量和型別不斷增加,有限的 IRQ 線路數量成了問題。即使存在空閒的 IRQ,一些裝置也硬編碼為使用特定 IRQ,而該 IRQ 可能已被使用。一些裝置允許透過跳線設定進行手動配置,並且可以在 BIOS 中重新分配 IRQ 以及 I/O 地址。
為了克服這一限制,引入了“即插即用”技術,允許裝置共享中斷線路,從而擴充套件了可以容納的裝置數量。“即插即用”消除了對裝置手動配置的需求。憑藉英特爾的先進可程式設計中斷控制器 (APIC) 架構,現在通常有 24 條可用中斷線路,可以容納多達 255 個裝置。
要檢視 Linux 系統中 IRQ 到裝置的分配,您可以檢查 /proc/interrupts 檔案的內容。
從現在起,您需要訪問 Linux PC。雖然涉及一些理論,但我們將越來越多地與 Linux 進行互動。我建議您嘗試您遇到的命令,在進行過程中測試您的理解。
圖 101.1.1:/proc/interrupts 的示例結果
/proc 檔案系統是什麼?
/proc 檔案系統是一個虛擬或偽檔案系統。核心設定 /proc 檔案系統以匯出有關正在執行的核心、使用者程序和已配置的硬體裝置的資訊。它是一個虛擬檔案系統,因為它只存在於記憶體中,並不代表任何真實的物理檔案。將所有內容視為檔案是 UNIX 設計理念的基石,許多這樣的偽檔案系統都存在。其他是 /sys 和 /dev 目錄。
輸入/輸出地址
[edit | edit source]當 CPU 和外圍裝置需要相互通訊和/或傳遞資料時,它們使用 I/O 地址。本質上,它們透過讀取和寫入裝置的保留 I/O 地址來進行通訊。有兩種互補的方法來執行 CPU 和裝置之間的 I/O。有記憶體對映 I/O (MMIO) 和埠 I/O (PIO) 定址。
在記憶體對映 I/O 中,地址是為 CPU 和特定裝置之間通訊保留的記憶體區域。重要的是,這些記憶體區域不能被任何其他程序使用。在埠對映 I/O 定址中,CPU 有一組單獨的指令用於執行 I/O,該指令具有單獨的地址空間的裝置。
Linux 中的 I/O 埠分配可以透過檢查 /proc/ioports 檔案的內容來揭示。
圖 101.1.2:/proc/ioports 的示例
要分配 I/O 記憶體,您可以檢視 /proc/iomem,下面給出了此檔案內容的示例。
圖 101.1.3:/proc/iomem 的示例
在“即插即用”技術出現之前,您需要在 BIOS 和作業系統中配置 I/O 裝置地址,但是隨著“即插即用”的引入,現在由作業系統和匯流排自動完成分配。
DMA 地址
[edit | edit source]DMA 代表直接記憶體訪問,是一種最佳化,允許裝置直接讀取和寫入記憶體,而無需經過 CPU。傳統上,當 CPU 請求從裝置讀取資料到記憶體時,CPU 需要參與資料傳輸過程。在這種模型下,稱為程式化 I/O (PIO),大量 CPU 時間用於簡單地在裝置和記憶體之間複製資料。使用 DMA,裝置可以直接寫入記憶體,繞過 CPU。這大大提高了系統性能。要檢查 Linux 系統中 DMA 地址的分配,您可以檢查 /proc/dma 的內容。
圖 1.4:/proc/dma 輸出示例
對於大多數裝置,作業系統會自動配置 DMA。一個可能不會自動配置 DMA 的重要裝置是系統並行 ATA (PATA) 磁碟。對於 PATA 裝置(參見下面的部分),如果您的裝置是 /dev/hda(當今流行的 SATA 驅動器不以傳統意義上的 DMA 方式使用 DMA),則可以透過執行以下命令啟用 DMA 訪問:
hdparm -d1 /dev/sda
要檢視硬碟的當前設定,您可以執行以下命令:
hdparm -d /dev/sda
配置 IRQ、I/O 埠/地址和 DMA
[edit | edit source]對於裝置 IRQ、I/O 地址、DMA 通道和記憶體區域的配置,在當今的即插即用 PCI 匯流排中,會自動完成。資源透過系統 BIOS、透過 Linux 核心以及可能透過裝置驅動程式分配,在大多數情況下會自動解決資源衝突。
Linux 提供各種實用程式來查詢裝置,以瞭解它們使用的資源。許多這些實用程式利用核心在 /proc 檔案系統中匯出的資訊。
用於查詢 PCI 裝置的兩個命令是 lspci 和 setpci 命令。lspci 實用程式可以根據您使用的引數提供有關使用 PCI 匯流排的裝置的詳細資料。
“lspci -vv”提供了有關 PCI 裝置的詳細輸出。下面的輸出顯示了“lspci”命令在沒有引數的情況下執行的典型輸出。
圖 1.5:lspci 輸出示例
所有 PCI 裝置都由唯一的 ID 標識。此 ID 由唯一的供應商 ID、裝置 ID 以及可能存在的子系統供應商 ID 和子系統裝置 ID 組成。執行“lspci”時,會查詢系統 ID 資料庫以獲取 PCI ID,並將其轉換為人類可讀的格式,顯示供應商名稱和裝置。PIC ID 資料庫位於 Ubuntu 上的 /usr/share/misc/pci.ids 和 RedHat 上。當在資料庫中找不到 PCI ID 時,它將顯示為兩個數字,以冒號分隔。在這種情況下,很可能該外圍裝置的正確裝置驅動程式也未載入。在 Internet 上搜索 PCI ID 可能可以揭示製造商、裝置 ID 和晶片組資訊,這些資訊可以幫助您確定裝置的正確驅動程式。或者,還沒有為 Linux 編寫該裝置的驅動程式。setpci 是一種用於配置和查詢 PCI 裝置的實用程式。它是一個高階實用程式,超出了本手冊的範圍,但您應該知道它的存在。
如何在 PnP BIOS/OS 中重新分配 IRQ 分配
即使 IRQ 衝突現在已經成為過去的事情,因為中斷可以共享,但對於一些中斷頻率很高的裝置來說,共享同一個 IRQ 仍然是一個壞主意。這對於硬碟或音效卡尤其如此。
在這種情況下,建議嘗試將 PCI 卡移到不同的插槽中,以嘗試為它們分配不同的 IRQ。
Linux 裝置管理概述
[edit | edit source]在繼續討論在執行 Linux 時通常會遇到的各種型別的海量儲存裝置之前,瞭解 Linux 如何管理裝置將非常有益。本手冊中介紹的許多概念將在後面進行擴充套件,但高層次概述將為您提供一個路線圖,說明所有這些概念是如何組合在一起的。
裝置驅動程式是一個核心空間程式,允許使用者空間應用程式與底層硬體進行互動。核心空間指的是具有對硬體的完全訪問許可權的特權程式碼,它在 ring 0 中執行,ring 0 是一種硬體強制實施的特權執行模式。使用者空間應用程式在特權較低的模式下執行,即 ring 3,不能直接訪問硬體。使用者空間應用程式只能透過向核心發出系統呼叫來與硬體互動,以代表它們執行操作。
Linux 核心將有關裝置驅動程式中裝置的資訊匯出到掛載在 /sys 下的偽檔案系統。此檔案系統告訴使用者空間哪些裝置可用。它在系統啟動時填充,但當熱插拔裝置插入或移除時, /sys 檔案系統會更新,核心會觸發事件以告知使用者空間發生了更改。
UNIX 設計原則之一是儘可能使用檔案的隱喻,為互動與各種 UNIX 元件提供一個標準的概念模型,其中它是真實的檔案、印表機、磁碟或鍵盤,使用標準輸入/輸出系統呼叫。裝置驅動程式的檔案介面匯出到/dev目錄下。
這些使用者空間應用程式之一是核心裝置管理器,udev,它在 /dev目錄下建立一個裝置節點,以允許使用者空間應用程式訪問裝置。裝置節點或檔案的名稱由裝置驅動程式的命名約定或 /etc/udev/rules.d中的使用者定義規則確定。它是透過 /dev下的條目,使用者空間應用程式可以與裝置驅動程式進行互動。
該udev守護程序還負責將更改通知其他使用者空間應用程式。此處最重要的應用程式是 HAL(硬體抽象層)守護程序和 D-Bus(桌面匯流排)。這些應用程式主要用於桌面環境在事件發生時執行任務,例如插入 USB 驅動器時開啟檔案瀏覽器,或者插入相機時開啟影像應用程式。
雖然 udev 在 /dev 檔案系統下建立相關的條目,但如果在事件發生時需要發生任何有用的事情,則需要 HAL 和 D-Bus。(注意:HAL 現在已棄用,因為它正在合併到 udev 中)。HAL 是一個單一的守護程序,負責發現、列舉和調解對主機計算機上大多數硬體的訪問,為桌面應用程式提供硬體抽象層。應用程式向 D-Bus 守護程序註冊以接收事件通知,併發布其他應用程式可能感興趣的事件通知。例如,D-Bus 用於在插入音訊 CD 時啟動媒體播放器,並通知其他應用程式當前播放的歌曲等。
從實際角度來看,對您影響最大的服務將是udev因為它在 / 下建立了裝置節點dev目錄。對於 LPI,能夠識別哪些裝置可用非常重要。
輔助儲存或大容量儲存裝置,如今天所知,有不同的型別,這些型別由它們的物理介面決定。介面是裝置物理連線到計算機的方式。隨著時間的推移,已經開發出許多用於連線大容量儲存裝置的介面,但今天遇到的四種主要型別的磁碟是
- PATA – 並行高階技術附件,也稱為 IDE
- SATA – 序列高階技術附件,最新的標準取代了 PATA,特別是在臺式機和筆記型電腦上。
- SCSI – 小型計算機系統介面磁碟用於伺服器和其他高階機器。SCSI 提供高速訪問,以及連線大量裝置的能力
- SAS – 序列 SCSI,一種針對伺服器的新 SCSI 標準
除了介面之外,大容量儲存的型別也由裝置本身決定。例如,您可以有 SATA 光碟機(CDROM/DVDROM)以及硬碟和 SCSCI 磁碟和 SCSI 磁帶驅動器。
PATA
PATA 是一種過時的標準,但您可能仍然會在較舊的機器上遇到它。並行指的是資料從裝置傳輸到 CPU 和記憶體的方式。PATA 標準有幾種變體,例如 IDE 和 EIDE,但自從 SATA 引入以來,它們被統稱為 PATA 裝置。
主機板配有兩個 PATA 聯結器,PATA 電纜最多支援每條電纜兩個裝置,以主/從模式配置。哪個裝置為主或從取決於裝置在電纜上的位置以及硬碟本身的跳線設定。由於 ATA 驅動器已經存在很長時間了,因此它們在 Linux 中得到了很好的支援,大多數 BIOS 通常沒有問題自動識別和配置這些裝置。
Linux 在 /dev 檔案系統下識別 ATA 裝置,命名約定為 /dev/hd[a-z]。裝置名稱的最後一個字母由磁碟是在主連線還是從連線上的主裝置還是從裝置決定。
裝置節點命名中也可能出現間隙。例如,磁碟通常被識別為 /dev/hda,為主驅動器,位於主聯結器上,而 CDROM 驅動器被識別為/dev/hdc作為從聯結器上的主裝置。對於桌上型電腦來說,這是一種非常常見的設定,因為最好將您兩個最常用的大容量儲存裝置放在單獨的電纜上以提高效能,而不是讓它們共享一條電纜,因為可能會出現訪問爭用。
PATA 磁碟上的分割槽由字母后面的數字標識。例如,/ 上的第一個主分割槽dev/hda驅動器被識別為 /dev/hda1和第 2 個主分割槽 /dev/hda2等等。有關磁碟分割槽編號的更多資訊,請參閱第 102.1 節。
在這一點上了解裝置節點命名約定,重要的是能夠識別硬碟裝置的型別及其裝置名稱。
SATA
序列 ATA (SATA) 驅動器已在很大程度上取代了桌上型電腦和筆記型電腦上的 PATA 驅動器。SATA 是一種序列標準,但比舊的 PATA 介面提供更高的吞吐量。SATA 驅動器沒有以主/從模式配置,每個驅動器都有自己專用的控制器或通道。SATA 驅動器的電纜比 PATA 裝置的電纜薄得多,節省了空間和成本。SATA 控制器使用高階主機控制器介面 (AHCI),允許 SATA 磁碟的熱插拔和熱交換。
與 PATA 裝置一樣,大多數 BIOS 會自動檢測 SATA 驅動器,Linux 核心通常沒有問題識別和載入 SATA 驅動器的正確驅動程式。SATA 在 Linux 下的一個特殊之處是,SATA 磁碟利用了 SCSI 磁碟子系統,因此這些裝置的命名約定遵循 SCSI 裝置的命名約定。
SATA 驅動器命名約定使用 scsi 子系統命名約定,裝置被標記為 /dev/sd[a-z]。裝置節點名稱的最後一個字元由 Linux 核心發現這些裝置的順序決定。SATA 驅動器上的分割槽從 1 開始編號。
SCSI 裝置
SCSI 與 PATA 和 SATA 一樣,定義了物理介面以及用於在計算機和外圍裝置之間傳輸資料的協議和命令。SCSI 最常用於硬碟和磁帶驅動器,但它可以連線各種其他裝置,例如掃描器和 CD 驅動器。通常,SCSI 裝置連線到具有自己 BIOS 的主機介面卡。SCSI 儲存裝置比 SATA 或 PATA 裝置更快、更健壯,但也更昂貴,因此它們主要用於伺服器或高階工作站。
SCSI 介面有兩種型別:8 位介面,其匯流排支援 8 個裝置,包括控制器,因此只有 7 個裝置的空間,以及 16 位介面(WIDE),支援 16 個裝置,包括控制器,因此只有 15 個塊裝置。
SCSI 裝置使用一組稱為 SCSI ID 的 3 個數字來唯一標識。
a. SCSI 通道
b. 裝置 ID 號碼
c. 邏輯單元號 LUN
SCSI 通道
每個 SCSI 介面卡都支援一個數據通道,用於連線 SCSI 裝置(磁碟、CDROM 等)。
這些通道從 0 開始編號。
裝置 ID 號碼
每個裝置都被分配了一個唯一的 ID 號碼,可以使用磁碟上的跳線設定。對於 8 位控制器,ID 範圍為 0 到 7,對於 16 位控制器,ID 範圍為 0 到 15。
邏輯單元
邏輯單元號 (LUN) 用於區分 SCSI 目標號內的裝置。例如,這用於指示磁碟驅動器內的特定分割槽或多驅動器磁帶機器人內的特定磁帶驅動器。如今它不太常見,因為主機介面卡現在成本更低,並且可以容納每個總線上更多的目標。
硬體檢測
所有檢測到的裝置都在 / 中列出proc/scsi/scsi檔案。下面的示例來自 SCSI-2.4-HOWTO
| 已連線的裝置 |
| 主機:scsi0 通道:00 ID:02 LUN:00 |
| 供應商:先鋒 型號:DVD-ROM DVD-303 版本:1.10 |
| 型別:CD-ROM ANSI SCSI 版本:02 |
| 主機:scsi1 通道:00 ID:00 LUN:00 |
| 供應商:IBM 型號:DNES-309170W 版本:SA30 |
| 型別:直接訪問 ANSI SCSI 版本:03 |
由於 SATA 驅動器與真正的 SCSI 驅動器使用相同的 scsi 子系統,因此 SCSI 裝置的命名約定與上面為 SATA 驅動器設定的命名約定相同。不僅 scsi 驅動器利用了 scsi 子系統,USB 驅動器也利用了 scsi 子系統,因此您會發現 USB 驅動器遵循相同的命名約定
該scsi_info工具使用 /proc/scsi/scsi 中的資訊列印指定裝置的 SCSI_ID 和型號。從上面的檔案中,scsi_info 將產生以下輸出
|
# scsi_info /dev/sda
MODEL="IBM DNES-309170W" FW_REV="SA30" |
系統將預設從 SCSI ID 為 0 的裝置啟動。這可以在 SCSI BIOS 中更改,可以在啟動時配置。如果 PC 混合使用 SCSI 和 SATA/PATA 磁碟,則必須先在系統的 BIOS 中選擇啟動順序。
SAS
序列連線 SCSI 是最新的介面,是對 SCSI 協議和介面的升級,就像 SATA 是對 PATA 的升級一樣。總的來說,SCSI 裝置比 SATA/PATA 驅動器更快、更可靠。這兩種技術的效能差距繼續縮小,但這兩種技術通常針對兩個不同的市場,即 SATA 針對消費市場,SCSI 針對企業市場。企業對可靠性和速度的要求高於消費市場,不同驅動器的價格也反映了這一點。
識別 BOOT 裝置的正確裝置 ID
列出不同型別的大容量儲存裝置及其命名約定的目的是讓您能夠輕鬆識別磁碟的裝置 ID。這對於能夠識別哪個驅動器是啟動裝置以及哪個磁碟分割槽包含根目錄和啟動目錄非常重要。
但是,Linux 命名約定存在問題,而且不僅僅是磁碟驅動器。問題是當進行硬體配置更改時,裝置名稱可能會在系統重新啟動之間發生變化。由於硬體命名約定包含一個取決於核心發現裝置順序的元件,因此新增、移動或刪除裝置可能會導致裝置名稱發生更改。幾年前,這並不是什麼大問題,因為更換硬碟並不常見;但隨著 USB 的出現,並且它使用 SCSI 子系統進行裝置命名,這個問題變得更加嚴重。為了唯一地識別裝置,無論何時發現或放置,都需要找到一種唯一地識別裝置的方法。對於磁碟,這是透過將通用唯一 ID 寫入磁碟元資料並使用 UUID 在配置檔案中而不是裝置節點來完成的。(不僅硬碟需要唯一識別。其他裝置也需要唯一識別,但可能使用不同的方法。例如,網絡卡使用它們的 MAC 地址。)blkid 實用程式(替換 vol_id)可用於查詢裝置上的設定或搜尋具有特定 UUID 的裝置。
blkid /dev/sda1
例如,產生以下輸出:/dev/sda1: UUID="c7d63e4b-2d9f-450a-8052-7b8929ec8a6b" TYPE="ext4",表明裝置 sda 上的第一個分割槽具有 ext4 檔案系統和 UUID 為 c7d63e4b-2d9f-450a-8052-7b8929ec8a6b
blkid -U 75426429-cc4b-4bfc-beb9-305e1f7f8bc9
搜尋具有指定 ID 的裝置並返回 /dev/sdb1。或者,您也可以檢視 /dev/disk/by-uuid 下以檢視哪些 ID 對映到 Linux 核心看到的哪些裝置。
熱插拔和冷插拔裝置指的是裝置在計算機執行時(熱插拔)可以插入或移除,還是機器必須先關閉電源才能插入或移除裝置(冷插拔)。
典型的熱插拔裝置包括 USB 資料儲存器、滑鼠或鍵盤以及一些 SATA 驅動器,而冷插拔裝置包括顯示卡、網絡卡和 CPU,儘管在高階伺服器機器中,即使這些元件也可以熱插拔。熱插拔裝置的優勢在於能夠在無需將機器離線的情況下更換故障元件或新增額外的元件,這是許多需要保持最大正常執行時間的生產伺服器的要求。
您需要了解的很多內容已經在“Linux 裝置管理概述”中解釋過了。當熱插拔裝置插入或移除時,核心會更新 sys 虛擬檔案系統,而 udev 會收到事件通知。udev 將在 /dev 下建立裝置節點,並向 HAL 傳送通知,HAL 又會向 D-Bus 通知這些更改。
USB 支援
如今最流行的熱插拔介面型別之一是通用序列匯流排 (USB),它是一種旨在將裝置連線到 PC 的通訊架構。這些裝置分為五個類別:
- 顯示裝置
- 通訊裝置
- 音訊裝置
- 大容量儲存裝置
- 人機介面裝置 (HID)
這些裝置插入 USB 埠,該埠由 USB 控制器驅動。自版本 2.2.7 起,Linux 核心中就包含了對 USB 控制器 的支援(Linux USB 子系統 HOWTO)。
主機控制器
有三種類型的 USB 主機控制器:
| OHCI (康柏) | usb-ohci.o |
| UHCI (英特爾) | usb-uhci.o |
| EHCI (USB v 2.0) | ehci-hdc.o |
將 USB 裝置插入 PC 後,我們可以使用 lsusb 命令列出這些裝置:
|
# lsusb
匯流排 001 裝置 002: ID 04a9:1055 佳能株式會社 |
圖 1.6:lsusb 輸出示例
在討論 Linux 如何管理裝置時,我們提到核心利用裝置驅動程式向 /sys 檔案系統匯出資訊。在 Linux 中,大多數裝置驅動程式作為核心原始碼的一部分提供,可以編譯為模組,這些模組可以動態載入和解除安裝到核心中,或者直接編譯到核心中。模組化系統使第三方能夠編寫裝置驅動程式並將其作為模組提供,這些模組可以在不重新編譯核心的情況下載入和解除安裝。
大多數驅動程式都編譯為模組,因為這可以使核心保持較小規模,並且可以提供比將所有驅動程式都編譯為核心的一部分更實用的驅動程式數量。您需要了解的用於在 Linux 下管理裝置驅動程式的命令是:
- lsmod - 列出當前安裝的模組。
- modinfo - 查詢模組的依賴關係、作者和引數資訊。
- insmod - 透過提供驅動程式路徑來安裝模組。
- modprobe - 透過模組名稱安裝模組,並處理依賴關係解析。
- rmmod - 移除。
要檢視系統載入了哪些核心模組,您可以執行 lsmod 命令。輸出的第一列是模組名稱,第二列是模組的大小,第三列顯示哪些其他模組依賴於此模組。
圖 1.7:lsmod 輸出示例
如果您需要有關模組的其他資訊,例如其依賴關係和配置引數,您可以使用 modinfo 命令。以下是 “modinfo psmouse” 命令(滑鼠驅動程式)輸出的一個示例。
圖 101.1.8:modinfo 輸出示例
要載入裝置的驅動程式,可以使用 insmod 或 modprobe 命令。insmod 命令以核心模組路徑為引數,並嘗試將模組載入到記憶體中。下面的命令將嘗試將 xpad 驅動程式載入到記憶體中。
insmod 命令很不方便,因為它不會載入任何驅動程式依賴關係,您需要指定驅動程式模組的完整路徑。modprobe 命令會自動載入任何未駐留的依賴關係,並允許您使用模組名稱而不是模組的檔名。
要移除模組,可以使用 rmmod 命令或 modprobe -r。只要沒有模組依賴於此模組,這就會移除模組。
使用過的術語、檔案和實用程式
- /sys
- /proc
- /dev
- modprobe
- lsmod
- lspci
- lsusb






