Disk Kotası: quota Komutu ile Kullanıcı Depolama Limitleme

Çok kullanıcılı bir Linux sisteminde disk alanı yönetimi, sysadmin’in en klasik baş ağrılarından biridir. Bir kullanıcı /home dizinini doldurduğunda tüm sistem etkilenebilir, diğer kullanıcıların işlemleri aksamaya başlar, hatta bazı sistem servisleri log yazamaz hale gelir. İşte tam bu noktada quota sistemi devreye giriyor. Linux’un yerleşik disk kotası mekanizması sayesinde her kullanıcıya ve gruba depolama limiti tanımlayabilir, sisteminizin dengeli çalışmasını garanti altına alabilirsiniz.

Disk Kotası Nedir ve Neden Gereklidir?

Disk kotası, belirli bir dosya sistemi üzerinde kullanıcı veya grup bazında depolama limitlerini zorunlu kılan bir mekanizmadır. Üniversite sunucuları, hosting ortamları, paylaşımlı NFS sistemleri ve kurumsal iş istasyonları gibi birden fazla kullanıcının aynı sistemi paylaştığı her senaryoda kota yönetimi kritik önem taşır.

Somut bir örnek düşünelim: 50 kişilik bir geliştirici ekibiniz var ve hepsi aynı Linux sunucusunda çalışıyor. Birisi makine öğrenmesi modelleri için büyük veri setleri indirmeye başladığında, ya da birinin home dizinine yanlışlıkla büyük dosyalar kopyalandığında, 500 GB’lık /home bölümü saatler içinde dolabilir. Kota olmadan bunu ancak sonradan fark edersiniz.

Quota sisteminin temel kavramları şunlardır:

  • Soft Limit: Kullanıcının geçebileceği esnek üst sınır. Aşılması hemen engellenmez, grace period süresince uyarı verilir.
  • Hard Limit: Kesinlikle aşılamayan mutlak üst sınır. Bu noktada yeni dosya yazımı engellenir.
  • Grace Period: Soft limit aşıldıktan sonra kullanıcıya tanınan süre (varsayılan 7 gün). Bu süre içinde hard limit’e çekilmezse soft limit hard limit gibi davranmaya başlar.
  • Inode Kotası: Disk bloğu yerine dosya sayısını sınırlar. Büyük sayıda küçük dosya oluşturan kullanıcılara karşı etkilidir.

Gerekli Paketlerin Kurulumu

Başlamadan önce quota araçlarının sisteminizde kurulu olduğunu doğrulayın.

Debian/Ubuntu tabanlı sistemler için:

sudo apt update
sudo apt install quota quotatool

RHEL/CentOS/AlmaLinux tabanlı sistemler için:

sudo dnf install quota

Kurulumun ardından quota araçlarının kullanılabilir olduğunu kontrol edin:

quota --version
quotacheck --version

Dosya Sistemini Kota Desteğiyle Hazırlamak

Quota’nın çalışabilmesi için ilgili dosya sisteminin mount seçeneklerinde kota desteğinin aktif edilmesi gerekir. /etc/fstab dosyasını düzenleyeceğiz.

Önce mevcut mount noktanızı görmek için kontrol edin:

cat /etc/fstab | grep home

Tipik bir çıktı şöyle görünebilir:

/dev/sdb1  /home  ext4  defaults  0  2

Bu satırı kullanıcı ve grup kotası için düzenliyoruz:

sudo nano /etc/fstab

Düzenlenmiş hali şöyle olmalı:

/dev/sdb1  /home  ext4  defaults,usrquota,grpquota  0  2

XFS dosya sistemi kullanıyorsanız seçenekler biraz farklıdır:

/dev/sdb1  /home  xfs  defaults,uquota,gquota  0  2

Önemli not: XFS dosya sistemi kota desteğini kernel düzeyinde farklı işler ve ayrıca quotacheck/quotaon adımlarına ihtiyaç duymaz. Bu yazıda ext4 üzerinde ilerliyoruz, XFS farkları gerektiğinde belirteceğim.

Değişiklikleri uygulamak için dosya sistemini yeniden mount edin:

sudo mount -o remount /home

Mount seçeneklerinin uygulandığını doğrulayın:

mount | grep /home

Çıktıda usrquota,grpquota ibarelerini görmelisiniz.

Kota Veritabanlarını Oluşturmak

ext4 üzerinde kota için önce kota veritabanı dosyalarını oluşturmanız gerekir. quotacheck komutu bu işi yapar:

sudo quotacheck -cugm /home

Kullanılan parametreler:

  • -c: Yeni kota dosyası oluştur (create)
  • -u: Kullanıcı kotası için tarama yap
  • -g: Grup kotası için tarama yap
  • -m: Dosya sistemini read-only yapmadan çalıştır (mount edilmiş sistemlerde gerekli)

Bu komut /home dizininde aquota.user ve aquota.group dosyalarını oluşturur:

ls -la /home/aquota*

Şöyle bir çıktı beklenir:

-rw------- 1 root root 8192 Oca 15 14:23 /home/aquota.group
-rw------- 1 root root 8192 Oca 15 14:23 /home/aquota.user

Şimdi kota sistemini aktif edelim:

sudo quotaon -ugv /home

-v parametresi verbose (ayrıntılı) çıktı verir, aktifleştirme sürecini görebilirsiniz.

Kota sisteminin aktif olup olmadığını kontrol etmek için:

sudo quotaon -p /home

Kullanıcıya Kota Tanımlamak

Artık kullanıcılara kota atayabiliriz. edquota komutu varsayılan text editörü açarak kota düzenlememizi sağlar:

sudo edquota -u ahmet

Açılan editörde şuna benzer bir görünüm karşınıza çıkar:

Disk quotas for user ahmet (uid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                         0          0          0          0        0        0

Buradaki alanları dolduralım. Örneğin ahmet kullanıcısına 5 GB soft, 6 GB hard limit ve 10.000 dosya soft, 12.000 dosya hard limit tanımlayalım:

Disk quotas for user ahmet (uid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                         0    5120000    6144000          0    10000    12000

Blok değerleri kilobayt cinsindendir. 5 GB = 5.242.880 KB olmakla birlikte quota sistemi 1024 blok = 1 MB hesaplar. 5 GB için 5.000.000, 6 GB için 6.000.000 yazabilirsiniz ya da tam değerleri kullanabilirsiniz.

Editörü kaydedip kapatın. Kota hemen aktif olur.

Komut Satırından Direkt Kota Atama

edquota editör yerine doğrudan komut satırından da kota atayabilirsiniz. Bu özellikle betiklerle toplu işlem yaparken kullanışlıdır:

sudo setquota -u ahmet 5000000 6000000 10000 12000 /home

Parametrelerin sırası: kullanıcı adı, block soft, block hard, inode soft, inode hard, dosya sistemi.

Kota tanımını doğrulamak için:

sudo quota -vs ahmet

Çıktı şöyle görünür:

Disk quotas for user ahmet (uid 1001):
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
      /dev/sdb1      0K  4883M   5722M             0    10000   12000

Grace Period Ayarlamak

Varsayılan grace period 7 gündür. Bunu sisteminizin ihtiyacına göre değiştirebilirsiniz:

sudo edquota -t

Açılan editörde şunu görürsünüz:

Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem             Block grace period     Inode grace period
  /dev/sdb1                     7days                  7days

Bunu örneğin 3 güne indirip kaydedebilirsiniz:

  /dev/sdb1                     3days                  3days

Grup grace period için:

sudo edquota -tg

Grup Kotası Tanımlamak

Kullanıcı bazlı kota yanında grup bazlı kota da çok işe yarar. Özellikle proje bazlı disk kullanımını sınırlamak istediğinizde idealdir.

Örneğin developers grubuna 50 GB soft, 60 GB hard limit tanımlayalım:

sudo edquota -g developers

Ya da komut satırından:

sudo setquota -g developers 50000000 60000000 0 0 /home

İkinci örnekte inode limiti 0 bıraktık, bu sınırsız demektir.

Toplu Kota Atama: Şablon Kullanımı

Onlarca kullanıcıya tek tek kota atamak yerine bir kullanıcıyı şablon olarak kullanabilirsiniz. Önce bir kullanıcı için kota tanımlayın, ardından diğerlerine kopyalayın:

# Önce şablon kullanıcı olarak "template_user"a kota tanımla
sudo setquota -u template_user 5000000 6000000 10000 12000 /home

# Diğer kullanıcılara bu kota şablonunu uygula
sudo edquota -p template_user ali veli ayse mehmet zeynep

Bu yöntem özellikle toplu kullanıcı oluşturma betiklerinde çok işe yarar.

Daha ileri gidip tüm mevcut kullanıcılara toplu uygulama yapmak isterseniz:

#!/bin/bash
# /home dizinindeki tüm kullanıcılara şablon kotasını uygula
for user in $(ls /home); do
    if id "$user" &>/dev/null; then
        sudo edquota -p template_user "$user"
        echo "Kota uygulandı: $user"
    fi
done

Kota Durumunu İzlemek

Tek Kullanıcı Kontrolü

# Belirli bir kullanıcının kotasını görüntüle
sudo quota -vs ahmet

# Kullanıcının kendisi kendi kotasını görebilir
quota -s

Tüm Sistemin Kota Raporu

sudo repquota -as /home

Bu komut tüm kullanıcılar için detaylı kota raporu üretir. Çıktı şöyle görünür:

*** Report for user quotas on device /dev/sdb1
Block grace time: 3days; Inode grace time: 3days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --      20       0       0             2     0     0
ahmet     --  512000 5000000 6000000           234 10000 12000
ali       --  234500 5000000 6000000            89 10000 12000
veli      -+ 5100000 5000000 6000000  2days    567 10000 12000

Burada -- normal durumu, -+ soft limit’in aşıldığını gösterir.

Otomatik Raporlama Scripti

Günlük kota raporu için cron job oluşturabilirsiniz:

# /usr/local/bin/quota-report.sh
#!/bin/bash

ADMIN_EMAIL="[email protected]"
HOSTNAME=$(hostname)
DATE=$(date '+%Y-%m-%d %H:%M')

REPORT=$(sudo repquota -as /home)

# Limit aşımı var mı kontrol et
if echo "$REPORT" | grep -q "-+"; then
    echo "UYARI: $HOSTNAME sisteminde kota aşımı tespit edildi ($DATE)" | 
    mail -s "[$HOSTNAME] Disk Kota Uyarısı" "$ADMIN_EMAIL" <<< "$REPORT"
fi

Bu scripti cron’a ekleyin:

sudo crontab -e
# Şu satırı ekleyin:
0 8 * * * /usr/local/bin/quota-report.sh

Kullanıcıya Kota Uyarısı Göndermek

warnquota komutu, kotasını aşan ya da sınıra yaklaşan kullanıcılara otomatik e-posta uyarısı gönderir:

sudo warnquota -u /home

warnquota konfigürasyon dosyası /etc/warnquota.conf üzerinden özelleştirilebilir. Uyarı mesajının içeriğini Türkçe yazmak için:

sudo nano /etc/warnquota.conf

İlgili kısmı şöyle düzenleyebilirsiniz:

MESSAGE = nMerhaba,nnDisk kota limitinizi aşıyorsunuz veya limitinize yaklaştınız.nLütfen gereksiz dosyalarınızı temizleyin.nnSistem Yöneticisin
SUBJECT = Disk Kota Uyarısı - %s Kullanıcısı

warnquota’yı da cron’a ekleyip günlük çalıştırabilirsiniz.

Kotayı Devre Dışı Bırakmak ve Kaldırmak

Geçici olarak kota sistemini durdurmak için:

sudo quotaoff -ugv /home

Belirli bir kullanıcının kotasını sıfırlamak (limitleri kaldırmak) için:

sudo setquota -u ahmet 0 0 0 0 /home

Tüm kota altyapısını tamamen kaldırmak istiyorsanız:

# Önce quota'yı kapat
sudo quotaoff -ugv /home

# fstab'dan kota seçeneklerini kaldır
sudo nano /etc/fstab
# usrquota ve grpquota seçeneklerini sil

# Dosya sistemini yeniden mount et
sudo mount -o remount /home

# Kota veritabanı dosyalarını sil
sudo rm /home/aquota.user /home/aquota.group

XFS Dosya Sisteminde Quota

XFS kullanıyorsanız süreç biraz farklıdır ve bazı adımları atlar. XFS quota bilgilerini dosya sistemi içinde metadata olarak saklar, ayrı dosyalar gerektirmez.

fstab’da uquota,gquota veya usrquota,grpquota seçeneklerini ekleyip mount ettikten sonra doğrudan xfs_quota komutu ile çalışırsınız:

# XFS kota durumunu kontrol et
sudo xfs_quota -x -c 'state' /home

# Kullanıcı limiti tanımla
sudo xfs_quota -x -c 'limit -u bsoft=5g bhard=6g isoft=10000 ihard=12000 ahmet' /home

# Tüm kullanıcıların raporunu al
sudo xfs_quota -x -c 'report -ubih' /home

XFS’te quotacheck veya quotaon komutlarına gerek yoktur, bu açıdan daha temiz bir deneyim sunar.

Gerçek Dünya Senaryosu: Hosting Ortamı

Diyelim ki küçük ölçekli bir web hosting sunucusu yönetiyorsunuz. Her müşteriye farklı planlarda farklı disk alanı satıyorsunuz. Bu yapıyı otomatize etmek için şöyle bir betik yazabilirsiniz:

#!/bin/bash
# Yeni hosting hesabı oluştur ve kota ata
# Kullanım: ./create_hosting.sh kullanici_adi plan (basic|pro|enterprise)

USERNAME=$1
PLAN=$2

if [ -z "$USERNAME" ] || [ -z "$PLAN" ]; then
    echo "Kullanim: $0 kullanici_adi plan"
    exit 1
fi

# Plan bazlı limitler (KB cinsinden)
case $PLAN in
    basic)
        SOFT=5000000    # ~5 GB
        HARD=5500000    # ~5.5 GB
        ISOFT=50000
        IHARD=55000
        ;;
    pro)
        SOFT=20000000   # ~20 GB
        HARD=22000000   # ~22 GB
        ISOFT=200000
        IHARD=220000
        ;;
    enterprise)
        SOFT=100000000  # ~100 GB
        HARD=110000000  # ~110 GB
        ISOFT=0
        IHARD=0
        ;;
    *)
        echo "Gecersiz plan: $PLAN"
        exit 1
        ;;
esac

# Kullaniciyi oluştur
sudo useradd -m -d /home/$USERNAME -s /bin/bash $USERNAME

# Kota ata
sudo setquota -u $USERNAME $SOFT $HARD $ISOFT $IHARD /home

echo "Kullanici $USERNAME olusturuldu. Plan: $PLAN"
echo "Disk limiti: Soft=$(($SOFT/1000))MB Hard=$(($HARD/1000))MB"
sudo quota -vs $USERNAME

Bu betik sayesinde yeni müşteri eklemek tek komuta indirgeniyor.

Sık Karşılaşılan Sorunlar ve Çözümleri

Quota bilgileri güncel değil:

quotacheck komutunu manuel çalıştırarak veritabanını yeniden tarayabilirsiniz. Bunu yapmadan önce quotaoff ile sistemi durdurun:

sudo quotaoff /home
sudo quotacheck -ugm /home
sudo quotaon /home

edquota değişiklikleri kaybolmuş görünüyor:

Bu genellikle kota veritabanı dosyalarının izin sorunlarından kaynaklanır. Kontrol edin:

ls -la /home/aquota.*
# Her ikisi de root'a ait ve 600 izinli olmalı
sudo chmod 600 /home/aquota.*

Sistem açılışında quota otomatik aktif olmuyor:

/etc/fstab değişikliklerinin doğru uygulandığını ve systemd servisinin çalıştığını kontrol edin:

sudo systemctl status quota
sudo systemctl enable quota

Bazı dağıtımlarda bu servis bulunmaz ve quotaon komutunu rc.local ya da bir systemd unit dosyasıyla başlangıca eklemeniz gerekebilir.

Sonuç

Disk kotası yönetimi, görünürde basit bir araç gibi görünse de doğru konfigüre edildiğinde sistemin uzun vadeli stabilitesini ciddi ölçüde artırır. Kullanıcıların birbirini ezmesini önler, sistem diskinin dolmasından kaynaklanan kritik servis kesintilerini engeller ve kaynak kullanımını şeffaf hale getirir.

Pratikte en çok işe yarayan yaklaşım şudur: önce inode limitleri olmadan yalnızca blok limitleriyle başlayın, bir süre repquota raporlarıyla gerçek kullanım alışkanlıklarını izleyin, ardından inode limitlerini de ekleyin. Bunun yanı sıra soft/hard limit arasındaki farkı %10-20 düzeyinde tutmak makul bir esneklik sağlar.

XFS üzerindeyseniz xfs_quota‘nın sunduğu proje kotası özelliğini de araştırmanızı öneririm. Dizin bazlı kota tanımlamak, özellikle /var/www altındaki farklı projeleri sınırlamak için kullanıcı kotasından çok daha temiz bir çözüm sunar. Her araç gibi quota da doğru yerde kullanıldığında hayatı kolaylaştırır.

Yorum yapın