ONTAP iSCSI LUN을 만들어 Windows 서버에 붙여봤습니다. NFS·CIFS와 달리 LUN은 만들어놓기만 하면 아무 데서도 보이지 않습니다. 파일 공유는 export policy나 share ACL로 “누구에게 열지”를 정하는데, 블록 스토리지는 “누구에게 보일지”부터 명시해야 합니다.
이 글은 그 구조를 따라갑니다 — SVM·LIF·볼륨·LUN을 만들고, igroup으로 호스트를 등록하고, 매핑한 뒤에야 Windows 디스크 관리에 나타나는 과정입니다.

online 인데도 아무 호스트에 안 보인다.이 글의 실습 환경
이 글은 ONTAP Simulator 9.17.1 기반 가상 랩에서 직접 명령을 실행하고 그 출력을 근거로 작성했습니다. 실제 장비(FAS/AFF)와는 지원 기능·성능·하드웨어 동작에서 차이가 있으며, ONTAP 버전에 따라 명령과 출력이 달라집니다.
| 구성 | 값 |
|---|---|
| 스토리지 | ONTAP Simulator 9.17.1, 2노드 클러스터 |
| SVM | ISCSI_SVM (iSCSI 전용) |
| 데이터 LIF | 192.168.126.22, 192.168.126.23 — 노드당 하나 |
| LUN | /vol/iscsi_vol1/lun1, 1GB, ostype windows_2008 |
| 호스트 | Windows Server 2025 |
1. iSCSI 전용 SVM을 따로 만든다
기존 NFS·CIFS SVM에 iSCSI를 얹을 수도 있지만, 프로토콜별로 SVM을 나누면 권한과 장애 범위가 분리됩니다. 여기서는 새로 만들었습니다.
cluster1::> vserver create -vserver ISCSI_SVM -aggregate N1_data -rootvolume ISCSI_SVM_root -rootvolume-security-style unix
[Job 77] Job succeeded:
Vserver creation completed.
SVM은 기본적으로 여러 프로토콜을 허용한 채로 생성됩니다. 쓰지 않을 프로토콜은 빼두는 편이 안전합니다.
cluster1::> vserver add-protocols -vserver ISCSI_SVM -protocols iscsi
cluster1::> vserver remove-protocols -vserver ISCSI_SVM -protocols nfs,cifs,fcp,nvme
cluster1::> vserver iscsi create -vserver ISCSI_SVM
vserver iscsi create 가 iSCSI 타겟을 만드는 명령입니다. 프로토콜을 허용한 것만으로는 타겟이 생기지 않습니다.
cluster1::> vserver iscsi show -vserver ISCSI_SVM
Vserver: ISCSI_SVM
Target Name: iqn.1992-08.com.netapp:sn.f13b4654a25b11f1b835000c2912a6ce:vs.5
Target Alias: ISCSI_SVM
Administrative Status: up
Target Name(IQN)이 발급됐습니다. 이 문자열이 스토리지 쪽 신원이고, 나중에 호스트에도 자기 IQN이 따로 있습니다. 둘을 헷갈리면 igroup 등록에서 막힙니다.
2. 데이터 LIF는 노드마다 하나씩
NFS는 LIF 하나로도 쓰지만, iSCSI는 다중 경로(MPIO)가 전제입니다. 노드마다 LIF를 두어 경로를 두 개 만듭니다.
cluster1::> network interface create -vserver ISCSI_SVM -lif iscsi_lif1 -service-policy default-data-iscsi -home-node cluster1-01 -home-port e0c -address 192.168.126.22 -netmask 255.255.255.0
cluster1::> network interface create -vserver ISCSI_SVM -lif iscsi_lif2 -service-policy default-data-iscsi -home-node cluster1-02 -home-port e0c -address 192.168.126.23 -netmask 255.255.255.0
왜 iscsi 는 네트워크 인터페이스 2개로 사용하여야하느냐
nas 프로토콜과 다르게 iscsi san 은 network failover 가 지원하지않는다
하여 인터페이스를 2개를 생성하여 호스트에 정보를 주고 호스트 iscsi 이니셰이터에서는
필히 스토리지의 인터페이스2개 ip를 등록하여야 디스크 다중인식이되며 네트워크나 하드웨어 장애발생하더라도 이중화로 중단없이 사용가능하다
해당 부분이 많은 엔지니어가 실수를 하는 poin.
service-policy가 바뀌었다
예전 자료를 보고 default-data-blocks 를 쓰면 이런 안내가 나옵니다.
Info: Network interface service policy "default-data-blocks" has been
deprecated and replaced by service policy "default-data-iscsi".
Consider using service policy "default-data-iscsi" instead.
에러가 아니라 안내라서 그냥 넘어가기 쉽습니다. LIF는 생성되고 동작도 합니다. 다만 지금 버전의 권장값은 default-data-iscsi 이므로 바꿔두는 편이 낫습니다.
cluster1::> network interface modify -vserver ISCSI_SVM -lif iscsi_lif1 -service-policy default-data-iscsi
cluster1::> network interface show -vserver ISCSI_SVM
vserver lif service-policy address home-node
--------- ---------- ------------------ -------------- -----------
ISCSI_SVM iscsi_lif1 default-data-iscsi 192.168.126.22 cluster1-01
ISCSI_SVM iscsi_lif2 default-data-iscsi 192.168.126.23 cluster1-02
3. 볼륨과 LUN
LUN은 볼륨 안에 놓입니다. 볼륨은 LUN보다 넉넉해야 합니다 — 스냅샷과 메타데이터가 같은 볼륨을 씁니다.
cluster1::> volume create -vserver ISCSI_SVM -volume iscsi_vol1 -aggregate N1_data -size 2GB -space-guarantee none -snapshot-policy none
[Job 78] Job succeeded: Successful
ostype 은 호스트 OS에 맞춰야 합니다. 정렬(alignment)에 영향을 주기 때문에 나중에 성능 문제로 돌아옵니다.
cluster1::> lun create -vserver ISCSI_SVM -path /vol/iscsi_vol1/lun1 -size 1GB -ostype windows_2008
Created a LUN of size 1g (1073741824)
여기서 ostype을 넣을때 필히 중요시여기는게 꼭 연결할 서버운영담당자에게 타입을 물어보고 설정하여야
서버에서 디스크 마운트가된다
예시)windows,windows_2008 항목이있는데
windows = 2008 이하
windows_2008 = 2008이상 os
솔라리스또한 마찬가지.
⭐ 여기서 확인해야 할 것 — unmapped
cluster1::> lun show -vserver ISCSI_SVM
Vserver Path State Mapped Type Size
--------- ------------------------ ------- ---------- ------------- ------
ISCSI_SVM /vol/iscsi_vol1/lun1 online unmapped windows_2008 1GB
online인데unmapped입니다. LUN은 만들어졌고 정상이지만 어느 호스트에도 보이지 않습니다. 이니시에이터에서 연결해도 디스크가 안 나옵니다. NFS라면 여기까지 만들면 마운트가 되는데, 블록은 한 단계가 더 남았습니다.
4. igroup — 누구에게 보일지 정한다
igroup(initiator group)은 이 LUN을 볼 수 있는 호스트 목록입니다. 파일 프로토콜의 export policy나 share ACL에 해당하는 자리입니다.
cluster1::> igroup create -vserver ISCSI_SVM -igroup win_hosts -protocol iscsi -ostype windows
cluster1::> igroup show -vserver ISCSI_SVM
Vserver Igroup Protocol OS Type Initiators
--------- ------------ -------- -------- ------------
ISCSI_SVM win_hosts iscsi windows -
Initiators 가 비어 있습니다. 여기에 호스트의 IQN을 넣어야 하는데, 그 값은 Windows 쪽에서 확인해야 합니다.
Windows 쪽 IQN은 서비스를 켜야 나온다
Windows Server에서 이니시에이터 IQN을 확인합니다. Microsoft iSCSI Initiator 서비스(msiscsi)는 기본이 수동이라 꺼져 있습니다. 먼저 켜야 합니다.
PS> Set-Service msiscsi -StartupType Automatic
PS> Start-Service msiscsi
PS> Get-InitiatorPort | Format-List NodeAddress
NodeAddress : iqn.1991-05.com.microsoft:lab-dc01.lab.example.com

Get-InitiatorPort 가 아무것도 반환하지 않는다. IQN이 안 나오면 대개 이것부터 확인해야 한다.IQN은 iqn.1991-05.com.microsoft: 로 시작하고 뒤에 호스트의 FQDN이 붙습니다. 컴퓨터 이름을 바꾸거나 도메인에 조인하면 IQN도 같이 바뀝니다. 도메인 조인 전에 igroup에 등록해두면, 조인 후 호스트가 LUN을 못 보게 됩니다.
igroup에 등록해도 아직 “not logged in”
cluster1::> igroup add -vserver ISCSI_SVM -igroup win_hosts -initiator iqn.1991-05.com.microsoft:lab-dc01.lab.example.com
cluster1::> igroup show -vserver ISCSI_SVM -igroup win_hosts
Vserver Name: ISCSI_SVM
Igroup Name: win_hosts
Protocol: iscsi
OS Type: windows
ALUA: true
Initiators: iqn.1991-05.com.microsoft:lab-dc01.lab.example.com (not logged in)
(not logged in) 은 정상입니다. igroup 등록은 “이 IQN을 허용하겠다”는 선언일 뿐이고, 실제 세션은 호스트가 접속해야 생깁니다. 이 표시를 오타나 설정 실패로 오해해서 IQN을 다시 지웠다 넣는 경우가 많습니다.
5. LUN 매핑 — 여기서 unmapped 가 풀린다
cluster1::> lun map -vserver ISCSI_SVM -path /vol/iscsi_vol1/lun1 -igroup win_hosts
cluster1::> lun mapping show -vserver ISCSI_SVM
Vserver Path Igroup LUN ID Protocol
---------- -------------------------- --------- ------ --------
ISCSI_SVM /vol/iscsi_vol1/lun1 win_hosts 0 iscsi
lun show 를 다시 보면 Mapped: mapped 로 바뀌어 있습니다. LUN ID 0 이 자동으로 붙었는데, 이 번호는 igroup 안에서만 유일하면 됩니다. 여러 LUN을 같은 igroup에 매핑하면 0, 1, 2… 순으로 올라갑니다.
그리고 특정 id 넘버로 관리하고싶으면 -lun-id number 를 옵션값을 주어 적용을시키된다.
6. 호스트에서 타겟에 붙는다
포털(타겟 IP)을 등록하면 타겟이 자동으로 검색됩니다.
PS> New-IscsiTargetPortal -TargetPortalAddress 192.168.126.22
PS> Get-IscsiTarget | Format-List NodeAddress,IsConnected
NodeAddress : iqn.1992-08.com.netapp:sn.f13b4654a25b11f1b835000c2912a6ce:vs.5
IsConnected : False
검색(discovery)과 연결(login)은 다릅니다. 타겟 이름은 보이는데 IsConnected : False 인 상태 — GUI에서 “Inactive”로 나오는 그 상태입니다. 연결해야 세션이 생깁니다.
PS> Connect-IscsiTarget -NodeAddress iqn.1992-08.com.netapp:sn.f13b4654a25b11f1b835000c2912a6ce:vs.5 -IsPersistent $true
TargetNodeAddress : iqn.1992-08.com.netapp:sn.f13b4654a25b11f1b835000c2912a6ce:vs.5
IsConnected : True
IsPersistent : True
-IsPersistent $true 를 빠뜨리면 재부팅 후 디스크가 사라집니다. 서비스로 붙여둔 볼륨이 부팅 때마다 없어지는 사고가 대부분 이것입니다.

iscsicpl 로 GUI에서도 같은 결과를 확인할 수 있다. Status가 Connected 여야 디스크가 올라온다.⭐ 붙은 디스크는 Offline · RAW 상태다
PS> Get-Disk | Format-Table Number,FriendlyName,Size,PartitionStyle,OperationalStatus -Auto
Number FriendlyName Size PartitionStyle OperationalStatus
------ ------------ ---- -------------- -----------------
1 NETAPP LUN C-Mode 1073741824 RAW Offline
0 VMware Virtual NVMe Disk 64424509440 GPT Online

Offline · RAW 다. 이 상태에서는 탐색기에 아무것도 보이지 않는다.FriendlyName 이 NETAPP LUN C-Mode 로 나오면 매핑까지는 성공한 것입니다. 여기서 디스크가 아예 안 보이면 igroup·매핑을 다시 봐야 하고, 보이는데 Offline이면 그냥 Windows가 새 디스크를 안전하게 잡아둔 것뿐입니다.
PS> $d = Get-Disk | Where-Object FriendlyName -like 'NETAPP*'
PS> Set-Disk -Number $d.Number -IsOffline $false
PS> Set-Disk -Number $d.Number -IsReadOnly $false
PS> Initialize-Disk -Number $d.Number -PartitionStyle GPT
PS> New-Partition -DiskNumber $d.Number -UseMaximumSize -AssignDriveLetter |
Format-Volume -FileSystem NTFS -NewFileSystemLabel ISCSI_LUN1 -Confirm:$false
DriveLetter : E
FileSystemLabel : ISCSI_LUN1
FileSystem : NTFS
Size : 1056894976
디스크 번호를 고정으로 쓰지 않고 FriendlyName 으로 찾는 이유가 있습니다. iSCSI 디스크 번호는 연결 순서에 따라 바뀌고, Initialize-Disk -Number 1 을 스크립트에 박아두면 다른 디스크를 초기화할 수 있습니다.

ONTAP에서도 이제 세션이 보입니다.
cluster1::> igroup show -vserver ISCSI_SVM -igroup win_hosts
Initiators: iqn.1991-05.com.microsoft:lab-dc01.lab.example.com (logged in)
cluster1::> iscsi connection show -vserver ISCSI_SVM
Tpgroup Conn Local Remote
Vserver Name TSIH ID Address Address
------------ ------- ----- ----- --------------- ---------------
ISCSI_SVM iscsi_lif1 1 1 192.168.126.22 192.168.126.40
7. ⭐ 볼륨 사용량은 LUN 사용량이 아니다
여기서 실무에서 가장 자주 오해하는 지점을 확인했습니다. 200MB짜리 파일을 만들어 넣고 양쪽 사용량을 비교해봤습니다.
먼저 fsutil 로 200MB 파일을 만들었습니다.
PS> fsutil file createnew E:\testfile.dat 209715200
File E:\testfile.dat is created
cluster1::> lun show -vserver ISCSI_SVM -fields path,size,size-used
ISCSI_SVM /vol/iscsi_vol1/lun1 1GB 10.39MB
200MB를 만들었는데 LUN 사용량은 10.39MB 그대로입니다. fsutil file createnew 는 크기만 잡아두고 실제 블록을 쓰지 않기 때문입니다(valid data length가 0). 성능 테스트나 용량 테스트를 이 명령으로 하면 아무것도 측정되지 않습니다.
실제 데이터를 200MB 썼습니다.
PS> $b = New-Object byte[] 1048576
PS> (New-Object Random).NextBytes($b)
PS> $fs = [IO.File]::OpenWrite('E:\real.dat')
PS> 1..200 | ForEach-Object { $fs.Write($b,0,$b.Length) }
PS> $fs.Close()
cluster1::> lun show -vserver ISCSI_SVM -fields path,size,size-used
ISCSI_SVM /vol/iscsi_vol1/lun1 1GB 211.2MB
이제 211.2MB로 올랐습니다. 그런데 볼륨 사용량은 두 경우 모두 똑같았습니다.
cluster1::> volume show -vserver ISCSI_SVM -volume iscsi_vol1 -fields size,used,available,percent-used
vserver volume size available used percent-used
--------- ---------- ---- --------- ------ ------------
ISCSI_SVM iscsi_vol1 2GB 916.9MB 1.00GB 52%
볼륨은 LUN을 만든 순간부터 1GB를 다 쓴 것으로 잡혀 있습니다. 안에 10MB가 있든 211MB가 있든 52%에서 움직이지 않습니다. LUN의 space reservation 때문입니다.
정말 그런지 예약만 껐다 켜봤습니다. 데이터는 그대로 두고 플래그 하나만 바꿨습니다.
cluster1::> lun modify -vserver ISCSI_SVM -path /vol/iscsi_vol1/lun1 -space-reserve disabled
cluster1::> volume show -vserver ISCSI_SVM -volume iscsi_vol1 -fields size,used,percent-used
ISCSI_SVM iscsi_vol1 2GB 211.9MB 10% <-- 52% 에서 10% 로
cluster1::> lun show -vserver ISCSI_SVM -path /vol/iscsi_vol1/lun1 -fields size-used
ISCSI_SVM /vol/iscsi_vol1/lun1 211.2MB <-- LUN 사용량은 그대로
볼륨 사용률만 보고 “LUN이 절반 찼다”고 판단하면 틀립니다. 볼륨 52%는 예약된 크기였고, 실제 데이터는 10%뿐이었습니다. LUN이 얼마나 찼는지는
lun show -fields size-used로 봐야 하고, 더 정확하게는 호스트의 파일시스템 사용량을 봐야 합니다.
NetApp 문서에서도 space reservation을 끈 LUN을 전통적으로 “thin-provisioned LUN”이라고 불러왔다고 정리하고 있습니다. 다만 문서는 동시에 “공간 부족으로 인한 오류를 막으려면 능동적인 여유 공간 관리가 필요하다”고 경고합니다. [문서확인] 볼륨이 가득 차면 LUN이 오프라인으로 떨어지기 때문에, 얇게 잡는 만큼 모니터링 책임이 늘어납니다. (출처: Settings for non-space-reserved files or LUNs with thin-provisioned volumes, lun modify — ONTAP CLI)
디스크가 안 보일 때 — 위에서부터 순서대로
iSCSI는 어느 단계에서 끊겼는지에 따라 증상이 다릅니다. 위 과정을 그대로 뒤집으면 점검 순서가 됩니다.
| 증상 | 확인할 곳 |
|---|---|
| 타겟 자체가 검색되지 않는다 | vserver iscsi show — 타겟이 up 인지. LIF IP로 3260 포트가 열리는지 |
타겟은 보이는데 Inactive | 검색만 된 상태. Connect-IscsiTarget 로 로그인해야 한다 |
| 연결됐는데 디스크가 없다 | lun show 의 Mapped 열. unmapped 면 lun map 을 안 한 것 |
igroup에 (not logged in) | 정상 표시. 호스트가 로그인하면 (logged in) 으로 바뀐다 |
| 디스크는 있는데 탐색기에 없다 | Offline · RAW 상태. 온라인 전환 후 초기화·포맷 필요 |
| 재부팅하면 사라진다 | 연결할 때 -IsPersistent $true 를 빠뜨린 것 |
| 도메인 조인 후 안 보인다 | 호스트 IQN에 FQDN이 들어간다. 이름이 바뀌면 IQN도 바뀐다 — igroup 재등록 |
정리 — 파일과 블록의 차이
| 단계 | NFS / CIFS | iSCSI |
|---|---|---|
| 저장 단위 | 볼륨을 그대로 공유 | 볼륨 안에 LUN |
| 접근 제어 | export policy · share ACL | igroup + LUN 매핑 |
| 경로 | LIF 하나로도 충분 | 노드마다 LIF (MPIO 전제) |
| 만든 직후 | 정책만 열면 접근 가능 | unmapped — 아무도 못 본다 |
| 호스트에서 할 일 | 마운트하면 끝 | 온라인 전환 → 초기화 → 포맷 |
| 사용량 보는 곳 | 볼륨 사용량이 곧 실사용량 | 볼륨 사용량 ≠ LUN 사용량 (예약분 포함) |
같은 시리즈의 파일 프로토콜 편도 함께 보시면 차이가 분명해집니다 — NFS 마운트가 access denied로 거부될 때는 export policy에 룰이 없어서였고, CIFS 도메인 조인이 LDAP Error로 실패할 때는 역방향 DNS가 원인이었습니다.


