[Linux] ISCSI 서버 설정 및 사용
RHEL 환경에서 iSCSI를 활용해 네트워크 디스크를 구성하고 클라이언트에서 연결하는 방법을 정리합니다.
SCSI란
SCSI(Small Computer System Interface)는 컴퓨터와 주변 장치를 연결하는 프로토콜입니다. 주로 하드디스크, CD-ROM, 테이프 드라이브 같은 외부 저장 장치들은 SCSI 드라이버를 통하여 액세스 됩니다. SCSI는 iSCSI, FCoE(Fiber Channel over Ethernet), 가상 시스템 드라이버(virtio), SAS, NVMe 등도 지원합니다. 즉 시스템에서 디스크를 사용하기 위해 디스크를 연결해 주는 역할을 SCSI가 담당한다고 볼 수 있습니다.
ISCSI란
ISCSI(Internet Small Computer System Interface)는 SCSI를 TCP/IP 네트워크를 통해 전송하기 위한 표준 프로토콜입니다. ISCSI를 이용하면 블록 장치 또는 파일 등을 네트워크를 통해 전달할 수 있으며 이용자들은 디스크가 마치 물리적으로 연결된 로컬 스토리지처럼 연결해 사용할 수 있게 됩니다. 네트워크를 통해 전송되므로 성능은 네트워크 속도에 의해 좌우됩니다.
즉 SCSI는 대부분의 물리적 연결을 지원해 주는 프로토콜이며, ISCSI는 네트워크를 통한 스토리지 연결을 지원 해주는 프로토콜입니다. ISCSI를 이용하게 되면 지역의 구분 없이 네트워크 통신만 되면 스토리지를 사용할 수 있는 장점이 있습니다.
ISCSI 구성 요소
iSCSI 환경을 구성하기 위해서는 다음과 같은 주요 개념을 이해해야 합니다:
-
Initiator: 클라이언트 역할을 하는 시스템으로, 고유한 식별자인 IQN을 사용하여 인증합니다.
-
Target: iSCSI 서버 측에서 제공하는 저장 리소스로, LUN(Logical Unit Number)을 통해 디스크를 제공합니다.
-
IQN (iSCSI Qualified Name): Initiator와 Target을 식별하는 고유한 이름으로, 일반적으로
iqn.yyyy-mm.naming-authority:unique
형식을 사용합니다.
예:iqn.2024-01.com.test.server
-
LUN: Target에서 클라이언트에게 제공하는 논리적 블록 장치 단위입니다.
-
ACL (Access Control List): 특정 Initiator IQN에 대해 LUN 접근 권한을 제어하는 목록입니다.
-
Portal: Target의 IP 주소와 포트 정보를 의미하며, 클라이언트가 연결 시 사용하는 엔드포인트입니다.
-
TPG (Target Portal Group): Target에 대한 전체 설정을 포함하는 구성 단위로, 포털, LUN, ACL 정보 등을 통합 관리합니다.
테스트 환경
RHEL 8
RHEL 9
목표
iSCSI 구성을 위한 실습은 서버(Target)와 클라이언트(Initiator)로 나누어 진행됩니다.
실습 목적은 서버에서 2GB 크기의 디스크 파일을 생성하여 iSCSI를 통해 제공하고, 클라이언트에서 이를 원격 디스크처럼 연결해 사용하는 것입니다.
ISCSI 서버 구성
패키지 설치
iSCSI 관련 구성에 필요한 도구를 설치합니다
# yum install iscsi-initiator-utils targetcli
iSCSI 서비스 시작 및 활성화
시스템 부팅 시에도 자동으로 실행되도록 iscsid
데몬을 활성화합니다
아래 enable 명령에 --now를 이용하면 데몬을 시작해 주는 기능이 추가됩니다.
# systemctl enable iscsid --now Created symlink /etc/systemd/system/multi-user.target.wants/iscsid.service → /usr/lib/systemd/system/iscsid.service.
targetcli를 이용한 iSCSI 디스크 설정
iSCSI 구성을 위한 CLI 도구인 targetcli
를 실행하면 다음과 같은 쉘 환경에 진입합니다
# targetcli targetcli shell version 2.1.53 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'. /> ls o- / ....................................................................................................... [...] o- backstores ............................................................................................ [...] | o- block ................................................................................ [Storage Objects: 0] | o- fileio ............................................................................... [Storage Objects: 0] | o- pscsi ................................................................................ [Storage Objects: 0] | o- ramdisk .............................................................................. [Storage Objects: 0] o- iscsi .......................................................................................... [Targets: 0] o- loopback ....................................................................................... [Targets: 0]
ls
명령으로 확인할 수 있는 주요 구성은 다음과 같습니다:
-
backstores
: 내보낼 실제 스토리지를 정의 -
iscsi
: 네트워크 접속 설정, IQN, LUN, ACL 등 구성 -
loopback
: 로컬 테스트용
iSCSI에서 클라이언트에 제공할 디스크는 backstores
에서 먼저 정의되어야 하며, 이후 iscsi
항목에서 연결 설정을 진행합니다.
스토리지 생성 (fileio 방식)
iscsi를 통해 전달할 스토리지를 생성한다. 스토리지는 block 방식과 file방식을 많이 사용하는데 file방식은 일반 파일을 디스크처럼 내보내는 방식을 말하고 block 방식은 실제 디스크를 내보내는 방식을 말한다.
File 기반의 2GB 가상 디스크를 생성합니다. 해당 파일은 명령 실행 시 자동으로 생성됩니다
/> backstores/fileio create disk1 /root/disk1 size=2G /root/disk1 exists, using its size (2147483648 bytes) instead Created fileio disk1 with size 2147483648 /> ls o- / ....................................................................................................... [...] o- backstores ............................................................................................ [...] | o- block ................................................................................ [Storage Objects: 0] | o- fileio ............................................................................... [Storage Objects: 1] | | o- disk1 ..................................................... [/root/disk1 (2.0GiB) write-back deactivated] | | o- alua ................................................................................. [ALUA Groups: 1] | | o- default_tg_pt_gp ..................................................... [ALUA state: Active/optimized] | o- pscsi ................................................................................ [Storage Objects: 0] | o- ramdisk .............................................................................. [Storage Objects: 0] o- iscsi .......................................................................................... [Targets: 0] o- loopback ....................................................................................... [Targets: 0] />
IQN 생성 및 Target 설정
이제 클라이언트가 연결할 iSCSI Target을 생성합니다. 이를 위해 IQN(iSCSI Qualified Name)을 지정합니다:
iscsi/ create iqn.2024-01.com.test.server
명령어 전체 실행 결과:
/> iscsi/ create iqn.2024-01.com.test.server ... /> ls o- / ............................................................................................. [...] o- backstores .................................................................................. [...] | o- block ..................................................................... [Storage Objects: 0] | o- fileio ..................................................................... [Storage Objects: 1] | | o- disk1 ..................................................... [/root/disk1 (2.0GiB) write-back deactivated] | | o- alua ....................................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ..................................................... [ALUA state: Active/optimized] | o- pscsi ...................................................................... [Storage Objects: 0] | o- ramdisk .............................................................................. [Storage Objects: 0] o- iscsi ................................................................................ [Targets: 1] | o- iqn.2024-01.com.test.server ........................................................... [TPGs: 1] | o- tpg1 ................................................................... [no-gen-acls, no-auth] | o- acls .............................................................................. [ACLs: 0] | o- luns .............................................................................. [LUNs: 0] | o- portals ........................................................................ [Portals: 1] | o- 0.0.0.0:3260 ......................................................................... [OK] o- loopback ............................................................................. [Targets: 0] />
IQN 형식은 다음과 같은 구조를 따릅니다
-
iqn
: iSCSI 식별 접두사 -
yyyy-mm
: 생성 연도 및 월 -
naming-authority
: 일반적으로 조직 이름 -
unique name
: 고유한 서버 식별자
IQN 생성 후 기본적으로 하나의 TPG(Target Portal Group)가 자동으로 생성됩니다. TPG 내부에는 다음과 같은 항목이 포함됩니다
-
acls: Initiator 접근 제어
-
luns: 제공할 디스크 설정
-
portals: 네트워크 접속 정보
해당 내용들을 차례로 설정해 보도록 하겠습니다.
TPG 설정: ACL, LUN, Portal 구성
1. ACL 설정
클라이언트의 IQN을 기반으로 접근을 허용할 Initiator를 등록합니다. 이 예제에서는 두 개의 클라이언트를 등록합니다
/> iscsi/iqn.2024-01.com.test.server/tpg1/acls create iqn.2024-01.com.test.client1 Created Node ACL for iqn.2024-01.com.test.client1 /> iscsi/iqn.2024-01.com.test.server/tpg1/acls create iqn.2024-01.com.test.client2 Created Node ACL for iqn.2024-01.com.test.client2
이 설정을 통해 지정된 IQN을 가진 Initiator만 해당 Target에 접근할 수 있습니다.
2. LUN 설정
위에서 생성한 스토리지인 disk1을 LUN으로 지정합니다.
/> iscsi/iqn.2024-01.com.test.server/tpg1/luns create /backstores/fileio/disk1 Created LUN 0. Created LUN 0->0 mapping in node ACL iqn.2024-01.com.test.client2 Created LUN 0->0 mapping in node ACL iqn.2024-01.com.test.client1
3. Portal 설정
기본 설정은 0.0.0.0:3260
으로 모든 인터페이스에 대해 개방되어 있습니다.
/> cd iscsi/iqn.2024-01.com.test.server/tpg1/portals/ /iscsi/iqn.20.../tpg1/portals> ls o- portals ................................................................................ [Portals: 1] o- 0.0.0.0:3260 ................................................................................. [OK]
특정 IP로만 허용하려면 기본 포털을 제거하고 새로 설정합니다.
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260 Deleted network portal 0.0.0.0:3260 /iscsi/iqn.20.../tpg1/portals> create 192.168.155.88 3260 Using default IP port 3260 Created network portal 192.168.155.88:3260. /iscsi/iqn.20.../tpg1/portals> ls o- portals ................................................................................ [Portals: 1] o- 192.168.155.88:3260 .......................................................................... [OK]
전체 설정 확인 및 저장
모든 구성이 완료되었으면 ls
명령어를 통해 전체 iSCSI 구성을 확인할 수 있습니다
/iscsi/iqn.20.../tpg1/portals> cd / /> ls o- / ............................................................................................. [...] o- backstores .................................................................................. [...] | o- block ...................................................................... [Storage Objects: 0] | o- fileio ..................................................................... [Storage Objects: 1] | | o- disk1 ....................................................... [/root/disk1 (2.0GiB) write-back activated] | | o- alua ....................................................................... [ALUA Groups: 1] | | o- default_tg_pt_gp ..................................................... [ALUA state: Active/optimized] | o- pscsi ...................................................................... [Storage Objects: 0] | o- ramdisk .................................................................... [Storage Objects: 0] o- iscsi ................................................................................ [Targets: 1] | o- iqn.2024-01.com.test.server ........................................................... [TPGs: 1] | o- tpg1 ................................................................... [no-gen-acls, no-auth] | o- acls .............................................................................. [ACLs: 2] | | o- iqn.2024-01.com.test.client1 ............................................. [Mapped LUNs: 1] | | | o- mapped_lun0 .............................................................. [lun0 fileio/disk1 (rw)] | | o- iqn.2024-01.com.test.client2 ....................................................... [Mapped LUNs: 1] | | o- mapped_lun0 .............................................................. [lun0 fileio/disk1 (rw)] | o- luns .............................................................................. [LUNs: 1] | | o- lun0 ................................................ [fileio/disk1 (/root/disk1) (default_tg_pt_gp)] | o- portals ........................................................................ [Portals: 1] | o- 192.168.155.88:3260 .................................................................. [OK] o- loopback ............................................................................. [Targets: 0] />
출력 결과에는 다음 항목들이 포함되어야 합니다:
-
backstores/fileio/disk1
: 생성한 2GB 가상 디스크 -
iscsi/iqn.2024-01.com.test.server
: Target IQN -
tpg1/acls
: 등록된 Initiator IQN 목록 -
tpg1/luns
: 연결된 디스크 정보 -
tpg1/portals
: 접속 가능한 IP 및 포트
설정 저장 및 종료
설정을 저장하고 종료합니다
saveconfig 명령을 이용하면 현재 설정이 저장됩니다.
/> saveconfig Last 10 configs saved in /etc/target/backup/. Configuration saved to /etc/target/saveconfig.json
/> exit Global pref auto_save_on_exit=true Configuration saved to /etc/target/saveconfig.json
exit
시에도 자동으로 저장되며, 설정 파일은 /etc/target/saveconfig.json
에 기록됩니다. 이전 설정은 /etc/target/backup/
디렉터리에 자동 백업됩니다.
[root@rhel88 ~]# ls /etc/target/backup/ saveconfig-20240131-14:27:05-json.gz saveconfig-20240131-14:36:53-json.gz saveconfig-20240131-15:31:26-json.gz saveconfig-20240131-14:35:09-json.gz saveconfig-20240131-15:29:17-json.gz
방화벽 설정
방화벽을 사용 중이라면 iSCSI Target 포트를 오픈해야 합니다
[root@rhel88 ~]# firewall-cmd --add-service=iscsi-target success [root@rhel88 ~]# firewall-cmd --add-service=iscsi-target --permanent
클라이언트 설정
1. 패키지 설치
iSCSI Initiator 유틸리티를 설치합니다:
# yum install iscsi-initiator-utils
2. Initiator IQN 설정
클라이언트는 서버에서 ACL로 등록한 IQN을 사용해야 합니다. 아래 파일에서 Initiator 이름을 설정합니다
[root@rhel92 ~]# cat /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2024-01.com.test.client1
3. Target 검색 및 연결
iSCSI Target 서버의 IP를 이용하여 Target을 검색합니다
# iscsiadm --mode discoverydb --type sendtargets --portal 192.168.155.88 --discover 192.168.155.88:3260,1 iqn.2024-01.com.test.server
타겟을 찾으면 명령어 출력 결과에 타겟 IQN이 출력됩니다. 해당 정보를 이용해서 로그인하면 타겟에서 내보낸 디스크를 사용할 수 있습니다.
ISCSI는 사용하기 위해서 로그인 절차를 거칩니다. 한번 로그인 되면 재부팅 후에도 유지됩니다.
[root@rhel92 ~]# iscsiadm -m node -T iqn.2024-01.com.test.server --login Logging in to [iface: default, target: iqn.2024-01.com.test.server, portal: 192.168.155.88,3260] Login to [iface: default, target: iqn.2024-01.com.test.server, portal: 192.168.155.88,3260] successful
로그인에 성공하면 Target이 연결되고 디스크 장치가 생성됩니다. 만약 ACL이 일치하지 않으면 인증 실패 메시지가 출력됩니다:
[root@rhel92 /]# iscsiadm -m node -T iqn.2024-01.com.test.server --login Logging in to [iface: default, target: iqn.2024-01.com.test.server, portal: 192.168.155.88,3260] iscsiadm: Could not login to [iface: default, target: iqn.2024-01.com.test.server, portal: 192.168.155.88,3260]. iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure) iscsiadm: Could not log into all portals
디스크 확인 및 마무리
iSCSI 연결이 성공하면 시스템에 새로운 디스크 장치가 생성됩니다. 다음 명령어로 디스크를 확인합니다. -s 옵션을 이용하면 디스크 사이즈도 확인이 가능합니다.
[root@rhel92 ~]# lsscsi -s [1:0:0:0] cd/dvd QEMU QEMU DVD-ROM 2.5+ /dev/sr0 9.59GB [7:0:0:0] disk LIO-ORG disk1 4.0 /dev/sda 2.14GB
vendor 이름 부분이 LIO-ORG로 표기되는 2GB 짜리 디스크가 보입니다. LIO는 리눅스 커널에서 제공하는 ISCSI를 이용하여 제공한 Linux-IO를 뜻합니다.
이 디스크는 일반 블록 디바이스처럼 파티션 생성 및 포맷 후 사용할 수 있습니다.
마무리
이번 실습에서는 RHEL 환경에서 iSCSI를 활용해 서버에서 디스크를 생성하고, 클라이언트에서 이를 원격으로 연결하는 전체 과정을 다뤘습니다.
iSCSI는 NFS와 달리 동시에 여러 노드에서 쓰기 작업을 할 수 없으며, 파일 시스템 손상을 방지하기 위해 한 번에 하나의 클라이언트에서만 마운트해 사용하는 것이 안전합니다.
댓글
댓글 쓰기