Linux에서의 iSCSI Initiator
iSCSI 서비스의 서버로써 제공하는 Storage entity를 target이라 하고 이렇게 제공된 entity를 가져다가 사용하는 것을 initiator라고 정의하였다. 즉, 제공되는 Storage를 가져다가 사용하기 위해서 Server에 접근하는 것을 Initiator라고 하며 iSCSI의 Client라고도 한다.
CentOS에 iSCSI Initiator 설치 및 상태 확인
CentOS 6.5에서 iSCSI Initiator 환경을 만들기 위해서는 iscsi-initiator-utils이라는 패키지가 필요하다 (iSCSI 서버에서는 scsi-target-utils라는 패키지였음). siscsi-initiator-utils는 TGT의 자원을 사용하기 위한 인 iscsiadm이 포함되어져 있다. 참고로 본 패키지는 CentOS 설치 미디어에 함께 포함되어져 있으며, 아래의 rpm들을 설치한다.
STEP 1) iscsi-initiator-utils 패키지 설치
CentOS 6.5의 설치 미디어에 포함되어진 iscsi-initiator-utils, iscsi-initiator-utils-devel 패키지를 설치한다.
rpm -Uvh iscsi-initiator-utils-6.2.0.873-10.el6.x86_64
rpm -Uvh iscsi-initiator-utils-devel-6.2.0.873-10.el6.x86_64
32-bit 패키지도 존재하지만 가능하면 64-bit OS 환경에서 64-bit iSCSI Initiator를 사용할 것을 권고한다.
STEP 2) 로그인을 위한 정보 설정 - 옵션 ( target의 계정을 생성 및 사용을 한다면 initiator에 target 계정을 설정해 줘야 함)
iSCSI Target의 자원을 사용하기 위해서 로그인을 해야 하는데 이때 필요한 로그인 정보들을 설정한다. 앞서서 iSCSI Target 생성시 보안을 위한 username, password 등 일련의 보안 사용을 정의했다면 여기에서 그 내용을 반드시 적용해주어야 한다.
로그인을 위한 환경 정보를 가지고 있는 설정 파일은 /etc/iscsi/iscsid.conf 이며, 이들 내용중에 중요한 것을을 살펴보면 다음과 같다.
/etc/iscsi/iscsid.conf
iSCSI Target에서 CHAP 인증으로 특정 사용자만이 로그인할 수 있도록 설정했다면 iSCSI Initiator에서 이들 사용자에 대한 username, password를 설정한다. 이때 설정하는 내용은 아래와 같다.
node.session.auth.username
node.session.auth.password
iSCSI Target에서 CHAP 인증으로 특정 사용자만이 Discovery를 할 수 있도록 설정했다면 iSCSI Initiator에서 이들 사용자에 대한 username, password를 설정한다. 이때 설정하는 내용은 아래와 같다.
discovery.sendtargets.auth.username
discovery.sendtargets.auth.password
기타 항목들에 대해서는 따로 설명이 요구된다.
필요한 내용을 수정했다면 iscsi 및 iscsid 서비스를 시작하거나 재시작한다.
STEP 3) iscsi 및 iscsid 서비스 확인
rpm을 통해서 정상적으로 iSCSI Initiator 패키지를 설치하게 되면 iscsi 및 iscsid 서비스가 등록된다.
따라서 아래의 명령어로 각각의 상태를 확인할 수 있다.
iSCSI Target에 로그인한 상태 정보 확인: service iscsi status
[root@hactus48 ~]# service iscsi status
No active sessions
iSCSI 데몬의 상태 정보 확인: service iscsid status
[root@hactus48 ~]# service iscsid status
iscsid (pid 1263) is running...
iSCSI Target 등록
STEP 1) Send Targets을 이용한 iSCSI Target Discovery
Send Targets 방법을 이용하여 iSCSI Target을 찾는다. 그러면 아래와 같이 iSCSI Target의 iqn을 포함한 LUN을 알 수 있다. 여기에서 IP Address는 iSCSI Target의 IP 주소이다. 그리고 sendtargets 대신 st로 사용해도 된다.-
iscsiadm --mode discovery -t st --portal phenton-priv
iscsiadm -m discovery --type sendtargets --portal 10.1.1.12
[root@hactus48 ~]# iscsiadm --mode discovery -t st --portal phenton-priv
참고로 여기에서 3260은 iSCSI 서비스가 사용하는 기본 포트번호이다.
이렇게 Discovery하게 되면 로그인을 위한 기본 내용들이 아래의 파일에 위치하게 된다. 이는 앞에서 언급한 /etc/iscsi/iscsid.conf의 내용이며, 이 정보를 이용하여 실제로 로그인을 하게 된다.
/var/lib/iscsi/send_targets/phenton-priv,3260/st_config
# BEGIN RECORD 6.2.0-873.10.el6
discovery.startup = manual
discovery.type = sendtargets
discovery.sendtargets.address = phenton-priv
discovery.sendtargets.port = 3260
discovery.sendtargets.auth.authmethod = None
discovery.sendtargets.timeo.login_timeout = 15
discovery.sendtargets.use_discoveryd = No
discovery.sendtargets.discoveryd_poll_inval = 30
discovery.sendtargets.reopen_max = 5
discovery.sendtargets.timeo.auth_timeout = 45
discovery.sendtargets.timeo.active_timeout = 30
discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 32768
# END RECORD
참고로 기존에 Send Targets으로 Discovery한 내용들은 /var/lib/iscsi/send_targets 디렉토리에 존재한다. 이들 중에서 불필요한 것들이 있다면 삭제해도 된다.
STEP 2) 찾은 iSCSI Target의 LUN으로 로그인
STEP 1에서 찾은 iSCSI Target의 LUN으로 로그인을 한다. 이는 iSCSI Target의 자원을 사용하기 위한 접속이라고 볼 수 있다.
iscsiadm --m node -T iqn.2014-03.com.serends.phenton:racdb.crs9 -portal phenton-priv --login --portal phenton-priv
iscsiadm --m node -T iqn.2014-03.com.serends.phenton:racdb.data9 -portal phenton-priv --login --portal phenton-priv
iscsiadm --m node -T iqn.2014-03.com.serends.phenton:racdb.fra9 -portal phenton-priv --login --portal phenton-priv
이는 RAC Node 모두에서 수행되어져야 하며, 특별한 에러 없이 로그인이 될 것이다.
STEP 3) 로그인 이후 내용 확인
STEP 2에서 정상적으로 로그인이 되었다면 아래의 내용들을 확인해본다. 즉, iSCSI Target의 자원을 Local에서 사용할 수 있도록 iSCSI Device가 만들어져 있다면 정상적으로 로그인이 된 것이다.
fdisk -l
...
...
Disk /dev/sdb: 10.5 GB, 10485760000 bytes
64 heads, 32 sectors/track, 10000 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdc: 21.0 GB, 20971520000 bytes
64 heads, 32 sectors/track, 20000 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdd: 21.0 GB, 20971520000 bytes
64 heads, 32 sectors/track, 20000 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
또한 /dev/disk/by-path에도 Dynamic path가 생성되어 있을 것이다.
ls -al /dev/disk/by-path
drwxr-xr-x 2 root root 180 Mar 23 15:39 .
drwxr-xr-x 5 root root 100 Mar 23 15:11 ..
lrwxrwxrwx 1 root root 9 Mar 23 15:39 ip-192.168.5.51:3260-iscsi-iqn.2014-03.com.serends.phenton:racdb.crs9-lun-1 -> ../../sdb
lrwxrwxrwx 1 root root 9 Mar 23 15:39 ip-192.168.5.51:3260-iscsi-iqn.2014-03.com.serends.phenton:racdb.data9-lun-1 -> ../../sdc
lrwxrwxrwx 1 root root 9 Mar 23 15:39 ip-192.168.5.51:3260-iscsi-iqn.2014-03.com.serends.phenton:racdb.fra9-lun-1 -> ../../sdd
lrwxrwxrwx 1 root root 9 Mar 23 15:39 pci-0000:00:1f.2-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 Mar 23 15:11 pci-0000:00:1f.2-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 23 15:11 pci-0000:00:1f.2-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 9 Mar 23 15:11 pci-0000:00:1f.2-scsi-1:0:0:0 -> ../../sr0
참고로 /sda는 Local Disk이며, /sdb가 iSCSI Target에 로그인하여 생성된 iSCSI Device이다. 그리고 /sdb1은 해당 Device가 이미 Partition이 만들어져 있는 상태를 의미한다.
또한 로그인 상태는 Session으로 나타나는데 Session의 상태를 확인해보자.
iscsiadm --mode session --op show
[root@hactus61 by-path]# iscsiadm --mode session --op show
여기까지 문제가 없다면 data, fra에 대해서도 STEP 1과 STEP 2를 반복해서 수행하고 각각 확인해본다. 내용은 크게 다르지 않기에 여기에서는 추가로 언급하지 않는다.
STEP 4) iSCSI Device에 대한 Format (ext4)
로그인된 이후 해당 Device를 사용하기 위해서 ext4 filesystem으로 포맷을 한다. 만약 Partition이 만들어져 있지 않다면 Linux Native Partition으로 을 먼저 파티션화한 이후 포맷한다.
mkfs.ext4 /dev/sdb1
[root@hactus48 ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
983040 inodes, 3932156 blocks
196607 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4026531840
120 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 33 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
CRS용 15G의 파티션이이 포맷되었다.
물론 data, fra에 대해서도 동일하게 포맷 작업을 수행한다.
STEP 5) UUID 확인
이렇게 생성되어 포맷이 되면 해당 iSCSI Device는 고유의 UUID값을 가지게 된다. UUID값은 LVM2를 관리하는 blk 툴을 이용하여 확인할 수 있다. 또는 by-uuid 디렉토리를 확인해도 된다.
blkid /dev/PARTITIONED_DEVICE
[root@hactus48 by-uuid]# blkid /dev/sdb1
/dev/sdb1: UUID="192ee3cc-7041-4615-a195-1993364e5900" TYPE="ext4"
[root@hactus48 by-uuid]# blkid /dev/sdc1
/dev/sdc1: UUID="a816685f-5d69-4eb7-8b9f-920c76801f40" TYPE="ext4"
[root@hactus48 by-uuid]# blkid /dev/sdd1
/dev/sdd1: UUID="64dbdeb7-bd55-4d51-8dbe-31fa30fd0b7b" TYPE="ext4"
또는 아래의 by-uuid 디렉토리 내용을 통해서도 알 수 있다.
ls -al /dev/disk/by-uuid
[root@hactus48 ~]# ls -al /dev/disk/by-uuid
total 0
drwxr-xr-x 2 root root 200 Mar 4 15:28 .
drwxr-xr-x 5 root root 100 Mar 4 12:06 ..
lrwxrwxrwx 1 root root 10 Mar 4 15:20 192ee3cc-7041-4615-a195-1993364e5900 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Mar 4 15:28 64dbdeb7-bd55-4d51-8dbe-31fa30fd0b7b -> ../../sdd1
lrwxrwxrwx 1 root root 10 Mar 4 12:06 7c3431a6-f963-4dc2-8527-6310aaac70f1 -> ../../dm-0
lrwxrwxrwx 1 root root 10 Mar 4 12:06 9d0b95d8-37c3-4070-bf54-4dcaf43c9442 -> ../../dm-1
lrwxrwxrwx 1 root root 10 Mar 4 15:26 a816685f-5d69-4eb7-8b9f-920c76801f40 -> ../../sdc1
lrwxrwxrwx 1 root root 10 Mar 4 12:06 c3b583ef-c04b-4c45-aa44-eaff3aae0254 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 4 12:06 c7c28eef-db64-40a6-9cc5-a1dbb8320fb2 -> ../../dm-3
lrwxrwxrwx 1 root root 10 Mar 4 12:06 c8d379f5-0679-40e5-81f8-7d2dbd68550d -> ../../dm-2
STEP 6) UUID를 이용한 마운트
by-path에 등록된 Multipath는 iSCSI 서비스가 재시작 될 때마다 Multipath의 경로가 변경이 된다. 이를 피하기 위한 좋은 방안이 UUID를 사용하는 것이다. 해서 UUID를 가지고 /etc/fstab에 등록해서 시스템 재기동시 기본적으로 마운트가 되도록 해 보자.
/etc/fstab
UUID=192ee3cc-7041-4615-a195-1993364e5900 /crs ext4 _netdev,rw 0 0
UUID=a816685f-5d69-4eb7-8b9f-920c76801f40 /data ext4 _netdev,rw 0 0
UUID=64dbdeb7-bd55-4d51-8dbe-31fa30fd0b7b /fra ext4 _netdev,rw 0 0
여기에서 _netdev는 netfs 서비스가 관리하며 그 의미는 Network이 먼저 로드되고 나서 해당 Device를 마운트하게 설정하겠다는 것이다. 따라서 netfs 서비스가 Enable되어져 있어야 한다.
기타 참조할 내용들
iscsiadm --mode node -T iqn.2000-01.com.synology:mfs.crs --portal 192.168.2.31:3260 -u
[root@hactus49 dev]# iscsiadm --mode node -T iqn.2000-01.com.synology:mfs.crs --portal 192.168.2.31:3260 -u
Logging out of session [sid: 14, target: iqn.2000-01.com.synology:mfs.crs, portal: 192.168.2.31,3260]
Logout of [sid: 14, target: iqn.2000-01.com.synology:mfs.crs, portal: 192.168.2.31,3260] successful.
delete
iscsiadm --mode node -o delete -T iqn.2000-01.com.synology:mfs.crs --portal 192.168.2.31:3260
[root@hactus49 dev]# iscsiadm --mode node -o delete -T iqn.2000-01.com.synology:mfs.crs --portal 192.168.2.31:3260
logout 할 때와는 다르게 별다른 메시지가 없다.
/var/lib/iscsi/send_targets 디렉토리의 내용이 지워진것 확인 가능