Veri merkezlerinde ya da küçük ofis altyapılarında bir noktada karşılaşırsın: Sunuculardan birinin diski dolmuş, başka bir makinede ise kullanılmayan büyük bir depolama alanı var. Ya da merkezi bir depolama sunucusu kuruyorsun ve birden fazla makineye aynı disk havuzundan alan sunmak istiyorsun. İşte tam bu noktada iSCSI devreye giriyor. Ağ üzerinden disk bağlamak, doğru yapılandırıldığında yerel disk kadar performanslı ve çok daha esnek bir çözüm sunuyor.
iSCSI Nedir ve Nasıl Çalışır
iSCSI (Internet Small Computer Systems Interface), SCSI komutlarını TCP/IP ağı üzerinden taşıyan bir protokoldür. Yani aslında yerel bir diski kontrol etmek için kullandığın SCSI komutlarını, ağ paketi olarak karşı tarafa gönderiyorsun. Karşı taraf bu komutları alıp bir disk üzerinde çalıştırıyor ve sonucu sana ağ üzerinden gönderiyor.
Bu mimaride iki temel bileşen var:
- Target (Hedef): Diski sunan taraf. Depolama sunucusu bu rolü üstlenir.
- Initiator (Başlatıcı): Diski kullanan taraf. Uzak diske bağlanmak isteyen istemci sunucu bu rolü üstlenir.
Her iSCSI hedefi IQN (iSCSI Qualified Name) adı verilen benzersiz bir kimlikle tanımlanır. Format şöyle görünür: iqn.2024-01.com.ornekfirma:depolama1
Protokolün güzelliği şu: İşletim sistemi açısından bu disk tamamen yerel bir disk gibi görünür. Partition oluşturabilirsin, formatlayabilirsin, mount edebilirsin. NFS veya Samba gibi dosya paylaşım protokollerinden farklı olarak, iSCSI block-level erişim sağlar. Bu da onu veritabanı sunucuları, VMware/KVM altyapıları ve yüksek performans gerektiren uygulamalar için ideal yapıyor.
Ortam Hazırlığı
Bu yazıda şöyle bir senaryo üzerinden gideceğiz: Bir depolama sunucumuz var (192.168.1.10), buna target diyeceğiz. Bir de uygulama sunucumuz var (192.168.1.20), buna initiator diyeceğiz. Target üzerinde /dev/sdb adında 500 GB’lık bir disk var ve bunu initiator’a sunmak istiyoruz.
Her iki tarafta da önce sistem güncel olmalı:
# Ubuntu/Debian için
sudo apt update && sudo apt upgrade -y
# RHEL/CentOS/Rocky Linux için
sudo dnf update -y
Target Sunucusu Yapılandırması (targetcli)
Linux’ta iSCSI target kurmanın en pratik yolu targetcli aracını kullanmak. Bu araç hem LIO (Linux-IO) kernel modülüyle konuşuyor hem de sana interaktif bir shell sunuyor.
targetcli Kurulumu
# Ubuntu/Debian
sudo apt install targetcli-fb -y
# RHEL/CentOS/Rocky Linux
sudo dnf install targetcli -y
# Servisi başlat ve otomatik başlatmayı etkinleştir
sudo systemctl enable --now target
targetcli ile Disk Tanımlama
targetcli komutunu çalıştırınca interaktif bir shell açılır. Bu shell içinde bir dosya sistemi benzeri bir yapı görürsün. Hadi adım adım ilerleyelim:
sudo targetcli
Önce backstore tanımlıyoruz. Backstore, sunacağımız fiziksel ya da sanal depolama biriminin temsilidir. Birkaç farklı tip var ama en yaygını block tipi:
# targetcli shell içinde
/backstores/block> create name=depolama1 dev=/dev/sdb
# Veya bir dosya üzerinden sanal disk oluşturmak için:
/backstores/fileio> create name=depolama1 file_or_dev=/var/lib/iscsi_disk/disk1.img size=100G
Şimdi iSCSI target oluşturalım:
# IQN formatında bir target oluştur
/iscsi> create iqn.2024-01.com.ornekfirma:depolama1
# LUN (Logical Unit Number) bağla
/iscsi/iqn.2024-01.com.ornekfirma:depolama1/tpg1/luns> create /backstores/block/depolama1
# Portal (dinleme adresi) kontrol et - varsayılan 0.0.0.0:3260
/iscsi/iqn.2024-01.com.ornekfirma:depolama1/tpg1/portals> ls
Güvenlik için ACL (Access Control List) tanımlayalım. Bu sayede sadece yetkili initiator’lar bağlanabilir:
# Initiator'ın IQN'ini ACL'e ekle
/iscsi/iqn.2024-01.com.ornekfirma:depolama1/tpg1/acls> create iqn.2024-01.com.ornekfirma:initiator1
# Değişiklikleri kaydet ve çık
/> saveconfig
/> exit
CHAP Kimlik Doğrulama (Opsiyonel ama Önerilen)
Açık ağlarda ya da güvenliği artırmak istediğinde CHAP kullanmalısın:
sudo targetcli
# CHAP kullanıcı adı ve şifre tanımla
/iscsi/iqn.2024-01.com.ornekfirma:depolama1/tpg1/acls/iqn.2024-01.com.ornekfirma:initiator1> set auth userid=iscsiuser password=guclu_sifre123
# Attribute olarak kimlik doğrulamayı zorunlu kıl
/iscsi/iqn.2024-01.com.ornekfirma:depolama1/tpg1> set attribute authentication=1
/> saveconfig
/> exit
Firewall Ayarları
iSCSI varsayılan olarak 3260 numaralı TCP portunu kullanır:
# UFW (Ubuntu)
sudo ufw allow 3260/tcp
sudo ufw reload
# firewalld (RHEL/CentOS/Rocky)
sudo firewall-cmd --permanent --add-port=3260/tcp
sudo firewall-cmd --reload
# iptables ile
sudo iptables -A INPUT -p tcp --dport 3260 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4
Initiator Yapılandırması
Şimdi diski kullanacak tarafı, yani istemci sunucumuzu (192.168.1.20) yapılandıralım.
open-iscsi Kurulumu
# Ubuntu/Debian
sudo apt install open-iscsi -y
# RHEL/CentOS/Rocky Linux
sudo dnf install iscsi-initiator-utils -y
# Servis başlatma
sudo systemctl enable --now iscsid
Initiator IQN Ayarlama
Initiator’ın kendi IQN’i /etc/iscsi/initiatorname.iscsi dosyasında bulunur:
cat /etc/iscsi/initiatorname.iscsi
# Çıktı: InitiatorName=iqn.1993-08.org.debian:01:abc123def456
# Bunu target'ta tanımladığın IQN ile eşleştir
sudo nano /etc/iscsi/initiatorname.iscsi
Dosya içeriğini şöyle düzenle:
InitiatorName=iqn.2024-01.com.ornekfirma:initiator1
Değişikliği uygulamak için servisi yeniden başlat:
sudo systemctl restart iscsid
Target Keşfi (Discovery)
Şimdi target sunucusunu keşfedelim:
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.10:3260
Başarılı bir keşif sonucunda şöyle bir çıktı görürsün:
192.168.1.10:3260,1 iqn.2024-01.com.ornekfirma:depolama1
CHAP Yapılandırması (Target’ta CHAP Aktifse)
sudo nano /etc/iscsi/iscsid.conf
Dosya içinde şu satırları bul ve düzenle:
node.session.auth.authmethod = CHAP
node.session.auth.username = iscsiuser
node.session.auth.password = guclu_sifre123
Target’a Bağlanma
# Tüm keşfedilen target'lara otomatik bağlan
sudo iscsiadm -m node --loginall=automatic
# Belirli bir target'a bağlan
sudo iscsiadm -m node -T iqn.2024-01.com.ornekfirma:depolama1 -p 192.168.1.10 --login
Bağlantı başarılıysa yeni bir disk cihazı görünecek. Bunu doğrulayalım:
lsblk
# veya
sudo fdisk -l | grep -E "Disk /dev/sd"
# veya daha detaylı bilgi için
sudo dmesg | tail -20 | grep -i scsi
Muhtemelen /dev/sdc veya /dev/sdb gibi bir isimle yeni disk görünecek.
Diski Kullanıma Hazırlama
Disk görünüyor, şimdi onu kullanılabilir hale getirelim. Bu kısım artık normal disk yönetimiyle aynı:
# Partition oluştur
sudo fdisk /dev/sdc
# n (yeni partition), p (primary), 1, Enter, Enter, w (kaydet)
# Dosya sistemi oluştur
sudo mkfs.ext4 /dev/sdc1
# veya XFS için (büyük dosyalar ve veritabanları için daha iyi)
sudo mkfs.xfs /dev/sdc1
# Mount noktası oluştur
sudo mkdir -p /mnt/iscsi-depolama
# Test olarak mount et
sudo mount /dev/sdc1 /mnt/iscsi-depolama
# Kontrol et
df -hT /mnt/iscsi-depolama
Otomatik Mount için /etc/fstab
Sistem yeniden başladığında diski otomatik mount etmek için fstab’a ekleyelim. Ama dikkat: iSCSI bağlantısı ağa bağlı olduğundan, ağ servislerinin başlamasını beklemelisin. Yoksa sistem açılışta donabilir.
Önce diskin UUID’sini öğren:
sudo blkid /dev/sdc1
# Çıktı: /dev/sdc1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"
Şimdi fstab’ı düzenle:
sudo nano /etc/fstab
Şu satırı ekle:
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/iscsi-depolama ext4 _netdev,auto 0 0
Buradaki kritik nokta _netdev parametresi. Bu parametre, mount işleminin ağ servisleri başlayana kadar beklemesini sağlar. Bunu atlayan sysadminlerin sistemleri açılışta sonsuz döngüye girdiğine defalarca tanık oldum.
Ayrıca iSCSI servisinin ağa bağlı olarak başlaması için:
sudo systemctl enable open-iscsi
sudo systemctl enable iscsid
Bağlantı Yönetimi ve İzleme
Mevcut Oturumları Görüntüleme
# Aktif oturumları listele
sudo iscsiadm -m session
# Detaylı bilgi
sudo iscsiadm -m session -P 3
# Node bilgilerini görüntüle
sudo iscsiadm -m node -o show
Bağlantıyı Güvenli Şekilde Kesme
Diski unmount etmeden bağlantıyı kesme, büyük ihtimalle veri kaybına ya da dosya sistemi bozulmasına yol açar:
# Önce unmount et
sudo umount /mnt/iscsi-depolama
# Sonra logout yap
sudo iscsiadm -m node -T iqn.2024-01.com.ornekfirma:depolama1 -p 192.168.1.10 --logout
# Tüm oturumlardan çık
sudo iscsiadm -m node --logoutall=all
Target Tarafında Durum İzleme
# Target durumunu kontrol et
sudo targetcli ls
# Aktif oturumları gör
sudo targetcli /iscsi/iqn.2024-01.com.ornekfirma:depolama1/tpg1 info
# Sistem loglarında iSCSI aktivitesi
sudo journalctl -u target -f
Gerçek Dünya Senaryosu: KVM Sanal Makineler için iSCSI Depolama
Bu yapının en çok işe yaradığı yer sanallaştırma ortamları. Diyelim ki KVM host’unuz var ve VM disklerini merkezi bir depolama sunucusunda tutmak istiyorsunuz. Bu sayede bir host çöktüğünde VM’leri hızlıca başka bir host’a taşıyabilirsiniz.
# KVM host'unda iSCSI diski bağladıktan sonra
# libvirt için storage pool tanımla
sudo virsh pool-define-as
--name iscsi-havuz
--type dir
--target /mnt/iscsi-depolama/kvm-images
sudo virsh pool-autostart iscsi-havuz
sudo virsh pool-start iscsi-havuz
# Pool durumunu kontrol et
sudo virsh pool-list --all
sudo virsh pool-info iscsi-havuz
Bu yapıyla VM imajları artık ağ diskinde tutuluyor. Başka bir KVM host’unda da aynı iSCSI target’a bağlanıp, bu pool’u tanımladığında aynı VM’leri görebilirsin. Tabii aynı anda iki host’tan da açmaya çalışma, o iş için cluster dosya sistemi (GFS2, OCFS2) gerekli.
Performans İpuçları
iSCSI performansı, büyük ölçüde ağ altyapına bağlı. Bazı pratik tavsiyeler:
- Jumbo Frame kullan: Ağ ekipmanın destekliyorsa MTU değerini 9000’e çek. iSCSI trafiği büyük bloklar halinde olduğu için ciddi performans artışı sağlar.
- Ayrı bir ağ segmenti: Mümkünse iSCSI trafiğini üretim ağından ayır. Hem güvenlik hem de performans için iyi.
- Multipath (çok yollu) yapılandır: Kritik sistemlerde iki ayrı ağ kartı üzerinden aynı target’a bağlanarak hem yük dağılımı hem de yedeklilik sağlayabilirsin.
- Read-ahead değerini ayarla: Büyük sıralı okumalar yapıyorsan:
sudo blockdev --setra 4096 /dev/sdc
# Kalıcı yapmak için /etc/udev/rules.d/ altına kural ekle
echo 'ACTION=="add", KERNEL=="sdc", ATTR{bdi/read_ahead_kb}="2048"' |
sudo tee /etc/udev/rules.d/99-iscsi-readahead.rules
Yaygın Sorunlar ve Çözümleri
Bağlantı kurulamıyor:
# Target portuna erişimi test et
nc -zv 192.168.1.10 3260
# iscsid servis durumunu kontrol et
sudo systemctl status iscsid
# Firewall durumunu kontrol et (target tarafında)
sudo ss -tlnp | grep 3260
Disk açılışta görünmüyor:
# open-iscsi servisinin durumunu kontrol et
sudo systemctl status open-iscsi
# Manuel olarak tüm node'lara bağlan
sudo iscsiadm -m node --loginall=automatic
# Kalıcı node kayıtlarını kontrol et
ls /etc/iscsi/nodes/
Performans düşüklüğü:
# Ağ bant genişliğini test et (target ve initiator arasında)
iperf3 -s # target'ta
iperf3 -c 192.168.1.10 # initiator'da
# Disk I/O istatistiklerini izle
iostat -xz 2 /dev/sdc
targetcli ayarları yeniden başlatmada kayboluyorsa:
sudo systemctl enable target
# Ayarlar /etc/target/saveconfig.json dosyasında saklanır
cat /etc/target/saveconfig.json
Güvenlik Notları
iSCSI başlı başına şifreli bir protokol değil. Bu yüzden şunlara dikkat et:
- CHAP kimlik doğrulamasını mutlaka kullan, özellikle güvenilir olmayan ağ segmentlerinde.
- iSCSI trafiğini ayrı VLAN’a al. Hem güvenlik hem de performans açısından kritik.
- IPsec ile şifrele: Çok hassas veriler için iSCSI trafiğini IPsec tünelinden geçirebilirsin, ama bu performansı düşürür.
- ACL’leri doğru tanımla:
generate_node_acls = 1ayarını üretim ortamında açık bırakma, bu herkesin bağlanmasına izin verir. - Target sunucusundaki firewall kurallarını düzenli kontrol et, sadece yetkili initiator IP adreslerinden gelen 3260 portuna izin ver.
Sonuç
iSCSI, kurumsal altyapılarda yıllardır kanıtlanmış, güvenilir bir protokol. Doğru yapılandırıldığında yerel disk performansına yakın sonuçlar veriyor ve merkezi depolama yönetimini önemli ölçüde kolaylaştırıyor. Özellikle KVM veya VMware ortamlarında, veritabanı sunucularında ve yedekleme altyapılarında çok işe yarıyor.
targetcli aracı sayesinde Linux üzerinde target kurulumu artık eskiye kıyasla çok daha kolay. open-iscsi paketi de initiator tarafını olgun bir şekilde yönetiyor. Bu iki araçla küçük bir ofis altyapısından orta ölçekli veri merkezi çözümlerine kadar pek çok senaryoyu rahatlıkla karşılayabilirsin.
Son olarak şunu söyleyeyim: iSCSI disklerin ağa bağımlı olduğunu hiçbir zaman unutma. Ağ altyapısındaki bir sorun, bu disklere bağımlı tüm servisleri etkiler. Bu yüzden kritik sistemlerde multipath yapılandırması ve ağ yedekliliği şart. Monitoring tarafını da ihmal etme, Zabbix veya Prometheus ile hem target hem initiator tarafını izlemeye al.