塊設備和字符設備管理

塊設備和字符設備管理


 

設備簡介

1:塊設備

應用程序可以隨機訪問設備數據,程序可自行確定讀取數據的位置。硬盤、軟盤、CD-ROM驅動器和閃存都是典型的塊設備,應用程序可以尋址磁盤上的任何位置,並由此讀取數據。此外,數據的讀寫只能以塊(通常是512B)的倍數進行。與字符設備不同,塊設備並不支持基於字符的尋址。

常見的塊設備文件:

/dev/hd[a-t]IDE設備

/dev/sd[a-z]SCSI設備

/dev/fd[0-7]:標準軟盤

/dev/md[0-3]:軟raid設備

loop[0-15]:本地回還設備

ram[0-19]:內存

 

2:字符設備

提供連續的數據流,應用程序可以順序讀取,通常不支持隨機存取。相反,此類設備支持按字節/字符來讀寫數據。舉例來說,鍵盤、串口、調制解調器都是典型的字符設備。

常見的字符設備文件:

/dev/null:無限數據接收設備

/dev/zero:無限零資源

/dev/tty[0-31]:虛擬中斷

/dev/ttyS[0-9]:串口

/dev/lp[0-3]:並口

/dev/console:控制檯

/dev/fb[0-31]:幀緩衝設備

 

二:查看設備信息

1:查看設備號每一個設備都具有一個主設備號和一個次設備號,主設備號被Linux系統用來確定驅動程序,告訴內核使用哪一個驅動程序爲該設備服務,而次設備號被驅動程序用來確定具體的設備。

 

例:查看光驅的設備號

[root@localhost ~]# ls -l /dev/cdrom

lrwxrwxrwx. 1 root root 3 7月   1 2016 /dev/cdrom -> sr0

[root@localhost ~]# ls -l /dev/sr0

brw-rw----+ 1 root cdrom 11, 0 7月   1 2016 /dev/sr0

 

註釋:

主設備號爲11,次設備號爲0

 

 

例:查看幀緩衝設備的設備號

[root@localhost ~]# ls -l /dev/fb

lrwxrwxrwx. 1 root root 3 7月   1 2016 /dev/fb -> fb0

[root@localhost ~]# ls -l /dev/fb0

crw-rw----. 1 root root 29, 0 7月   1 2016 /dev/fb0

 

2/proc/devices文件詳解

/proc/devices文件列出字符設備和塊設備的主設備號,以及分配到這些設備號的設備名稱。

[root@localhost ~]# cat /proc/devices

Character devices:

  1 mem

  4 /dev/vc/0

  4 tty

  4 ttyS

  5 /dev/tty

  5 /dev/console

  5 /dev/ptmx

  7 vcs

 10 misc

 13 input

 14 sound

 21 sg

 29 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 rtc

 

Block devices:

  1 ramdisk

259 blkext

  7 loop

  8 sd

  9 md

 11 sr

 65 sd

 66 sd

 67 sd

 68 sd

 69 sd

 70 sd

 71 sd

128 sd

129 sd

130 sd

131 sd

132 sd

133 sd

134 sd

135 sd

253 device-mapper

254 mdp

 

 

3lsblk

lsblk命令用於列出所有可用塊設備的信息,而且還能顯示他們之間的依賴關係,但是它不會列出RAM盤的信息。塊設備有硬盤,閃存盤,cd-ROM等等。lsblk命令包含在util-linux-ng包中,現在該包改名爲util-linux。這個包帶了幾個其它工具,如dmesg。要安裝lsblk,請在此處下載util-linux包。Fedora用戶可以通過命令sudo yum install util-linux-ng來安裝該包。

lsblk命令選項含義:

-a, --all            顯示所有設備。

-b, --bytes          bytes方式顯示設備大小。

-d, --nodeps         不顯示 slaves holders

-D, --discard        print discard capabilities

-e, --exclude <list> 排除設備 (default: RAM disks)

-f, --fs             顯示文件系統信息。

-h, --help           顯示幫助信息。

-i, --ascii          use ascii characters only

-m, --perms          顯示權限信息。

-l, --list           使用列表格式顯示。

-n, --noheadings     不顯示標題。

-o, --output <list>  輸出列。

-P, --pairs          使用key="value"格式顯示。

-r, --raw            使用原始格式顯示。

-t, --topology       顯示拓撲結構信息。

 

 

 

例:列出塊設備

[root@localhost ~]# 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:本欄顯示設備是否可移動設備。注意,在本例中設備sdbsr0RM值等於1,這說明他們是可移動設備。

SIZE:本欄列出設備的容量大小信息。例如298.1G表明該設備大小爲298.1GB,而1K表明該設備大小爲1KB

RO:該項表明設備是否爲只讀。在本案例中,所有設備的RO值爲0,表明他們不是隻讀的。

TYPE:本欄顯示塊設備是否是磁盤或磁盤上的一個分區。在本例中,sdasdb是磁盤,而sr0是隻讀存儲(rom)。

MOUNTPOINT:本欄指出設備掛載的掛載點。

 

例:列出塊設備,並且顯示有關文件系統的信息

[root@localhost ~]# 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]

 

例:列出塊設備,並顯示有關權限的信息

[root@localhost ~]# 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----

 

例:以拓撲的形式列出塊設備

[root@localhost ~]# 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

 

 

例:以鍵=值的輸出 

[root@localhost ~]# lsblk -P

NAME="sr0" MAJ:MIN="11:0" RM="1" SIZE="4.2G" RO="0" TYPE="rom" MOUNTPOINT="/media/cdrom"

NAME="sda" MAJ:MIN="8:0" RM="0" SIZE="50G" RO="0" TYPE="disk" MOUNTPOINT=""

NAME="sda1" MAJ:MIN="8:1" RM="0" SIZE="500M" RO="0" TYPE="part" MOUNTPOINT="/boot"

NAME="sda2" MAJ:MIN="8:2" RM="0" SIZE="49.5G" RO="0" TYPE="part" MOUNTPOINT=""

NAME="VolGroup-lv_root" MAJ:MIN="253:0" RM="0" SIZE="47.6G" RO="0" TYPE="lvm" MOUNTPOINT="/"

NAME="VolGroup-lv_swap" MAJ:MIN="253:1" RM="0" SIZE="2G" RO="0" TYPE="lvm" MOUNTPOINT="[SWAP]"格式列出塊設備

 

三:創建設備文件

1:手動創建設備文件

mknod命令用於創建Linux中的字符設備文件和塊設備文件。當文件類型爲P時(FIFO文件)可以不需指定主設備號,其他文件類型必須指定。

mknod命令可以指定的文件類型:

b:創建(有緩衝的)塊設備文件

cu:創建(沒有緩衝的)字符設備文件

p:創建先進先出(FIFO)設備文件

 

mknod命令的選項含義:

-Z:設置安全的上下文;

-m:設置權限模式;

-help:顯示幫助信息;

--version:顯示版本信息。

 

 

 

例:手動創建/dev/sda設備文件

[root@localhost ~]# ls -l /dev/sda

brw-rw----. 1 root disk 8, 0 7月   1 2016 /dev/sda

[root@localhost ~]# rm -rf /dev/sda

[root@localhost ~]# ls -l /dev/sda

ls: 無法訪問/dev/sda: 沒有那個文件或目錄

[root@localhost ~]# mknod /dev/sda b 8 0

[root@localhost ~]# ls -l /dev/sda

brw-r--r--. 1 root root 8, 0 3月  24 21:24 /dev/sda

 

 

註釋:

b指塊設備文件

8指主設備號

0指次設備號

 

例:爲/dev/sda設備手動創建/tmp/Disk設備文件

[root@localhost ~]# ls -l /dev/sda

brw-r--r--. 1 root root 8, 0 3月  24 21:24 /dev/sda

[root@localhost ~]# fdisk -l /dev/sda

 

Disk /dev/sda: 53.7 GB, 53687091200 bytes

255 heads, 63 sectors/track, 6527 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x000807fb

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1          64      512000   83  Linux

Partition 1 does not end on cylinder boundary.

/dev/sda2              64        6528    51915776   8e  Linux LVM

[root@localhost ~]# mknod /tmp/Disk b 8 0

[root@localhost ~]# fdisk -l /tmp/Disk

 

Disk /tmp/Disk: 53.7 GB, 53687091200 bytes

255 heads, 63 sectors/track, 6527 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x000807fb

 

    Device Boot      Start         End      Blocks   Id  System

/tmp/Disk1   *           1          64      512000   83  Linux

Partition 1 does not end on cylinder boundary.

/tmp/Disk2              64        6528    51915776   8e  Linux LVM

[root@localhost ~]# ls -l /tmp/Disk

brw-r--r--. 1 root root 8, 0 3月  24 21:26 /tmp/Disk

 

 

2:自動創建設備文件

MAKEDEV是一個腳本程序,用於在 /dev 目錄下建立設備,通過這些設備文件可以訪問位於 內核 的 驅動程序。

MAKEDEV命令選項含義:

-a:即使設備已經存在,始終創建設備,並有適當的權限和文件上下文

-d <目錄>:指定目錄,創建的設備不再默認的目錄下

-D <目錄>:如果目錄指定-d選項,計算設備創建的上下文

-m <最大設備數>:創建不超過在配置文件中規定的指定數量的設備

-n:不更新設備,只需顯示將被執行的操作

-M:創建屬於當前用戶的符號鏈接、目錄和socket,並顯示設備列表

-S:不更新設備,只是顯示格式,可以將執行動作輸出到一個sehll

-i:忽略錯誤解析配置文件

-u:顯示設備的所有權和權限,而不是創建

-v:顯示詳細信息

 

例:使用MAKEDEV命令自動創建/dev/sda設備文件

[root@localhost ~]# ls -l /dev/sda

brw-rw----. 1 root disk 8, 0 7月   1 2016 /dev/sda

[root@localhost ~]# rm -rf /dev/sda

[root@localhost ~]# ls -l /dev/sda

ls: 無法訪問/dev/sda: 沒有那個文件或目錄

[root@localhost ~]# MAKEDEV sda

[root@localhost ~]# ls -l /dev/sda

brw-r-----. 1 root disk 8, 0 3月  25 08:30 /dev/sda

 

 

 

 

四:udev簡介

1:什麼是udev

在對待設備文件這塊,Linux改變了幾次策略。在Linux早期,設備文件僅僅是是一些帶有適當的屬性集的普通文件,它由mknod命令創建,文件存放在/dev目錄下。後來,採用了devfs, 一個基於內核的動態設備文件系統,他首次出現在2.3.46內核中。Mandrake,Gentoo等Linux分發版本採用了這種方式。devfs創建 的設備文件是動態的。但是devfs有一些嚴重的限制,從2.6.13版本後移走了。目前取代他的便是文本要提到的udev--一個用戶空間程序。

目前很多的Linux分發版本採納了udev的方式,因爲它在Linux設備訪問,特別是那些對設備有極端需求的站點(比如需要控制上千個硬盤)和熱插拔設備(比如USB攝像頭和MP3播放器)上解決了幾個問題。下面我我們來看看如何管理udev設備。
實際上,對於那些爲磁盤,終端設備等準備的標準配置文件而言,你不需要修改什麼。但是,你需要了解udev配置來使用新的或者外來設備,如果不修改配置, 這些設備可能無法訪問,或者說Linux可能會採用不恰當的名字,屬組或權限來創建這些設備文件。你可能也想知道如何修改RS-232串口,音頻設備等文件的屬組或者權限。這點在實際的Linux實施中是會遇到的。

 

2:使用udev的好處

爲什麼使用udev

在此之前的設備文件管理方法(靜態文件和devfs)有幾個缺點:

Ø 不確定的設備映射。特別是那些動態設備,比如USB設備,設備文件到實際設備的映射並不可靠和確定。舉一個例子:如果你有兩個USB打印機。一個可能稱 爲/dev/usb/lp0,另外一個便是/dev/usb/lp1。但是到底哪個是哪個並不清楚,lp0,lp1和實際的設備沒有一一對應的關係,因爲 他可能因爲發現設備的順序,打印機本身關閉等原因而導致這種映射並不確定。理想的方式應該是:兩個打印機應該採用基於他們的序列號或者其他標識信息的唯一 設備文件來映射。但是靜態文件和devfs都無法做到這點。

Ø 沒有足夠的主/輔設備號。我們知道,每一個設備文件是有兩個8位的數字:一個是主設備號 ,另外一個是輔設備號來分配的。這兩個8位的數字加上設備類型(塊設備或者字符設備)來唯一標識一個設備。不幸的是,關聯這些身邊的的數字並不足夠。

Ø /dev目錄下文件太多。一個系統採用靜態設備文件關聯的方式,那麼這個目錄下的文件必然是足夠多。而同時你又不知道在你的系統上到底有那些設備文件是激活的。

Ø 命名不夠靈活。儘管devfs解決了以前的一些問題,但是它自身又帶來了一些問題。其中一個就是命名不夠靈活;你別想非常簡單的就能修改設備文件的名字。缺省的devfs命令機制本身也很奇怪,他需要修改大量的配置文件和程序。

Ø 內核內存使用。devfs特有的另外一個問題是,作爲內核驅動模塊,devfs需要消耗大量的內存,特別當系統上有大量的設備時(比如上面我們提到的系統一個上有好幾千磁盤時)

 

udev的目標是想解決上面提到的這些問題,他通採用用戶空間(user-space)工具來管理/dev/目錄樹,他和文件系統分開。知道如何改變缺省配置能讓你之大如何定製自己的系統,比如創建設備字符連接,改變設備文件屬組,權限等。

使用udev的好處:

Ø 動態管理

Ø 自定義命名規則

Ø 設置設備的權限和所有者

 

3udev相關術語

(1) 設備文件

是指在/dev目錄下,可以被應用程序用來和設備驅動交互的文件。而不會特別地區分設備文件、設備節點或者設備特殊文件

(2) devfs

Linux系統早期的設備管理工具,已經被udev取代

(3) sysfs

Linux2.6的內核裏的一個虛擬文件系統(/sys)。他把設備和驅動的信息從內核的設備模塊到處到用戶空間,從該文件系統中,Linux用戶可以獲取很多設備的屬性

(4) devpath

是指一個設備在sysfs文件系統(/sys)下的相對路徑,該路徑包含了該設備的屬性文件。udev裏的多數命令都是針對devpath操作的。

(5) 內核設備名稱

設備在sysfs裏的名稱,是udev默認使用的設備文件

4/etc/udev/udev.conf文件詳解

[root@localhost ~]# 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     

設置當udev產生事件時以哪一種等級將事件記錄到日誌中,可以是errinfo、或debug,默認err

 

udev_root=/dev

udev產生的設備文件的根目錄

 

udev_db=/dev/.udevdb

udev產生的設備文件形成的數據庫

 

udev_rules=/dev/udev/rules.d

指定udev規則文件所在的目錄

 

5udev規則文件

udev規則文件都保存在/etc/udev/rules.d目錄中,在該目錄下有好幾個udev規則文件,這些文件一部分是udev軟件包生成的,另外一部分可能是別的硬件或者軟件包生成的,這些規則文件的文件名通常是兩個數字開頭的,他表示系統應用該規則的順序。

這個目錄存儲的是以.rules結束的文件。每一個文件處理一系列規則來幫助udev分配名字給設備文件以保證能被內核識別。

 

[root@localhost ~]# ls -l /etc/udev/rules.d/

總用量 44

-rw-r--r--. 1 root root 1652 1112 2010 60-fprint-autosuspend.rules

-rw-r--r--. 1 root root 1060 1112 2010 60-pcmcia.rules

-rw-r--r--. 1 root root  316 1122 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 1111 2010 97-bluetooth-serial.rules

-rw-r--r--. 1 root root  308 1123 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

(1) /值對操作符

規則文件裏的規則有一系列的鍵/值對組成,鍵/值對之間用逗號(,)分割。每一個鍵或者是用戶匹配鍵,或者是一個賦值鍵。匹配鍵確定規則是否被應用,而賦 值鍵表示分配某值給該鍵。這些值將影響udev創建的設備文件。賦值鍵可以處理一個多值列表。

 

匹配鍵和賦值鍵操作符解釋見下表:

 

操作符         匹配或賦值             解釋
-------------------------------------
==                匹配                        相等比較
!=                 匹配                        不等比較
=                   賦值                       分配一個特定的值給該鍵,他可以覆蓋之前的賦值。
+=                 賦值                       追加特定的值給已經存在的鍵
:=                  賦值                       分配一個特定的值給該鍵,後面的規則不可能覆蓋它。

 

(2) 常用鍵

有一些鍵在udev規則文件裏經常出現,這些鍵的值可以使用通配符(*,?,甚至範圍,比如[0-9]),這些常用鍵列舉如下:

常用udev

ACTION :一個時間活動的名字,比如add,當設備增加的時候

KERNEL:在內核裏看到的設備名字,比如sd*表示任意SCSI磁盤設備

DEVPATH:內核設備錄進,比如/devices/*

SUBSYSTEM :子系統名字,比如sound,net

BUS :總線的名字,比如IDE,USB

DRIVER :設備驅動的名字,比如ide-cdrom

ID :獨立於內核名字的設備名字

SYSFS{ value} sysfs屬性值,他可以表示任意

ATTRS:匹配設備的sysfs屬性值

ENV{ key} :環境變量,可以表示任意

PROGRAM :可執行的外部程序,如果程序返回0值,該鍵則認爲爲真(true)

RESULT :上一個PROGRAM調用返回的標準輸出。

 

(3) 可以賦值的鍵

NAME:根據這個規則創建的設備文件的文件名。注意:僅僅第一行的NAME描述是有效   的,後面的均忽略。 如果你想使用使用兩個以上的名字來訪問一個設備的話,可以考慮SYMLINK鍵。

SYMLINK:根據規則創建的字符連接名

OWNER :設備文件的屬組

GROUP :設備文件所在的組。

MODE :設備文件的權限,採用8進制

ATTR:應寫入設備sysfs屬性的值

RUN :爲設備而執行的程序列表

LABEL :在配置文件裏爲內部控制而採用的名字標籤(下下面的GOTO服務)

GOTO :跳到匹配的規則(通過LABEL來標識),有點類似程序語言中的GOTO

IMPORT{ type}:導入一個文件或者一個程序執行後而生成的規則集到當前文件

WAIT_FOR_SYSFS:等待一個特定的設備文件的創建。主要是用作時序和依賴問題。

PTIONS:特定的選項: last_rule 對這類設備終端規則執行; ignore_device 忽略當前規則;   

ignore_remove 忽略接下來的並移走請求。all_partitions 爲所有的磁盤分區創建設備文件。

 

(4) 替換操作符

(5) udev規則配置

KERNEL=="*", OWNER="root" GROUP="root", MODE="0600"

KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"

KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"

KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1",

               SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"

ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"

 

註釋:

上面的例子給出了5個規則,每一個都是KERNEL或者ACTION鍵開頭:

第一個規則是缺省的,他匹配任意被內核識別到的設備,然後設定這些設備的屬組是root,組是root,訪問權限模式是0600(-rw——-)。這也是一個安全的缺省設置保證所有的設備在默認情況下只有root可以讀寫

第二個規則也是比較典型的規則了。它匹配終端設備(tty),然後設置新的權限爲0600,所在的組是tty。它也設置了一個特別的設備文件名:%K。在這裏例子裏,%k代表設備的內核名字。那也就意味着內核識別出這些設備是什麼名字,就創建什麼樣的設備文件名。

第三行開始的KERNEL==”scd[0-9]*”,表示 SCSI CD-ROM 驅動. 它創建一對設備符號連接:cdromcdrom-%k

第四行,開始的 KERNEL==”hd[a-z]“, 表示ATA CDROM驅動器。這個規則創建和上面的規則相同的符號連接。ATA CDROM驅動器需要sysfs值以來區別別的ATA設備,因爲SCSI CDROM可以被內核唯一識別。.

第五行以 ACTION==”add”開始,它告訴udev增加 /sbin/modprobe sg 到命令列表,當任意SCSI設備增加到系統後,這些命令將執行。其效果就是計算機應該會增加sg內核模塊來偵測新的SCSI設備。

 

(6) 網卡設備udev規則文件以及修改實例

例:修改網卡設備的名稱:

[root@localhost ~]# cat /etc/udev/rules.d/70-persistent-net.rules

# This file was automatically generated by the /lib/udev/write_net_rules

# program, run by the persistent-net-generator.rules rules file.

#

# You can modify it, as long as you keep each rule on a single

# line, and change only the value of the NAME= key.

 

# PCI device 0x8086:0x100f (e1000)

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:39:97:18", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

6:查詢udev數據庫中的設備信息

使用udevadm info命令可以查詢udev數據庫中的設備信息,也可以從sysfs文件系統中查詢到設備的屬性以輔助創建udev規則。

udevadm info命令選項含義:

-q:查詢指定類型的設備信息。可以指定以下類型進行查詢

    name設備節點的名稱

symlink符號鏈接文件

path系統設備路徑

property設備屬性

all所有的值

-p:查詢系統設備的路徑

-n:查詢設備節點或鏈接名

-r:前置dev目錄路徑名

-a:顯示指定設備的所有sysfs記錄的屬性,使用udev規則匹配特殊的設備

-d:顯示主設備號和次設備號

-e:導出udev數據庫中的內容

 

例:查詢/dev/sda設備的系統設備路徑

[root@localhost ~]# udevadm info -q path -n /dev/sda

/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda

 

例:查詢/dev/sda設備的符號鏈接文件

[root@localhost ~]# udevadm info -q symlink -n /dev/sda

block/8:0 disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0

 

例:查詢/dev/sda設備的所有值

[root@localhost ~]# 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

E: ID_SCSI=1

E: ID_VENDOR=VMware_

E: ID_VENDOR_ENC=VMware\x2c\x20

E: ID_MODEL=VMware_Virtual_S

E: ID_MODEL_ENC=VMware\x20Virtual\x20S

E: ID_REVISION=1.0

E: ID_TYPE=disk

E: ID_BUS=scsi

E: ID_PATH=pci-0000:00:10.0-scsi-0:0:0:0

E: ID_PART_TABLE_TYPE=dos

E: LVM_SBIN_PATH=/sbin

E: DEVLINKS=/dev/block/8:0 /dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0

E: UDISKS_PRESENTATION_NOPOLICY=0

E: UDISKS_PARTITION_TABLE=1

E: UDISKS_PARTITION_TABLE_SCHEME=mbr

E: UDISKS_PARTITION_TABLE_COUNT=2

 

例:查詢系統指定設備路徑的信息

[root@localhost ~]# udevadm info -a -p /sys/block/sda

 

Udevadm info starts with the device specified by the devpath and then

walks up the chain of parent devices. It prints for every device

found, all possible attributes in the udev rules key format.

A rule to match, can be composed by the attributes of the device

and the attributes from one single parent device.

 

  looking at device '/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda':

    KERNEL=="sda"

    SUBSYSTEM=="block"

    DRIVER==""

    ATTR{range}=="16"

    ATTR{ext_range}=="256"

    ATTR{removable}=="0"

    ATTR{ro}=="0"

    ATTR{size}=="104857600"

    ATTR{alignment_offset}=="0"

    ATTR{discard_alignment}=="0"

    ATTR{capability}=="52"

    ATTR{stat}=="   40863     7088  2184128    31130     8589   184619  1443208    40651        0    37765    71671"

    ATTR{inflight}=="       0        0"

 

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0':

    KERNELS=="2:0:0:0"

    SUBSYSTEMS=="scsi"

    DRIVERS=="sd"

    ATTRS{device_blocked}=="0"

    ATTRS{type}=="0"

    ATTRS{scsi_level}=="3"

    ATTRS{vendor}=="VMware, "

    ATTRS{model}=="VMware Virtual S"

    ATTRS{rev}=="1.0 "

    ATTRS{state}=="running"

    ATTRS{timeout}=="180"

    ATTRS{eh_timeout}=="10"

    ATTRS{iocounterbits}=="32"

    ATTRS{iorequest_cnt}=="0xc14b"

    ATTRS{iodone_cnt}=="0xc14b"

    ATTRS{ioerr_cnt}=="0x5"

    ATTRS{modalias}=="scsi:t-0x00"

    ATTRS{evt_media_change}=="0"

    ATTRS{dh_state}=="detached"

    ATTRS{queue_depth}=="32"

    ATTRS{queue_ramp_up_period}=="120000"

    ATTRS{queue_type}=="simple"

 

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host2/target2:0:0':

    KERNELS=="target2:0:0"

    SUBSYSTEMS=="scsi"

    DRIVERS==""

 

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host2':

    KERNELS=="host2"

    SUBSYSTEMS=="scsi"

    DRIVERS==""

 

  looking at parent device '/devices/pci0000:00/0000:00:10.0':

    KERNELS=="0000:00:10.0"

    SUBSYSTEMS=="pci"

    DRIVERS=="mptspi"

    ATTRS{vendor}=="0x1000"

    ATTRS{device}=="0x0030"

    ATTRS{subsystem_vendor}=="0x15ad"

    ATTRS{subsystem_device}=="0x1976"

    ATTRS{class}=="0x010000"

    ATTRS{irq}=="17"

    ATTRS{local_cpus}=="00000000,00000000,00000000,00000001"

    ATTRS{local_cpulist}=="0"

    ATTRS{modalias}=="pci:v00001000d00000030sv000015ADsd00001976bc01sc00i00"

    ATTRS{numa_node}=="-1"

    ATTRS{enable}=="1"

    ATTRS{broken_parity_status}=="0"

    ATTRS{msi_bus}==""

    ATTRS{config}==""

 

  looking at parent device '/devices/pci0000:00':

    KERNELS=="pci0000:00"

    SUBSYSTEMS==""

DRIVERS==""

 

7:重啓udev守護進程

例:讓新的udev規則立即生效

[root@localhost ~]# start_udev

 

例:查看udev進程是否存在

[root@localhost ~]# 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章