Linux’ta iSCSI ile Uzak Disk Bağlama

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 = 1 ayarı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.

Yorum yapın