udev的使用-minicom沒有許可權開啟串口,更改 ttyUSB0 的許可權

來源:互聯網
上載者:User

udev的使用-minicom沒有許可權開啟串口,更改 ttyUSB0 的許可權

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驅動. 它建立一對裝置符號串連:cdrom和cdrom-%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:裝置的核心裝置名稱,例如:sda、cdrom。

$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, %c:PROGRAM返回的結果

$parent, %P:父裝置的裝置檔案名稱。

$root, %r:udev_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守護進程

本操作會對所有的裝置重新查詢規則目錄下所有的規則檔案,然後執行所匹配的規則裡的行為。

通常使用該命令讓新的規則檔案立即生效。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.