天天看點

讨論:如何解決系統啟動盤符飄逸的問題

在核心調試的過程中,可以通過ls /dev/sd*檢視相關的資訊

SYMLINK是符号連結,但NAME是我們定義在/dev裡邊生成的,難道這個也叫符号連結

<a href="http://blog.itpub.net/10752019/viewspace-941275/" target="_blank">http://blog.itpub.net/10752019/viewspace-941275/</a>

<a href="http://bbs.chinaunix.net/thread-1961452-1-1.html" target="_blank">http://bbs.chinaunix.net/thread-1961452-1-1.html</a>

我增加了一個硬碟,核心将其命名為sdb,我嘗試寫了一條規則将NAME=sdc,并用LAST_RULE将後續的比對終止,用udevtrigger将其生效了(也重新開機過),在用fdisk -l的時候是看不到sdc的,也隻有sdb,但在dev下邊存在sdc,并可以分區,用fdisk可以産生sdc1,同時也産生sdb1了,但無法對sdc1進行mkfs,提示磁盤明顯不存在,

問題

1,為什麼仍有/dev/sdb的命名?規則中已經LAST_RULE了,50規則找到sdb也不該來比對他,

2,格式化sdc1為什麼不生效,難道是因為sdb是核心的命名,而udev定義的别名是使用者模式?核心無法識别?

但udev的用法不就是建立在可以給核心所識裝置來定義别名的基礎上嗎?

3,利用udevinfo可以檢視磁盤的detail來定義rule,NAME定義的是我們自己要在/dev下看到的名字,但核心的名字也出現在/dev下邊,核心的命名是必須在/dev下生效的呢?還是否需要重新寫一套完整的規則來替代50規則?

KERNEL=="sda"是否核心已經指定(可能是sysfs),是以其實重新配置設定名字

也隻是重建立立一個裝置節點而已,

為了能夠自定義生成相應的裝置名稱,需要比預設的系統配置50提前描述

編寫檔案如下錯誤:

将 2:0:0 上的裝置 igb0 設定透傳後,它就不會被附着 

驅動程式了。2:0:1 上的裝置的名稱就會由 igb1 變為 

igb0。這不正好就能由 pciconf -l 準确地反映出來嗎? 

這樣,就可以根據 pciconf -l 的結果,将 2:0:1 上的裝置 

确定地重命名為 net1,将 2:0:2 上的裝置重命名為 net2, 

如此等等。

是不是有問題

DEVPATH=="/devices/pci0000:00/0000:00:10.0/host2/target2:0:1/2:0:1:0/block/sdb"

研究的議題:如何通過pci插槽綁定裝置名稱但是udev掃描插槽的時候,并不知道插槽的具體

命名方式,并且不同機器的插槽是否一樣的命名,如果隻是通過size,是否可行。

操作步驟1:

ID=="host2",SUBSYSTEM="block",NAME="mydisk"

invalid SUBSYSTEM operation

由于SUBSYSTEM的編寫規則出現錯誤,必須是==

正确如下:

ID=="host2",SUBSYSTEM=="block",NAME="mydisk"

ID_PATH=="pci-0000:00:10.0-scsi-0:0:1:0", SUBSYSTEM=="block",NAME="mydisk"

pciconf -l 是用來檢視目前 PCI 的 總線:插槽:功能 

與裝置名的對應關系。

unknown key 'ID_PATH' in /etc/udev/rules,d/50-persistent-storage.rules

由于出現如上的錯誤,導緻無法正常進入系統,這個時候采用的系統隻能夠通過

重新挂載根檔案系統變成可讀寫的方可以進入系統

mount -o remount,rw /dev/sda2 /

操作步驟2:

嘗試修改核心指定的盤符,取消原有的裝置辨別

kernel=="sdb",NAME="MYDISK"

出現如下的麻煩:

1)fdisk -l 無法識别裝置,但是能夠正常的挂載,結果發現裝置分區MYDISK2和MYDISK1根本不存在,而且不能夠挂載,是否需要重新部署這個裝置名稱,發現這個方法沒有任何的意義。

udev介紹:

 1.udev規則檔案:

   /etc/udev/rules.d/    # 使用者自定義的規則檔案一般放在這    /lib/udev/rules.d/

2.udev主配置檔案:    

/etc/udev/udev.conf

3.(檔案名中的)50為預設值;數值越小越先被解析。

4.udev工具包括udevadm、udevcontrol、udevinfo、udevmonitor、udevsettle、udevtest、  udevtrigger,都被內建到了udevadm中。

如下是猜測:

你想要的效果不是udev的工作,udev隻是根據sysfs中的資訊來生成/dev下的裝置節點,你的驅動程式中必須進行相應的操作向sysfs檔案系統注冊裝置才行。

下面是一個在sysfs中注冊adc裝置資訊,之後udev會自動在/dev下生成裝置adc的部分代碼:

。。。。。。

    /* creating adc class */

    adc_class = class_create(THIS_MODULE, "adc"); 

    if (IS_ERR(adc_class))

    {

     printk(KERN_ERR "failed in creating class!\n");

     goto fail;

    }

    /* register adc device in sysfs, 

     * and this will cause mdev to create corresponding device node 

     */     

    device_create(adc_class, NULL, devno, "adc");

。。。。。

要帶達到你說的效果,修改驅動程式是可以的。

ATTR{UDISKS_PARTITION_SIZE}=="337204224"

SYSFS{size}=="337204224"

172730880

現在确實已經發生 了盤符的改變,但是不知道是否是在核心啟動的時候改變的,

還是

     本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1612007,如需轉載請自行聯系原作者