Multipath實現LUN設備名稱的持久化
一.補充知識
根據傳輸協議的不同的,網卡可分為三種,一是以太網卡,二是FC網卡,三是iSCSI網卡。
(1)以太網卡:學名Ethernet Adapter,傳輸協議為IP協議,一般通過光纖線纜或雙絞線與以太網交換機連接。接口類型分為光口和電口。光口一般都是通過光纖線纜來進行數據傳輸,接口模塊一般為SFP(傳輸率2Gb/s)和GBIC(1Gb/s),對應的接口為SC、ST和LC。電口目前常用接口類型為RJ45,用來與雙絞線連接,也有與同軸電纜連接的接口,不過現在已經用的比較少了。
(2)FC網卡:一般也叫光纖網卡,學名Fibre Channel HBA(Hose Bus Adapter: 主機總線適配器)。傳輸協議為光纖通道協議,一般通過光纖線纜與光纖通道交換機連接。接口類型分為光口和電口。光口一般都是通過光纖線纜來進行數據傳輸,接口模塊一般為SFP(傳輸率2Gb/s)和GBIC(1Gb/s),對應的接口為SC和LC。電口的接口類型一般為DB9針或HSSDC。
“光纖網卡”一般是指FC HBA卡,插在服務器上,外接存儲用的光纖交換機;而光口的以太網卡一般都叫做“光纖以太網卡”,也是插在服務器上,不過它外接的是帶光口的以太網交換機。
(3)ISCSI網卡:Internet Small Computer System Interface, 學名ISCSI HBA,傳輸ISCSI協議,接口類型與以太網卡相同。 iSCSI(internet SCSI)是一套定義在TCP/IP網絡上傳輸SCSI協議的命令。他將SCSI定義的發起方(initiator)和目標方(target)由原來的 SCSI總線連接擴展到internet上,打破了SCSI定義中的存儲距離的限制。
FC SAN和IP SAN是目前兩種流行的SAN存儲方案:
(1) SAN設備在連入系統後,表示為一個或多個target ID,它的邏輯分配單元即為LUN-Logical Unit Number(邏輯單元號)。
(2)IP SAN也稱之為ISCSI(internet Small Computer System Interface)。
ISCSI技術的核心是在TCP/IP網絡上傳輸SCSI協議,是指用TCP/IP報文、和ISCSI報文封裝SCSI報文,使得SCSI命令和數據可以在普通以太網絡上進行傳輸
了解上面的知識,現在來看一下Multipath。 Multipath除了上面提到的,實現LUN設備的持久化,它還有另一個功能,支持多路徑輪詢(提高 I/O負載能力)。 即可以通過多個網卡去訪問Target 設備。 這樣就提高了I/O的能力。 在生產環境中較多使用multipath實現LUN的持久化和多路徑訪問。
注意,這裡有個問題,當我們配置了多session訪問存儲的target後,那麼每個網卡都會生成一個/dev/sd*的設備。 這個在昨天的實驗裡已經有說明。昨天說的lun設備隨即映射到可用的/dev/sd* 設備上,在這裡一個lun 映射還可以到多個/dev/sd* 設備的問題。所以對LUN 設備的持久化是非常重要的。
但是每個target的ID 是唯一的,在多session訪問的條件下,不管一個lun映射到幾個設備, 在配置Multipath的時候,我用的是target ID。 這樣就保證了target 的唯一性。
二.安裝配置
2.1 安裝Multipath
查看相關包:
[root@rac1 ~]# rpm -qa|grep device-mapper
device-mapper-multipath-0.4.7-30.el5
device-mapper-event-1.02.32-1.el5
device-mapper-1.02.32-1.el5
如果沒有安裝,從系統的安裝文件裡找到這集個包:
device-mapper-1.02.32-1.el5.i386.rpm
device-mapper-event-1.02.32-1.el5.i386.rpm
device-mapper-multipath-0.4.7-30.el5.i386.rpm
安裝很簡單:
Rpm –Uvh device-mapper-*.rpm
說明:
(1)device-mapper-multipath
提供multipathd和multipath等工具和multipath.conf等配置文件。這些工具通過device mapper的ioctr的接口創建和配置multipath設備(調用device-mapper的用戶空間庫。創建的多路徑設備會在/dev/mapper中)
(2)device-mapper
device-mapper包括兩大部分:內核部分和用戶部分。
內核部分由device-mapper核心(multipath.ko)和一些target driver(dm-multipath.ko)構成。dm-mod.ko是實現multipath的基礎,dm-multipath其實是dm的一個target驅動。核心完成設備的映射,而target根據映射關系和自身特點具體處理從mappered device 下來的i/o。同時,在核心部分,提供了一個接口,用戶通過ioctr可和內核部分通信,以指導內核驅動的行為,比如如何創建mappered device,這些device的屬性等。
用戶空間部分包括device-mapper這個包。其中包括dmsetup工具和一些幫助創建和配置mappered device的庫。這些庫主要抽象,封裝了與ioctr通信的接口,以便方便創建和配置mappered device。device-mapper-multipath的程序中就需要調用這些庫。
2.2 配置ISCSI多session訪問
1個iSCSI Initiator透過多個Session連入同1個iSCSI Target設備,以便利用多網卡或iSCSI HBA啟用負載平衡與故障失效切換機制,也可稱作Multiple Sessions per Initiator。
2.2.1 斷開ISCSI登錄狀態
[root@rac1 ~]# iscsiadm -m node -T iqn.2006-01.com.san -p 192.168.6.1 -u
Logging out of session [sid: 1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]
Logout of [sid: 1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful
-u 表示logout,-l 表示login。 具體可以用man iscsiadm 查看。
2.2.2新建訪問接口文件
[root@rac1 ~]# iscsiadm -m iface -I iface0 --op=new
New interface iface0 added
[root@rac1 ~]# iscsiadm -m iface -I iface1 --op=new
New interface iface1 added
接口文件保存在/var/lib/iscsi/ifaces目錄中
[root@rac1 ifaces]# cd /var/lib/iscsi/ifaces/
[root@rac1 ifaces]# ls
iface0 iface1
[root@rac1 ifaces]# cat iface0
# BEGIN RECORD 2.0-871
iface.iscsi_ifacename = iface0
iface.transport_name = tcp
# END RECORD
[root@rac1 ifaces]# cat iface1
# BEGIN RECORD 2.0-871
iface.iscsi_ifacename = iface1
iface.transport_name = tcp
# END RECORD
[root@rac1 ifaces]#
2.2.3 配置iface
[root@rac1 ifaces]# iscsiadm -m iface -I iface0 --op=update -n iface.net_ifacename -v eth0
iface0 updated.
[root@rac1 ifaces]# iscsiadm -m iface -I iface1 --op=update -n iface.net_ifacename -v eth1
iface1 updated.
2.2.4 確認iface配置
[root@rac1 ifaces]# iscsiadm -m iface
default tcp,<empty>,<empty>,<empty>,<empty>
iser iser,<empty>,<empty>,<empty>,<empty>
iface1 tcp,<empty>,<empty>,eth1,<empty>
iface0 tcp,<empty>,<empty>,eth0,<empty>
2.2.5 搜索ISCSI Target
[root@rac1 ifaces]# iscsiadm -m discovery -t st -p 192.168.6.1 -I iface0 -I iface1
192.168.6.1:3260,1 iqn.2006-01.com.san
192.168.6.1:3260,1 iqn.2006-01.com.san
2.2.6 建立與Target的連接
[root@rac1 ifaces]# iscsiadm -m node -l
Logging in to [iface: iface1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]
Logging in to [iface: iface0, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]
Login to [iface: iface1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful
Login to [iface: iface0, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful
注意事項:
刪除失效的iscsi 連接:如果因為錯誤配置等原因創建了iscsi 對應,系統不會自動刪除,需手動刪除。
如:
[root@rac3 mapper]# iscsiadm -m node
192.168.6.1:3260,1 iqn.2006-01.com.san
192.168.6.1:3260,1 iqn.2006-01.com.san
我們看到上面有二個iscsi對應,加入這個對應已經失效,系統不會自動刪除。
刪除命名:
iscsiadm -m node -o delete -T iqn.2006-01.com.san -p 192.168.6.1:3260
2.2.7 查看連接狀態
[root@rac1 ifaces]# netstat -anp |grep 3260
tcp 0 0 192.168.6.5:63327 192.168.6.1:3260 ESTABLISHED 2370/iscsid
tcp 0 0 192.168.6.6:32380 192.168.6.1:3260 ESTABLISHED 2370/iscsid
2.3 multipath的默認配置
Multipath的配置文件是:/etc/multipath.conf。該文件中大部分配置是注釋掉的,可以將他保存為備用,然後新建一個multipath.conf 文件,編輯新的配置文件。
[root@rac1 etc]# cp multipath.conf multipath.conf.back
2.3.1 黑名單過濾
multipath會把所有設備都加入到黑名單(devnode "*"),也就是禁止使用。所以,我們首先需要取消該設置,把配置文件修改為類似下面的內容:
devnode_blacklist {
#devnode "*"
devnode "hda"
wwid 3600508e000000000dc7200032e08af0b
}
這裡禁止使用hda,也就是光驅。另外,還使用wwid限制使用本地的sda設備。
可通過下面的命令獲得wwid:
[root@rac1 ~]# /sbin/scsi_id -g -u -s /block/sdf
14f504e46494c450034594d6462472d534745442d6a714841
這裡有redhat的一個bug,具體參考:
scsi_id does not return WWID for /dev/sda with aacraid driver
https://bugzilla.redhat.com/show_bug.cgi?id=445696
這裡要有一點要注意的,就是要獲取某個設備的wwid時,必須先確保用fdisk –l等看到這個設備。 如果沒有看到,是獲取不到的。 這時候可以嘗試把iscsi initiator 重啟一下,網卡禁用啟用,最後在與target 連接:iscsiadm -m node –l。
當fdsk –l能看到設備了,我們可以正常獲取設備的wwid了。
[root@rac1 ~]# iscsiadm -m node -l
Logging in to [iface: iface1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]
Logging in to [iface: iface0, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]
Login to [iface: iface1, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful
Login to [iface: iface0, target: iqn.2006-01.com.san, portal: 192.168.6.1,3260]: successful
[root@rac1 ~]# fdisk –l
…
Disk /dev/sdf: 39.7 GB, 39795556352 bytes
64 heads, 32 sectors/track, 37952 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Disk /dev/sdf doesn't contain a valid partition table
Disk /dev/sdg: 39.7 GB, 39795556352 bytes
64 heads, 32 sectors/track, 37952 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
[root@rac1 ~]# /sbin/scsi_id -g -u -s /block/sdf
14f504e46494c450034594d6462472d534745442d6a714841
[root@rac1 ~]# /sbin/scsi_id -g -u -s /block/sdg
14f504e46494c450034594d6462472d534745442d6a714841
關於:scsi_id
其包含在udev程序包中,可以在multipath.conf中配置該程序來獲取scsi設備的序號。通過序號,便可以判斷多個路徑對應了同一設備。這個是多路徑實現的關鍵。scsi_id是通過sg驅動,向設備發送EVPD page80或page83 的inquery命令來查詢scsi設備的標識。但一些設備並不支持EVPD 的inquery命令,所以他們無法被用來生成multipath設備。但可以改寫scsi_id,為不能提供scsi設備標識的設備虛擬一個標識符,並輸出到標准輸出。
multipath程序在創建multipath設備時,會調用scsi_id,從其標准輸出中獲得該設備的scsi id。在改寫時,需要修改scsi_id程序的返回值為0。因為在multipath程序中,會檢查該直來確定scsi id是否已經成功得到。
2.3.2 編輯默認規則
不同的device-mapper-multipath或操作系統發行版,其默認的規則都有點不同,以紅旗 DC Server 5.0 SP2 for x86_64為例,其path_grouping_policy默認為failover,也就是主備的方式。HDS支持多路徑負載均衡,EMC CX300等只支持Failover。默認允許friendly_name,否則使用設備的wwid作為持久化名稱.我們修改默認的規則:
defaults {
udev_dir /dev
path_grouping_policy multibus
failback immediate
no_path_retry fail
user_friendly_name yes
}
2.3.3 配置multipath.conf文件
我們通過多session來訪問target。 這樣有2個設備/dev/sdf 和 /dev/sdg。 其實他們都對應一個target。 通過上面的查詢知道,他們的wwid是一樣的。 我們就用這個wwid,把他們配置到一起,當成一個設備。在該文件最後添加如下內容。
[root@rac1 ~]#cat /etc/multipath.conf|more
…
multipaths {
multipath {
wwid 14f504e46494c450034594d6462472d534745442d6a714841
alias rac-share
path_grouping_policy multibus
path_checker readsector0
path_selector "round-robin 0"
failback manual
rr_weight priorities
no_path_retry 5
}
}
一個target 對應一個multipath. 如果有多個target 就寫多個multipath 選項。
2.3.4 重啟multipathd服務,驗證配置
[root@rac1 dev]# service multipathd restart
Device /dev/sda1 not found
Command failed
Stopping multipathd daemon: [ OK ]
Starting multipathd daemon: [ OK ]
進入/dev/mapper目錄進行驗證:
root@rac3 mapper]# ls -lrt /dev/mapper/*
crw------- 1 root root 10, 62 Nov 1 05:51 /dev/mapper/control
brw-rw---- 1 root disk 253, 0 Nov 1 06:20 /dev/mapper/rac-share
用 multipath–ll 命令查看到兩條活躍路徑,他們之間互為A/A關系。斷掉其中一根線路,那麼系統自動切換到另外一條。
[root@rac3 mapper]# multipath -ll
rac-share (14f504e46494c450034594d6462472d534745442d6a714841) dm-0 OPNFILER,VIRTUAL-DISK
[size=37G][features=1 queue_if_no_path][hwhandler=0][rw]
/_ round-robin 0 [prio=2][active]
/_ 2:0:0:0 sdf 8:80 [active][ready]
/_ 3:0:0:0 sdg 8:96 [active][ready]
2.3.5 將multipathd服務設置成開機自啟動
[root@rac3 mapper]# chkconfig multipathd on
2.3.6 分區或者創建PV
看到了我們剛才配置的多路徑的目錄。 但是這裡有一個問題。 因為這個是設備創建的,還不能掛載。我們需要對個這個設備進行分區或者創建為PV.
注意,用fdisk分區並保存後,必須刷新multipath的映射表,以便其創建分區對應的設備符.
(1)分區
[root@rac3 mapper]# fdisk /dev/mapper/rac-share
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
The number of cylinders for this disk is set to 4838.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-4838, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-4838, default 4838):
Using default value 4838
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 22: Invalid argument.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@rac3 mapper]# multipath -F --清除多路徑設備緩存
[root@rac3 mapper]# multipath –v3 --重新加載
[root@rac3 mapper]# fdisk -l
……
Disk /dev/sdf: 39.7 GB, 39795556352 bytes
255 heads, 63 sectors/track, 4838 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdf1 1 4838 38861203+ 83 Linux
Disk /dev/sdg: 39.7 GB, 39795556352 bytes
255 heads, 63 sectors/track, 4838 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdg1 1 4838 38861203+ 83 Linux
Disk /dev/dm-0: 39.7 GB, 39795556352 bytes
255 heads, 63 sectors/track, 4838 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/dm-0p1 1 4838 38861203+ 83 Linux
分區之後使用fdisk –l 命令查看磁盤會看到磁盤下面已經有分區的信息了。 這時磁盤就可以mount掛載及使用了。
(2)創建PV
要配置LVM,可以按以下步驟進行:
1. 創建和初始化物理卷(Physical Volume),通過pvcreate建立pv,即pv階段;
2. 添加物理卷到卷組(Volume Group),使用vgcreate加入多個pv成為vg,即vg階段;
3. 在卷組上創建邏輯卷(logical volume),使用lvcreate劃分vg,成為一個或多個lv,即lv階段;
常用命令:
# pvcreate /dev/md0 #創建PV
# pvscan
# vgcreate LVM1 /dev/md0 #創建VG
# vgdisplay LVM1
# lvcreate -L 1.5TB -n data1 LVM1 #創建LV
# lvcreate -L 325GB -n data2 LVM1 #創建LV
# lvscan #查看LV信息
# pvscan #再次查看PV信息
# vgdisplay LVM1 #再次查看VG信息
掛載命令:
#mount /dev/LVM1/data1 /data1
#mount /dev/LVM1/data2 /data2
設置開機自動掛載:
編輯/etc/fstab
/dev/LVM1/data1 /data1 ext3 defaults 2 2
/dev/LVM1/data2 /data2 ext3 defaults 2 2
示例:
[root@rac3 mapper]# pvcreate /dev/mapper/rac-share
Physical volume "/dev/mapper/rac-share" successfully created
[root@rac3 mapper]# vgcreate vg0 /dev/mapper/rac-share
Volume group "vg0" successfully created
[root@rac3 mapper]# lvcreate -L 10M -n lv1 vg0
Rounding up size to full physical extent 12.00 MB
Logical volume "lv1" created
[root@rac3 mapper]# lvdisplay
--- Logical volume ---
LV Name /dev/vg0/lv1
VG Name vg0
LV UUID XkbDyS-btpZ-fIFA-MvBH-d4kl-hibU-RhuKu1
LV Write Access read/write
LV Status available
# open 0
LV Size 12.00 MB
Current LE 3
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
[root@rac3 mapper]# mkfs.ext3 /dev/mapper/vg0-lv1 --格式化
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
3072 inodes, 12288 blocks
614 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=12582912
2 block groups
8192 blocks per group, 8192 fragments per group
1536 inodes per group
Superblock backups stored on blocks:
8193
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.