塊設備與字符設備管理深度解析(基于OpenEuler 24.03)
文章目錄
- 塊設備與字符設備管理深度解析(基于OpenEuler 24.03)
- 一、設備基礎概念體系
- 1.1 塊設備的核心特性與分類
- 1.2 字符設備的流式數據模型
- 1.3 設備標識系統:主設備號與次設備號
- 二、設備信息查詢與管理工具
- 2.1 系統設備注冊表:/proc/devices
- 2.2 塊設備可視化工具:lsblk
- 2.2.1 基本用法與輸出解析
- 2.2.2 高級查詢功能
- 2.3 設備號查詢工具:ls -l
- 三、設備文件操作與管理
- 3.1 手動創建設備文件:mknod
- 3.2 自動創建設備文件:MAKEDEV
- 四、udev設備管理系統
- 4.1 udev概述與發展歷程
- 4.2 udev核心配置文件
- 4.2.1 udev.conf配置文件
- 4.2.2 規則文件目錄:/etc/udev/rules.d
- 4.3 udev規則語法詳解
- 4.3.1 操作符類型
- 4.3.2 常用匹配鍵
- 4.3.3 常用賦值鍵
- 4.4 udev規則實例解析
- 4.5 udev設備信息查詢工具:udevadm
- 4.5.1 查詢設備路徑信息
- 4.5.2 全面設備信息查詢
- 4.6 udev服務控制
- 五、實戰案例:自定義udev規則
- 5.1 案例:為USB打印機分配固定名稱
- 5.2 案例:設置串口設備權限
- 移除并重新插入打印機
- 應看到指向實際設備文件的符號鏈接
一、設備基礎概念體系
1.1 塊設備的核心特性與分類
塊設備是Linux系統中以"數據塊"為基本單位進行數據傳輸的設備類型,其核心特征是支持隨機訪問。在OpenEuler 24.03中,塊設備的典型代表包括:
- 存儲介質類:硬盤(HDD/SSD)、U盤、SD卡等,這類設備以512字節或其整數倍的塊為單位讀寫數據
- 光學存儲類:CD-ROM、DVD驅動器,數據組織為固定大小的邏輯塊
- 虛擬存儲類:Loop設備(用于掛載鏡像文件)、RAM磁盤(基于內存的塊設備)
塊設備在文件系統中的標識遵循特定規范:
- SCSI/SATA設備:
/dev/sd[a-z]
,如/dev/sda
表示第一塊SCSI磁盤 - 光驅設備:
/dev/sr[0-9]
,如/dev/sr0
對應系統識別的第一個光驅 - 軟RAID設備:
/dev/md[0-9]
,用于軟件磁盤陣列 - 內存磁盤:
/dev/ram[0-0]
至/dev/ram19
,基于物理內存創建的塊設備
1.2 字符設備的流式數據模型
字符設備以字節為單位順序處理數據,不支持隨機尋址,適用于數據流式傳輸場景。OpenEuler 24.03中的典型字符設備包括:
- 輸入輸出設備:鍵盤(
/dev/input/event*
)、串口(/dev/ttyS[0-9]
) - 虛擬設備:空設備(
/dev/null
)、零設備(/dev/zero
) - 控制臺設備:
/dev/console
(系統控制臺)、/dev/tty[0-31]
(虛擬終端) - 多媒體設備:幀緩沖設備(
/dev/fb[0-31]
)、聲卡設備(/dev/snd/*
)
字符設備的訪問特性決定了其應用場景:
/dev/null
:數據寫入后會被丟棄,常用于屏蔽命令輸出/dev/zero
:讀取時返回無限零數據流,可用于文件填充/dev/tty
:指向當前終端,實現終端無關的輸入輸出
1.3 設備標識系統:主設備號與次設備號
Linux系統通過設備號對設備進行唯一標識,設備號由兩部分組成:
- 主設備號(Major Number):標識設備驅動程序,范圍0-255
- 次設備號(Minor Number):標識具體的設備實例,范圍0-65535
在OpenEuler中查看設備號的典型方法:
# 查看光驅設備號
ls -l /dev/cdrom
# 輸出示例:lrwxrwxrwx. 1 root root 3 7月 1 2016 /dev/cdrom -> sr0
ls -l /dev/sr0
# 輸出示例:brw-rw----+ 1 root cdrom 11, 0 7月 1 2016 /dev/sr0
# 解析:主設備號11,次設備號0# 查看幀緩沖設備號
ls -l /dev/fb
# 輸出示例:lrwxrwxrwx. 1 root root 3 7月 1 2016 /dev/fb -> fb0
ls -l /dev/fb0
# 輸出示例:crw-rw----. 1 root root 29, 0 7月 1 2016 /dev/fb0
# 解析:主設備號29,次設備號0
二、設備信息查詢與管理工具
2.1 系統設備注冊表:/proc/devices
/proc/devices
文件記錄了系統中所有已注冊的設備類型及其主設備號,在OpenEuler中分為字符設備和塊設備兩部分:
cat /proc/devices
# 輸出片段:
Character devices:1 mem4 /dev/vc/04 tty4 ttyS5 /dev/tty5 /dev/console5 /dev/ptmx7 vcs10 misc13 input14 sound21 sg29 fb
116 alsa
128 ptm
136 pts
162 raw
180 usb
189 usb_device
202 cpu/msr
203 cpu/cpuid
249 hidraw
250 usbmon
251 bsg
252 pcmcia
253 watchdog
254 rtcBlock devices:1 ramdisk
259 blkext7 loop8 sd9 md11 sr65 sd66 sd67 sd68 sd69 sd70 sd71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp
2.2 塊設備可視化工具:lsblk
lsblk
是OpenEuler中用于查看塊設備層次結構的強大工具,包含在util-linux
包中(已默認安裝)。其核心功能包括:
2.2.1 基本用法與輸出解析
# 列出所有塊設備及其掛載關系
lsblk
# 輸出示例:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 4.2G 0 rom /media/cdrom
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 49.5G 0 part ├─VolGroup-lv_root (dm-0) 253:0 0 47.6G 0 lvm /└─VolGroup-lv_swap (dm-1) 253:1 0 2G 0 lvm [SWAP]# 字段解析:
# NAME:設備名稱
# MAJ:MIN:主設備號:次設備號
# RM:是否可移動設備(1為可移動)
# SIZE:設備容量
# RO:是否只讀(0為可寫)
# TYPE:設備類型(disk=磁盤,part=分區,rom=光驅等)
# MOUNTPOINT:掛載點
2.2.2 高級查詢功能
# 顯示文件系統信息
lsblk -f
# 輸出示例:
NAME FSTYPE LABEL UUID MOUNTPOINT
sr0 iso9660 CentOS_6.5_Final /media/cdr
sda
├─sda1 ext4 294ad562-2483-41ce-b5c8-22feb620a766 /boot
└─sda2 LVM2_mem sPD7DF-cTL5-R8XK-fl0y-9Hlr-8uic-LDgOpH ├─VolGroup-lv_root (dm-0)ext4 95161875-59c2-4777-a7ba-599f1cc1fffc /└─VolGroup-lv_swap (dm-1)swap 17981850-c0ec-4b36-8f93-5c4e36165af5 [SWAP]# 顯示權限信息
lsblk -m
# 輸出示例:
NAME SIZE OWNER GROUP MODE
sr0 4.2G root cdrom brw-rw----
sda 50G root disk brw-rw----
├─sda1 500M root disk brw-rw----
└─sda2 49.5G root disk brw-rw----├─VolGroup-lv_root (dm-0) 47.6G root disk brw-rw----└─VolGroup-lv_swap (dm-1) 2G root disk brw-rw----# 顯示拓撲結構
lsblk -t
# 輸出示例:
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA
sr0 0 2048 0 2048 2048 1 cfq 128 128
sda 0 512 0 512 512 1 cfq 128 128
├─sda1 0 512 0 512 512 1 cfq 128 128
└─sda2 0 512 0 512 512 1 cfq 128 128├─VolGroup-lv_root (dm-0)0 512 0 512 512 1 128 128└─VolGroup-lv_swap (dm-1)0 512 0 512 512 1 128 128
2.3 設備號查詢工具:ls -l
通過ls -l
命令可以直接查看設備文件的主設備號和次設備號,這是最基礎的設備信息查詢方式:
# 查看硬盤設備號
ls -l /dev/sda
# 輸出示例:brw-rw----. 1 root disk 8, 0 7月 1 2016 /dev/sda
# 解析:主設備號8,次設備號0# 查看串口設備號
ls -l /dev/ttyS0
# 輸出示例:crw-rw----. 1 root dialout 4, 64 7月 1 2016 /dev/ttyS0
# 解析:主設備號4,次設備號64
三、設備文件操作與管理
3.1 手動創建設備文件:mknod
mknod
命令用于在OpenEuler中手動創建設備文件,支持塊設備、字符設備和FIFO文件:
# 命令語法
mknod [選項] 設備文件 類型 主設備號 次設備號# 選項說明:
# -Z:設置安全上下文
# -m:設置權限模式(如0666)
# --help:顯示幫助信息
# --version:顯示版本信息# 示例1:創建/dev/sda設備文件
ls -l /dev/sda # 確認設備文件存在
# 輸出示例:brw-rw----. 1 root disk 8, 0 7月 1 2016 /dev/sda
rm -rf /dev/sda # 刪除原有設備文件
mknod /dev/sda b 8 0 # 創建塊設備文件
ls -l /dev/sda # 驗證創建結果
# 輸出示例:brw-r--r--. 1 root root 8, 0 3月 24 21:24 /dev/sda# 示例2:創建字符設備文件
mknod /dev/test_char c 249 0 # 創建hidraw字符設備
ls -l /dev/test_char
# 輸出示例:crw-r--r--. 1 root root 249, 0 3月 24 21:30 /dev/test_char# 示例3:創建FIFO文件
mknod /tmp/myfifo p # 創建命名管道
ls -l /tmp/myfifo
# 輸出示例:prw-r--r--. 1 root root 0 3月 24 21:35 /tmp/myfifo
3.2 自動創建設備文件:MAKEDEV
MAKEDEV
是OpenEuler中的設備文件自動創建腳本,基于預設規則生成標準設備文件:
# 命令語法
MAKEDEV [選項] [設備類型]# 選項說明:
# -a:強制創建設備文件,覆蓋已存在的文件
# -d <目錄>:指定設備文件創建目錄
# -m <最大設備數>:限制創建的設備數量
# -n:僅顯示操作,不實際執行
# -v:顯示詳細執行過程# 示例1:自動創建/dev/sda設備文件
ls -l /dev/sda # 確認設備文件存在
# 輸出示例:brw-rw----. 1 root disk 8, 0 7月 1 2016 /dev/sda
rm -rf /dev/sda # 刪除原有設備文件
MAKEDEV sda # 自動創建sda設備文件
ls -l /dev/sda # 驗證結果
# 輸出示例:brw-r-----. 1 root disk 8, 0 3月 25 08:30 /dev/sda# 示例2:創建所有磁盤設備文件
MAKEDEV -a disk # 強制創建所有磁盤相關設備文件
四、udev設備管理系統
4.1 udev概述與發展歷程
udev是OpenEuler中負責動態管理/dev目錄設備文件的用戶空間工具,其發展背景如下:
- 早期階段:靜態設備文件(通過mknod手動創建)
- devfs階段:內核動態設備文件系統(2.3內核引入,2.6.13后移除)
- udev階段:用戶空間設備管理(當前主流方案,解決了devfs的諸多問題)
udev的核心優勢:
- 動態管理:自動識別熱插拔設備,實時更新/dev目錄
- 穩定命名:基于設備硬件特征(如序列號)分配固定名稱
- 靈活配置:可自定義設備權限、屬主、符號鏈接等屬性
- 資源優化:僅創建系統實際存在的設備文件,減少資源消耗
4.2 udev核心配置文件
4.2.1 udev.conf配置文件
/etc/udev/udev.conf
是udev的主配置文件,控制udev的基本行為:
# 查看udev.conf內容
cat /etc/udev/udev.conf
# 輸出示例:
# The initial syslog(3) priority: "err", "info", "debug" or its
# numerical equivalent. For runtime debugging, the daemons internal
# state can be changed with: "udevadm control --log-priority=<value>".
udev_log="err"# 主要配置參數:
udev_log="err" # 日志級別(err/info/debug)
udev_root="/dev" # 設備文件根目錄
udev_db="/dev/.udevdb" # udev數據庫路徑
udev_rules="/dev/udev/rules.d" # 規則文件目錄
4.2.2 規則文件目錄:/etc/udev/rules.d
udev規則文件存儲在/etc/udev/rules.d
目錄中,文件名通常以兩位數字開頭表示執行順序:
# 查看規則文件列表
ls -l /etc/udev/rules.d/
# 輸出示例:
總用量 44
-rw-r--r--. 1 root root 1652 11月 12 2010 60-fprint-autosuspend.rules
-rw-r--r--. 1 root root 1060 11月 12 2010 60-pcmcia.rules
-rw-r--r--. 1 root root 316 11月 22 2013 60-raw.rules
-rw-r--r--. 1 root root 789 7月 1 2016 70-persistent-cd.rules
-rw-r--r--. 1 root root 420 7月 1 2016 70-persistent-net.rules
-rw-r--r--. 1 root root 320 9月 12 2012 90-alsa.rules
-rw-r--r--. 1 root root 83 7月 20 2011 90-hal.rules
-rw-r--r--. 1 root root 2486 11月 11 2010 97-bluetooth-serial.rules
-rw-r--r--. 1 root root 308 11月 23 2013 98-kexec.rules
-rw-r--r--. 1 root root 54 12月 8 2011 99-fuse.rules
-rw-r--r--. 1 root root 341 7月 1 2016 99-vmware-scsi-udev.rules
4.3 udev規則語法詳解
4.3.1 操作符類型
udev規則由鍵值對組成,通過操作符連接,主要操作符包括:
- 匹配操作符:
==
:等于!=
:不等于
- 賦值操作符:
=
:賦值(可覆蓋)+=
:追加值:=
:賦值(不可覆蓋)
4.3.2 常用匹配鍵
鍵名 | 說明 | 示例 |
---|---|---|
ACTION | 設備事件(add/remove等) | ACTION==“add” |
KERNEL | 內核設備名 | KERNEL==“sd*” |
DEVPATH | 設備在sysfs中的路徑 | DEVPATH==“/devices/*” |
SUBSYSTEM | 設備子系統 | SUBSYSTEM==“block” |
BUS | 總線類型 | BUS==“usb” |
DRIVER | 驅動程序名 | DRIVER==“ide-cdrom” |
ATTRS{key} | sysfs屬性值 | ATTRS{removable}==“1” |
ENV{key} | 環境變量 | ENV{ID_FS_TYPE}==“ext4” |
4.3.3 常用賦值鍵
鍵名 | 說明 | 示例 |
---|---|---|
NAME | 設備文件名 | NAME=“mydevice” |
SYMLINK | 符號鏈接名 | SYMLINK+=“link1 link2” |
OWNER | 設備屬主 | OWNER=“root” |
GROUP | 設備屬組 | GROUP=“disk” |
MODE | 設備權限 | MODE=“0666” |
ATTR{key} | 設置sysfs屬性 | ATTR{power/state}==“on” |
RUN | 執行外部程序 | RUN+=“/sbin/modprobe sg” |
OPTIONS | 特殊選項 | OPTIONS=“last_rule” |
4.4 udev規則實例解析
以下是OpenEuler中典型的udev規則示例及其解析:
# 規則1:默認設備權限設置
KERNEL=="*", OWNER="root", GROUP="root", MODE="0600"
# 解析:匹配所有設備,設置屬主為root,屬組為root,權限0600(僅root可讀寫)# 規則2:終端設備配置
KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
# 解析:
# - 匹配所有tty設備
# - 設備名為內核名稱(%k)
# - 屬組為tty
# - 權限0666(所有用戶可讀寫)
# - OPTIONS="last_rule"表示這是終端規則# 規則3:光驅符號鏈接
KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"
# 解析:匹配SCSI光驅設備,創建符號鏈接cdrom和cdrom-內核名# 規則4:ATA光驅識別
KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"
# 解析:
# - 匹配ATA設備(hd[a-z])
# - 總線類型為IDE
# - 可移動設備(removable=1)
# - 媒體類型為cdrom
# - 創建光驅符號鏈接# 規則5:SCSI設備驅動加載
ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"
# 解析:當SCSI設備添加時,加載sg驅動模塊
4.5 udev設備信息查詢工具:udevadm
udevadm
是OpenEuler中用于查詢和管理udev數據庫的命令行工具:
4.5.1 查詢設備路徑信息
# 查詢/dev/sda的系統設備路徑
udevadm info -q path -n /dev/sda
# 輸出示例:/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda# 查詢符號鏈接信息
udevadm info -q symlink -n /dev/sda
# 輸出示例:block/8:0 disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
4.5.2 全面設備信息查詢
# 查詢所有設備信息
udevadm info -q all -n /dev/sda
# 輸出片段:
P: /devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda
N: sda
W: 27
S: block/8:0
S: disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda
E: MAJOR=8
E: MINOR=0
E: DEVNAME=/dev/sda
E: DEVTYPE=disk
E: SUBSYSTEM=block
# (省略更多輸出)# 基于sysfs路徑查詢
udevadm info -a -p /sys/block/sda
# 輸出包含從設備到總線的完整層次結構信息
4.6 udev服務控制
在OpenEuler中控制udev服務的常用命令:
# 重啟udev服務使規則生效
systemctl restart udev# 查看udev進程狀態
ps -ef | grep udev
# 輸出示例:
root 42737 1 1 12:20 ? 00:00:00 /sbin/udevd -d
root 43263 12851 0 12:20 pts/0 00:00:00 grep udev# 重新加載udev規則
udevadm control --reload-rules
五、實戰案例:自定義udev規則
5.1 案例:為USB打印機分配固定名稱
需求:為特定USB打印機分配固定設備名/dev/usb_printer
,避免因插拔順序導致設備名變化。
實現步驟:
- 查詢打印機硬件信息:
# 插入打印機后執行
udevadm info -a -n /dev/usb/lp0
# 記錄關鍵信息:
# - 廠商ID(ATTRS{idVendor})
# - 產品ID(ATTRS{idProduct})
# - 序列號(ATTRS{serial})
- 創建自定義規則:
# 在rules.d目錄創建新規則文件
vi /etc/udev/rules.d/99-usb-printer.rules
# 添加以下內容:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0419", ATTRS{idProduct}=="0050", ATTRS{serial}=="PRN001", SYMLINK+="usb_printer"
# 解析:
# - 匹配USB子系統
# - 廠商ID 0419,產品ID 0050
# - 序列號PRN001
# - 創建符號鏈接usb_printer
- 應用規則并驗證:
# 重新加載規則
udevadm control --reload-rules
# 移除并重新插入打印機
ls -l /dev/usb_printer
# 應看到指向實際設備文件的符號鏈接
5.2 案例:設置串口設備權限
需求:將串口設備/dev/ttyS0
的權限設置為允許dialout組用戶訪問。
實現步驟:
- 創建規則文件:
vi /etc/udev/rules.d/60-serial-port.rules
# 添加內容:
KERNEL=="ttyS0", GROUP="dialout", MODE="0660"
# 解析:
# - 匹配ttyS0設備
# - 屬組設為dialout
# - 權限設為0660(dialout組可讀寫)
- 應用規則:
systemctl restart udev
# 或
udevadm control --reload-rules
- 驗證權限:
ls -l /dev/ttyS0
# 應顯示權限為crw-rw----,屬組為dialout
ol --reload-rules
移除并重新插入打印機
ls -l /dev/usb_printer
應看到指向實際設備文件的符號鏈接
### 5.2 案例:設置串口設備權限需求:將串口設備`/dev/ttyS0`的權限設置為允許dialout組用戶訪問。實現步驟:1. **創建規則文件**:
```bash
vi /etc/udev/rules.d/60-serial-port.rules
# 添加內容:
KERNEL=="ttyS0", GROUP="dialout", MODE="0660"
# 解析:
# - 匹配ttyS0設備
# - 屬組設為dialout
# - 權限設為0660(dialout組可讀寫)
- 應用規則:
systemctl restart udev
# 或
udevadm control --reload-rules
- 驗證權限:
ls -l /dev/ttyS0
# 應顯示權限為crw-rw----,屬組為dialout
通過上述內容,我們全面解析了OpenEuler 24.03中塊設備與字符設備的管理體系,從基礎概念到高級配置,結合具體命令和案例,幫助讀者深入理解Linux設備管理的核心機制。無論是設備信息查詢、手動/自動創建設備文件,還是通過udev實現動態設備管理,都提供了完整的操作指南和實踐案例,適用于系統管理員和開發人員掌握設備管理的關鍵技術。