塊設備和字符設備管理

塊設備和字符設備管理node


 

設備簡介linux

1:塊設備數據庫

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

常見的塊設備文件:app

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

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

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

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

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

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

相關文章
相關標籤/搜索