101.1 Bài 1
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
101 Kiến trúc Hệ thống |
Mục tiêu: |
101.1 Xác định và Định Cấu hình Cài đặt Phần Cứng |
Bài: |
1 trên 1 |
Giới thiệu
Kể từ những năm tháng đầu tiên của máy tính điện tử, các nhà sản xuất máy tính cá nhân và doanh nghiệp đã tích hợp nhiều bộ phận phần cứng khác nhau trong máy của họ. Chính vì lý do này mà chúng cần tới sự hỗ trợ của hệ điều hành. Điều này có thể khiến các nhà phát triển hệ điều hành bị choáng ngợp nếu các tiêu chuẩn cho bộ hướng dẫn và giao tiếp thiết bị không được thiết lập bởi toàn ngành. Tương tự như lớp trừu tượng được tiêu chuẩn hóa do hệ điều hành cung cấp cho một ứng dụng, các tiêu chuẩn này sẽ giúp việc viết và bảo trì một hệ điều hành không bị ràng buộc với một kiểu phần cứng cụ thể trở nên dễ dàng hơn. Tuy nhiên, sự phức tạp của các phần cứng cơ bản tích hợp đôi khi sẽ cần tới những điều chỉnh về cách các tài nguyên tiếp xúc với hệ điều hành để hệ điều hành có thể được cài đặt và hoạt động một cách chính xác.
Một số điều chỉnh có thể được thực hiện ngay cả khi chưa cài đặt hệ điều hành. Hầu hết các máy đều cung cấp tiện ích cấu hình có thể được thực thi khi máy được bật. Cho đến giữa những năm 2000, tiện ích cấu hình đã được triển khai trong BIOS (Hệ thống Đầu vào/Đầu ra Cơ bản), tiêu chuẩn cho phần sụn chứa các tiến trình cấu hình cơ bản có trong bo mạch chủ x86. Từ cuối thập kỷ đầu tiên của những năm 2000, các máy dựa trên kiến trúc x86 đã bắt đầu thay thế BIOS bằng một triển khai mới được gọi là UEFI (Giao diện Phần Sụn Mở rộng Hợp nhất) có nhiều tính năng tinh vi hơn để nhận dạng, kiểm tra, cấu hình và nâng cấp phần sụn. Bất chấp sự thay đổi này, không quá lạ khi người ta vẫn gọi tiện ích cấu hình là BIOS vì cả hai cách triển khai đều đáp ứng cùng một mục đích cơ bản.
Note
|
Thông tin chi tiết về sự giống và khác nhau giữa BIOS và UEFI sẽ được đề cập trong bài học sau. |
Kích hoạt Thiết bị
Tiện ích cấu hình hệ thống được hiển thị sau khi ta nhấn một phím cụ thể lúc máy tính được bật. Phím bấm này sẽ tùy thuộc vào từng nhà sản xuất, nhưng thường sẽ là phím Del hoặc một trong các phím chức năng, chẳng hạn như F2 hoặc F12. Tổ hợp phím để sử dụng thường sẽ được hiển thị trong màn hình bật nguồn.
Trong tiện ích thiết lập BIOS, ta có thể bật và tắt các thiết bị ngoại vi tích hợp, kích hoạt bảo vệ lỗi cơ bản và thay đổi cài đặt phần cứng như IRQ (yêu cầu ngắt) và DMA (truy cập bộ nhớ trực tiếp). Trên các máy hiện đại, việc thay đổi các cài đặt này hiếm khi cần thiết nhưng vẫn có thể cần tới một số điều chỉnh để giải quyết các vấn đề cụ thể. Chẳng hạn có những công nghệ RAM tương thích với tốc độ truyền dữ liệu nhanh hơn giá trị mặc định; vì vậy, ta nên thay đổi nó thành giá trị do nhà sản xuất chỉ định. Một số CPU sẽ cung cấp các tính năng không cần thiết cho phiên cài đặt cụ thể và có thể bị vô hiệu hóa. Các tính năng bị vô hiệu hóa sẽ giảm mức tiêu thụ điện năng và có thể tăng khả năng bảo vệ hệ thống vì các tính năng CPU chứa các lỗi đã biết cũng có thể bị vô hiệu hóa.
Nếu máy được trang bị nhiều thiết bị lưu trữ, điều quan trọng là phải xác định được thiết bị nào có trình tải khởi động chính xác và phải là mục nhập đầu tiên trong thứ tự khởi động thiết bị. Hệ điều hành có thể sẽ không tải nếu thiết bị không chính xác xuất hiện đầu tiên trong danh sách xác minh khởi động BIOS.
Kiểm tra Thiết bị trong Linux
Khi các thiết bị được xác định chính xác, hệ điều hành sẽ liên kết các thành phần phần mềm tương ứng theo yêu cầu của chúng. Khi một tính năng phần cứng không hoạt động như mong đợi, điều quan trọng là phải xác định được chính xác vấn đề đang xảy ra ở đâu. Khi một phần cứng không được hệ điều hành phát hiện, rất có thể phần đó — hoặc cổng mà nó được kết nối — đã bị lỗi. Khi phần cứng được phát hiện chính xác nhưng vẫn không thể hoạt động bình thường, có thể đã có sự cố nằm ở phía hệ điều hành. Do đó, một trong những bước đầu tiên khi xử lý các sự cố liên quan đến phần cứng là kiểm tra xem hệ điều hành có phát hiện đúng thiết bị hay không. Có hai cách cơ bản để xác định tài nguyên phần cứng trên hệ thống Linux: sử dụng các lệnh chuyên biệt hoặc đọc các tệp cụ thể bên trong các hệ thống tệp đặc biệt.
Lệnh Kiểm tra
Hai lệnh cần thiết để xác định các thiết bị được kết nối trong hệ thống Linux là:
lspci
-
Lệnh sẽ hiển thị tất cả các thiết bị hiện được kết nối với cổng PCI (Kết nối Thiết bị Ngoại vi). Thiết bị PCI có thể là một thành phần được gắn vào bo mạch chủ (giống như một bộ điều khiển đĩa) hoặc một thẻ mở rộng được lắp vào khe cắm PCI (ví dụ như thẻ đồ họa bên ngoài).
lsusb
-
Lệnh sẽ liệt kê các thiết bị USB (Cổng nối Đa năng) hiện được kết nối với máy. Mặc dù có đủ các thiết bị USB cho hầu hết mọi mục đích ta có thể nghĩ tới nhưng giao diện USB chủ yếu được sử dụng để kết nối các thiết bị đầu vào — bàn phím, thiết bị trỏ — và các phương tiện lưu trữ di động.
Đầu ra của các lệnh lspci
và lsusb
sẽ bao gồm một danh sách tất cả các thiết bị PCI và USB được xác định bởi hệ điều hành. Tuy nhiên, thiết bị có thể sẽ chưa hoạt động hoàn toàn vì mọi phần cứng đều yêu cầu một thành phần phần mềm để điều khiển thiết bị tương ứng. Thành phần phần mềm này được gọi là mô-đun nhân và nó có thể là một phần của nhân Linux chính thức hoặc được thêm riêng vào từ các nguồn khác.
Các mô-đun nhân Linux liên quan đến thiết bị phần cứng cũng được gọi là trình điều khiển như trong các hệ điều hành khác. Tuy nhiên, trình điều khiển của Linux không phải lúc nào cũng được nhà sản xuất thiết bị cung cấp. Trong khi một số nhà sản xuất cung cấp trình điều khiển nhị phân của riêng họ để cài đặt riêng, nhiều trình điều khiển vẫn được viết bởi các nhà phát triển độc lập. Ví dụ như trước đây, các bộ phận hoạt động trên Windows có thể sẽ không có mô-đun nhân tương ứng cho Linux. Ngày nay, các hệ điều hành dựa trên Linux đều có hỗ trợ phần cứng mạnh mẽ và hầu hết các thiết bị đều có thể hoạt động một cách dễ dàng.
Các lệnh liên quan trực tiếp đến phần cứng thường yêu cầu quyền gốc để thực thi hoặc sẽ chỉ hiển thị thông tin hạn chế khi được thực thi bởi người dùng bình thường. Vì vậy, ta sẽ cần phải đăng nhập dưới tên siêu người dùng hoặc thực thi lệnh bằng sudo
.
Ví dụ: đầu ra sau của lệnh lspci
sẽ hiển thị một vài thiết bị được xác định:
$ lspci 01:00.0 VGA compatible controller: NVIDIA Corporation GM107 [GeForce GTX 750 Ti] (rev a2) 04:02.0 Network controller: Ralink corp. RT2561/RT61 802.11g PCI 04:04.0 Multimedia audio controller: VIA Technologies Inc. ICE1712 [Envy24] PCI Multi-Channel I/O Controller (rev 02) 04:0b.0 FireWire (IEEE 1394): LSI Corporation FW322/323 [TrueFire] 1394a Controller (rev 70)
Đầu ra của các lệnh như vậy có thể dài đến hàng chục dòng. Vì vậy, ví dụ trước và ví dụ tiếp theo sẽ chỉ chứa các phần trọng tâm. Các số thập lục phân ở đầu mỗi dòng là địa chỉ duy nhất của thiết bị PCI tương ứng. Lệnh lspci
sẽ hiển thị thêm chi tiết về một thiết bị cụ thể nếu địa chỉ của nó được cung cấp với tùy chọn -s
kèm theo tùy chọn -v
:
$ lspci -s 04:02.0 -v 04:02.0 Network controller: Ralink corp. RT2561/RT61 802.11g PCI Subsystem: Linksys WMP54G v4.1 Flags: bus master, slow devsel, latency 32, IRQ 21 Memory at e3100000 (32-bit, non-prefetchable) [size=32K] Capabilities: [40] Power Management version 2 kernel driver in use: rt61pci
Đầu ra hiện nay đã hiển thị nhiều chi tiết hơn về thiết bị trên địa chỉ 04:02.0
. Nó là một bộ điều khiển mạng có tên nội bộ là Ralink corp. RT2561/RT61 802.11g PCI
. Hệ thống con (Subsystem
) được liên kết với loại và nhãn hiệu của thiết bị — Linksys WMP54G v4.1
— và có thể sẽ hữu ích trong các mục đích chẩn đoán.
Mô-đun nhân có thể được xác định trong dòng kernel driver in use
hiển thị mô-đun rt61pci
. Từ tất cả các thông tin thu thập được, ta có thể giả định rằng:
-
Thiết bị đã được xác định.
-
Một mô-đun nhân phù hợp đã được tải.
-
Thiết bị sẵn sàng để sử dụng.
Một cách khác để xác minh mô-đun nhân nào đang được sử dụng cho thiết bị cụ thể có thể được cung cấp bởi tùy chọn -k
có sẵn trong các phiên bản lspci
gần đây:
$ lspci -s 01:00.0 -k 01:00.0 VGA compatible controller: NVIDIA Corporation GM107 [GeForce GTX 750 Ti] (rev a2) kernel driver in use: nvidia kernel modules: nouveau, nvidia_drm, nvidia
Đối với thiết bị đã chọn là bo mạch GPU NVIDIA, lspci
cho ta biết rằng mô-đun đang sử dụng có tên nvidia
tại dòng kernel driver in use: nvidia
và tất cả các mô-đun nhân tương ứng được liệt kê trong dòng kernel modules: nouveau , nvidia_drm, nvidia
.
Lệnh lsusb
cũng tương tự như lspci
nhưng nó sẽ chỉ liệt kê thông tin về USB:
$ lsusb Bus 001 Device 029: ID 1781:0c9f Multiple Vendors USBtiny Bus 001 Device 028: ID 093a:2521 Pixart Imaging, Inc. Optical Mouse Bus 001 Device 020: ID 1131:1001 Integrated System Solution Corp. KY-BT100 Bluetooth Adapter Bus 001 Device 011: ID 04f2:0402 Chicony Electronics Co., Ltd Genius LuxeMate i200 Keyboard Bus 001 Device 007: ID 0424:7800 Standard Microsystems Corp. Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Lệnh lsusb
sẽ hiển thị các kênh USB có sẵn và các thiết bị được kết nối với chúng. Như với lspci
, tùy chọn -v
sẽ hiển thị đầu ra chi tiết hơn. Ta có thể chọn một thiết bị cụ thể để kiểm tra bằng cách cung cấp ID của nó cho tùy chọn -d
:
$ lsusb -v -d 1781:0c9f Bus 001 Device 029: ID 1781:0c9f Multiple Vendors USBtiny Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.01 bDeviceClass 255 Vendor Specific Class bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x1781 Multiple Vendors idProduct 0x0c9f USBtiny bcdDevice 1.04 iManufacturer 0 iProduct 2 USBtiny iSerial 0 bNumConfigurations 1
Với tùy chọn -t
, lệnh lsusb
sẽ hiển thị ánh xạ thiết bị USB hiện tại dưới dạng cây phân cấp:
$ lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M |__ Port 1: Dev 3, If 0, Class=Hub, Driver=hub/3p, 480M |__ Port 2: Dev 11, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 2: Dev 11, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 3: Dev 20, If 0, Class=Wireless, Driver=btusb, 12M |__ Port 3: Dev 20, If 1, Class=Wireless, Driver=btusb, 12M |__ Port 3: Dev 20, If 2, Class=Application Specific Interface, Driver=, 12M |__ Port 1: Dev 7, If 0, Class=Vendor Specific Class, Driver=lan78xx, 480M |__ Port 2: Dev 28, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 3: Dev 29, If 0, Class=Vendor Specific Class, Driver=, 1.5M
Có thể không phải tất cả các thiết bị đều có các mô-đun tương ứng được liên kết với chúng. Việc giao tiếp với một số thiết bị nhất định có thể được xử lý trực tiếp bởi ứng dụng mà không cần qua trung gian cung cấp bởi một mô-đun. Tuy nhiên, có những thông tin quan trọng trong đầu ra được cung cấp bởi lsusb -t
. Khi một mô-đun phù hợp tồn tại, tên của nó sẽ xuất hiện ở cuối dòng dành cho thiết bị như trong Driver=btusb
. Thiết bị Class
sẽ xác định danh mục chung, như Human Interface Device
, Wireless
, Vendor Specific Class
, Mass Storage
và các danh mục khác. Để xác minh thiết bị nào đang sử dụng mô-đun btusb
có trong danh sách trước, cả hai số của Bus
và Dev
phải được cung cấp cho tùy chọn -s
của lệnh lsusb
:
$ lsusb -s 01:20 Bus 001 Device 020: ID 1131:1001 Integrated System Solution Corp. KY-BT100 Bluetooth Adapter
Thông thường, bất cứ lúc nào cũng có một tập hợp lớn các mô-đun nhân được tải trong một hệ thống Linux tiêu chuẩn. Cách tốt nhất để tương tác với chúng là sử dụng các lệnh được cung cấp bởi gói kmod
. Đây là một bộ công cụ để xử lý các tác vụ phổ biến với các mô-đun nhân Linux như chèn, xóa, liệt kê, kiểm tra thuộc tính, giải quyết các phần phụ thuộc và bí danh. Ví dụ: lệnh lsmod
sẽ hiển thị tất cả các mô-đun hiện được tải:
$ lsmod Module Size Used by kvm_intel 138528 0 kvm 421021 1 kvm_intel iTCO_wdt 13480 0 iTCO_vendor_support 13419 1 iTCO_wdt snd_usb_audio 149112 2 snd_hda_codec_realtek 51465 1 snd_ice1712 75006 3 snd_hda_intel 44075 7 arc4 12608 2 snd_cs8427 13978 1 snd_ice1712 snd_i2c 13828 2 snd_ice1712,snd_cs8427 snd_ice17xx_ak4xxx 13128 1 snd_ice1712 snd_ak4xxx_adda 18487 2 snd_ice1712,snd_ice17xx_ak4xxx microcode 23527 0 snd_usbmidi_lib 24845 1 snd_usb_audio gspca_pac7302 17481 0 gspca_main 36226 1 gspca_pac7302 videodev 132348 2 gspca_main,gspca_pac7302 rt61pci 32326 0 rt2x00pci 13083 1 rt61pci media 20840 1 videodev rt2x00mmio 13322 1 rt61pci hid_dr 12776 0 snd_mpu401_uart 13992 1 snd_ice1712 rt2x00lib 67108 3 rt61pci,rt2x00pci,rt2x00mmio snd_rawmidi 29394 2 snd_usbmidi_lib,snd_mpu401_uart
Đầu ra của lệnh lsmod
được chia thành ba cột:
Module
-
Tên mô-đun.
Size
-
Lượng RAM chiếm bởi mô-đun, tính bằng byte.
Used by
-
Các mô-đun phụ thuộc.
Một số mô-đun sẽ yêu cầu các mô-đun khác hoạt động đúng cách như trong trường hợp của các mô-đun dành cho thiết bị âm thanh:
$ lsmod | fgrep -i snd_hda_intel snd_hda_intel 42658 5 snd_hda_codec 155748 3 snd_hda_codec_hdmi,snd_hda_codec_via,snd_hda_intel snd_pcm 81999 3 snd_hda_codec_hdmi,snd_hda_codec,snd_hda_intel snd_page_alloc 13852 2 snd_pcm,snd_hda_intel snd 59132 19 snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_hda_codec_via,snd_pcm,snd_seq,snd_hda_codec,snd_hda_intel,snd_seq_device
Cột thứ ba (Used by
) hiển thị các mô-đun yêu cầu mô-đun trong cột đầu tiên phải hoạt động đúng cách. Nhiều mô-đun trong kiến trúc âm thanh Linux có tiền tố là snd
sẽ phụ thuộc lẫn nhau. Khi tìm kiếm các sự cố trong quá trình chẩn đoán hệ thống, việc gỡ bỏ các mô-đun cụ thể hiện đang tải có thể sẽ rất hữu ích. Lệnh modprobe
có thể được sử dụng để tải và dỡ bỏ các mô-đun nhân: để dỡ bỏ một mô-đun và các mô-đun liên quan của nó (miễn là chúng không được sử dụng bởi một tiến trình đang chạy), ta nên sử dụng lệnh modprobe -r
. Ví dụ: để hủy tải mô-đun snd-hda-intel
(mô-đun dành cho thiết bị âm thanh HDA Intel) và các mô-đun khác liên quan đến hệ thống âm thanh:
# modprobe -r snd-hda-intel
Ngoài việc tải và dỡ bỏ các mô-đun nhân trong khi hệ thống đang chạy, ta có thể thay đổi các tham số mô-đun khi hạt nhân đang được tải. Nó sẽ không khác lắm so với việc chuyển các tùy chọn cho các lệnh. Mỗi mô-đun sẽ chấp nhận các tham số cụ thể, nhưng hầu hết các giá trị mặc định đều được khuyến nghị và không cần thêm tham số. Tuy nhiên, trong một số trường hợp, ta sẽ cần sử dụng các tham số để thay đổi hành vi của mô-đun để chúng có thể hoạt động được như mong đợi.
Khi sử dụng tên mô-đun làm đối số duy nhất, lệnh modinfo
sẽ hiển thị mô tả, tệp, tác giả, giấy phép, phần nhận dạng, phần phụ thuộc và các tham số khả dụng cho mô-đun đã cho. Các tham số tùy chỉnh cho một mô-đun có thể được duy trì liên tục bằng cách đưa chúng vào tệp /etc/modprobe.conf
hoặc trong các tệp riêng lẻ có phần mở rộng .conf
trong thư mục /etc/modprobe.d/
. Tùy chọn -p
sẽ làm cho lệnh modinfo
hiển thị tất cả các tham số có sẵn và bỏ qua các thông tin khác:
# modinfo -p nouveau vram_pushbuf:Create DMA push buffers in VRAM (int) tv_norm:Default TV norm. Supported: PAL, PAL-M, PAL-N, PAL-Nc, NTSC-M, NTSC-J, hd480i, hd480p, hd576i, hd576p, hd720p, hd1080i. Default: PAL NOTE Ignored for cards with external TV encoders. (charp) nofbaccel:Disable fbcon acceleration (int) fbcon_bpp:fbcon bits-per-pixel (default: auto) (int) mst:Enable DisplayPort multi-stream (default: enabled) (int) tv_disable:Disable TV-out detection (int) ignorelid:Ignore ACPI lid status (int) duallink:Allow dual-link TMDS (default: enabled) (int) hdmimhz:Force a maximum HDMI pixel clock (in MHz) (int) config:option string to pass to driver core (charp) debug:debug string to pass to driver core (charp) noaccel:disable kernel/abi16 acceleration (int) modeset:enable driver (default: auto, 0 = disabled, 1 = enabled, 2 = headless) (int) atomic:Expose atomic ioctl (default: disabled) (int) runpm:disable (0), force enable (1), optimus only default (-1) (int)
Đầu ra mẫu đã hiển thị tất cả các tham số có sẵn cho mô-đun nouveau
- một mô-đun nhân do Dự án Nouveau cung cấp dưới dạng thay thế cho trình điều khiển độc quyền dành cho thẻ GPU NVIDIA. Ví dụ: tùy chọn modeset
cho phép kiểm soát xem độ phân giải và độ sâu của màn hình có được đặt trong không gian hạt nhân thay vì không gian người dùng hay không. Việc thêm options nouveau modeset=0
vào tệp /etc/modprobe.d/nouveau.conf
sẽ vô hiệu hóa tính năng hạt nhân modeset.
Nếu một mô-đun gây ra sự cố, tệp /etc/modprobe.d/blacklist.conf
có thể được sử dụng để chặn việc tải mô-đun. Ví dụ: để ngăn việc tải tự động mô-đun nouveau
, dòng blacklist nouveau
phải được thêm vào tệp /etc/modprobe.d/blacklist.conf
. Hành động này là bắt buộc khi mô-đun độc quyền nvidia
được cài đặt và mô-đun mặc định nouveau
nên được đặt sang một bên.
Note
|
Ta có thể sửa đổi tệp |
Tệp Thông tin và Tệp Thiết bị
Các lệnh lspci
, lsusb
và lsmod
đóng vai trò là giao diện phía người dùng để đọc thông tin phần cứng được hệ điều hành lưu trữ. Loại thông tin này được lưu giữ trong các tệp đặc biệt trong thư mục /proc
và /sys
. Các thư mục này là các điểm gắn kết với các hệ thống tệp không có trong phân vùng thiết bị mà chỉ có trong không gian RAM được hạt nhân sử dụng để lưu trữ cấu hình thời gian chạy và thông tin về các tiến trình đang chạy. Các hệ thống tệp như vậy không dành cho việc lưu trữ tệp thông thường, vì thế mà chúng được gọi là hệ thống tệp giả và chỉ tồn tại khi hệ thống đang chạy. Thư mục /proc
sẽ chứa các tệp có thông tin liên quan đến các tiến trình đang chạy và tài nguyên phần cứng. Một số tệp quan trọng trong /proc
để kiểm tra phần cứng là:
/proc/cpuinfo
-
Liệt kê thông tin chi tiết về (các) CPU được tìm thấy bởi hệ điều hành.
/proc/interrupts
-
Một danh sách các số xử lý ngắt trên mỗi thiết bị IO cho mỗi CPU.
/proc/ioports
-
Liệt kê các khu vực cổng Đầu vào/Đầu ra đã đăng ký hiện đang được sử dụng.
/proc/dma
-
Liệt kê các kênh DMA (truy cập bộ nhớ trực tiếp) đã đăng ký đang được sử dụng.
Các tệp bên trong thư mục /sys
có vai trò tương tự như trong /proc
. Tuy nhiên, thư mục /sys
có mục đích cụ thể là lưu trữ thông tin thiết bị và dữ liệu hạt nhân liên quan đến phần cứng, trong khi /proc
cũng chứa thông tin về các cấu trúc dữ liệu hạt nhân khác nhau bao gồm các tiến trình đang chạy và cấu hình.
Một thư mục khác liên quan trực tiếp đến các thiết bị trong hệ thống Linux tiêu chuẩn là /dev
. Mọi tệp bên trong /dev
đều được liên kết với một thiết bị hệ thống, đặc biệt là các thiết bị lưu trữ. Ví dụ như khi được kết nối với kênh IDE đầu tiên của bo mạch chủ, ổ cứng IDE kế thừa sẽ được biểu thị bằng tệp /dev/hda
. Mỗi phân vùng trong đĩa này sẽ được xác định bởi /dev/hda1
, /dev/hda2
cho đến phân vùng cuối cùng được tìm thấy.
Các thiết bị có thể tháo rời được xử lý bởi hệ thống con udev. Hệ thống này sẽ tạo ra các thiết bị tương ứng trong /dev
. Nhân Linux sẽ nắm bắt sự kiện kiểm tra phần cứng và chuyển nó tới tiến trình udev. Tiến trình này sau đó sẽ xác định thiết bị và tự động tạo các tệp tương ứng trong /dev
sử dụng các quy tắc đã được xác định trước.
Trong các bản phân phối Linux hiện tại, udev sẽ chịu trách nhiệm nhận dạng và cấu hình các thiết bị đã có trong quá trình khởi động máy (phát hiện cắm nguội) và các thiết bị được xác định trong khi hệ thống đang chạy (phát hiện cắm nóng). Udev dựa vào SysFS, tức hệ thống tệp giả, về các thông tin liên quan đến phần cứng được gắn trong /sys
.
Note
|
Cắm nóng là thuật ngữ dùng để chỉ việc phát hiện và cấu hình thiết bị trong khi hệ thống đang chạy, chẳng hạn như khi cắm thiết bị USB. Nhân Linux đã hỗ trợ các tính năng cắm nóng kể từ phiên bản 2.6 và cho phép hầu hết các cổng hệ thống (PCI, USB, v.v.) kích hoạt các sự kiện cắm nóng khi một thiết bị được kết nối hoặc ngắt kết nối. |
Khi các thiết bị mới được phát hiện, udev sẽ tìm kiếm một quy tắc phù hợp trong các quy tắc được xác định trước được lưu trữ trong thư mục /etc/udev/rules.d/
. Các quy tắc quan trọng nhất được cung cấp bởi bản phân phối, nhưng những quy tắc mới cũng có thể được thêm vào cho các trường hợp cụ thể.
Thiết bị Lưu trữ
Trong Linux, thiết bị lưu trữ thường được gọi là thiết bị khối vì dữ liệu được đọc đến và từ các thiết bị này dưới dạng các khối dữ liệu được đệm với kích thước và vị trí khác nhau. Mỗi thiết bị khối đều được xác định bằng một tệp trong thư mục /dev
với tên của tệp tùy thuộc vào loại thiết bị (IDE, SATA, SCSI, v.v.) và các phân vùng của nó. Ví dụ, các thiết bị CD/DVD và đĩa mềm sẽ có tên tương ứng được đặt trong /dev
: ổ đĩa CD/DVD được kết nối với kênh IDE thứ hai sẽ được xác định là /dev/hdc
(/dev/hda
và /dev/hdb
dành riêng cho thiết bị chính và phụ trên kênh IDE đầu tiên) và một ổ đĩa mềm cũ sẽ được xác định là /dev/fdO
, /dev/fd1
, v.v.
Kể từ nhân Linux phiên bản 2.4 trở đi, hầu hết các thiết bị lưu trữ hiện đều được xác định như thể chúng là thiết bị SCSI bất kể phần cứng của chúng thuộc loại nào. Các thiết bị khối IDE, SSD và USB sẽ có tiền tố là sd
. Đối với các đĩa IDE, tiền tố sd
sẽ được sử dụng, nhưng chữ cái thứ ba sẽ được chọn tùy thuộc vào việc ổ đĩa là chính hay phụ (trong kênh IDE đầu tiên, chính sẽ là sda
và phụ sẽ là sdb
). Các phân vùng sẽ được liệt kê bằng số. Đường dẫn /dev/sda1
, /dev/sda2
, v.v. được sử dụng cho phân vùng thứ nhất và thứ hai của thiết bị khối được xác định đầu tiên; /dev/sdb1
, /dev/sdb2
, v.v. được sử dụng để xác định phân vùng thứ nhất và thứ hai của thiết bị khối được xác định thứ hai. Ngoại lệ đối với mẫu này là với thẻ nhớ (thẻ SD) và thiết bị NVMe (SSD được kết nối với cổng PCI Express). Đối với thẻ SD, các đường dẫn /dev/mmcblk0p1
, /dev/mmcblk0p2
, v.v. được sử dụng cho phân vùng thứ nhất và thứ hai của thiết bị được xác định trước; /dev/mmcblk1p1
, /dev/mmcblk1p2
, v.v. được sử dụng để xác định phân vùng thứ nhất và thứ hai của thiết bị được xác định thứ hai. Các thiết bị NVMe sẽ nhận tiền tố nvme
như trong /dev/nvme0n1p1
và /dev/nvme0n1p2
.
Bài tập Hướng dẫn
-
Giả sử một hệ điều hành không thể khởi động sau khi thêm đĩa SATA thứ hai vào hệ thống, biết rằng tất cả các bộ phận đều hoạt động bình thường. Nguyên nhân có thể là gì?
-
Giả sử bạn muốn đảm bảo rằng thẻ video bên ngoài được kết nối với cổng PCI của máy tính để bàn mới mua của bạn thực sự là thẻ được nhà sản xuất quảng cáo, nhưng việc mở vỏ máy tính sẽ làm mất hiệu lực bảo hành. Lệnh nào có thể được sử dụng để liệt kê các chi tiết của thẻ màn hình khi chúng được hệ điều hành phát hiện?
-
Dòng sau đây là một phần của đầu ra được tạo bởi lệnh
lspci
:03:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS 2208 [Thunderbolt] (rev 05)
Bạn nên thực hiện lệnh nào để xác định mô-đun nhân đang được sử dụng cho thiết bị cụ thể này?
-
Quản trị viên hệ thống muốn thử các tham số khác nhau cho mô-đun nhân
bluetooth
mà không cần khởi động lại hệ thống. Tuy nhiên, bất kỳ cách nào để hủy tải mô-đun bằngmodprobe -r bluetooth
đều dẫn đến lỗi sau:modprobe: FATAL: Module bluetooth is in use.
Nguyên nhân có thể là gì?
Bài tập Mở rộng
-
Không có gì lạ khi tìm thấy các máy cũ trong môi trường sản xuất, chẳng hạn như khi một số thiết bị sử dụng kết nối lỗi thời để giao tiếp với máy tính điều khiển khiến ta cần phải đặc biệt chú ý đến một số đặc thù của những máy cũ này. Ví dụ, một số máy chủ x86 có phần sụn BIOS cũ hơn sẽ không khởi động nếu không phát hiện thấy bàn phím. Làm thế nào để tránh được vấn đề này?
-
Các hệ điều hành được xây dựng xung quanh nhân Linux cũng có sẵn cho nhiều loại kiến trúc máy tính khác ngoài x86, chẳng hạn như trong các máy tính bảng đơn dựa trên kiến trúc ARM. Một người dùng cẩn thận sẽ nhận thấy sự vắng mặt của lệnh
lspci
trên các máy như Raspberry Pi. Sự khác biệt nào với các máy x86 có thể giải thích cho sự vắng mặt này? -
Nhiều bộ định tuyến mạng có cổng USB cho phép kết nối với thiết bị bên ngoài, chẳng hạn như ổ cứng USB. Vì hầu hết trong số này đang sử dụng hệ điều hành dựa trên Linux, ổ cứng USB bên ngoài sẽ được đặt tên như thế nào trong thư mục
/dev/
(giả sử không có thiết bị khối thông thường nào khác có trong bộ định tuyến)? -
Vào năm 2018, lỗ hổng phần cứng có tên Meltdown đã được phát hiện. Nó ảnh hưởng đến hầu hết tất cả các bộ xử lý của nhiều kiến trúc. Các phiên bản gần đây của nhân Linux có thể thông báo liệu hệ thống hiện tại có dễ bị tấn công hay không. Làm thế nào để có được thông tin này?
Tóm tắt
Bài học này đã trình bày các khái niệm chung về cách nhân Linux xử lý tài nguyên phần cứng, chủ yếu trong kiến trúc x86. Bài học đã đi qua các chủ đề sau:
-
Cách cài đặt được xác định trong tiện ích cấu hình BIOS hoặc UEFI có thể ảnh hưởng đến cách hệ điều hành tương tác với phần cứng.
-
Cách sử dụng các công cụ do hệ thống Linux tiêu chuẩn cung cấp để lấy thông tin về phần cứng.
-
Cách xác định các thiết bị lưu trữ vĩnh viễn và di động trong hệ thống tệp.
Các lệnh và tiến trình đã được nhắc đến là:
-
Các lệnh kiểm tra phần cứng được phát hiện:
lspci
vàlsusb
. -
Các lệnh quản lý mô-đun nhân:
lsmod
vàmodprobe
. -
Các tệp đặc biệt liên quan đến phần cứng (hoặc là các tệp được tìm thấy trong thư mục
/dev/
hoặc trong các hệ thống tệp giả trong/proc/
và/sys/
).
Đáp án Bài tập Hướng dẫn
-
Giả sử một hệ điều hành không thể khởi động sau khi thêm đĩa SATA thứ hai vào hệ thống, biết rằng tất cả các bộ phận đều hoạt động bình thường. Nguyên nhân có thể là gì?
Thứ tự thiết bị khởi động phải được cấu hình trong tiện ích thiết lập BIOS. Nếu không, BIOS có thể sẽ không chạy được trình tải khởi động.
-
Giả sử bạn muốn đảm bảo rằng thẻ video bên ngoài được kết nối với cổng PCI của máy tính để bàn mới mua của bạn thực sự là thẻ được nhà sản xuất quảng cáo, nhưng việc mở vỏ máy tính sẽ làm mất hiệu lực bảo hành. Lệnh nào có thể được sử dụng để liệt kê các chi tiết của thẻ màn hình khi chúng được hệ điều hành phát hiện?
Lệnh
lspci
sẽ liệt kê thông tin chi tiết về tất cả các thiết bị hiện được kết nối với cổng PCI. -
Dòng sau đây là một phần của đầu ra được tạo bởi lệnh
lspci
:03:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS 2208 [Thunderbolt] (rev 05)
Bạn nên thực hiện lệnh nào để xác định mô-đun nhân đang được sử dụng cho thiết bị cụ thể này?
Lệnh
lspci -s 03:00.0 -v
hoặclspci -s 03:00.0 -k
-
Quản trị viên hệ thống muốn thử các tham số khác nhau cho mô-đun nhân
bluetooth
mà không cần khởi động lại hệ thống. Tuy nhiên, bất kỳ cách nào để hủy tải mô-đun bằngmodprobe -r bluetooth
đều dẫn đến lỗi sau:modprobe: FATAL: Module bluetooth is in use.
Nguyên nhân có thể là gì?
Mô-đun
bluetooth
đang được sử dụng bởi một tiến trình đang chạy.
Đáp án Bài tập Mở rộng
-
Không có gì lạ khi tìm thấy các máy cũ trong môi trường sản xuất, chẳng hạn như khi một số thiết bị sử dụng kết nối lỗi thời để giao tiếp với máy tính điều khiển khiến ta cần phải đặc biệt chú ý đến một số đặc thù của những máy cũ này. Ví dụ, một số máy chủ x86 có phần sụn BIOS cũ hơn sẽ không khởi động nếu không phát hiện thấy bàn phím. Làm thế nào để tránh được vấn đề này?
Tiện ích cấu hình BIOS có một tùy chọn để tắt khóa máy tính khi không tìm thấy bàn phím.
-
Các hệ điều hành được xây dựng xung quanh nhân Linux cũng có sẵn cho nhiều loại kiến trúc máy tính khác ngoài x86, chẳng hạn như trong các máy tính bảng đơn dựa trên kiến trúc ARM. Một người dùng cẩn thận sẽ nhận thấy sự vắng mặt của lệnh
lspci
trên các máy như Raspberry Pi. Sự khác biệt nào với các máy x86 có thể giải thích cho sự vắng mặt này?Không giống như hầu hết các máy x86, một máy tính dựa trên ARM như Raspberry Pi không có cổng PCI, vì thế nên lệnh
lspci
sẽ là vô dụng. -
Nhiều bộ định tuyến mạng có cổng USB cho phép kết nối với thiết bị bên ngoài, chẳng hạn như ổ cứng USB. Vì hầu hết trong số này đang sử dụng hệ điều hành dựa trên Linux, ổ cứng USB bên ngoài sẽ được đặt tên như thế nào trong thư mục
/dev/
(giả sử không có thiết bị khối thông thường nào khác có trong bộ định tuyến)?Các nhân Linux hiện đại xác định ổ cứng USB là thiết bị SATA. Do đó, tệp tương ứng sẽ là
/dev/sda
vì không có thiết bị khối thông thường nào khác tồn tại trong hệ thống. -
Vào năm 2018, lỗ hổng phần cứng có tên Meltdown đã được phát hiện. Nó ảnh hưởng đến hầu hết tất cả các bộ xử lý của nhiều kiến trúc. Các phiên bản gần đây của nhân Linux có thể thông báo liệu hệ thống hiện tại có dễ bị tấn công hay không. Làm thế nào để có được thông tin này?
Tệp
/proc/cpuinfo
có một dòng hiển thị các lỗi đã biết đối với CPU tương ứng nhưbugs: cpu_meltdown
.