1. 程式人生 > >udev的使用-minicom沒有權限打開串口,更改 ttyUSB0 的權限

udev的使用-minicom沒有權限打開串口,更改 ttyUSB0 的權限

pan 細致 設備名 ttyusb0 value popu 用戶組 back 介紹

udev的使用-minicom沒有權限打開串口,更改 ttyUSB0 的權限


使用minicom打開串口會提示沒有權限,必需要用 sudo,怎樣更改串口設備的權限能夠讓普通用戶讀寫呢?

事實上僅僅要更改udev的規則, ttyUSB0 的權限為666。就可以實現讓普通用戶可讀寫。

加入udev規則:

/etc/udev/rules.d/50-usb-serial.rules

KERNEL=="ttyUSB0", GROUP="uucp",MODE="0666"

重新啟動


Udev 的使用--linux系統創建設備節點

Linux 裏都是以設備文件的形式存在。在早期的 Linux 版本號中,/dev文件夾包括了全部可能出現的設備的設備文件。

但由於這樣 Linux 用戶非常難在這些大量的設備文件裏找到匹配條件的設備文件。

如今 udev 僅僅為那些連接到 Linux 操作系統的設備產生設備文件。而且 udev 能通過定義一個 udev 規則 (rule) 來產生匹配設備屬性的設備文件,這些設備屬性能夠是內核設備名稱、總線路徑、廠商名稱、型號、序列號或者磁盤大小等等。

動態自己主動管理設備信息:當有設備加入 / 刪除時。udev 的守護進程偵聽到來自內核的 uevent 的事件,用來加入或者刪除 /dev下的設備文件,所以 udev 能夠僅僅為已經連接的設備產生設備文件。而不會象 2.4 內核一樣在 /dev下產生大量設備文件。另外能夠使用這個功能 ,當有設備加入時執行外部的程序,比方鼠標加入時自己主動禁用觸摸板之類
使用自己定義命名和管理設備

:使用 Udev 規則文件,udev 在 /dev/ 裏為全部的設備定義了內核設備名稱,比方 /dev /sda、/dev/hda、/dev/fd等等。因為 udev 是在用戶空間 (user space) 執行,Linux 用戶能夠接下來對這些信息進行操作,比方能夠通過自己定義的規則文件,生成人性的設備標識。比方 /dev/my_disk、/dev/nameusb 等,還能對設置進行參數成員用戶組權限之類的改動。

開始之類須要了解
? sysfs:sysfs是 Linux 2.6 內核裏的一個虛擬文件系統 (/sys)。它把設備和驅動的信息從內核的設備模塊導出到用戶空間 (userspace)。

從該文件系統中,Linux 用戶能夠獲取非常多設備的屬性。
? devpath:本文的 devpath是指一個設備在 sysfs文件系統 (/sys)下的相對路徑,該路徑包括了該設備的屬性文件。

udev 裏的多數命令都是針對 devpath操作的。

比如:sda的 devpath是 /block/sda,sda2 的 devpath是 /block/sda/sda2。
? 內核設備名稱:設備在 sysfs裏的名稱,是 udev 默認使用的設備文件名稱。

udev 主配置文件

基本的udev 主配置文件是 /etc/udev/udev.conf。這個文件通常非常短,他可能僅僅是包括幾行#開頭的凝視。然後有幾行選項:

udev_root=/dev/ # 設置的絕對路徑,相當於創建 chroot 的根。

udev_rules=/etc/udev/rules.d/ #規則的存放地址

udev_log=err # 日誌的輸入級別

udev 的規則配置文件實例

默認的規則配置文件存放在 /etc/udev/rules.d/ 中,我們進入這個能夠看到 RedHat 默認對設備建好的一些規則和一些硬件公司寫好的規則。
進入文件夾,能夠見到以二位數字開頭的前綴的配置文件,能夠使用 vi 進入配置文件裏查看,一行是一條規則,默認是從小數字到大數字。這些表示生效的順序。

我們在使用 udev 寫規則前,先來看一個樣例

KERNEL==sd*, PROGRAM=/lib/udev/scsi_id -g -s %p, RESULT==123456, SYMLINK=%k_%c

該規則的運行:假設有一個內核設備名稱以 sd 開頭,且 SCSI ID 為 123456,則為設備文件產生一個符號鏈接“sda_123456”. %p %k %c 請看後面的“udev 的值和可調用的替換操作符

udev 的規則配置文件

在規則文件中,除了以“#”開頭的行(凝視)。全部的非空行都被視為一條規則。可是一條規則不能擴展到多行。規則都是由多個 鍵值對(key-value pairs)組成,並由逗號隔開,鍵值對能夠分為 條件匹配鍵值對( 下面簡稱“匹配鍵 ”) 和 賦值鍵值對( 下面簡稱“賦值鍵 ”)。一條規則能夠有多條匹配鍵和多條賦值鍵。匹配鍵是匹配一個設備屬性的全部條件,當一個設備的屬性匹配了該規則裏全部的匹配鍵。就覺得這條規則生效,然後依照賦值鍵的內容,運行該規則的賦值。


規則文件中的規則有一系列的鍵/值對組成,鍵/值對之間用逗號(,)切割。

通過上面樣例中也能看出,這些配置,但我想大家可能會產生疑惑,為什麽 KERNEL 是匹配鍵,而 NAME 和 MODE 是賦值鍵呢?這由中間的操作符 (operator) 決定。

僅當操作符是“==”或者“!=”時,其為匹配鍵;若為其它操作符時。都是賦值鍵。



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

操作符 匹配或賦值t 解釋
----------------------------------------
== 匹配 相等比較
!= 匹配 不等比較
= 賦值 分配一個特定的值給該鍵,他能夠覆蓋之前的賦值。


+= 賦值 追加特定的值給已經存在的鍵
:= 賦值 分配一個特定的值給該鍵,後面的規則不可能覆蓋它。

udev 規則的匹配鍵 :

含義

----------------------------------------

ACTION 事件 (uevent)的行為。比如:add( 加入設備 )remove(刪除設備 )

KERNEL 在內核裏看到的設備名字。比方sd*表示隨意SCSI磁盤設備

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

SUBSYSTEM 子系統名字,比如:sda的子系統為 block

BUS 總線的名字,比方IDE,USB

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

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

SYSFS{ value} sysfs屬性值,他能夠表示隨意

ENV{ key} 環境變量。能夠表示隨意

PROGRAM 可運行的外部程序。假設程序返回0值,該鍵則覺得為真(true)

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

NAME 依據這個規則創建的設備文件的文件名稱。

註意:只第一行的NAME描寫敘述是有效的。後面的均忽略。

假設你想使用使用兩個以上的名字來訪問一個設備的話。能夠考慮SYMLINK鍵。

SYMLINK /dev/下的設備文件產生符號鏈接。因為 udev僅僅能為某個設備產生一個設備文件。

所以為了不覆蓋系統默認的 udev規則所產生的文件。推薦使用符號鏈接。

OWNER 設備文件的屬組

GROUP 設備文件所在的組。

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

RUN 為設備而運行的程序列表

LABEL 在配置文件中為內部控制而採用的名字標簽(下以下的GOTO服務)

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

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

WAIT_FOR_SYSFS 等待一個特定的設備文件的創建。

主要是用作時序和依賴問題。

PTIONS 特定的選項:

last_rule 對這類設備終端規則運行。

ignore_device 忽略當前規則。

ignore_remove 忽略接下來的並移走請求。

all_partitions 為全部的磁盤分區創建設備文件。

我們給出一個列子來解釋怎樣使用這些鍵。以下的樣例來自Fedora Core 5系統的標準配置文件。



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設備。

當然,上面不過一小部分樣例。假設你的系統採用了udev方式,那你應該能夠看到很多其它的規則。假設你想改動設備的權限或者創建信的符號連接。那麽你須要熟讀這些規則,特別是要細致註意你改動的那些與之相關的設備。

udev 的值和可調用的替換操作符

在鍵值對中的鍵和操作符都介紹完了。最後是值 (value)

Linux用戶能夠任意地定制 udev 規則文件的值。

比如:my_root_disk, my_printer。同一時候也能夠引用以下的替換操作符:

----------------------------------------

$kernel, %k:設備的內核設備名稱,比如:sdacdrom

$number, %n:設備的內核號碼,比如:sda3的內核號碼是 3

$devpath, %p:設備的 devpath路徑。

$id, %b:設備在 devpath裏的 ID號。

$sysfs{file}, %s{file}:設備的 sysfs file 的內容。

事實上就是設備的屬性值。

比如:$sysfs{size}表示該設備 ( 磁盤 )的大小。

$env{key}, %E{key}:一個環境變量的值。

$major, %M:設備的 major號。

$minor %m:設備的 minor號。

$result, %cPROGRAM返回的結果

$parent, %P:父設備的設備文件名稱。

$root, %rudev_root的值。默認是 /dev/

$tempnode, %N:暫時設備名。

%%:符號 %本身。

$$:符號 $本身。


udev 規則所須要信息的查詢

經常使用的查上面匹配鍵信息的命令

udevinfo -a -p $(udevinfo -q path -n /dev/sda1 )

上面的命令兩次使用udevinfo

第一次是返回sysfs設備路徑(他通常和我們看到的Linux設備文件名稱所在路徑--/dev/hda--不同)

第二次才是查詢這個設備路徑,結果將是很常的syfs信息匯總

udevinfo -a -p /sys/class/net/eth0

scsi_id -g -s /block/sda

scsi_id -g -x -s /block/sda/sda3

ata_id /dev/hda


udev 信息的測試和生效

查出來後,依據上面文件裏的內容寫規則後,怎麽測試

udevtest /block/sda

start_dev #命令重新啟動 udev守護進程

本操作會對全部的設備又一次查詢規則文件夾下全部的規則文件,然後運行所匹配的規則裏的行為。

通常使用該命令讓新的規則文件馬上生效。

udev的使用-minicom沒有權限打開串口,更改 ttyUSB0 的權限