Disk bölümlendirme, her sistem yöneticisinin er ya da geç karşılaşacağı temel görevlerden biridir. Yeni bir sunucu kuruyorsun, ek disk takıyorsun ya da mevcut bir diski yeniden düzenliyorsun; bu işlerin hepsinde doğru araçları bilmek hem zamandan tasarruf ettirir hem de felaketten kurtarır. Linux dünyasında iki araç bu işin merkezinde yer alır: fdisk ve parted. Bu yazıda her ikisini de gerçek senaryolar üzerinden, elleri kirletecek şekilde anlatacağım.
Disk Bölümlendirmeye Neden İhtiyaç Duyarız?
Teorik kısmı kısa tutayım çünkü blog okuyorsun, ders kitabı değil. Ama şunu bilmek gerekiyor: Bir diski doğrudan kullanmak yerine bölümlere ayırmak birkaç kritik avantaj sağlar.
- İzolasyon:
/vardolduğunda sistemi çökertemez çünkü kendi bölümünde yaşıyor - Farklı dosya sistemleri: Aynı diskte hem ext4 hem XFS kullanabilirsin
- Yedekleme kolaylığı: Bölüm bazlı snapshot almak çok daha yönetilebilir
- Performans optimizasyonu: Farklı I/O profillerine sahip uygulamaları ayrı bölümlere taşıyabilirsin
- MBR/GPT uyumluluğu: Eski sistemlerde MBR, yenilerde GPT şarttır
Şimdi işin pratik kısmına geçelim.
Önce Sistemi Tanı: Mevcut Durumu Görme
Herhangi bir şey yapmadan önce mevcut disk durumunu anlamak şarttır. Yanlış diske yazdığın anda geri dönüş yoktur.
# Tüm blok cihazlarını listele
lsblk
# Daha detaylı çıktı için
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,UUID
# Disk ve bölüm bilgilerini göster
fdisk -l
# Sadece belirli bir diski incele
fdisk -l /dev/sdb
# Disk kullanım durumunu göster
df -hT
lsblk çıktısı genellikle şuna benzer bir şey verir:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 4G 0 part [SWAP]
└─sda3 8:3 0 45G 0 part /
sdb 8:16 0 200G 0 disk
Burada sdbnin boş ve bölümsüz olduğunu görüyoruz. Bu diski bölümlendireceğiz.
fdisk: Klasik Ama Güçlü
fdisk yıllardır Linux sistemlerinde standart araç olarak kullanılıyor. 2TB altındaki diskler ve MBR partition table için ideal. 2TB üzerini GPT ile yönetmek gerekiyor ki orada parted veya gdisk devreye giriyor.
fdisk ile Yeni Bölüm Oluşturma
Senaryo: 200GB’lık /dev/sdb diskini üç bölüme ayıracağız. Birinci bölüm veritabanı için 100GB, ikincisi log dosyaları için 50GB, üçüncüsü yedekleme için kalan alan.
# fdisk'i interaktif modda başlat
fdisk /dev/sdb
fdisk açıldıktan sonra bir komut istemi çıkar. İşte sık kullandığın komutlar:
- m: Yardım menüsünü gösterir
- p: Mevcut partition tablosunu yazdırır
- n: Yeni bölüm oluşturur
- d: Bölüm siler
- t: Bölüm tipini değiştirir
- w: Değişiklikleri yazar ve çıkar
- q: Kaydetmeden çıkar
- l: Bilinen partition tiplerini listeler
İlk bölümü oluşturmak için sırasıyla şunları yapıyoruz:
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-419430399, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-419430399, default 419430399): +100G
Created a new partition 1 of type 'Linux' and of size 100 GiB.
Aynı şekilde ikinci ve üçüncü bölümleri oluştur, sonra w ile yaz:
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Bölüm Tipini Değiştirme
Swap bölümü oluşturuyorsan tipini değiştirmen gerekiyor:
# fdisk içinde
Command (m for help): t
Partition number (1-3, default 3): 2
Hex code or alias (type L to list all): 82
# 82 = Linux swap
Non-İnteraktif fdisk Kullanımı
Otomasyon scriptlerinde interaktif mod kullanmak istemezsin. sfdisk ile bunu çözebilirsin:
# sfdisk ile script tabanlı bölümlendirme
cat << EOF | sfdisk /dev/sdb
label: dos
device: /dev/sdb
unit: sectors
/dev/sdb1 : start=2048, size=209715200, type=83
/dev/sdb2 : start=209717248, size=104857600, type=83
/dev/sdb3 : start=314574848, type=83
EOF
Bu yöntem özellikle Ansible playbook veya bash scriptleri içinde çok işe yarıyor.
parted: Modern ve GPT Dostu
parted hem MBR hem GPT destekler ve özellikle 2TB üzerindeki diskler için tercih edilmesi gereken araçtır. Ayrıca scriptleme için çok daha temiz bir arayüz sunar.
GPT Disk Hazırlama
Senaryo: Yeni bir 4TB disk /dev/sdc geliyor, bunu GPT ile hazırlayacağız.
# parted'ı başlat
parted /dev/sdc
# GPT partition table oluştur
(parted) mklabel gpt
# Birinci bölüm: 1TB, veri için
(parted) mkpart primary ext4 0% 25%
# İkinci bölüm: 1TB, log için
(parted) mkpart primary xfs 25% 50%
# Üçüncü bölüm: 2TB, yedekleme için
(parted) mkpart primary ext4 50% 100%
# Bölümleri gör
(parted) print
# Çık
(parted) quit
parted ile Non-İnteraktif Kullanım
Production ortamında scriptleme şart:
# Tek satırda GPT oluştur ve bölümle
parted -s /dev/sdc
mklabel gpt
mkpart primary ext4 0% 25%
mkpart primary xfs 25% 50%
mkpart primary ext4 50% 100%
# Sonucu kontrol et
parted -s /dev/sdc print
-s: Script modunda çalıştırır, onay sormaz
Bu çıktı şuna benzer:
Model: ATA SAMSUNG (scsi)
Disk /dev/sdc: 4001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 1001GB 1000GB ext4 primary
2 1001GB 2001GB 1000GB xfs primary
3 2001GB 4001GB 2000GB ext4 primary
Alignment Ayarı
Modern diskler ve SSD’ler için hizalama kritiktir. Yanlış hizalama ciddi performans kaybına yol açar:
# Optimal hizalama ile bölüm oluştur
parted -s /dev/sdc
mklabel gpt
mkpart primary 1MiB 100GiB
mkpart primary 100GiB 200GiB
align-check optimal 1
align-check optimal 2
parted yüzde kullandığında hizalamayı otomatik ayarlar. Manuel sektor değeri giriyorsan 1MiB‘dan başlamak en güvenlisi.
Dosya Sistemi Oluşturma
Bölüm oluşturdun, ama henüz kullanılabilir değil. Dosya sistemi oluşturman gerekiyor:
# ext4 dosya sistemi oluştur
mkfs.ext4 /dev/sdb1
# XFS dosya sistemi (büyük dosyalar için ideal)
mkfs.xfs /dev/sdc2
# Etiket ile birlikte oluştur (fstab için kullanışlı)
mkfs.ext4 -L veritabani /dev/sdb1
mkfs.xfs -L loglar /dev/sdc2
# Swap bölümü hazırla
mkswap /dev/sdb2
swapon /dev/sdb2
# Swap durumunu kontrol et
swapon --show
Kalıcı Mount Yapılandırması
Bölümleri /etc/fstab‘a eklemezsen yeniden başlatmada kaybolur.
# UUID'leri öğren
blkid /dev/sdb1
blkid /dev/sdc2
# Çıktı örneği
# /dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4" LABEL="veritabani"
# fstab'a ekle
echo "UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /var/lib/mysql ext4 defaults,noatime 0 2" >> /etc/fstab
# Mount noktasını oluştur
mkdir -p /var/lib/mysql
# fstab'ı test et (makinayı yeniden başlatmadan)
mount -a
# Başarılı mount'u kontrol et
df -hT | grep sdb1
Label kullanmak UUID yerine daha okunabilir ama UUID daha güvenli çünkü disk sırası değişse bile doğru diski bulur.
Gerçek Dünya Senaryosu: Veritabanı Sunucusu Disk Yapılandırması
Bir PostgreSQL sunucusu için disk yapılandırması yapacaksın. Gereksinimler:
/dev/sdb500GB: Veri dosyaları için/dev/sdc200GB: WAL (Write-Ahead Log) için/dev/sdd1TB: Yedekleme için
#!/bin/bash
# postgresql-disk-setup.sh
set -e
echo "=== PostgreSQL Disk Yapılandırması ==="
# Mevcut durumu kaydet
lsblk > /tmp/disk-oncesi.txt
# Veri diski - GPT ile bölümlendir
echo "Veri diski hazırlanıyor: /dev/sdb"
parted -s /dev/sdb
mklabel gpt
mkpart primary xfs 1MiB 100%
# WAL diski
echo "WAL diski hazırlanıyor: /dev/sdc"
parted -s /dev/sdc
mklabel gpt
mkpart primary xfs 1MiB 100%
# Yedekleme diski
echo "Yedekleme diski hazırlanıyor: /dev/sdd"
parted -s /dev/sdd
mklabel gpt
mkpart primary ext4 1MiB 100%
# Kernel'ın yeni partition table'ı okuması için
partprobe /dev/sdb
partprobe /dev/sdc
partprobe /dev/sdd
sleep 2
# Dosya sistemleri oluştur
echo "Dosya sistemleri oluşturuluyor..."
mkfs.xfs -L pg_data /dev/sdb1
mkfs.xfs -L pg_wal /dev/sdc1
mkfs.ext4 -L pg_backup /dev/sdd1
# Mount noktaları
mkdir -p /var/lib/postgresql/data
mkdir -p /var/lib/postgresql/wal
mkdir -p /var/lib/postgresql/backup
# fstab girişleri
DATA_UUID=$(blkid -s UUID -o value /dev/sdb1)
WAL_UUID=$(blkid -s UUID -o value /dev/sdc1)
BACKUP_UUID=$(blkid -s UUID -o value /dev/sdd1)
cat >> /etc/fstab << EOF
UUID=$DATA_UUID /var/lib/postgresql/data xfs defaults,noatime,nodiratime 0 2
UUID=$WAL_UUID /var/lib/postgresql/wal xfs defaults,noatime,nodiratime 0 2
UUID=$BACKUP_UUID /var/lib/postgresql/backup ext4 defaults,noatime 0 2
EOF
# Bağla
mount -a
# Yetkileri ayarla
chown -R postgres:postgres /var/lib/postgresql/
echo "=== Yapılandırma Tamamlandı ==="
df -hT | grep -E "pg_|postgresql"
Bu scripti bir değişkene atıp çalıştırmadan önce mutlaka test ortamında dene.
Disk Boyutu Genişletme
Bulut ortamında disk büyütme çok yaygın. VMware’de veya AWS’de diski büyüttün, şimdi Linux’ta tanıman lazım:
# Yeni disk boyutunu kernel'a tanıt
echo 1 > /sys/class/block/sdb/device/rescan
# ya da
partprobe /dev/sdb
# Durumu kontrol et
lsblk
fdisk -l /dev/sdb
# parted ile son bölümü genişlet
parted /dev/sdb
(parted) resizepart 3 100%
(parted) quit
# Dosya sistemini de genişlet
# ext4 için:
resize2fs /dev/sdb3
# XFS için (sadece büyütme desteklenir, küçültme yok):
xfs_growfs /mount/noktasi
LVM ile Entegrasyon
fdisk ve parted ile oluşturduğun bölümleri LVM’e de verebilirsin. Bu çok yaygın bir senaryo:
# fdisk ile LVM tipi bölüm oluştur
# fdisk içinde t ile tip değiştir, 8e seç (Linux LVM)
# Physical Volume oluştur
pvcreate /dev/sdb1
# Volume Group oluştur
vgcreate vg_data /dev/sdb1
# Logical Volume oluştur
lvcreate -L 80G -n lv_mysql vg_data
lvcreate -l 100%FREE -n lv_logs vg_data
# Dosya sistemi ve mount
mkfs.ext4 /dev/vg_data/lv_mysql
mount /dev/vg_data/lv_mysql /var/lib/mysql
Sık Yapılan Hatalar ve Çözümleri
Sorun: fdisk -l diski göstermiyor
# Kernel'ı yeniden tara
echo "- - -" > /sys/class/scsi_host/host0/scan
# veya
udevadm trigger
udevadm settle
Sorun: Bölüm oluşturduktan sonra dosya sistemi oluşturulamıyor
# Bölüm tablosunu kernel'a yeniden oku
partprobe /dev/sdb
# veya sistemi kısaca beklet
sleep 3
ls /dev/sdb*
Sorun: Device or resource busy hatası
# Hangi process diski kullanıyor
fuser -vm /dev/sdb
lsof /dev/sdb
# Mount noktasını kontrol et
umount /dev/sdb1
# sonra işlemini yap
Sorun: GPT diskini MBR’a çevirmek gerekiyor
# DİKKAT: Tüm veri silinir!
# Önce yedek al
dd if=/dev/sdb of=/backup/sdb-backup.img bs=4M status=progress
# Sonra dönüştür
parted -s /dev/sdb mklabel msdos
fdisk mi, parted mi? Hangisini Kullanmalıyım?
İkisi de güçlü araçlar ama kullanım senaryolarına göre tercih değişiyor:
- fdisk kullan: 2TB altı diskler, MBR diskleri yönetirken, interaktif iş yaparken, legacy sistemlerde
- parted kullan: 2TB üzeri diskler, GPT gereken yerler, otomasyon scriptlerinde, modern sistemlerde
- gdisk kullan: Sadece GPT üzerinde çalışmak istiyorsan ve fdisk’e alışkınsan, gdisk benzer arayüz sunar
Canlı sistemlerde her iki araç da mevcut disk içeriğini silmeden yeni bölümler ekleyebilir. Ama var olan bölümleri küçültmek veya silmek veri kaybı riski taşır; önce mutlaka yedek al.
Hızlı Referans Komutları
Günlük işlerde sürekli kullandığım, not defterime aldığım komutlar:
# Tüm diskleri ve bölümleri göster
lsblk -f
# Disk UUID ve dosya sistemi bilgisi
blkid
# Bölüm tablosunu ekrana yazdır
parted /dev/sdb print
# fdisk ile özet
fdisk -l /dev/sdb
# Dosya sistemi sağlık kontrolü (unmount edilmeli)
fsck -n /dev/sdb1
# XFS sağlık kontrolü
xfs_repair -n /dev/sdc1
# Disk I/O durumu
iostat -x 1 5
# Bölüm boyutunu öğren
blockdev --getsize64 /dev/sdb1
Sonuç
Disk bölümlendirme, sysadmin’in en temel becerilerinden biri. fdisk onlarca yıllık geçmişiyle hala geçerli ve güvenilir; MBR diskler ve 2TB altı senaryolarda rahatça kullanılabilir. parted ise özellikle GPT ve büyük diskler için modern tercihtir, scripting için de çok daha uygun bir arayüz sunar.
Bu araçları öğrenmenin en iyi yolu bir VM veya test diski üzerinde defalarca pratik yapmak. Vagrant ile hızlıca bir test ortamı kurabilir, sanal disk ekleyip bu komutları deneyebilirsin. Üretim ortamında bu işleri yapmadan önce her zaman:
- Mevcut disk durumunu kaydet (
lsblkvefdisk -lçıktısını sakla) - Kritik verileri yedekle
- Değişikliği önce test ortamında uygula
wtuşuna basana kadarfdiskveparted‘da hiçbir şey kalıcı olmaz; bu seni korur
Disk yönetimi konusunda soru ve yorumlarını aşağıya bırakabilirsin. Özellikle LVM entegrasyonu, RAID yapılandırması veya bulut ortamlarında disk yönetimi hakkında ayrı yazılar gelecek.