Menu

문서정보

목차

iSCSI

iSCSI는 Internet Small Computer Interface의 줄임말입니다. SCSI는 많이 들어보셨을 겁니다. 저 역시 많이 듣기는 했지만... 듣기만 했죠. 시스템 관리자가 아닌 다음에야 SCSI이든 혹은 다른 그 무엇이든 그닥 신경쓸일이 없습니다. 개발자 입장에서야 읽기/쓰기만 잘되면 되니까요.

SCSI는 PC와 하드디스크, CD-ROM, 프린터, 스캐너등과 같은 주변 장치와 통신하기 위한 인터페이스라고 합니다.

그럼 iSCSI가 무엇일지에 대해서는 대충 감이 오죠. 인터넷을 건너 뛰어서 장치와 통신하기 위한 인터페이스 입니다. SCSI를 인터넷으로 확장한 겁니다.

SCSI는 TCP/IP 프로토콜을 사용합니다. 포트번호는 860과 3260을 이용하고요. TCP/IP로 연결한다음 SCSI 커멘드를 이용해서 스토리지를 사용합니다. iSCSI를 사용하는 이유는 아래와 같습니다. 여기 저기 흩어져 있는 저장소를 하나로 통합해서 중앙에서 관리할 수 있습니다. 저장소를 통합한다음 분배할 수 있음으로 자원을 효율적으로 사용할 수 있습니다. 물리적인 제약이 없으니 대용량의 저장소도 별 다른 비용 투자 없이 쉽게 구성할 수 있습니다. mirror Storage를 구성할 수 있습니다. 그래서 데이터에 문제가 생기더라도 쉽게 복구할 수 있습니다. 언제 테스트를 해봐야겠스니다. iSCSI는 로컬 저장소처럼 사용할 수 있는데, 따라서 원격으로 부팅하는게 가능합니다. PXE-boot의 경우 tftp를 많이 사용하는데, iSCSI로 대체가능합니다. 테스트는 안해봤습니다. 역시 언젠가 테스트를 해보고 싶네요.

iSCSI의 구성

iSCSI는 서버 클라이언트 모델을 따르니다.

Linux iSCSI 사용

리눅스에서 iSCSI를 구성해 보려합니다. 공부를 목적으로 구성하는 거라서 루프백으로 충분하겠지만, 인터넷 프로토콜을 이용하는 만큼 네트워크를 이용해서 구성하려고 합니다. 안타깝게도 테스트에 사용할 수 있는 장비가 제가 사용하는 리눅스 노트북 하나라서, virtualBox를 이용 LAN 환경을 구축해서 테스트 하기로 햇습니다. Target, Initiator 모두 리눅스가 되겠군요.

Target 서버는 이미 구축이 돼 있는데요. LVM 구축에서 사용했던 Linux Guest VM을 Target 서버로 사용할 겁니다. LVM으로 구성된 장치를 iSCSI로 연결해서 사용하는 거죠. LVM 구성은 따라하시면 되구요. LVM 구성이 귀찮으면, Guest VM에 장치 직접 붙여서 테스트해도 되겠습니다.

테스트 환경

서버 구성은 다음과 같습니다.

192.168.56.2가 storage 볼륨을 제공합니다. iSCSI target 호스트죠. 192.168.56.1에서 iSCSI 장치를 mount해서 사용할겁니다.

Target

Target 설치

iSCSI 서버에 Target 애플리케이션을 설치해야 겠죠. 애플리케이션의 이름은 tgt 입니다.
# sudo apt-get install tgt

설치를 끝냈다면, 실행을 합시다.
# /etc/init.d/tgtd restart

iqn

먼저 iqn 값을 지정합니다. iqn은 Qualified name의 줄임말인데, 장치를 찾기 위한 도메인이름이라고 보시면 되겠네요.
# tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.joinc.com.example:storage.disk1

tid 값은 1부터 정해주면 됩니다. iqn 값이 제대로 설정돼었는지 확인을 해보죠.
# tgtadm --lld iscsi --op show --mode target
Target 1: iqn.joinc.com.example:storage.disk1
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Readonly: No
            Backing store type: null
            Backing store path: None
            Backing store flags: 
    Account information:
    ACL information:
잘 지정 됐습니다. 아직 물리적인 장치가 할당돼지 않았으므로 크기가 0MB인걸 알 수 있습니다. 여기에 실제 볼륨을 등록하면 되겠죠. LV 이름 /dev/myVG/lvol0을 등록하겠습니다.
# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/myVG/lvol0 

볼륨이 제대로 등록됐는지 확인해 보겠습니다.
# tgtadm --lld iscsi --op show --mode target
Target 1: iqn.joinc.com.example:storage.disk1
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: 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: 1573 MB, Block size: 512
            Online: Yes
            Removable media: No
            Readonly: No
            Backing store type: rdwr
            Backing store path: /dev/myVG/lvol0
            Backing store flags: 
    Account information:
    ACL information:
LUN 1이 추가된 걸 확인할 수 있네요.

이제 외부에서 iSCSI Target에 접근할 수 있도록 bind 해주면 됩니다.
$ tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL
ACL(접근설정)은 -I 옵션으로 정할 수 있습니다. 귀찮아서 ALL로 했습니다.

제대로 bind됐는지 netstat로 확인해 봤습니다.
# netstat -nap | grep tgtd
tcp        0      0 0.0.0.0:3260            0.0.0.0:*               LISTEN      943/tgtd        
tcp6       0      0 :::3260                 :::*                    LISTEN      943/tgtd        

initiator

initiator은 iSCSI 클라이언트 프로그램입니다. 먼저 설치를 해야 겠죠. 공개 소프트웨어인 open-iscsi를 사용하기로 했습니다.
# sudo apt-get install open-iscsi

이제 initiator name을 설정해 줍니다. 클라이언트를 구별하기 위한 이름으로 보입니다. open-iscsi를 설치했더니, initiator name 정보를 가진 파일이 만들어집니다. 우분투라면 확인할 필요가 없는데, 유저가 직접 작업을 해줘야 하는 배포판도 있더군요. CentOS같은 경우인데요. initiator name이 없으면, target에 연결할 수 없습니다. 이것 때문에 삽질을 좀 했습니다. 혹시 모르니 확인하는 걸 추천
# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1993-08.org.debian:01:378a830d17c

initiator 데몬을 실행합니다.
# /etc/init.d/iscsi-network-interface start

이제 Target 시스템을 찾으면 됩니다.
# iscsiadm --mode discovery --type sendtargets --portal 192.168.56.2
192.168.56.2:3260,1 iqn.joinc.com.example:storage.disk1

찾았다면, 로그인 해서 장치를 붙입니다.
# iscsiadm --mode node --targetname iqn.joinc.com.example:storage.disk1 --portal 192.168.56.2 --login
Logging in to [iface: default, target: iqn.joinc.com.example:storage.disk1, portal: 192.168.56.2,3260]
Login to [iface: default, target: iqn.joinc.com.example:storage.disk1, portal: 192.168.56.2,3260]: successful

장치가 성공적으로 붙었는지 확인해봅시다.
# fdisk -l
...
...
Disk /dev/sdb: 1572 MB, 1572864000 bytes
49 heads, 62 sectors/track, 1011 cylinders
Units = cylinders of 3038 * 512 = 1555456 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
잘 붙었군요. 이제 mkfs로 포맷한 다음 마운트해서 사용하면 됩니다.
# mkfs.ext4 /dev/sdb
mke2fs 1.41.14 (22-Dec-2010)
/dev/sdb is entire device, not just one partition!                                                             
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
96000 inodes, 384000 blocks
19200 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=394264576
12 block groups
32768 blocks per group, 32768 fragments per group
8000 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912

Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

마운트 하고 결과를 확인했습니다.
# mount /dev/sdb /mnt/iscsi0/
# df -h
파일시스템            Size  Used Avail Use% 마운트 됨
/dev/sda1             285G   65G  206G  25% /
none                  1.5G  736K  1.5G   1% /dev
none                  1.5G  6.7M  1.5G   1% /dev/shm
none                  1.5G  312K  1.5G   1% /var/run
none                  1.5G     0  1.5G   0% /var/lock
/dev/sdb              1.5G   35M  1.4G   3% /mnt/iscsi0

자동 마운트

매번 부팅할 때마다 iscsiadm명령을 이용해서, 마운트 할수는 없는 노릇이다. target을 성공적으로 붙이고 파일시스템까지 만들었다면, 이후에는 부팅시 자동으로 마운트하면 될테다.

운영체제 마운트 정보는 /etc/fstab에 들어간다. 리눅스 운영체제는 fstab의 정보를 읽어서 마운트를 시도 한다. 마운트까지 성공했다면 /etc/fstab에 아래의 내용을 추가한다.
# cat /etc/fstab
......
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
192.168.57.32:/srv/nfs /mnt/test nfs rw 0 2
/dev/sdb1 /mnt/iscsi ext3 _netdev 0 0

iscsiadm은 attach에 성공한 target 정보를 저장해 두고, mount시 활용한다. 이제 리부팅 해도 마운트 되는 걸 확인할 수 있을 것이다.

Cloud를 위한 LVM + iSCSI

이 문서는 iSCSI over LVM 구성입니다. 클라우드는 Storage를 통합해야 하고, 원격으로 Storage Volume을 제공할 수 있어야 합니다. 이런 점에서 LVM과 iSCSI는 좋은 조합이라고 할 수 있겠습니다.

또 다른 조합으로 생각할 수 있는게 NFS over LVM일 건데요.

어느 구성을 선택할 지는 A Performance Comparison on NFS and iSCSI for IP-Networked Storage 문서를 참고하시기 바랍니다.

이외에도 iSCSI over ZFS도 있습니다. ZFS는 현재 조사중에 있습니다.