udev如何除錯,如何看udev的輸出日誌?udev除錯的坑?

e71hao發表於2021-03-31

一、 問題:udev如何除錯,如何看udev的輸出日誌?udev除錯的坑?

二、結論:

環境centos6 

啟動:start_udev 除錯日誌,設定udev.conf 為udev_log="debug" ,日誌輸出在/var/log/message

(1)注意2點:rule啟動有順序的,假設你增加iscsi link,那你的必須要先載入網路,70網路之後,你再執行你新增iscsi link的指令碼,否則rule指令碼無效

(2)假如你現在給裝置新增一個link name,當你編寫好rule指令碼後,呼叫呼叫start_dev,你會發現,在/var/log/message 看不到指令碼執行的日誌。原因是如果已經有link name,udev是會忽略的。這樣如果指令碼編寫有問題,對除錯是不利的,所以需要重啟,可以看到完整的udev指令碼執行日誌輸出。


三、具體例子分析過程


用 UDEV 固定 iSCSI 裝置名稱

用 open-iscsi 連上 Target 之後,iSCSI 裝置的名稱在系統裡總是變來變去,無法固定,這給應用帶來了諸多不便。為了固定系統中 iSCSI 裝置的名稱,可以考慮使用Linux 2.6 核心引入的 UDEV 機制。

[root@rac1 rules.d]# cat 95-openiscsi.rules

 KERNEL=="sd*", ENV{ID_PATH}=="ip-*",  BUS=="scsi",  PROGRAM="/etc/udev/scripts/iscsidev2.sh %E{ID_PATH}", SYMLINK+="iscsi/%c/part%n" 


[root@rac1 rules.d]# cat /etc/udev/scripts/iscsidev2.sh

#!/bin/sh 

# File: /etc/udev/scripts/iscsidev.sh 


TARGET_NAME=`/bin/echo $1 | /bin/awk -F"-iscsi-" '{print $2}' | /bin/awk -F"-lun-" '{print $1"/lun"$2}'` 

/bin/echo ${TARGET_NAME} 

 

規則中以"%"開始的是 UDEV 中的引數,如下:

[table]

|%E{key}|一個環境變數的值,即透過 [color=red]udevadm[/color] 命令查詢出的裝置屬性

|%c|PROGRAM 返回的結果

|%n|裝置的核心號碼,例如:sda3 的核心號碼是 3 

重啟就會看到詳細日誌輸出(設定log為debug),以下是正確新增link的日誌:

[root@rac1 ~]# tail -5000  /var/log/messages |grep "/etc/udev/scripts/iscsidev2"

Mar 31 11:04:27 rac1 udevd-work[1656]: PROGRAM '/etc/udev/scripts/iscsidev2.sh ip-172.16.27.38:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0' /etc/udev/rules.d/95-openiscsi.rules:2

Mar 31 11:04:27 rac1 udevd-work[1656]: '/etc/udev/scripts/iscsidev2.sh ip-172.16.27.38:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0' started

Mar 31 11:04:27 rac1 udevd-work[1645]: '/etc/udev/scripts/iscsidev2.sh' (stdout) 'iqn.2006-01.com.openfiler:racdb.crs1/lun0'

Mar 31 11:04:27 rac1 udevd-work[1645]: '/etc/udev/scripts/iscsidev2.sh ip-172.16.27.38:3260-iscsi-iqn.2006-01.com.openfiler:racdb.crs1-lun-0' returned with exitcode 0

Mar 31 11:04:27 rac1 udevd-work[1656]: '/etc/udev/scripts/iscsidev2.sh' (stdout) 'iqn.2006-01.com.openfiler:racdb.data1/lun0'

Mar 31 11:04:27 rac1 udevd-work[1656]: '/etc/udev/scripts/iscsidev2.sh ip-172.16.27.38:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0' returned with exitcode 0


[root@rac1 ~]# ls /dev/iscsi/

iqn.2006-01.com.openfiler:racdb.crs1  iqn.2006-01.com.openfiler:racdb.data1  iqn.2006-01.com.openfiler:racdb.data2  iqn.2006-01.com.openfiler:racdb.fra1




(1)以上是我花了4個小時除錯出來的結果。假設你把95-openiscsi.rules重新命名成55-openiscsi.rules,然後你會發現,你是怎麼得不到上面link 結果的。

iqn.2006-01.com.openfiler:racdb.crs1 。

原因是:因為建立iscsi需要網路的支援,所以應該在70-persistent-net.rules之後執行。

(2)假設你要執行的指令碼沒有執行許可權,會發生什麼?很明顯udev不能呼叫,日誌就應該列印出錯誤訊息。那這裡有一個坑,如果你重新使用命令start_udev,message日誌

裡面是沒有錯誤訊息的。必須要重啟。

原因是:udev 會忽略已經建立的link,這個時候就不好除錯了,需要重啟,才能看到錯誤日誌 returned with exitcode 2


(3)start_udev,這個命令是重新載入一遍裝置命名,有一個坑就是上面的,如果已經有了的裝置命名,它是不會去重新載入,也不會在message列印日誌。當發生錯誤的時候,

我們都不知道錯誤在哪裡。這個是我認為除錯的一個坑。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30393770/viewspace-2765904/,如需轉載,請註明出處,否則將追究法律責任。

相關文章