天天看點

iscsi多路徑存儲方式

1、ISCSI多路徑應用

如果存儲伺服器到交換機隻有一條線路的時候,那麼一條線路出線故障,整個就沒法使用了,是以多線路可以解決這個問題,避免單點故障。

iscsi多路徑存儲方式

2、實驗環境:  172.17.1.150,172.17.1.151配置雙網卡。

服務端:docker-01   IP:172.17.1.150 eth0 ,br  ;IP:172.17.1.160 eth1 , vmnet4

用戶端:docker-02   IP:172.17.1.151 eth0 ,br  ;IP:172.17.1.170 eth1 , vmnet4

3、将docker-01配置成ip san,将docker-01上的sdb1分區,通過ip san 共享出去。

伺服器端:target     docker-01

用戶端:  initiator   docker-02

3.1生成eth1配置檔案,配置IP ,172.17.1.160     172.17.1.170

 #172.17.1.150(docker-01)
 [root@docker-01 network-scripts]# cd /etc/sysconfig/network-scripts/
 [root@docker-01 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
 [root@docker-01 network-scripts]# vim ifcfg-eth1
 DEVICE=eth1 ##修改
 TYPE=Ethernet
 ONBOOT=yes
 NM_CONTROLLED=yes
 BOOTPROTO=static
 IPADDR=172.17.1.160  ##修改
 NETMASK=255.255.240.0
 GATEWAY=172.17.0.1
 [root@docker-01 network-scripts]# service network restart
 #172.17.1.151(docker-02)
 [root@docker-02 network-scripts]# cd /etc/sysconfig/network-scripts/
 [root@docker-02 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
 [root@docker-02 network-scripts]# vim ifcfg-eth1
 DEVICE=eth1 ##修改
 TYPE=Ethernet
 ONBOOT=yes
 NM_CONTROLLED=yes
 BOOTPROTO=static
 IPADDR=172.17.1.170  ##修改
 NETMASK=255.255.240.0
 GATEWAY=172.17.0.1
 [root@docker-02 network-scripts]# service network restart      

3.2安裝tgtd伺服器,準備一個磁盤: sda4

 [root@docker-01 network-scripts]# yum install -y scsi-target-utils
 [root@docker-01 network-scripts]# fdisk /dev/sda
 
 WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
 
 Command (m forhelp): p
 
 Disk /dev/sda: 107.4 GB, 107374182400bytes
 255heads, 63sectors/track, 13054cylinders
 Units =cylinders of 16065* 512=8225280bytes
 Sector size (logical/physical): 512bytes / 512bytes
 I/O size (minimum/optimal): 512bytes / 512bytes
 Disk identifier: 0x000b076e
 
   Device Boot     Start         End     Blocks   Id System
 /dev/sda1   *           1         26     204800  83Linux
 Partition 1does not end on cylinder boundary.
 /dev/sda2              26        287    2097152  82Linux swap / Solaris
 Partition 2does not end on cylinder boundary.
 /dev/sda3             287      13055  102554624  83Linux
 
 Command (m forhelp): d
 Partition number (1-4): 2
 
 Command (m forhelp): p
 
 Disk /dev/sda: 107.4 GB, 107374182400bytes
 255heads, 63sectors/track, 13054cylinders
 Units =cylinders of 16065* 512=8225280bytes
 Sector size (logical/physical): 512bytes / 512bytes
 I/O size (minimum/optimal): 512bytes / 512bytes
 Disk identifier: 0x000b076e
 
   Device Boot     Start         End     Blocks   Id System
 /dev/sda1   *           1         26     204800  83Linux
 Partition 1does not end on cylinder boundary.
 /dev/sda3             287      13055  102554624  83Linux
 
 Command (m forhelp): n
 Command action
   e   extended
   p   primary partition (1-4)
 p
 Partition number (1-4): 
 Value out of range.
 Partition number (1-4): 4
 First cylinder (26-13054, default 26): 
 Using default value 26
 Last cylinder, +cylinders or +size{K,M,G} (26-286, default 286): +10G
 Value out of range.
 Last cylinder, +cylinders or +size{K,M,G} (26-286, default 286): 
 Using default value 286
 
 Command (m forhelp): p
 
 Disk /dev/sda: 107.4 GB, 107374182400bytes
 255heads, 63sectors/track, 13054cylinders
 Units =cylinders of 16065* 512=8225280bytes
 Sector size (logical/physical): 512bytes / 512bytes
 I/O size (minimum/optimal): 512bytes / 512bytes
 Disk identifier: 0x000b076e
 
   Device Boot     Start         End     Blocks   Id System
 /dev/sda1   *           1         26     204800  83Linux
 Partition 1does not end on cylinder boundary.
 /dev/sda3             287      13055  102554624  83Linux
 /dev/sda4              26        286    2091471  83Linux
 
 Partition table entries are not indisk order
 
 Command (m forhelp): w  
 The partition table has been altered!
 
 Calling ioctl() to re-read partition table.
 
 WARNING: Re-reading the partition table failed with error 16: 裝置或資源忙.
 The kernel still uses the old table. The new table will be used at
 the next reboot or after you run partprobe(8) or kpartx(8)
 Syncing disks.
 [root@docker-01 network-scripts]# reboot      

3.3配置target ,把sda4分區共享出去,修改配置檔案。

 [root@docker-01 ~]# vim /etc/tgt/targets.conf
 ##在參考這段内容并在段内容後,追加以下紅色标記内容:
 75#<target iqn.2008-09.com.example:server.target4>
 76#   direct-store /dev/sdb     # Becomes LUN 1
 77#   direct-store /dev/sdc     # Becomes LUN 2
 78#   direct-store /dev/sdd     # Becomes LUN 3
 79#   write-cache off
 80#   vendor_id MyCompany Inc.
 81#</target>
 ##改為
 82<target iqn.2019-09.cn.docker.www:target_san1>
 83        backing-store /dev/sda4
 84        initiator-address 172.17.1.151
 85        initiator-address 172.17.1.170   #在通路控制清單中添加一個用戶端
 86        vendor_id docker
 87        product_id   target1
 88</target>
 ##注釋:
 default-driver iscsi      #此配置檔案預設全部注釋,使用iscsi驅動   
 <target iqn.2019-09.cn.docker.www:target_san1>  # iscsi正規名字格式 : iqn.年-月.主機名倒着寫: target端名字
   backing-store /dev/sda4     # 可以是具體的分區,也可以是DD出來的檔案。不能小于1G。(後面的檔案系統是GFS,光日志空間就128M)         
   initiator-address 172.17.1.150   #指定允許通路的此存儲主機
 initiator-address 172.17.1.151   #指定允許通路的此存儲主機
 vendor_id “docker”  #供應廠商編号 辨別這個裝置(字元不要過長)
 product_id "target1"    # 産品編号
 </target>      

3.4啟動服務

 [root@docker-01 scripts]# service tgtd restart
 Stopping SCSI target daemon: not running                   [FAILED]
 Starting SCSI target daemon:                               [ OK ]
 [root@docker-01 scripts]# netstat -antup | grep 3260
 tcp        0     00.0.0.0:3260                0.0.0.0:*                   LISTEN      1328/tgtd
 [root@docker-01 scripts]# chkconfig tgtd on      

3.5檢視狀态tgt-admin --show

 [root@docker-01 scripts]# tgt-admin --show 
 Target 1: iqn.2019-09.cn.docker.www:target_san1
   System information:
       Driver: iscsi
       State: ready
   I_T nexus information:
   LUN information:
       LUN: 0
           Type: controller
           SCSI ID: IET     00010000
           SCSI SN: beaf10
           Size: 0MB, Block size: 1
           Online: Yes
           Removable media: No
           Prevent removal: No
           Readonly: No
           Backing store type: null
           Backing store path: None
           Backing store flags: 
       LUN: 1
           Type: disk
           SCSI ID: IET     00010001
           SCSI SN: beaf11
           Size: 2142MB, Block size: 512
           Online: Yes
           Removable media: No
           Prevent removal: No
           Readonly: No
           Backing store type: rdwr
           Backing store path: /dev/sda4
           Backing store flags: 
   Account information:
   ACL information:
        172.17.1.151
        172.17.1.170      

4、配置用戶端: 172.17.1.151

 [root@docker-02 network-scripts]# yum install -y iscsi-initiator-utils
 [root@docker-02 network-scripts]# iscsiadm -m discovery -t sendtargets -p 172.17.1.150:3260
 正在啟動 iscsid:                                        [确定]
 172.17.1.150:3260,1 iqn.2019-09.cn.docker.www:target_san1
 [root@docker-02 network-scripts]# service iscsi restart
 Stopping iscsi:                                           [ OK ]
 Starting iscsi:                                           [ OK ]      

5、檢視發現到新硬碟

 [root@docker-02 network-scripts]# ls /dev/sdb
 /dev/sdb
 [root@docker-02 network-scripts]# netstat -antup | grep 3260
 tcp        0     0172.17.1.151:44880          172.17.1.150:3260           ESTABLISHED 2062/iscsid      

6、用戶端從另一條線路發現裝置

 [root@docker-02 network-scripts]# iscsiadm -m discovery -t sendtargets -p 172.17.1.160
 172.17.1.160:3260,1 iqn.2019-09.cn.docker.www:target_san1
 [root@docker-02 network-scripts]# yum install -y tree
 [root@docker-02 network-scripts]# tree /var/lib/iscsi/
 /var/lib/iscsi/
 ├── ifaces
 ├── isns
 ├── nodes
 │   └── iqn.2019-09.cn.docker.www:target_san1
 │       ├── 172.17.1.150,3260,1
 │       │   └── default
 │       └── 172.17.1.160,3260,1
 │           └── default
 ├── send_targets
 │   ├── 172.17.1.150,3260
 │   │   ├── iqn.2019-09.cn.docker.www:target_san1,172.17.1.150,3260,1,default -> /var/lib/iscsi/nodes/iqn.2019-09.cn.docker.www:target_san1/172.17.1.150,3260,1
 │   │   └── st_config
 │   └── 172.17.1.160,3260
 │       ├── iqn.2019-09.cn.docker.www:target_san1,172.17.1.160,3260,1,default -> /var/lib/iscsi/nodes/iqn.2019-09.cn.docker.www:target_san1/172.17.1.160,3260,1
 │       └── st_config
 ├── slp
 └── static
 13directories, 4files
 [root@docker-02 network-scripts]# service iscsi restart
 Stopping iscsi:                                           [OK]
 Starting iscsi:                                           [OK]
 [root@docker-02 network-scripts]# ls /dev/sd*
 /dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb /dev/sdc      

7、挂載硬碟測試資料

 [root@docker-02 network-scripts]# fdisk /dev/sdb
 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
 Building a new DOS disklabel with disk identifier 0x1d8c9593.
 Changes will remain inmemory only, untilyou decide to writethem.
 After that, of course, the previous content won't be recoverable.
 
 Warning: invalid flag 0x0000 of partition table 4will be corrected by w(rite)
 
 WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
 
 Command (m forhelp): n
 Command action
   e   extended
   p   primary partition (1-4)
 p
 Partition number (1-4): 1
 First cylinder (1-1022, default 1): 
 Using default value 1
 Last cylinder, +cylinders or +size{K,M,G} (1-1022, default 1022): 
 Using default value 1022
 
 Command (m forhelp): w
 The partition table has been altered!
 
 Calling ioctl() to re-read partition table.
 Syncing disks.
 [root@docker-02 network-scripts]# mkfs.ext4 /dev/sdb1
 [root@docker-02 network-scripts]# mount /dev/sdb1 /opt/
 [root@docker-02 network-scripts]# df -Th
 Filesystem     Type   Size Used Avail Use% Mounted on
 /dev/sda3     ext4   97G  2.5G   89G   3% /
 tmpfs         tmpfs  7.8G     0 7.8G   0% /dev/shm
 /dev/sda1     ext4   190M   52M 129M  29% /boot
 /dev/sdb1     ext4   2.0G  3.0M  1.9G   1% /opt
 ##注:可以看到sdb1可以正常使用
 [root@docker-02 network-scripts]# ls /dev/sdc* ##檢視不到sdc1
 /dev/sdc
 [root@docker-02 network-scripts]# service iscsi restart
 Stopping iscsi:                                           [OK]
 Starting iscsi:                                           [OK]
 [root@docker-02 network-scripts]# ls /dev/sdc*
 /dev/sdc /dev/sdc1
 [root@docker-02 network-scripts]# mkdir /tmp/sdc1
 [root@docker-02 network-scripts]# mount /dev/sdc1 /tmp/sdc1/ 
 [root@docker-02 network-scripts]# mount /dev/sdb1 /opt/ ## 挂載報錯了吧?
 mount: you must specify the filesystem type
 [root@docker-02 network-scripts]# blkid /dev/sdc1 /dev/sdb1 ##對比一下,發現UUID一樣的
 /dev/sdc1: UUID="d6493ee6-b9c8-4d28-9920-efc46c0354dd"TYPE="ext4"
 ##解決方法
 [root@docker-02 network-scripts]# mount -t xfs -o nouuid /dev/sdb1 /opt
 [root@docker-02 network-scripts]# df -Th
 Filesystem     Type   Size Used Avail Use% Mounted on
 /dev/sda3     ext4   97G  2.5G   89G   3% /
 tmpfs         tmpfs  7.8G     0 7.8G   0% /dev/shm
 /dev/sda1     ext4   190M   52M 129M  29% /boot
 /dev/sdb1     ext4   2.0G  3.0M  1.9G   1% /opt
 /dev/sdc1     ext4   2.0G  3.0M  1.9G   1% /tmp/sdc1      

8、在存儲用戶端docker-02(172.17.1.151)上配置多路徑

多路徑軟體Device Mapper Multipath(DM-Multipath)可以将伺服器節點和存儲陣列之間的多條I/O鍊路配置為一個單獨的裝置。這些I/O鍊路是由不同的線纜、交換機、控制器組成的SAN實體鍊路。Multipath将這些鍊路聚合在一起,生成一個單獨的新的裝置。

8.1DM-Multipath概覽:

(1)資料備援

DM-Multipath可以實作在active/passive模式下的災難轉移。在active/passive模式下,隻有一半的鍊路在工作,如果鍊路上的某一部分(線纜、交換機、控制器)出現故障,DM-Multipath就會切換到另一半鍊路上。

(2)提高性能

DM-Multipath也可以配置為active/active模式,進而I/O任務以round-robin的方式分布到所有的鍊路上去。通過配置,DM-Multipath還可以檢測鍊路上的負載情況,動态地進行負載均衡。

8.2安裝多路經軟體

 [root@docker-02 network-scripts]# yum install device-mapper-multipath -y
 [root@docker-02 network-scripts]# cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc/
 [root@docker-02 network-scripts]# service multipathd restart
 ux_socket_connect: No such file or directory
 Stopping multipathd daemon:                               [FAILED]
 Starting multipathd daemon:                               [ OK ] 
 [root@docker-02 network-scripts]# multipath -ll ##沒有輸出消息。表示出錯了。
 ##解決:把正在使用中的sdb1和sdbc1解除安裝了
 [root@docker-02 network-scripts]# umount /opt/
 [root@docker-02 network-scripts]# service iscsi restart
 Stopping iscsi:                                           [ OK ]
 Starting iscsi:                                           [ OK ]
 [root@docker-02 network-scripts]# service multipathd restart
 ok
 Stopping multipathd daemon:                               [OK]
 Starting multipathd daemon:                               [OK]
 [root@docker-02 network-scripts]# multipath -ll
 mpathb (1IET     00010001) ##(遠端儲存設備id) dm-0 ##(廠商)docker,target1 ##(産品ID)
 size=2.0G features='0'hwhandler='0'wp=rw
 |-+-policy='round-robin 0'prio=1status=active ##預設使用active的鍊路
 |`- 8:0:0:1 sdb 8:16 active ready running
 `-+- policy='round-robin 0' prio=1 status=enabled 
 ##有效的鍊路,但不是活動鍊路
 `- 7:0:0:1 sdc 8:32 active ready running
 ##預設配置并不會實作負載均衡,隻會實作高可用的效果。
 ##課外講解
 00010001遠端儲存設備的産品資訊,由于sda和sdb對應的都是遠端同一個存儲,是以産品資訊是一樣的,最後被多路經驅動發現,是以為他們生成了一個裝置檔案/dev/mapper/mpatha
 [root@docker-02 network-scripts]# ll /dev/mapper/mpathb*
 lrwxrwxrwx 1root root 79月  3022:55 /dev/mapper/mpathb -> ../dm-0
 lrwxrwxrwx 1root root 79月  3022:55 /dev/mapper/mpathbp1 -> ../dm-1      

8.3修改配置檔案,啟動高可用負載均衡模式,并自定義多路經裝置檔案的名字

 [root@localhost ~]# /lib/udev/scsi_id --whitelisted --replace-whitespace /dev/sdb
 1IET_00010001
 [root@docker-02 network-scripts]# vim /etc/multipath.conf 
 ##登出掉下面三行内容
 25defaults {
 26        user_friendly_names yes
      

 27}

iscsi多路徑存儲方式

 ##請在此模版下寫内容

 28multipaths {

 29        multipath {

 30                wwid   "1IET_00010001"  #填寫硬碟産品關鍵資訊

 31                alias                   webdata   #自定義名字

 32                path_grouping_policy   multibus

 33                path_selector           "round-robin 0"

 34                failback                 manual

 35                rr_weight               priorities

 36                no_path_retry           5

 37        }

 38}

iscsi多路徑存儲方式

8.4重新開機服務multipathd

 [root@docker-02 network-scripts]# service multipathd restart
 ok
 Stopping multipathd daemon:                               [OK]
 Starting multipathd daemon:                               [OK]
 [root@docker-02 network-scripts]# service iscsi restart ##需要重新實别一下存儲
 Stopping iscsi:                                           [ OK ]
 Starting iscsi:                                           [ OK ]
 ##再次檢視
 [root@docker-02 network-scripts]# multipath -ll
 1IET     00010001dm-0 docker,target1
 size=2.0G features='0'hwhandler='0'wp=rw
 |-+-policy='round-robin 0'prio=1status=active
 | `- 10:0:0:1 sde 8:64 active ready running
 `-+- policy='round-robin 0' prio=1 status=enabled
  `- 9:0:0:1 sdd 8:48 active ready running
 ##注:之前相當于主備,現在相當于負載均衡       

8.5模拟故障: 斷開一條鍊路。測試鍊路高可用,關閉其中一個網卡,多路經驅動需要約1分鐘的時間,去識别鍊路故障

 [root@docker-01 scripts]# ifdown eth1
 [root@docker-02 mapper]# multipath -ll ##多路經驅動需要約1分鐘的時間,去識别鍊路故障
 1IET     00010001dm-0 docker,target1
 size=2.0G features='0'hwhandler='0'wp=rw
 |-+-policy='round-robin 0'prio=0status=active
 | `- 10:0:0:1 sde 8:64 failed faulty running 
 ##連結運作不正常 faulty故障
 `-+- policy='round-robin 0' prio=1 status=enabled
  `- 9:0:0:1 sdd 8:48 active ready running
 ##會卡在這個地方,大約一分鐘後,檢測故障結束
 [root@docker-01 scripts]# ifup eth1
 Determining ifip address 172.17.1.160 is already inuse fordevice eth1...
 [root@docker-02 mapper]# multipath -ll 
 1IET     00010001dm-0 docker,target1
 size=2.0G features='0'hwhandler='0'wp=rw
 |-+-policy='round-robin 0'prio=1status=active
 | `- 10:0:0:1 sde 8:64 active ready running
 ##鍊路運作正常
 `-+- policy='round-robin 0' prio=1 status=enabled
  `- 9:0:0:1 sdd 8:48 active ready running      

9、在應用伺服器上使用udev規則為target建立固定名字的軟連結

udev概述:udev 是Linux kernel 2.6系列的裝置管理器。它主要的功能是管理/dev目錄底下的裝置節點。udev會根據使用者添加/删除硬體的行為,自處理/dev目錄下所有裝置檔案。

主配置檔案**:/etc/udev/udev.conf**

裝置檔案名字規則目錄:

 [root@localhost ~]# ls /lib/udev/rules.d/10-dm.rules
 /lib/udev/rules.d/10-dm.rules      

命名規律:開頭為數字, 結尾是 .rules

運作機制和注意事項:

1、udev按照規則檔案名的數字順序來查詢全部規則檔案,然後為比對規則的裝置,建立其裝置檔案或檔案連結。

2、通常情況下,建議讓自己想要的規則檔案最先被解析。比如,建立一個名為 /etc/udev/rules.d/10-myrule.rules的檔案,并把你的規則寫入該檔案,這樣udev就會在解析系統預設的規則檔案之前解析到你的檔案。

3、在規則檔案裡,除了以“#”開頭的行(注釋),所有的非空行都被視為一條規則,但是一條規則不能擴充到多行。

4、規則都是由多個鍵值對(key-valuepairs)組成,并由逗号隔開,鍵值對可以分為條件比對鍵值對(以下簡稱“比對鍵”)和指派鍵值對(以下簡稱“指派鍵”),一條規則可以有多條比對鍵和多條指派鍵。

5、比對鍵是比對一個裝置屬性的條件,當一個裝置的屬性比對了該規則裡所有的比對鍵,就認為這條規則生效,然後按照指派鍵的内容,執行該規則的指派。

說明:如果有一個裝置被核心實别sdb1,則該條件生效,執行後面的指派:在/dev下産生一個名為my_ disk的裝置檔案,并把裝置檔案的權限設為0666。

詳細參數說明

udev**規則的比對鍵**

  1. ACTION:事件 (uevent) 的行為,例如:add( 添加裝置 )、remove( 删除裝置 )。
  2. KERNEL:核心裝置名稱,例如:sda, cdrom。
  3. DEVPATH:裝置的 devpath 路徑。
  4. SUBSYSTEM:裝置的子系統名稱,例如:sda 的子系統為 block。
  5. BUS:裝置在 devpath 裡的總線名稱,例如:usb。
  6. DRIVER:裝置在 devpath 裡的裝置驅動名稱,例如:ide-cdrom。
  7. ID:裝置在 devpath 裡的識别号。
  8. SYSFS{filename}:裝置的 devpath 路徑下,裝置的屬性檔案“filename”裡的内容。
  9. ENV{key}:環境變量。在一條規則中,可以設定最多五條環境變量的 比對鍵。
  10. PROGRAM:調用外部指令。
  11. RESULT:外部指令 PROGRAM 的傳回結果。

udev**重要的指派鍵**

  1. NAME:在 /dev下産生的裝置檔案名。隻有第一次對某個裝置的 NAME 的指派行為生效,之後比對的規則再對該裝置的 NAME 指派行為将被忽略。如果沒有任何規則對裝置的 NAME 指派,udev 将使用核心裝置名稱來産生裝置檔案。
  2. SYMLINK:為 /dev/下的裝置檔案産生符号連結。由于 udev 隻能為某個裝置産生一個裝置檔案,是以為了不覆寫系統預設的 udev 規則所産生的檔案,推薦使用符号連結。
  3. OWNER, GROUP, MODE:為裝置設定權限。
  4. ENV{key}:導入一個環境變量

udev**規則操作符**

  1. “==”:比較鍵、值,若等于,則該條件滿足;
  2. “!=”:比較鍵、值,若不等于,則該條件滿足;
  3. “=”:對一個鍵指派;
  4. “+=”:為一個表示多個條目的鍵指派。
  5. “:=”:對一個鍵指派,并拒絕之後所有對該鍵的改動。目的是防止後面的規則檔案對該鍵指派。

# KERNEL是比對鍵,NAME和MODE是指派鍵。

僅當操作符是“==”或者“!=”時,其為比對鍵;若為其他操作符時,都是指派鍵。

相關文章:http://www.361way.com/udev-disk-order/3954.html

實戰:在應用伺服器172,17,1,151上使用udev規則為每個target建立固定名字的軟連結

對iscsi多路徑共享的裝置裝置,讓核心識别成:my_disk

在進行udev綁定的時候,可以是一個未分區的磁盤,也可以是磁盤的一個分區。

檢視共享裝置磁盤的UUID:

 [root@localhost ~]# /lib/udev/scsi_id --whitelisted --replace-whitespace /dev/sdb
 1IET_00010001
 [root@localhost ~]# vim /etc/udev/rules.d/10-sda.rules
 KERNEL=="sd?1",SUBSYSTEM=="block",PROGRAM="/lib/udev/scsi_id --whitelisted --replace-whitespace /dev/$name", RESULT=="1IET_00010001", SYMLINK+="my-disk1", MODE="0660"      

參數:

# KERNEL是比對鍵, SUBSYSTEM:裝置的子系統名稱,例如:sda 的子系統為block。udevadm info -a -p  /sys/block

# PROGRAM:調用外部指令;

# RESULT:外部指令 PROGRAM 的傳回結果。

# SYMLINK:為/dev/下的裝置檔案産生符号連結。由于udev 隻能為某個裝置産生一個裝置檔案,是以為了不覆寫系統預設的udev 規則所産生的檔案,推薦使用符号連結。

 [root@localhost opt]# cd /dev/mapper/
 [root@localhost mapper]# ls
 1IET\x20\x20\x20\x20\x20000100011IET\x20\x20\x20\x20\x2000010001p1 
 [root@localhost mapper]# mount /dev/mapper/1IET\\x20\\x20\\x20\\x20\\x2000010001p1 /opt/
 [root@localhost mapper]# df -Th
 Filesystem           Type   Size Used Avail Use% Mounted on
 /dev/sda3           ext4   97G  2.6G   89G   3% /
 tmpfs               tmpfs  7.8G     0 7.8G   0% /dev/shm
 /dev/sda1           ext4   190M   52M 129M  29% /boot
 /dev/mapper/1IET\x20\x20\x20\x20\x2000010001p1
                     ext4   2.0G  3.0M  1.9G   1% /opt