FCoE는 10Gbps의 이더넷을 이용, 점보 이더넷 프레임 내에 FC(Fiber Channel) 프레임을 캡슐화하여 이더넷을 통해 FC 프레임을 전송하는 기술로서 별도의 SAN S/W, HBA 없이 CEE(Converged Enhanced Ethernet)에 대응하는 Ethernet S/W와 10Gbps CNA(Converged Network Adapter) NIC 를 통해 구성이 가능하여 IP네트워크와 스토리지 접속용 네트워크를 통합할 수 있는 장점을 가지고 있다. 하지만 별도의 CEE에 대응하는 S/W 와 NIC 가 필요한 단점이 있다.
이 문서에서는 iSCSI와 FCoE의 차이점과 RHEL 6 기반에서의 FCoE 설정과 DM Multipath 구성에 대해 다룬다.
0. FCoE 와 iSCSI
Externel 스토리지를 구현하는데 있어서 얼핏 보면 비슷한 iSCSI와 FCoE의 차이점이 무엇일까?
0.1. 이더넷과 IP 네트워크
이더넷은 IP 네트워크 통신을 전달하는 하나의 규격이다.
IP 네트워크는 이더넷 외에도 무선 LAN, 프레임 릴레이, 토큰링 등의 다양한 규격을 이용하여 전달하는 것이 가능하다. 네트워크 용어로 이더넷은 '데이터 링크 층' 이며, IP 네트워크는 그 위에 구성되는 '네트워크 층' 이다.
0.2. FCoE 와 iSCSI 차이점
iSCSI : 네트워크 계증의 IP 네트워크상에 스토리지 엑세스 SCSI 통신을 올리는 기술이다.
FCOE : 데이터링크 층으로, 이더넷상에 IP 네트워크와 같은 레벨에 FC 프로토콜 통신을 올리는 기술이다.
0.3. FCoE 와 iSCSI 비교 그림
[ iSCSI와 FCoE의 프로토콜 스택 비교 ]
그림에서 볼 수 있듯이 FCoE에서는 기존 이더넷을 그대로 이용하는 것이 아니다.
FC 프로토콜을 올리기 위해 다양한 기능이 확장된 'Converged Enhanced Ethernet(CEE)'라는 규격을 이용한다.
iSCSI 는 일반적으로 IP 네트워크와 스토리지 접속용 네트워크를 나누는 것을 권장하지만 FCoE의 경우 CEE 에 의해 스위치에서 IP 네트워크 통신과 FCoE에 의한 스토리지 엑세스 대역을 분리하는 기능을 구현할 수 있기 때문에 2개의 네트워크를 통합하는 것이 가능하다. 또한 기본으로 10Gbps 대역을 기반으로 하기 때문에 대역폭 부족의 염려도 줄어든다. 하지만 2개의 네트워크의 동시 장애 부분은 우려될 수 있는 부분이다.
이제 FCoE 구성(FCoE 설정)에 대해서 알아 보겠다.
1. 시스템 정보
1.1. H/W
– Enclosure : HP Blade C7000
– Device Bay : BL460C G8
– VC : FlexFablic 10GB-2Port 534FLB Adapter
– Ethernet model : NetXtreme II BCM57810 10 Gigabit Ethernet
– Ethernet Driver(FCOE) : bnx2x 1.78.19-0
1.2. OS
– RHEL 6.6 x86_64 (Kernel 2.6.32-504.8.1.el6)
1.3. Storage
– EMC VMAX 20K
2. FCoE 구성 및 WWPN (Port Name) 추출
여기서는 SAN Storage에 연결할 NIC 장치를 2개를 사용한다.
즉, 2개의 Path로 LUN을 바라보게 되며 FCoE 로 사용할 NIC 는 eth3, eth11 이다.
2.1. Mac Address 확인
미리 확보한 FCoE로 사용할 NIC의 Mac Address를 확인해 본다.
[root@Sample ~]# ifconfig -a | grep '5B:A5'
eth3 Link encap:Ethernet HWaddr 00:17:A4:42:5B:A5
[root@Sample ~]# ifconfig -a | grep '5B:A7'
eth11 Link encap:Ethernet HWaddr 00:17:A4:42:5B:A7
2.2. fcoe-utils 설치
[root@Sample ~]# yum install -y fcoe-utils
–> fcoe-utils, fcoe-target-utils, lldpad 3가지 패키지가 설치가 된다.
2.3. FCoE cfg 파일 복사
FCoE cfg 파일을 NIC 장치명에 맞게 복사한다.
[root@Sample ~]# cd /etc/fcoe/
[root@Sample fcoe]# cp cfg-ethx cfg-eth3
[root@Sample fcoe]# cp cfg-ethx cfg-eth11
2.4. FCoE cfg 수정
fcoe cfg 파일의 내용 중 DCB 부분을 yes 에서 no로 수정
[root@Sample fcoe]# sed -i 's/DCB_REQUIRED=\"yes\"/DCB_REQUIRED=\"no\"/g' cfg-eth3
[root@Sample fcoe]# sed -i 's/DCB_REQUIRED=\"yes\"/DCB_REQUIRED=\"no\"/g' cfg-eth11
2.5. NIC script 수정
아래와 같이 수정한다.
[root@Sample ~ ]# vi /etc/sysconfig/network-scripts/ifcfg-eth3
DEVICE="eth3"
BOOTPROTO="none"
HWADDR="00:17:A4:42:5B:A5"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
UUID="26d81c16-999b-4d58-855d-0178c6230147
–> ifcfg-eth11 도 eth3을 참조하여 수정한다.
2.6. NIC 활성화
[root@Sample ~]# ifconfig eth3 up
[root@Sample ~]# ifconfig eth11 up
2.7. 데몬 활성화 및 시작
[root@Sample ~]# chkconfig lldpad on
[root@Sample ~]# chkconfig fcoe on
[root@Sample ~]# chkconfig –list | egrep 'fcoe|lldpad'
fcoe 0:off 1:off 2:on 3:on 4:on 5:on 6:off
lldpad 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@Sample ~]# /etc/init.d/lldpad start
Starting lldpad: [ OK ]
[root@Sample ~]# /etc/init.d/fcoe start
Starting FCoE initiator service: [ OK ]
2.8. FCoE 확인
여기서 확인된 Port Name (WWPN) 값을 Storage 팀에 전달하여 SAN Fabric 내에서 Zonning을 할 수 있도록 한다.
* WWPN : World Wide Port Name
[root@Sample network-scripts]# fcoeadm -i
Description: NetXtreme II BCM57810 10 Gigabit Ethernet
Revision: 10
Manufacturer: Broadcom Corporation
Serial Number: 1154D0440A72
Driver: bnx2x 1.78.19-0
Number of Ports: 1
Symbolic Name: bnx2fc (Broadcom BCM57810) v2.4.2 over eth3
OS Device Name: host1
Node Name: 0x50060B0000D15E7C
Port Name: 0x50060B0000Q55E4A
FabricName: 0x10000027F8FCB3B3
Speed: Unknown
Supported Speed: 1 Gbit, 10 Gbit
MaxFrameSize: 2048
FC-ID (Port ID): 0x010B01
State: Online
Description: NetXtreme II BCM57810 10 Gigabit Ethernet
Revision: 10
Manufacturer: Broadcom Corporation
Serial Number: 2C20FD924B45
Driver: bnx2x 1.78.19-0
Number of Ports: 1
Symbolic Name: bnx2fc (Broadcom BCM57810) v2.4.2 over eth11
OS Device Name: host2
Node Name: 0x50060B0000Q55E4F
Port Name: 0x50060B0000Q55E4E
FabricName: 0x10000027F8FCB2D3
Speed: Unknown
Supported Speed: 1 Gbit, 10 Gbit
MaxFrameSize: 2048
FC-ID (Port ID): 0x010B01
State: Online
3. DM-Multipath 구성
스토리지 팀은 서버의 FCoE WWPN 값을 참조하여 Zonning을 하고 LUN을 할당 해 준다.
부여 받은 LUN을 이용하여 DM-Multipath 작업 및 볼륨 구성 작업을 한다.
25G LUN 100개를 할당해 주었다 가정한다.
3.1. 패키지 설치
[root@Sample ~]# yum install -y sysfsutils.x86_64
[root@Sample ~]# yum install -y lsscsi
3.2. 할당된 Device 확인
스토리지쪽에서 25G를 할당해 주었지만 fdisk로 확인시 26.8G 사이즈로 확인한다.
[root@Sample ~]# fdisk -l | grep 26.8 | wc -l
200
2개의 패스로 보이기 때문에 100개 * 2 = 200개로 보인다.
3.3. multipath.conf 작성
sample 파일 복사
[root@Sample ~]# cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc/
defaults 파일을 vi 열어서 SYMMETRIX를 찾는다.
[root@Sample ~]# vi /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf.defaults
찾은 부분을 multipath.conf 파일의 마지막에 삽입
[root@Sample ~]# vi /etc/multipath.conf
~~ snip ~~ devices { device { vendor "EMC" product "SYMMETRIX" path_grouping_policy multibus getuid_callout "/lib/udev/scsi_id --page=pre-spc3-83 --whitelisted --device=/dev/%n" path_selector "round-robin 0" path_checker tur features "0" hardware_handler "0" prio const rr_weight uniform no_path_retry 6 rr_min_io 1000 rr_min_io_rq 1 } }
3.4. 데몬시작
[root@Sample ~]# chkconfig multipathd on
[root@Sample ~]# chkconfig –list multipathd
[root@Sample ~]# /etc/init.d/multipathd start
3.5. mpath 장치 목록 뽑기
25G 사이즈의 LUN을 바라보는 mpath* 장치들 목록만 쭉 뽑는다.
1) 먼저 갯수가 100개가 맞는지 샌다.
[root@Sample ~]# multipath -ll |egrep -v 'policy|ready' | egrep -B 2 'size=25G' | egrep -v size | awk '{print $1}' | egrep -v '\-\-' |wc -l
–> multipathd를 start 한지 조금 후에 해야 100개가 모두 보인다. 100개가 모두 맞다면 아래를 진행.
2) pvc.sh 이름의 파일로 mpath 장치 목록 작성
[root@Sample ~]# multipath -ll |egrep -v 'policy|ready' | egrep -B 2 'size=25G' | egrep -v size | awk '{print $1}' | egrep -v '\-\-' > /root/pvc.sh
3.6. 스크립트 작성
vg 하나에서 다수의 lv 로 쪼갠다는 것으로 가정한다.
1) vgc.sh 라는 파일로도 복사를 한다.
[root@Sample ~]# cp /root/pvc.sh /root/vgc.sh
2) pvc.sh 스크립트 작성
수백개의 LUN을 일일히 PV, VG 생성하려면 힘든 작업이다. 따라서 간단한 스크립트를 작성하여 손쉽게 생성한다.
[root@Sample ~]# vi /root/pvc.sh
#!/bin/bash pv=" mpathak mpathr mpathbc . . ~~ snip ~~ " for i in $pv do pvcreate /dev/mapper/$i done
3) vgc.sh 스크립트 작성
[root@Sample ~]# vi /root/vgc.sh
#!/bin/bash vgcreate vg1 /dev/mapper/mpathak sleep 1; vg=" mpathr mpathbc . . ~~ snip ~~ " for i in $vg do vgextend vg1 /dev/mapper/$i done
–> vgc.sh 에서 주의할 점은 mpath 장치 들 중 하나를 선별해서 (여기서는 mpathak ) vgcreate를 먼저 한번 해주고, vgextend로 나머지 장치들을 vg에 확장하는 방법으로 생성한다. 따라서 선별한 장치는 vg=" 목록에서 뺀다.
3.7. 스트립트 구동 및 확인
1) 구동
[root@Sample ~]# cd /root
[root@Sample ~]# bash -x pvc.sh
–> bash -x 옵션으로 스크립트 실행 결과를 화면에 출력되도록 하면서 진행.
[root@Sample ~]# bash -x vgc.sh
2) 생성된 pv, vg 확인
[root@Sample ~]# pvscan
[root@Sample ~]# vgscan
[root@Sample ~]# vgdisplay vg1
3.8. lv 및 파일시스템 생성, mount
[root@Sample ~]# lvcreate -L 1600G -n lv1 vg1
[root@Sample ~]# lvcreate -L 900G -n lv2 vg1
[root@Sample ~]# mkfs.ext4 /dev/vg1/lv1
[root@Sample ~]# mkfs.ext4 /dev/vg1/lv2
[root@Sample ~]# mkdir /db-store
[root@Sample ~]# mkdir /data-store
[root@Sample ~]# vi /etc/fstab
~~ snip ~~
/dev/vg1/lv1 /db-store ext4 defaults,_netdev 0 0
/dev/vg1/lv2 /data-store ext4 defaults,_netdev 0 0
–> 만약 마운트는 안하고 lvm active만 하고 싶다면 fstab 에 볼륨 갯수에 상관 없이
none none none _netdev 0 0 을 한 줄만 기입해 준다.
[root@Sample ~]# mount -a
[root@Sample ~]# df -h
3.9. 기타 데몬 활성화
FCoE 의 경우 네트워크 기반 스토리지 이므로 부팅시 netfs가 실행되지 않으면 lvm 이 inactive 상태로 되어 마운트가 되지 않는다. lvm이 active가 안되므로 /etc/rc.local 에 마운트를 명시한다 해도 마찬가지이다.
[root@Sample ~]# /etc/init.d/netfs start
[root@Sample ~]# chkconfig netfs on
–> netfs는 부팅시 fstab의 _netdev 옵션이 발견되면 /sbin/lvm vgchange -a y 명령을 수행하여 lvm을 active 시켜주는 역활을 한다.
/etc/rc.d/rc.sysinit 초기화 스크립트가 같은 명령으로 lvm 을 active 시키지만 FCoE, iSCSI 등의 네트워크 기반의 스토리지는 rc.sysinit 스크립트가 구동되는 시점보다 늦게 인지가 된다. 따라서 netfs가 그것을 감안하여 LVM을 active 시켜준다.
이상으로 글을 마친다.