Bölüm 10: Dosya Sistemleri

İşletim Sistemleri
Dosya kavramı ve özniteliklerDosya işlemleriAçık dosya tabloları ve fdErişim yöntemleriDizin yapıları ve yol çözümlemeKatı ve sembolik bağlarBağlama ve koruma (rwx, ACL)MBR, GPT ve süperblokBitişik, bağlı, FAT, i-nodeBoş alan yönetimiÖnbellek ve performansfsck, günlükleme, CoW, LFSNTFS, ext4, FAT32, exFATVFS, NFS ve SSD
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Giriş

Öğrenme Çıktıları

Dosya soyutlaması

Dosyayı adı, türü, öznitelikleri ve işlemleriyle tanımlamak; açık dosya tablolarını ve dosya tanımlayıcılarını izlemek.

Dizinler

Dizin yapılarını karşılaştırmak, bir yolu adım adım çözmek, katı/sembolik bağ ve bağlamayı (mount) açıklamak.

Koruma

rwx izin bitlerini ve özel bitleri okumak; POSIX ve NTFS ACL'lerini karşılaştırmak.

Tahsis

Bitişik, bağlı liste, FAT ve i-node tahsisini aynı dosya üzerinde uygulamak; en büyük dosya boyutunu hesaplamak.

Boş alan ve performans

Biteşlem, liste, gruplama ve sayma yöntemlerini hesaplamak; tampon/sayfa önbelleğini ve önden okumayı açıklamak.

Güvenilirlik ve gerçek sistemler

fsck, günlükleme, CoW ve LFS'i karşılaştırmak; NTFS, ext4, FAT32/exFAT, VFS, NFS ve SSD TRIM'i tanımak.

Giriş

Neden Dosya Sistemi?

  • Üç gereksinim: çok büyük veri (adres uzayına sığmaz), kalıcılık (süreç bitince de kalır), eşzamanlı erişim (birçok süreç aynı veriyi kullanır).
  • Disk yalnızca numaralı bloklar sunar: “k. bloğu oku / yaz”. Dosya sistemi bunun üzerine dosya ve dizin soyutlamasını kurar.
  • Dosya, bellekteki adres uzayına benzeyen mantıksal bir birimdir; süreçler oluşturur, işletim sistemi yönetir: adlandırma, yapı, erişim, koruma, yerleşim.
  • İki bakış açısı:
    • Kullanıcı: ad, tür, dizin, izin, işlem — ne görünüyor?
    • Gerçekleştirici: bloklar nasıl tahsis edilir, boş alan nasıl izlenir, çökme sonrası tutarlılık nasıl sağlanır?
Uygulamaopen · read · write · closeDosya soyutlamasıad · bayt dizisi · özniteliklerDosya sistemidosya ofseti → blok numarasıBlok aygıtı (SSD / HDD)LBA 0 … N−1 · 512 B / 4 KiBdisk = numaralı sabit boyutlu bloklar

Dosya Kavramı

Dosya Adlandırma

Dosya sistemiAd uzunluğuBüyük/küçük harfNot
FAT (MS-DOS)8.3 (ör. RAPOR~1.TXT)duyarsızVFAT uzun adı ek girdilerde: 255 UTF-16
NTFS255 UTF-16 birimikorur, duyarsız\ / : * ? " < > | yasak
ext4, XFS255 baytduyarlıyalnız / ve NUL yasak
APFS255 UTF-8 karaktermacOS'ta varsayılan duyarsızUnicode normalizasyonu
Uzantı (sonek)

Ad içinde noktadan sonraki kısım: tez.pdf. UNIX'te yalnızca gelenektir; çekirdek anlam yüklemez, ama programlar yükleyebilir (gcc .c ile .o'yu ayırır).

Windows

Uzantı, kayıt defterinde (registry) bir programla ilişkilendirilir; çift tıklayınca o program açılır. Gizli uzantı tuzağı: fatura.pdf.exe.

Eski Windows sürümleri FAT16/FAT32, güncel Windows NTFS kullanır; FAT32 ve exFAT bugün USB bellek ve SD kartlarda yaşar. Adlar Unicode saklanır; Türkçe karakter sorun değildir.

Dosya Kavramı

Uzantılar ve Sihirli Sayılar

GrupUzantılar ve açılımları
Belgedocx Word (Office Open XML), doc eski ikili Word, pdf Portable Document Format, odt OpenDocument, rtf, txt
Görseljpg JPEG, png Portable Network Graphics, gif, bmp bitmap, tiff; yeni: webp, avif, heic
Ses / videomp3 MPEG-1 Audio Layer III, wav, m4a, flac; mp4 MPEG-4 Part 14, mkv, webm, mov; flv artık eski
Tablo / sunumxlsx, csv Comma-Separated Values, pptx, odp
Webhtml HyperText Markup Language, css Cascading Style Sheets, js JavaScript
Yürütülebilirexe Windows PE, msi Windows Installer; Linux'ta ELF uzantısızdır, kütüphane .so
Arşivzip, 7z, rar, tar Tape Archive, gz gzip, zst Zstandard
dosyanın ilk baytlarıPNG89 50 4E 47‰PNGPDF25 50 44 46%PDFELF7F 45 4C 46.ELFZIP · docx · pptx50 4B 03 04PK..Windows PE4D 5AMZgzip1F 8B..

Tür, uzantıdan bağımsız olarak sihirli sayı ile de anlaşılır: file rapor komutu bunu yapar. docx/xlsx/pptx aslında ZIP arşividir.

Dosya Kavramı

Dosya Yapısı

(a) Bayt dizisi1 bayt = en küçük birimUNIX, Windows, macOSanlamı uygulama verir(b) Sabit uzunluklu kayıtlarkayıt 1 · 80 baytkayıt 2 · 80 baytkayıt 3 · 80 baytkayıt 4 · 80 baytkayıt 5 · 80 baytkayıt 6 · 80 baytdelikli kart imajı (80 sütun)bugün: anabilgisayar veri kümeleri(c) Anahtarlı kayıt ağacıDog · PonyAnt Cat CowFox Hen LionRat Wormkayıt, anahtar alanıyla bulunurbugün: veritabanı / B-ağacı dosyaları
  • Maksimum esneklik: işletim sistemi dosyayı yalnızca bayt dizisi olarak görür; içine her şey konabilir, yapıyı uygulama belirler.
  • Kayıt yapısında okuma/yazma birimi kayıttır; ağaç yapısında “anahtarı Pony olan kaydı getir” gibi istekler doğrudan desteklenir.
  • Bugün yapılandırılmış erişim işletim sisteminde değil, kütüphanelerde ve veritabanlarında (SQLite, B+ ağaçları) gerçekleştirilir.

Dosya Kavramı

Dosya Türleri

  • Normal dosyalar kullanıcı verisini tutar: metin (satırlar, yazdırılabilir karakterler, satır sonu LF ya da CRLF) veya ikili (yapısını program bilir).
  • Dizinler, dosya sisteminin yapısını tutan sistem dosyalarıdır.
  • Özel dosyalar G/Ç aygıtlarını modeller: karakter aygıtı (yazıcı, terminal) ve blok aygıtı (disk).
  • “Her şey bir dosyadır”: aynı open/read/write arayüzü aygıtlar, borular ve soketler için de çalışır. Tablodaki harf ls -l çıktısının ilk karakteridir.
HarfTürÖrnek
-normal dosya (metin ya da ikili)notlar.txt, /bin/ls
ddizin/home
lsembolik bağ/bin → usr/bin
ckarakter aygıtı (seri, bayt bayt)/dev/tty, /dev/null
bblok aygıtı (blok blok, rastgele)/dev/nvme0n1, /dev/sda
padlandırılmış boru (FIFO)mkfifo kanal
sUNIX soketi/run/systemd/notify

Dosya Kavramı

İkili Dosyalar: Yürütülebilir ve Arşiv

(a) Eski UNIX a.outsihirli sayımetin boyutuveri boyutuBSS boyutusembol tablosu boyutugiriş noktasımetin (kod)veriyer değiştirme bitlerisembol tablosubaşlık + bölümler(b) Bugün: ELF (Linux)ELF başlığı · 7F 45 4C 46program başlıkları.text (kod).rodata.data.symtab · .strtabbölüm başlıklarıWindows: PE · macOS: Mach-O(c) Arşiv (.a / .lib)!<arch> başlığıüye başlığı: ad · boyutnesne modülü (.o)üye başlığı: ad · boyutnesne modülü (.o)üye başlığı: ad · boyutnesne modülü (.o)bağlanmamış, derlenmiş modüller

Her işletim sistemi kendi yürütülebilir biçimini tanır; çekirdek dosyayı yalnızca doğru sihirli sayıyla başlıyorsa çalıştırır. Eski sunumdaki “.exe” etiketi UNIX dosyası için yanlıştı: Tanenbaum'un şekli eski UNIX a.out biçimidir; arşiv uzantısı .a, içindeki modüller .o'dur.

Dosya Kavramı

Dosya Öznitelikleri

ÖznitelikAnlamNerede / nasıl
Ad, tür, konumdizin girdisindeki ad; i-node/MFT kaydındaki tür ve blok adresleritüm sistemler
Boyutmantıksal boyut (st_size) ve ayrılmış alan (st_blocks)seyrek dosyada ikisi farklıdır
Sahip, grupUID / GID; Windows'ta SIDchown, icacls
Korumarwx bitleri, ACLchmod, setfacl
Zaman damgalarıerişim (atime), içerik değişimi (mtime), i-node değişimi (ctime), oluşturma (btime)stat; Linux'ta relatime
Bağ sayısıdosyaya işaret eden ad sayısı0 olunca bloklar serbest
Read-only, Hidden, Systemsalt okunur, gizli, sistem dosyasıWindows attrib; UNIX'te gizli = ad . ile başlar
Archiveson yedekten sonra değişti, yedeklenecekWindows; yedekleme aracı sıfırlar
Compressed, Encryptedsıkıştırılmış / şifrelenmişNTFS, Btrfs, APFS; fscrypt, BitLocker
Sparse, Temporarysıfır blokları diskte yok; geçici (önbellek ipucu)NTFS bayrakları
Reparse pointözel işleme: sembolik bağ, junction, bulut yer tutucuNTFS
Genişletilmiş öznitelikad = değer çiftlerixattr (SELinux etiketi), NTFS ADS

Eski listedeki Symlink, Device, Junction öznitelik değil dosya türüdür; Temporary dosyayı kendiliğinden silmez (yalnızca yazmayı geciktirme ipucu); Creator ve Max size eski sistemlere aittir.

Dosya Kavramı

stat Yapısı ve ls -l

struct stat {
  dev_t     st_dev;      /* aygıt (dosya sistemi)  */
  ino_t     st_ino;      /* i-node numarası        */
  mode_t    st_mode;     /* tür + izin bitleri      */
  nlink_t   st_nlink;    /* katı bağ sayısı         */
  uid_t     st_uid;      /* sahip kullanıcı         */
  gid_t     st_gid;      /* sahip grup              */
  dev_t     st_rdev;     /* aygıt dosyası ise no.   */
  off_t     st_size;     /* boyut (bayt)            */
  blksize_t st_blksize;  /* tercih edilen G/Ç boyu  */
  blkcnt_t  st_blocks;   /* ayrılmış 512 B birim    */
  struct timespec st_atim; /* son erişim   */
  struct timespec st_mtim; /* son içerik   */
  struct timespec st_ctim; /* son i-node   */
};
$ ls -l b.txt-rwxr-x---türsahipgrupdiğer1→ katı bağ sayısı (st_nlink)root root→ sahip ve grup81→ boyut, bayt (st_size)May 26 19:20→ son değişiklik (mtime)b.txt→ ad: dizin girdisinden gelirad i-node'da değil, dizindedir!

Eski sunumdaki yapıda st_mtime/st_ctime, st_blksize ve st_blocks eksikti; POSIX.1-2008'den beri zamanlar nanosaniyeli struct timespec alanlarıdır (st_atime makro olarak kalır). Linux'ta oluşturma zamanı statx() ile okunur.

Dosya Kavramı

Dosya İşlemleri ve Sistem Çağrıları

İşlemPOSIX çağrısıNe yapar?
Createopen(O_CREAT), creatboş dosya ve dizin girdisi oluşturur, öznitelikleri atar
Deleteunlinkadı siler; bağ sayısı 0 olup son tanımlayıcı da kapanınca alan boşalır
Openopenyolu çözer, i-node'u belleğe alır, tanımlayıcı (fd) döndürür
Closeclosefd'yi ve gerekirse tablo girdilerini serbest bırakır
Read / Writeread, writedosya konumundan itibaren okur / yazar, konumu ilerletir
Appendopen(O_APPEND)her yazma atomik olarak dosya sonuna gider
Seeklseekkonumu değiştirir (rastgele erişim); G/Ç yapmaz
Get / Set attributesstat, chmod, chown, utimensatöznitelikleri okur / değiştirir
Renamerenameadı değiştirir; aynı dosya sisteminde atomiktir
Truncate, Mapftruncate, mmapboyutu kısaltır/uzatır; dosyayı adres uzayına eşler

Güvenli kaydetme kalıbı: yeni içeriği geçici dosyaya yaz → fsync → rename(gecici, asil). Çökme olursa ya eski ya yeni dosya görünür, yarım dosya görünmez.

Dosya Kavramı

Açık Dosya Tabloları

Süreç A · fd tablosu0 stdin1 stdout2 stderr3Süreç B (A'nın çocuğu)0 stdin1 stdout2 stderr34Sistem geneli açık dosya tablosukonum = 4096O_RDONLYref = 2konum = 0O_RDWRref = 1Bellek içi i-node tablosui-node 4711boyut = 6000ref = 2diskteki i-node + bloklaropen()fork() paylaşır
  • fd: çekirdeğin süreç başına tablosunda bir indis; 0, 1, 2 standart girdi/çıktı/hata, open en küçük boş numarayı verir.
  • Açık dosya girdisi konumu (offset) ve erişim kipini tutar: fork ve dup girdiyi paylaşır (ortak konum); ikinci bir open yeni girdi açar (ayrı konum).
  • i-node dosya başına bir kez bellektedir; diskte birden çok açılış onu tekrar okumaz. Windows'ta karşılığı tanıtıcı (handle) tablosudur.

Dosya Kavramı · Kodu adım adım çalıştır

open, read, close Adım Adım

#include <fcntl.h>
#include <unistd.h>

int main(void) {
  char buf[4096];
  int fd = open("notlar.txt", O_RDONLY);
  ssize_t n = read(fd, buf, sizeof buf);
  n = read(fd, buf, sizeof buf);
  n = read(fd, buf, sizeof buf);
  close(fd);
  return 0;
}
fd tablosu0 tty1 tty2 tty3notlar.txt (6000 bayt)0 – 40954096 – 5999

Başlangıç: yalnız 0, 1, 2 açık (kabuktan miras: terminal).

fd tablosu0 tty1 tty2 tty3açık dosya girdisikonum = 0O_RDONLYref = 1i-node 4711boyut 6000ref = 1notlar.txt (6000 bayt)0 – 40954096 – 5999konum

open: yol çözülür, i-node 4711 belleğe alınır, konumu 0 olan bir açık dosya girdisi kurulur; en küçük boş numara 3 döner.

fd tablosu0 tty1 tty2 tty3açık dosya girdisikonum = 4096O_RDONLYref = 1i-node 4711boyut 6000ref = 1notlar.txt (6000 bayt)0 – 40954096 – 5999konum

İlk read: blok(lar) önbelleğe/okunur, 4096 bayt buf'a kopyalanır, konum 4096 olur.

fd tablosu0 tty1 tty2 tty3açık dosya girdisikonum = 6000O_RDONLYref = 1i-node 4711boyut 6000ref = 1notlar.txt (6000 bayt)0 – 40954096 – 5999konum

İkinci read: dosyada yalnız 1904 bayt kaldı; kısa okuma hata değildir. Konum 6000.

fd tablosu0 tty1 tty2 tty3açık dosya girdisikonum = 6000O_RDONLYref = 1i-node 4711boyut 6000ref = 1notlar.txt (6000 bayt)0 – 40954096 – 5999konum

Üçüncü read 0 döndürür: dosya sonu (EOF). Hata olsaydı −1 ve errno.

fd tablosu0 tty1 tty2 tty3girdi serbestref = 0notlar.txt (6000 bayt)0 – 40954096 – 5999

close: fd 3 boşalır; girdinin başvuru sayısı 0 → silinir, i-node'un da 0 → bellekten atılabilir.

Dosya Kavramı · Kodu adım adım çalıştır

Dosya Kopyalama: copy abc xyz

#define BUF 4096

int kopyala(const char *src, const char *dst) {
  char buf[BUF];
  int in  = open(src, O_RDONLY);
  int out = open(dst, O_WRONLY | O_CREAT
                      | O_TRUNC, 0644);
  ssize_t n;
  while ((n = read(in, buf, BUF)) > 0)
    write(out, buf, n);
  close(in);
  close(out);
  return 0;
}
abc (10000 bayt)tampon(4096 B)xyz

in = 3; out = 4. O_TRUNC: xyz varsa içeriği silinir, yoksa O_CREAT ile 0644 izinle oluşturulur.

abc (10000 bayt)tampon(4096 B)4096 baytxyzread

İlk read: 4096 bayt tampona.

abc (10000 bayt)tampon(4096 B)4096 baytxyzwrite

write aynı 4096 baytı xyz'ye yazar (önce sayfa önbelleğine; diske sonra gider).

abc (10000 bayt)tampon(4096 B)4096 baytxyzwrite

İkinci tur: 8192 bayt kopyalandı.

abc (10000 bayt)tampon(4096 B)1808 baytxyzwrite

Üçüncü read yalnız 1808 bayt döndürür; write tam n bayt yazar (BUF değil!).

abc (10000 bayt)tampon(4096 B)xyz

read 0 → döngü biter; iki tanımlayıcı kapatılır. Toplam 4 read + 3 write çağrısı.

Gerçek kodda her çağrının −1 dönüşü denetlenmeli ve write'ın kısa yazması döngüyle tamamlanmalıdır; eski sunumdaki kod bildirimsiz değişkenler ve izin argümanı olmayan O_CREAT içeriyordu.

Dosya Kavramı

Erişim Yöntemleri

Sıralı erişim0123456geçerli konumrewind (başa sar)read next · write nextteyp, günlük, akışDoğrudan (rastgele) erişim0123456read 5lseek(fd, 5·B, SEEK_SET)disk, veritabanı, mmapİndeksli erişimindeksAdaKaanSelinZeynepkayıt bloklarıblok 1blok 4blok 7blok 10anahtar → indeks → blokISAM, B+ ağacı
  • Sıralı: baştan sona sırayla; atlama yerine sarma. Teyp ve kaset böyleydi; bugün de günlük dosyaları ve akışlar için en yaygın kalıptır.
  • Doğrudan: dosya numaralı bloklar/kayıtlar dizisidir; istenen yerden başlanır (lseek, pread). Diskler ve SSD'ler bunu destekler.
  • İndeksli: küçük bir indeks (gerekirse indeksin indeksi) anahtarla doğru bloğu bulur; doğrudan erişimin üzerine kurulur.
  • Bellek eşlemeli erişimde (mmap) dosya sayfaları adres uzayına eşlenir; okuma/yazma sıradan bellek erişimidir.

Dizinler

Dizin İşlemleri

Çağrıİşlev
mkdirboş dizin oluşturur (içinde yalnız . ve ..)
rmdirdizini siler; dizin boş olmalıdır
opendir / closedirdizin akışını açar / kapatır
readdiraçık dizindeki bir sonraki girdiyi (ad, i-node no., tür) döndürür
renamedosya ya da dizini yeniden adlandırır veya taşır (aynı dosya sisteminde atomik)
linkvar olan bir dosyaya yeni bir ad (katı bağ) ekler; i-node'un bağ sayısı artar
symlinkhedef yolunu içeren sembolik bağ oluşturur
unlinkbir adı kaldırır; bağ sayısı 0 olursa dosya silinir
  • Dizin de bir dosyadır: içeriği (ad → dosya) eşlemeleridir; ama kullanıcı onu write ile değil, yalnızca bu çağrılarla değiştirebilir.
  • Eski listedeki “Link, dizini başka bir dizine bağlar” ifadesi yanlıştı: link dosyaya ikinci bir ad verir; dizinlere katı bağ kullanıcıya yasaktır (döngü önlenir).

Dizinler · Adım adım

Dizin Yapıları

tek dizin (kök)catboatestdatamailconthexrecordsTüm kullanıcıların dosyaları aynı yerde: iki kullanıcı da “test” adını isteyemez,dosyalar gruplanamaz. İlk sistemler (CDC 6600) ve bazı gömülü aygıtlar böyleydi.

Tek düzeyli: basit, ama adlandırma ve gruplama sorunları var.

ana dosya dizini (MFD)aliayşecanececatbotestadatatestxdataaKullanıcı başına dosya dizini (UFD): ad çakışması yok (ali/test ≠ can/test), ama paylaşım ve gruplama zor.

İki düzeyli: yol = kullanıcı/dosya. Sistem programları için ayrı bir “kullanıcı” dizini gerekir; aranacak dizin listesi (search path) fikri buradan gelir.

/binhomeusraliayşeliblsnotlar.txtodevfoto.pngproje.c

Ağaç (hiyerarşik): kullanıcı istediği kadar alt dizin açar; her dosyanın tek bir mutlak yolu vardır. Bugünkü tüm genel amaçlı sistemlerin temeli.

/binhomeusraliayşeliblsnotlar.txtodevfoto.pngortakproje.caynı dosya, iki ad

Döngüsüz çizge (DAG): proje.c hem ali/odev hem ayşe/ortak altında görünür (bağ). Sorun: dolaşırken iki kez sayılabilir, silerken kimin silindiği belirsizleşir.

/binhomeusraliayşeliblsnotlar.txtodevfoto.pngortakproje.cortak/geri → homedöngü!

Genel çizge: dizine bağ verilirse döngü oluşur; arama sonsuza gidebilir, erişilemeyen döngüler için çöp toplama gerekir. UNIX bu yüzden dizinlere katı bağı yasaklar.

Dizinler

Yol Adları

  • Mutlak yol kökten başlar: /home/sercan/os/slaytlar. Windows: C:\Users\sercan\os; ağ paylaşımı \\sunucu\pay.
  • Göreli yol çalışma dizininden (pwd, cd) başlar: /home/sercan/ders içindeyken ../os/slaytlar.
  • . bulunulan dizin, .. üst dizin; kökte .. yine köke çıkar.
  • Ayırıcı UNIX'te /, Windows'ta \ (API /'yi de kabul eder).
/binetchomeusrdevsercanlibdersosslaytlarpasswdçalışma dizini../os/slaytlar

Eski sunumdaki /usr/sercan örneği tarihseldir; bugün kullanıcı dizinleri /home (macOS'ta /Users) altındadır, /usr salt okunur sistem yazılımı içindir.

Dizinler · Adım adım

Yol Çözümleme Adım Adım

kök dizin1.1..4bin7dev14lib9etc6usr8tmp

Mutlak yol: kök dizinin i-node'u (UNIX'te 1; ext4'te 2) bilinir. Kök dizinde usr aranır → i-node 6.

kök dizin1.1..4bin7dev14lib9etc6usr8tmpi-node 6mod, boyut,zamanlar …→ blok 132

i-node 6 okunur: /usr bir dizin, içeriği blok 132'de. (Burada izin denetimi de yapılır: dizinde x hakkı gerekir.)

kök dizin1.1..4bin7dev14lib9etc6usr8tmpi-node 6mod, boyut,zamanlar …→ blok 132blok 132: /usr6.1..19dick30erik51jim26ast45bal

Blok 132 okunur, ast aranır → i-node 26.

kök dizin1.1..4bin7dev14lib9etc6usr8tmpi-node 6mod, boyut,zamanlar …→ blok 132blok 132: /usr6.1..19dick30erik51jim26ast45bali-node 26mod, boyut,zamanlar …→ blok 406

i-node 26: /usr/ast dizininin içeriği blok 406'da.

kök dizin1.1..4bin7dev14lib9etc6usr8tmpi-node 6mod, boyut,zamanlar …→ blok 132blok 132: /usr6.1..19dick30erik51jim26ast45bali-node 26mod, boyut,zamanlar …→ blok 406blok 406: /usr/ast26.6..64grants92books60mbox81minix17srci-node 60/usr/ast/mbox

Blok 406'da mbox → i-node 60. Önbelleksiz 5 disk okuması; Linux bu yüzden ad → i-node eşlemelerini dentry önbelleğinde tutar.

Örnek Tanenbaum'un şeklidir (eski sunumda “mbox.conf” yazıyordu; doğrusu /usr/ast/mbox). Göreli yolda arama kök yerine çalışma dizininin i-node'undan başlar.

Dizinler · Adım adım

Katı ve Sembolik Bağlar

dizin /home/alia.txt812i-node 812tür: normal dosyabağ sayısı = 1"merhaba\n"

echo merhaba > a.txt: dizin girdisi a.txt → i-node 812, bağ sayısı 1.

dizin /home/alia.txt812b.txt812i-node 812tür: normal dosyabağ sayısı = 2"merhaba\n"

ln a.txt b.txt (katı bağ): yeni girdi aynı i-node'u gösterir; bağ sayısı 2. İki ad eşittir, “asıl” yoktur.

dizin /home/alia.txt812b.txt812c.txt905i-node 812tür: normal dosyabağ sayısı = 2"merhaba\n"i-node 905tür: sembolik bağ"a.txt"ad üzerinden yeniden çözülür

ln -s a.txt c.txt (sembolik bağ): kendi i-node'u (905) olan küçük bir dosya; içeriği hedefin yoludur.

dizin /home/alia.txtsilindi (rm)b.txt812c.txt905i-node 812tür: normal dosyabağ sayısı = 1"merhaba\n"i-node 905tür: sembolik bağ"a.txt"a.txt yok → ENOENT (askıda bağ)

rm a.txt: bağ sayısı 1 → veri durur, b.txt çalışır. c.txt askıda kalır. (Tanenbaum: sahip C silince B'nin bağı kalır ama i-node sahibi hâlâ C'dir — kota C'ye yazılır.)

Katı bağ: aynı dosya sistemi içinde, dizinlere değil, ek maliyet yok. Sembolik bağ: dizinlere, başka dosya sistemlerine, hatta ağ yollarına gösterebilir; her erişimde ek yol çözümü gerekir, döngüleri çekirdek sınırlar (ELOOP). Windows: mklink /H, mklink, junction.

Dizinler · Adım adım

Bağlama (Mounting)

kök dosya sistemi (/dev/nvme0n1p2, ext4)/binhomemntusbeski.txtUSB bellek (/dev/sdb1, exFAT)kökfotobelgelerhenüz ağaçta değil

İki ayrı dosya sistemi. /mnt/usb sıradan bir dizin ve içinde eski.txt var.

kök dosya sistemi (/dev/nvme0n1p2, ext4)/binhomemntusbfotobelgelerUSB kökü /mnt/usb'nin yerini aldı/mnt/usb/foto → USB'deki fotoeski.txt geçici olarak gizli

mount /dev/sdb1 /mnt/usb: çekirdek bağlama tablosuna kayıt ekler; yol çözümü /mnt/usb'ye gelince USB'nin kök i-node'una atlar. Eski içerik gizlenir, silinmez.

kök dosya sistemi (/dev/nvme0n1p2, ext4)/binhomemntusbeski.txtUSB bellek (/dev/sdb1, exFAT)kökfotobelgelerayrıldı (umount)

umount /mnt/usb: açık dosya yoksa ayrılır (yoksa EBUSY); eski.txt yeniden görünür.

Açılışta kök dosya sistemi bağlanır, diğerleri /etc/fstab veya systemd birimleriyle; findmnt ağacı gösterir. Windows her birime sürücü harfi (C:, D:) verir, ama NTFS boş bir klasöre de bağlayabilir. Bağlama noktasından geçerken izinler ve nosuid, noexec, ro gibi seçenekler uygulanır.

Koruma

Erişim Hakları: rwx

setuid1×4setgid0×2sticky0×1r1×4w1×2x1×1r1×4w0×2x1×1r1×4w0×2x1×1özel bitler= 4sahip (u)= 7grup (g)= 5diğer (o)= 5örnek: chmod 4755 → -rwsr-xr-x (setuid + rwx r-x r-x)
HakDosyadaDizinde
riçeriği okugirdileri listele (ls)
wiçeriği değiştirgirdi ekle/sil/yeniden adlandır (dosyanın kendi izni önemsiz!)
xprogram olarak çalıştıriçinden geç (yol çözümü, cd)
  • Denetim sırası: sahip mi? → sahip hakları; değilse grupta mı? → grup hakları; değilse diğer. İlk eşleşen kullanılır.
  • setuid: program dosya sahibinin kimliğiyle çalışır (passwd). sticky dizinde: herkes yazabilir ama yalnız sahip siler (/tmp: drwxrwxrwt). Eski sunumdaki -rwxrwx--T: sticky açık, diğerlerinde x yok → büyük T.

Koruma

Erişim Denetim Listeleri (ACL)

$ setfacl -m u:ayse:rw- rapor.txt
$ getfacl rapor.txt
# file: rapor.txt
# owner: ali   # group: ogr
user::rw-
user:ayse:rw-      <- adlı kullanıcı
group::r--
mask::rw-          <- üst sınır
other::---
POSIX ACL (Linux)

rwx üçlüsünün üzerine adlı kullanıcı/grup girdileri; mask grup sınıfının en fazla alabileceği hakkı sınırlar; ls çıktısında + görünür.

NTFS ACL (Windows)

Güvenlik tanımlayıcısında DACL: sıralı izin ver / reddet ACE'leri (SID + hak maskesi), açık reddet önce gelir; klasörden kalıtılır. Araç: icacls.

YaklaşımArtıEksi
ACL (nesne başına)“bu dosyaya kim erişir?” kolayliste uzar, yönetim zor
rwx (sahip/grup/diğer)9 bit, hızlıkaba taneli
Yetenek (capability)“bu süreç ne yapabilir?” kolaygeri alma zor

Paylaşım anlambilimi: UNIX'te yazma diğer süreçlere hemen görünür; AFS gibi dağıtık sistemlerde değişiklik dosya kapatılınca (oturum anlambilimi) yayılır.

Disk Düzeni

Disk Bölümleme: MBR ve GPT

MBR (BIOS, 1983)LBA 0512 Bkod 446 Bönyükleyici4 × 16 Bbölüm tablosu55 AABölüm 1 (etkin)Bölüm 2genişletilmiş → mantıksalen fazla 4 birincil bölüm; 32 bit LBA × 512 B ⇒ 2 TiB sınırıGPT (UEFI, 2000'ler)LBA 0koruyucu MBRLBA 1GPT başlığıLBA 2–33128 girdi × 128 BESPFAT32, 100+ MiBWindowsNTFSLinuxext4 / Btrfsyedek girdison LBA'laryedek başlıkson LBA64 bit LBA, 128 bölüm, CRC32 sağlama, disk sonunda yedek; her bölümün GUID'i ve tür GUID'i var
  • Disk bir veya daha çok bölüme (partition) ayrılır; her bölümde ayrı bir dosya sistemi olabilir (ya da takas alanı, LVM, şifreli kap).
  • MBR'nin sonunda bölüm tablosu: her girdi başlangıç ve uzunluk tutar; BIOS yalnızca etkin işaretli bölümden açılır.
  • GPT UEFI standardının parçasıdır; 2 TiB üzeri diskler ve Windows 11 için gereklidir. Koruyucu MBR, eski araçların diski “boş” sanmasını önler.

Disk Düzeni · Adım adım

Açılış: BIOS/MBR ve UEFI/GPT

BIOS + MBR (eski)UEFI + GPT (bugün)BIOS / POSTUEFI / POSTMBR kodu (446 B)NVRAM önyüklemegirdisietkin bölümünönyükleme bloğuESP: \EFI\…\*.efiönyükleyici(GRUB, NTLDR)GRUB veya WindowsBoot Managerçekirdekçekirdek +initramfs

Güç verilince donanım sınaması (POST). BIOS 16 bit gerçek kipte çalışır; UEFI 32/64 bit, kendi sürücüleri ve dosya sistemi desteğiyle.

BIOS + MBR (eski)UEFI + GPT (bugün)BIOS / POSTUEFI / POSTMBR kodu (446 B)NVRAM önyüklemegirdisietkin bölümünönyükleme bloğuESP: \EFI\…\*.efiönyükleyici(GRUB, NTLDR)GRUB veya WindowsBoot Managerçekirdekçekirdek +initramfs

BIOS diskin ilk sektörünü (MBR) belleğe alıp çalıştırır. UEFI ise NVRAM'deki önyükleme girdilerini (efibootmgr) okur; sektör değil dosya arar.

BIOS + MBR (eski)UEFI + GPT (bugün)BIOS / POSTUEFI / POSTMBR kodu (446 B)NVRAM önyüklemegirdisietkin bölümünönyükleme bloğuESP: \EFI\…\*.efiönyükleyici(GRUB, NTLDR)GRUB veya WindowsBoot Managerçekirdekçekirdek +initramfs

MBR kodu bölüm tablosunda etkin bölümü bulur ve onun ilk bloğunu (önyükleme bloğu) çalıştırır. UEFI ESP'deki (FAT32) .efi programını yükler; etkin bayrağı kullanılmaz.

BIOS + MBR (eski)UEFI + GPT (bugün)BIOS / POSTUEFI / POSTMBR kodu (446 B)NVRAM önyüklemegirdisietkin bölümünönyükleme bloğuESP: \EFI\…\*.efiönyükleyici(GRUB, NTLDR)GRUB veya WindowsBoot Managerçekirdekçekirdek +initramfs

Önyükleyici çekirdeği bulur, belleğe yükler; gerekirse menü sunar. Güvenli Önyükleme (Secure Boot) imzaları bu aşamada doğrular.

BIOS + MBR (eski)UEFI + GPT (bugün)BIOS / POSTUEFI / POSTMBR kodu (446 B)NVRAM önyüklemegirdisietkin bölümünönyükleme bloğuESP: \EFI\…\*.efiönyükleyici(GRUB, NTLDR)GRUB veya WindowsBoot Managerçekirdekçekirdek +initramfs

Çekirdek başlar, kök dosya sistemini bağlar (initramfs ile) ve ilk kullanıcı sürecini (systemd) çalıştırır.

Eski sunum yalnızca BIOS/MBR akışını anlatıyordu; 2020'den beri PC'ler UEFI ile gelir ve uyumluluk kipi (CSM) çoğunlukla kaldırılmıştır. Ayrıntı: Bölüm 2 (açılış süreci).

Disk Düzeni

Dosya Sistemi Düzeni

DiskMBR / GPTbölüm 1bölüm 2bölüm 3önyüklemebloğusüperblokboyut, blok sayısıboş alanbiteşlem / listei-node'lardosya başına 1kök dizindosyalar ve dizinlerveri bloklarıext4: bölüm blok gruplarına ayrılır (her biri 128 MiB, 4 KiB blokta 32768 blok)grup 0grup 1grup 2…grup nsüperblok*grup tanımlayıcıblok biteşlemii-node biteşlemii-node tablosuveri blokları* süperblok ve tanımlayıcıların yedekleri bazı gruplarda tutulur
  • Süperblok: dosya sisteminin kimliği (sihirli sayı), blok boyutu, blok ve i-node sayıları, boş sayaçlar, bağlama durumu. Bağlarken ilk okunan yapıdır.
  • Önyükleme bloğu bölümün ilk bloğudur (eski sunumdaki “diskin ilk bloğu” MBR'dir); boş olsa da her bölümde yer ayrılır.
  • ext4 ilgili i-node'u ve verisini aynı gruba koyarak baş hareketini azaltır (BSD FFS silindir grupları fikri).

Tahsis Yöntemleri · Adım adım

Tahsis Yöntemleri: Aynı Dosya, Dört Yol

disk (32 blok)01234567809110211312413141516171819202122232425262728293031dizin girdisiadjeepbaşlangıç9uzunluk5blok i = başlangıç + itek arama, ardışık okuma

Bitişik: 5 blok yan yana (9–13). Dizin girdisinde yalnız başlangıç ve uzunluk.

disk (32 blok)0→1012345678→169→25101112131415→1161718192021222324→−125262728293031dizin girdisiadjeepilk9son25her blok sonrakinin numarasını taşır9 → 16 → 1 → 10 → 25 → −1

Bağlı liste: bloklar diske dağılmış (9, 16, 1, 10, 25); her blok sonrakini gösterir.

disk (32 blok)02123456780931011121314151161718192021222324425262728293031dizin girdisiadjeepilk blok9boyut5 blokFAT (bellekte)110916102516125EOFzincir tabloda

FAT: aynı zincir, ama işaretçiler bloklarda değil bellekteki tabloda; bloklar tamamen veri.

disk (32 blok)02123456780931011121314151161718ind192021222324425262728293031dizin girdisiadjeepindeks bloğu19boyut5 blokindeks bloğu 1991611025−1−1i. girdi = i. bloğun adresi

İndeksli: tüm adresler tek bir indeks bloğunda (19); i. bloğa doğrudan erişilir.

Etkileşimli deneme: Dosya Sistemi Gerçekleştirimi sayfasında tahsis yöntemlerini, dizinleri ve boş alan yönetimini kendi örneklerinizle inceleyebilirsiniz.

Tahsis Yöntemleri · Adım adım

Bitişik Tahsis

A0A1A2A3B4B5B6C7C8C9C10C11C12D13D14D15D16D17E18E19E20E21E22E23E24E25E26E27E28E29F30F31F32F33F34F35G36G37G38G397 dosya: A4 · B3 · C6 · D5 · E12 · F6 · G4 = 40 blok, disk dolu

Her dosya ardışık bloklara yerleştirildi; dizin girdisi = (başlangıç, uzunluk).

A0A1A2A3B4B5B6C7C8C9C10C11C121314151617E18E19E20E21E22E23E24E25E26E27E28E29303132333435G36G37G38G39D ve F silindi: 5 ve 6 bloklık iki delik (toplam 11 boş blok)

Silinen dosyalar delik bırakır; boş alan parçalara bölünür.

A0A1A2A3B4B5B6C7C8C9C10C11C121314151617E18E19E20E21E22E23E24E25E26E27E28E29303132333435G36G37G38G39H 8 blok istiyor: toplam 11 boş, ama en büyük delik 6 → sığmaz!dış parçalanma (external fragmentation)

Yeni dosya hiçbir deliğe sığmaz: bellek yönetimindeki dış parçalanmanın aynısı. Üstelik dosyanın son boyutu baştan bilinmelidir.

A0A1A2A3B4B5B6C7C8C9C10C11C12E13E14E15E16E17E18E19E20E21E22E23E24G25G26G27G28H29H30H31H32H33H34H35H36373839sıkıştırma: G ve E kaydırıldı, tek bir 11 bloklık delik → H yerleştibedeli: diskte 16 bloğun yeniden yazılması

Çözüm: birleştirme/sıkıştırma (pahalı) ya da dosyayı birden çok bitişik parçaya, extent'lere bölmek.

Artılar

Basit; i. blok = başlangıç + i, rastgele erişim kolay; tüm dosya tek aramayla, art arda okunur (HDD'de en iyi performans).

Eksiler

Dış parçalanma (eski sunumda “dahili” yazıyordu); dosya büyüyemez ya da taşınmalı. Sabit içerikli ortamlara uygun: CD-ROM/DVD (ISO 9660, UDF).

Tahsis Yöntemleri · Adım adım

Bağlı Liste ile Tahsis

Dosya Ablok 0veri7fiziksel 4blok 1veri2fiziksel 7blok 2veri10fiziksel 2blok 3veri12fiziksel 10blok 4veri−1fiziksel 12Dosya Bblok 0veri3fiziksel 6blok 1veri11fiziksel 3blok 2veri14fiziksel 11blok 3veri−1fiziksel 14

Dizin girdisi yalnız ilk bloğu (A için 4) bilir. Her bloğun ilk/son birkaç baytı sonraki bloğun numarasıdır.

Dosya Ablok 0veri7fiziksel 4blok 1veri2fiziksel 7blok 2veri10fiziksel 2blok 3veri12fiziksel 10blok 4veri−1fiziksel 12Dosya Bblok 0veri3fiziksel 6blok 1veri11fiziksel 3blok 2veri14fiziksel 11blok 3veri−1fiziksel 14okunan: 1 blok

Mantıksal 3. bloğu okumak istiyoruz: önce fiziksel 4 okunur → sonraki 7.

Dosya Ablok 0veri7fiziksel 4blok 1veri2fiziksel 7blok 2veri10fiziksel 2blok 3veri12fiziksel 10blok 4veri−1fiziksel 12Dosya Bblok 0veri3fiziksel 6blok 1veri11fiziksel 3blok 2veri14fiziksel 11blok 3veri−1fiziksel 14okunan: 2 blok

Fiziksel 7 okunur → sonraki 2.

Dosya Ablok 0veri7fiziksel 4blok 1veri2fiziksel 7blok 2veri10fiziksel 2blok 3veri12fiziksel 10blok 4veri−1fiziksel 12Dosya Bblok 0veri3fiziksel 6blok 1veri11fiziksel 3blok 2veri14fiziksel 11blok 3veri−1fiziksel 14okunan: 3 blok

Fiziksel 2 okunur → sonraki 10.

Dosya Ablok 0veri7fiziksel 4blok 1veri2fiziksel 7blok 2veri10fiziksel 2blok 3veri12fiziksel 10blok 4veri−1fiziksel 12Dosya Bblok 0veri3fiziksel 6blok 1veri11fiziksel 3blok 2veri14fiziksel 11blok 3veri−1fiziksel 14okunan: 4 blok

Fiziksel 10 = mantıksal 3: 4 disk okuması. Rastgele erişim O(n); HDD'de her biri ayrı arama olabilir.

  • Dış parçalanma yoktur, dosya kolayca büyür; iç parçalanma (son blok) her yöntemde vardır. Eski sunumdaki “dahili parçalanmayı en aza indirir” ifadesi düzeltildi.
  • Bloktaki veri miktarı ikinin kuvveti değildir (4096 − 4 bayt); tek bir işaretçi bozulursa zincirin geri kalanı kaybolur.

Tahsis Yöntemleri · Adım adım

FAT: Tablo ile Tahsis

FAT (bellekte): girdi i = i. bloktan sonraki blok0ayr.1ayr.210311475boş63728boş9boş1012111412EOF13boş14EOF15boşA: başlangıç 4B: başlangıç 6

A: 4 → 7 → 2 → 10 → 12; B: 6 → 3 → 11 → 14.

FAT (bellekte): girdi i = i. bloktan sonraki blok0ayr.1ayr.210311475boş63728boş9boş1012111412EOF13boş14EOF15boşA: başlangıç 4B: başlangıç 6A zinciri: 4

Girdi 4 = 7.

FAT (bellekte): girdi i = i. bloktan sonraki blok0ayr.1ayr.210311475boş63728boş9boş1012111412EOF13boş14EOF15boşA: başlangıç 4B: başlangıç 6A zinciri: 4 → 7

Girdi 7 = 2.

FAT (bellekte): girdi i = i. bloktan sonraki blok0ayr.1ayr.210311475boş63728boş9boş1012111412EOF13boş14EOF15boşA: başlangıç 4B: başlangıç 6A zinciri: 4 → 7 → 2

Girdi 2 = 10.

FAT (bellekte): girdi i = i. bloktan sonraki blok0ayr.1ayr.210311475boş63728boş9boş1012111412EOF13boş14EOF15boşA: başlangıç 4B: başlangıç 6A zinciri: 4 → 7 → 2 → 10

Girdi 10 = 12.

FAT (bellekte): girdi i = i. bloktan sonraki blok0ayr.1ayr.210311475boş63728boş9boş1012111412EOF13boş14EOF15boşA: başlangıç 4B: başlangıç 6A zinciri: 4 → 7 → 2 → 10 → 12

Girdi 12 = EOF. Zincir bellekte izlendi: disk okuması yok.

  • Bağlı listedeki işaretçiler bloklardan alınıp tek bir dosya tahsis tablosuna (FAT) taşınır; blokların tamamı veriye kalır.
  • Rastgele erişim hâlâ zincir izler, ama bellekte: hızlı. Tablo diskte iki kopya tutulur.
  • Sorun: tablo diskle orantılı büyür ve tamamı bellekte olmalıdır. Eski sunumdaki “bellek gereksinimi daha az” yanlıştı.
Örnek (eski sunum): 200 GiB disk, 1 KiB blok → 200 × 220 = 209.715.200 girdi; 4 B/girdi → 800 MiB (3 B ile 600 MiB). FAT32’de 2 TiB birim, 32 KiB küme → 67.108.864 girdi = 256 MiB.

Tahsis Yöntemleri

FAT Ailesi: FAT12/16/32 ve exFAT

MS-DOS dizin girdisi (32 bayt)Ad8 BUzantı3 BÖz1 BAyrılmış10 BSaat2 BTarih2 BKüme2 BBoyut4 BÖz: öznitelik. FAT32: “ayrılmış” alana oluşturma/erişim zamanı ve ilk kümenin üst 16 biti yerleşti; uzun adlar ek girdilerde.
FAT12FAT16FAT32exFAT
FAT girdisi12 bit16 bit28 bit kullanılır32 bit
En büyük birim≈ 16 MiB2 GiB (32 KiB küme)2 TiB (512 B sektör)128 PiB
En büyük dosyabirim kadar2 GiB4 GiB − 1 bayt16 EiB (kuramsal)
Boş alanFAT'ta 0FAT'ta 0FAT'ta 0 + FSInfo ipucuayrı biteşlem
Kullanımdisketeski disklerUSB, UEFI ESPSDXC/SDUC, büyük USB

Boyut alanı 32 bit olduğundan FAT32'de 4 GiB'lık dosya sınırı vardır; exFAT bunu kaldırır ve bitişik dosyalarda FAT zincirini hiç kullanmayabilir. Windows'un grafik biçimlendirme aracı FAT32'yi tarihsel olarak 32 GB ile sınırlar; bu dosya sisteminin değil, aracın sınırıdır.

Tahsis Yöntemleri

İndeksli Tahsis ve i-node

  • Her dosyanın blok adresleri bir indeks bloğunda (UNIX'te i-node) toplanır: i. girdi i. bloğun adresidir. Rastgele erişim hızlı, dış parçalanma yok.
  • i-node yalnızca dosya açıkken bellektedir: K açık dosya × i-node boyutu. FAT gibi disk boyutuyla değil, açık dosya sayısıyla orantılı.
  • i-node sabit boyutludur; çok büyük dosyalar için son girdiler başka indeks bloklarını gösterir (dolaylı bloklar).
  • Bedel: küçük dosyada bile indeks yeri harcanır; büyük dosyada dolaylı blok okumaları gerekir (önbellek bunu azaltır).
indeks bloğu 1991611025−1−1…02123456780931011121314151161718ind192021222324425262728293031i-node bu bloğun adresini tutar

Tahsis Yöntemleri

i-node Yapısı: Dolaylı Bloklar

i-nodemod (tür, izinler)UID, GIDboyut, blok sayısızamanlar (a/m/c)bağ sayısıdoğrudan 0…doğrudan 11tek dolaylıçift dolaylıüç dolaylıveriveritekveriveriçifttekveriveriüççifttekveri4 KiB blok, 4 B işaretçi:blok başına 1024 adres12 doğrudan48 KiBtek dolaylı+ 4 MiBçift dolaylı+ 4 GiBüç dolaylı+ 4 TiBher düzey ×1024

ext2/ext3 ve klasik UNIX (V7: 10 doğrudan) yapısı. Küçük dosyalar yalnız doğrudan işaretçileri kullanır, dolaylı blok hiç ayrılmaz; dosya büyüdükçe ağaç derinleşir.

Tahsis Yöntemleri · Adım adım hesap

En Büyük Dosya Boyutu

Varsayımlar: blok 4 KiB = 4096 B, işaretçi 4 B → bir dolaylı blok 4096 / 4 = 1024 adres tutar; i-node’da 12 doğrudan, 1 tek, 1 çift, 1 üç dolaylı işaretçi.

Doğrudan: 12 × 4 KiB = 48 KiB (49.152 B) · Tek dolaylı: 1024 × 4 KiB = 4 MiB

İlk 12 blok i-node’dan doğrudan; sonraki 1024 blok tek bir indeks bloğundan.

Çift dolaylı: 1024² × 4 KiB = 1.048.576 blok = 4 GiB

1024 indeks bloğunun her biri 1024 veri bloğu gösterir.

Üç dolaylı: 1024³ × 4 KiB = 1.073.741.824 blok = 4 TiB

Bir düzey daha: ×1024.

Toplam: 12 + 1024 + 1024² + 1024³ = 1.074.791.436 blok × 4096 = 4.402.345.721.856 B ≈ 4,004 TiB

Neredeyse tamamı üç dolaylı bloktan gelir.

Tanenbaum örneği (1 KiB blok, 256 adres, 10 doğrudan): 16.843.018 blok ≈ 16 GiB. Gerçekte ext2/ext3’te 4 KiB blokla sınır 2 TiB’dir (blok sayacı 32 bit × 512 B); ext4 extent’lerle 16 TiB.

Tahsis Yöntemleri · Adım adım

Ofsetten Disk Bloğuna

ofset → mantıksal blok40.000 Bblok 9 · doğrudan1.000.000 Bblok 244 · tek dolaylı5.000.000 Bblok 1.220 · çift dolaylı6.000.000.000 Bblok 1.464.843 · üç dolaylıi-nodedoğrudan 0–11tek dolaylıçift dolaylıüç dolaylıadres i-node'daveriblok içi konum = 40.000 mod 4096 = 3.136disk okuması (i-node bellekteyse): 1

40.000 / 4096 = 9 → 12'den küçük: doğrudan işaretçi 9. Tek okuma.

ofset → mantıksal blok40.000 Bblok 9 · doğrudan1.000.000 Bblok 244 · tek dolaylı5.000.000 Bblok 1.220 · çift dolaylı6.000.000.000 Bblok 1.464.843 · üç dolaylıi-nodedoğrudan 0–11tek dolaylıçift dolaylıüç dolaylı[232]indeksveriblok içi konum = 1.000.000 mod 4096 = 576disk okuması (i-node bellekteyse): 2

1.000.000 / 4096 = 244; 244 − 12 = 232 < 1024 → tek dolaylı bloğun 232. girdisi. 2 okuma.

ofset → mantıksal blok40.000 Bblok 9 · doğrudan1.000.000 Bblok 244 · tek dolaylı5.000.000 Bblok 1.220 · çift dolaylı6.000.000.000 Bblok 1.464.843 · üç dolaylıi-nodedoğrudan 0–11tek dolaylıçift dolaylıüç dolaylı[0]indeks[184]indeksveriblok içi konum = 5.000.000 mod 4096 = 2.880disk okuması (i-node bellekteyse): 3

5.000.000 / 4096 = 1220; 1220 − 12 − 1024 = 184 < 1024² → çift dolaylı: dış indeks 184 div 1024 = 0, iç indeks 184. 3 okuma.

ofset → mantıksal blok40.000 Bblok 9 · doğrudan1.000.000 Bblok 244 · tek dolaylı5.000.000 Bblok 1.220 · çift dolaylı6.000.000.000 Bblok 1.464.843 · üç dolaylıi-nodedoğrudan 0–11tek dolaylıçift dolaylıüç dolaylı[0]indeks[405]indeks[511]indeksveriblok içi konum = 6.000.000.000 mod 4096 = 3.072disk okuması (i-node bellekteyse): 4

6 GB / 4096 = 1.464.843; 12 + 1024 + 1024² çıkarılınca 415.231 → üç dolaylı: 0, 405, 511. 4 okuma; önbellek ilk düzeyleri tutar.

Tahsis Yöntemleri

ext4: Extent'ler

i-node içindeki i_block (60 bayt)extent başlığı · 0xF30A · girdi 3 / 4 · derinlik 0mantıksal 0 · uzunluk 1.000 · fiziksel 34.000mantıksal 1.000 · uzunluk 32.768 · fiziksel 120.000mantıksal 33.768 · uzunluk 200 · fiziksel 9.100(boş girdi)disk0160.0003 extent × 12 B = 36 B, ek blok yokblok haritası: 33.968 işaretçi = 35 indeks bloğu (140 KiB)extent ≤ 32.768 blok = 128 MiB
  • Bir extent = (mantıksal başlangıç, uzunluk, fiziksel başlangıç): bitişik blok dizisi tek kayıtla anlatılır. 48 bit fiziksel adres → 1 EiB birim; dosya en fazla 16 TiB.
  • i-node'a 4 extent sığar; daha fazlası gerekirse girdiler bir extent ağacının (derinlik > 0) indeks düğümlerini gösterir.
  • Gecikmeli tahsis (delayed allocation) ve çoklu blok ayırıcı, veriyi diske yazarken büyük bitişik alanlar seçer. XFS, Btrfs, NTFS (run list) ve APFS de extent kullanır.

Tahsis Yöntemleri

NTFS: Ana Dosya Tablosu (MFT)

MFT (1 KiB kayıtlar)0$MFT1$MFTMirr2$LogFile3$Volume5. (kök dizin)6$Bitmap8$BadClus9$Secure……≥ 24kullanıcı dosyalarıbir dosyanın MFT kaydıbaşlık$STANDARD_INFORMATION$FILE_NAME$DATA (run list)zamanlar, öznitelik bayraklarıad, üst dizinrun: (başlangıç, uzunluk)20, 464, 280, 3küme 0küme 100küçük dosyada veri kaydın içinde: yerleşik (resident) $DATA
  • NTFS'te her şey bir dosyadır; MFT'nin kendisi de (kayıt 0). Her dosya en az bir 1 KiB kayıttır; içeriği öznitelikler listesidir.
  • Büyük veri run list (extent) olarak tutulur; dizinler B+ ağacıdır ($INDEX_ROOT, $INDEX_ALLOCATION). $LogFile meta veri günlüğüdür.
  • Ek özellikler: katı bağ, reparse point, alternatif veri akışı (ADS), sıkıştırma, EFS şifreleme, kotalar. Sunucularda ReFS (CoW, sağlama toplamı) da var.

Tahsis Yöntemleri

Dosya Sistemlerinin Karşılaştırması

Dosya sistemiEn büyük dosyaEn büyük birimÇökme tutarlılığıTipik kullanım
FAT324 GiB − 1 B2 TiByok (chkdsk/fsck)USB, UEFI ESP
exFAT16 EiB*128 PiByokSD kart, harici disk
NTFS16 EiB* (Windows: 256 TiB–8 PiB)256 TiB–8 PiBmeta veri günlüğüWindows
ext416 TiB (4 KiB blok)1 EiBgünlük (jbd2)Linux, Android
XFS8 EiB8 EiBmeta veri günlüğüRHEL, büyük sunucular
Btrfs16 EiB16 EiBCoW + sağlama toplamıFedora, openSUSE, NAS
ZFS16 EiB2¹²⁸ B (kuramsal)CoW + sağlama toplamıFreeBSD, TrueNAS, sunucu
APFS8 EiB8 EiBCoW, anlık görüntümacOS, iOS

* kuramsal sınır; işletim sistemi ve küme boyutu daha düşük sınır koyar. Windows 10 (1709) sonrası NTFS 2 MiB kümeyle 8 PiB'a ulaşır. Eski sunumda adı geçen HFS+ yerini 2017'de APFS'e bıraktı; ext3 yerini ext4'e.

Dizin Gerçekleştirimi

Dizin Girdileri ve Uzun Adlar

(a) öznitelikler girdide (MS-DOS)gamesöznitelikler + disk adresimailöznitelikler + disk adresinewsöznitelikler + disk adresiworköznitelikler + disk adresi(b) öznitelikler i-node'da (UNIX)games14i-nodemail7i-nodenews29i-nodework51i-node(c) değişken uzunluk, satır içiuzunluki-node · türproje-bütçeuzunluki-node · türpersoneluzunluki-node · türfooext4 girdisi: i-node, rec_len, ad uzunluğu, tür, ad(d) sabit girdiler + ad yığınıad işaretçisiöznitelikad işaretçisiöznitelikad işaretçisiöznitelikyığın (heap)proje-bütçepersonelfoogirdiler hizalı; ad dizin bloğunun sonunda

Dizinin yerini bulmak için ilk bloğun adresi (bitişik), ilk bloğun numarası (bağlı liste/FAT) ya da i-node numarası (UNIX) yeterlidir. Uzun adlarda (a)/(b) gibi sabit girdi alan israf eder; (c) silinince delik bırakır ve ad sayfa sınırını aşabilir, (d) yığını yönetmeyi gerektirir.

Dizin Gerçekleştirimi · Adım adım

Dizin Arama: Liste, Karma, Ağaç

doğrusal liste...notlar.txtfoto.pngodevmakefilerapor.pdftez.docx← 7 karşılaştırma

Doğrusal liste: basit, ama arama O(n). Ekleme için önce adın olmadığı denetlenir; silmede girdi boş işaretlenir ya da son girdi taşınır.

doğrusal liste...notlar.txtfoto.pngodevmakefilerapor.pdftez.docxkarma tablosu (8 kova)01234567h("rapor.pdf") mod 8 = 5rapor.pdfnotlar.txt

Karma tablosu: adın özeti kovayı seçer; arama ortalama O(1).

doğrusal liste...notlar.txtfoto.pngodevmakefilerapor.pdftez.docxkarma tablosu (8 kova)01234567h("rapor.pdf") mod 8 = 5rapor.pdftez.docxh("tez.docx") mod 8 = 5 → çakışmazincirde en çok 2 karşılaştırmanotlar.txt

Çakışmalar zincirle çözülür. Sabit kova sayısı büyüyen dizinde sorun olur; bu yüzden modern sistemler ağaç kullanır.

ext4 büyük dizinlerde ad özetine göre sıralı htree, NTFS, XFS ve Btrfs B+ ağacı kullanır: sıralı listeleme ve O(log n) arama birlikte. Linux en son kullanılan ad → i-node eşlemelerini ayrıca dentry önbelleğinde tutar.

Boş Alan Yönetimi

Blok Boyutu Seçimi

02468101214%0%25%50%75%1001248163264128blok boyutu (KiB, logaritmik)MB/snveri hızı (MB/sn)alan verimliliği (%)0,4512,8
  • Model (Tanenbaum): tüm dosyalar 4 KiB; ortalama arama 5 ms, dönüş 8,33 ms, iz 1 MB. Süre = 5 + 4,165 + (b / 1 MB) × 8,33 ms. Hesap Python ile.
  • Büyük blok → daha iyi veri hızı, daha kötü alan kullanımı; küçük blok tersi. Eski sunumda bu ilişki ters yazılmıştı.
  • Ölçümler dosyaların çoğunun küçük, alanın çoğunu ise az sayıda büyük dosyanın kapladığını gösterir. Bugün varsayılan 4 KiB (sayfa boyutu); büyük dosyalar extent ve küme seçenekleriyle desteklenir (eski sunumdaki “64 KB kullanılmalı” genel öneri değildir).

Boş Alan Yönetimi · Adım adım

Boş Alan Yönetimi: Dört Yöntem

disk: yeşil = boş012345678910111213141516171819202122232425262728293031boş bloklar:2–5, 8–13, 17–18, 25–2715 boş blok / 32

Örnek disk: 32 blok, 15'i boş (Silberschatz örneği).

disk: yeşil = boş012345678910111213141516171819202122232425262728293031biteşlem (1 = boş)blok 0–700111100blok 8–1511111100blok 16–2301100000blok 24–310111000032 blok → 32 bit = 4 baytilk boş: ilk sıfır olmayan sözcükte ilk 1 biti

Biteşlem: blok başına 1 bit. Boyutu sabit ve küçük; bitişik boş blok aramak kolay. Bellekte tutulması gerekir.

disk: yeşil = boş01→32→43→54→8567→98→109→1110→1211→1312→1713141516→1817→2518192021222324→2625→2726−12728293031baş işaretçisi → 2her boş blok bir sonrakini gösterirek alan gerekmez (bilgi boş blokların içinde)ama listeyi dolaşmak = her blok için G/Ç

Bağlı liste: boş bloklar birbirine bağlanır. Tek boş blok almak ucuz, çok sayıda bitişik blok bulmak pahalı.

disk: yeşil = boş012345678910111213141516171819202122232425262728293031gruplama (n = 4): ilk boş blok n−1 adres + sonraki grupblok 2345→ 8blok 891011→ 12blok 12131718→ 25blok 252627→ −tek okumayla n−1 boş blok bulunur

Gruplama: ilk boş blok sonraki n−1 boş bloğun adresini ve bir sonraki grup bloğunu tutar (UNIX'in boş liste blokları).

disk: yeşil = boş012345678910111213141516171819202122232425262728293031sayma: (ilk blok, ardışık sayı)(2, 4)blok 2–5(8, 6)blok 8–13(17, 2)blok 17–18(25, 3)blok 25–2715 boş blok → 4 çiftboş alan bitişik öbeklerse çok kısa

Sayma: (başlangıç, uzunluk) çiftleri; extent fikrinin boş alana uygulanmışı. XFS bunu iki B+ ağacında tutar.

Boş Alan Yönetimi

Boş Alan: Sayısal Karşılaştırma

Tanenbaum örneğiModern örnek
Disk / blok500 GB, 1 KiB blok1 TiB, 4 KiB blok
Blok sayısı500 × 10⁹ / 1024 ≈ 488,3 milyon2⁴⁰ / 2¹² = 268.435.456
Boş liste bloğu (32 bit no.)1 KiB / 4 B = 256 → 255 adres + 1 bağ4096 / 4 = 1024 → 1023 adres + 1 bağ
Liste, disk tamamen boşken488,3 M / 255 ≈ 1,91 milyon blok268,4 M / 1023 ≈ 262.401 blok (≈ 1 GiB)
Biteşlem488,3 M bit / 8192 ≈ 59.605 blok (≈ 60.000)2²⁸ bit = 32 MiB = 8192 blok
  • Biteşlem sabit boyutludur; liste yalnızca disk neredeyse doluyken daha küçüktür (çünkü yalnız boş blokları listeler).
  • Bellekte tek bir işaretçi bloğu tutmak yeterlidir: dolunca diske yazılır, boşalınca yenisi okunur. Tanenbaum'un iyileştirmesi: bellekte yarı dolu blok tutarak geçici dosyaların sürekli disk G/Ç'sine yol açmasını önlemek.
  • Gerçek sistemler: ext4 blok grubu başına biteşlem; XFS konuma ve boyuta göre iki B+ ağacı (sayma); ZFS ayırma/serbest bırakma günlüğü (space map); Btrfs extent ağacı.

Boş Alan Yönetimi

Disk Kotaları

açık dosya tablosuöznitelikler, adresleröznitelikler, adresleröznitelikler, adresleröznitelikler, adreslergirdi: kullanıcı = alikota işaretçisikota tablosu (kullanıcı başına bir kayıt, ali)blok yumuşak sınırı9 GiBblok sert sınırı10 GiBkullanılan blok9,4 GiBkalan uyarı / süre6 gündosya yumuşak sınırı90.000dosya sert sınırı100.000kullanılan dosya41.250yumuşak sınır aşıldı: uyarı + süre başladı
  • Her açık dosya girdisi sahibinin kota kaydını gösterir; her yeni blok ya da i-node tahsisinde sayaçlar artar ve sınırlarla karşılaştırılır.
  • Yumuşak sınır aşılabilir ama uyarı verilir ve bir süre (ör. 7 gün) başlar; süre biterse ya da sert sınıra ulaşılırsa yazma EDQUOT ile reddedilir.
  • Bugün: Linux quota araçları (ext4, XFS proje kotaları), NTFS birim kotaları, ZFS veri kümesi ve Btrfs alt birim (qgroup) kotaları.

Performans

Tampon Önbelleği (Buffer Cache)

karma tablosu(aygıt, blok no.)01234blok 12blok 87blok 6blok 43blok 8blok 203blok 19kesikli turuncu: LRU listesi(en eski 6 → en yeni 203)arama: karma ile O(1)değiştirme: LRU kuyruğunun başıönemli bloklar (i-node, dizin)kirliyse hemen yazılır
ErişimGecikme (2026, tipik)
DRAM'den 64 bayt≈ 80–120 ns
NVMe SSD 4 KiB rastgele okuma≈ 50–100 µs
HDD arama + dönüş≈ 5–10 ms (100–280 MB/sn sıralı)
  • Yazma politikası: write-through her yazmayı hemen diske gönderir (eski MS-DOS, çıkarılabilir ortam); write-back kirli blokları biriktirir. Linux 30 sn'den eski kirli sayfaları arka planda yazar; uygulama fsync ile zorlar.

Performans · Adım adım

Sayfa Önbelleği ve Birleşik Tampon Önbelleği

bellek eşlemeli G/Ç (mmap)read() / write()sayfa önbelleğitampon önbelleğidosya sistemiaynı veri iki kez!

Birleşik değil: mmap verisi sayfa önbelleğinde, read/write verisi tampon önbelleğinde; ikisi arasında kopyalanır (çift önbellekleme), bellek ve tutarlılık sorunu.

bellek eşlemeli G/Ç (mmap)read() / write()birleşik tampon (sayfa) önbelleğidosya sistemitek kopya, tek değiştirme

Birleşik tampon önbelleği: dosya sayfaları tek yerde; iki yol da aynı sayfaları görür. Linux 2.4'ten beri sayfa önbelleği, Windows önbellek yöneticisi, Solaris böyledir.

Sayfa önbelleği sanal bellekle aynı sayfa değiştirme algoritmalarını paylaşır (Bölüm 9). İstisna: ZFS kendi ARC önbelleğini tutar. O_DIRECT veritabanlarının önbelleği atlamasını sağlar.

Performans

Önden Okuma, Yerleşim ve Birleştirme

(a) i-node'lar diskin başındai-nodeveri bloklarıher dosya erişimi: uzun kol hareketi(b) silindir / blok gruplarıigrup 0igrup 1igrup 2i-node ve verisi aynı gruptaBSD FFS, ext2/3/4
  • Önden okuma: k. blok istenince k+1 de (önbellekte yoksa) okunur. Yalnız sıralı erişimde işe yarar; dosya başına bir “sıralı mı?” izi tutulur. Linux pencereyi uyarlar (varsayılan 128 KiB), uygulama posix_fadvise ile ipucu verir.
  • Kol hareketini azaltmak: ardışık okunacak blokları yakına koy; biteşlemle bitişik blok bulmak kolaydır. Bloklar ikişer ayrılır (eski öneri) ya da bugünkü gibi extent, gecikmeli tahsis ve çoklu blok ayırıcı kullanılır.
  • Birleştirme (defrag): zamanla dosyalar parçalanır. Windows “Sürücüleri birleştir ve iyileştir”; Linux'ta da vardır: e4defrag, xfs_fsr, btrfs filesystem defragment (eski sunumdaki “Linux desteklemez” yanlış). ext4'ün tahsis politikası ihtiyacı azaltır.
  • SSD'de arama süresi yoktur: birleştirme gereksiz yazma (aşınma) demektir; Windows SSD'de birleştirme yerine TRIM gönderir.

Performans · Adım adım

SSD Dikkat Noktaları: FTL ve TRIM

dosya sistemi (LBA)A0A1A2A34567FTL eşleme tablosuLBA → fiziksel sayfa (SSD denetleyicisinde)flaş silme bloğu Xsilme bloğu YA0A1A2A3

A dosyası LBA 0–3'e yazılır; FTL bunları X bloğundaki sayfalara eşler.

dosya sistemi (LBA)A0A1A2A34567FTL eşleme tablosuLBA → fiziksel sayfa (SSD denetleyicisinde)flaş silme bloğu Xsilme bloğu YA0eskiA2A3A1'yerinde yazılamaz: yeni sayfaya yaz, eskisini geçersiz işaretle

Flaş sayfası yerinde güncellenemez (önce tüm blok silinmeli): A1 yeni sayfaya yazılır, eski sayfa geçersiz. SSD'nin içi aslında günlük yapılıdır.

dosya sistemi (LBA)01234567FTL eşleme tablosuLBA → fiziksel sayfa (SSD denetleyicisinde)flaş silme bloğu Xsilme bloğu YA0eskiA2A3A1'SSD bunları hâlâ geçerli sanıyor → çöp toplamada boşuna kopyalanır

rm A: dosya sistemi bloklarını kendi biteşleminde boş işaretler, ama SSD bunu bilmez.

dosya sistemi (LBA)01234567FTL eşleme tablosuLBA → fiziksel sayfa (SSD denetleyicisinde)flaş silme bloğu Xsilme bloğu YgeçersizgeçersizgeçersizgeçersizgeçersizTRIM: LBA 0–3 kullanılmıyor → X bloğu kopyasız silinebilir

TRIM (ATA) / Deallocate (NVMe): dosya sistemi boşalan LBA'ları bildirir; çöp toplama daha az kopyalar, yazma büyütmesi ve aşınma azalır.

Linux: haftalık fstrim.timer ya da discard bağlama seçeneği; Windows “İyileştir” TRIM gönderir. Ayrıca: bölümleri 1 MiB sınırına hizala, SSD'yi birleştirme; flaş için tasarlanan F2FS (Android) günlük yapılıdır.

Tutarlılık ve Kurtarma

Yedekleme Stratejileri

Fiziksel dökümMantıksal döküm
Ne kopyalanır?blok 0'dan sona tüm (kullanılan) bloklarseçilen dizinler ve dosyalar, yollarıyla
Hız, basitlikçok hızlı, basitdaha yavaş, karmaşık
Dizin atlama, artımlı yedekyapamazyapabilir (değişenler)
Tek dosyayı geri yüklemezorkolay; başka makinede de
Bozuk bloklardenetleyici yeniden eşlemeli ya da İS listeyi bilmelisorun değil
  • İki amaç: felaketten kurtarma (disk, yangın, fidye yazılımı) ve dikkatsizlikten kurtarma (yanlışlıkla silinen dosya).
  • Tam + artımlı: ör. ayda bir tam döküm, her gün yalnız son dökümden beri değişenler. Geri yükleme: boş dosya sistemine son tam döküm (önce dizinler, sonra dosyalar), ardından artımlılar sırayla.
  • Geçici dosyalar ve özel dosyalar (/dev, /proc, /tmp) yedeklenmez. Sistem kullanılırken tutarlı yedek için anlık görüntü (LVM, ZFS/Btrfs, Windows VSS) alınır.
  • 3-2-1 kuralı: 3 kopya, 2 farklı ortam, 1 kopya başka yerde (çevrimdışı ya da değiştirilemez). Teyp bugün de arşivde: LTO-9 kartuş 18 TB yerel (eski sunumdaki “yüzlerce GB” güncellendi).

Tutarlılık ve Kurtarma · Adım adım

Mantıksal Döküm Algoritması

12345678910biteşlem010203040506070809010

Kareler dizin, daireler dosya; sayılar i-node numarası. Turuncu: son dökümden beri değişenler (3, 6, 10).

12345678910biteşlem111213140516171809110aşama 1

Aşama 1: kökten başlayıp ağacı dolaş; değişen her dosyayı ve tüm dizinleri işaretle.

12345678910biteşlem111213140516071809110aşama 2

Aşama 2: altında değişen hiçbir şey olmayan dizinlerin işaretini kaldır: 7 (yalnız değişmemiş 9'u içeriyor).

12345678910biteşlem111213140516071809110aşama 3

Aşama 3: i-node sırasıyla işaretli dizinleri dök (1, 2, 4, 8) — değişmemiş olsalar da, yolları geri kurabilmek için.

12345678910biteşlem111213140516071809110aşama 4

Aşama 4: işaretli dosyaları dök (3, 6, 10). Geri yüklemede önce dizinler, sonra dosyalar yazılır.

Ek ayrıntılar: boş liste dökülmez, geri yüklemede yeniden kurulur; bir dosyanın birden çok katı bağı yalnız bir kez dökülmeli; seyrek dosyaların delikleri ve FIFO/aygıt dosyaları özel işlenir.

Tutarlılık ve Kurtarma · Adım adım

Tutarlılık Denetimi: fsck

blok numarası0123456789101112131415kullanımda1101011110011100boş listede0010100001100011Her blok bir sayaçta 1, diğerinde 0: tutarlı.

(a) Tutarlı: fsck tüm i-node'ları ve boş listeyi/biteşlemi okur, blok başına iki sayaç tutar.

blok numarası0123456789101112131415kullanımda1101011110011100boş listede0000100001100011Blok 2 hiçbir yerde yok: eksik blok → boş listeye eklenir.

(b) Eksik blok: zararsız ama alan kaybı; boş listeye konur.

blok numarası0123456789101112131415kullanımda1101011110011100boş listede0010200001100011Blok 4 boş listede iki kez → boş liste yeniden kurulur.

(c) Boş listede yinelenen blok: aynı blok iki kez verilebilirdi; liste yeniden oluşturulur. (Biteşlemde bu durum oluşamaz.)

blok numarası0123456789101112131415kullanımda1101021110011100boş listede0010100001100011Blok 5 iki dosyada → yeni blok ayır, kopyala, kullanıcıya bildir.

(d) Yinelenen veri bloğu: en kötüsü; blok kopyalanıp iki dosyaya ayrı verilir, kullanıcı bilgilendirilir.

  • Dosya tutarlılığı: kökten tüm dizinler dolaşılır, her i-node için görülme sayısı tutulur ve i-node'daki bağ sayısıyla karşılaştırılır. Bağ sayısı büyükse yalnız alan israfı; küçükse tehlikeli (dosya erken silinir) → düzeltilir. Sahipsiz i-node'lar lost+found'a konur.
  • Windows'ta karşılığı chkdsk (eski sunumdaki scandisk Windows 9x'e aitti). Tam tarama terabaytlık diskte saatler sürer; günlükleme ve CoW bu yüzden doğdu.

Tutarlılık ve Kurtarma

Çökme ve Atomiklik: Neden Günlük?

1. dizin girdisini kaldırçökme2. i-node'u boş havuzaçökme3. blokları boş havuza1'den sonra çökme: i-node ve bloklar sahipsiz (sızıntı, fsck bulur)2'den sonra çökme: bloklar sızarsıra ters olsaydı: dizin, başka dosyaya verilmiş bir i-node'u gösterebilirdi → veri karışır!
  • Bir dosya işlemi birden çok bloğu değiştirir; diskler yalnızca tek sektörlük yazmayı atomik yapar. Arada çökme olursa yapı tutarsız kalır.
  • Çözüm ailesi: (1) sonra onar: fsck; (2) önce niyeti yaz: günlükleme; (3) hiç üzerine yazma: CoW ve LFS; (4) yazma sırasını ayarla: BSD soft updates.
  • Eşgüçlülük (idempotence): günlükteki işlemler kaç kez yeniden oynatılırsa oynatılsın aynı sonucu vermeli. “Blok n'yi boş işaretle” eşgüçlüdür; “boş listenin sonuna n'yi ekle” değildir (iki kez eklenebilir).

Tutarlılık ve Kurtarma · Adım adım

Günlükleme: Önce Günlüğe Yaz

günlük (journal)boş günlük alanıson yerleri-node biteşlemiveri biteşlemi (v1)i-node tablosu (v1)veri bloğu (yeni)

1. Veri: dosyaya eklenen blok Db önce son yerine yazılır (ordered kip, ext4 varsayılanı).

günlük (journal)TxBI[v2]B[v2]boş günlük alanıson yerleri-node biteşlemiveri biteşlemi (v1)i-node tablosu (v1)veri bloğu (yeni)

2. Günlüğe yaz: işlem başı TxB ve değişecek meta veri blokları (i-node I, biteşlem B) günlüğe sıralı yazılır.

günlük (journal)TxBI[v2]B[v2]TxEboş günlük alanıson yerleri-node biteşlemiveri biteşlemi (v1)i-node tablosu (v1)veri bloğu (yeni)

3. İşlemi onayla: önceki yazmalar diske ulaşınca (bariyer/FLUSH) TxE yazılır. TxE diskteyse işlem kesinleşmiştir.

günlük (journal)TxBI[v2]B[v2]TxEboş günlük alanıson yerleri-node biteşlemiveri biteşlemi (v2)i-node tablosu (v2)veri bloğu (yeni)kontrol noktası (checkpoint)

4. Kontrol noktası: I ve B son yerlerine yazılır; bu yazmalar arada kesilse de günlükten tekrarlanabilir.

günlük (journal)boş günlük alanıişlem serbest bırakıldıson yerleri-node biteşlemiveri biteşlemi (v2)i-node tablosu (v2)veri bloğu (yeni)

5. Serbest bırak: günlük süperbloğu işlemi tamamlandı işaretler; günlük dairesel bir tampon gibi yeniden kullanılır.

günlük (journal)boş günlük alanıson yerleri-node biteşlemiveri biteşlemi (v2)i-node tablosu (v2)veri bloğu (yeni)çökme TxE'den önce → işlem yok sayılır; sonra → günlük yeniden oynatılır

Kurtarma: açılışta günlük taranır; TxE'si olan işlemler baştan oynatılır (redo, eşgüçlü), olmayanlar atılır. fsck gerekmez, saniyeler sürer.

Kipler: journal (veri de günlüğe, en güvenli, en yavaş), ordered, writeback (veri sırası yok). Günlük kullananlar: ext3/ext4 (jbd2), XFS, NTFS ($LogFile), JFS. Apple'da HFS+ yerini CoW tabanlı APFS'e bıraktı.

Tutarlılık ve Kurtarma · Adım adım

Yazınca Kopyala (CoW): ZFS, Btrfs, APFS

süperblokkökI1I2L1L2L3L4

Dosya sistemi bir blok ağacıdır: süperblok (ZFS'te uberblock) → kök → iç düğümler → veri.

süperblokkökI1I2L1L2L3L4L3'

L3 değişecek: yerinde yazılmaz; yeni kopya L3' boş bir yere yazılır. Eski L3 hâlâ sağlam.

süperblokkökI1I2L1L2L3L4L3'I2'R'

L3''ü gösteren üst düğümler de kopyalanır: I2', kök R'. Değişmeyen alt ağaçlar (I1, L4) paylaşılır.

süperblokkökI1I2L1L2L3L4L3'I2'R'gri: eski sürüm = anlık görüntü (ya da serbest)

Tek atomik yazma: süperblok R''yi gösterir. Çökme öncesinde ya eski ya yeni ağaç görünür, ara durum yoktur; günlük gerekmez.

süperblokkökI1I2L1L2L3L4L3'I2'R'gri: eski sürüm = anlık görüntü (ya da serbest)her işaretçi çocuğun sağlama toplamını taşır

Eski kök saklanırsa anlık görüntü bedavadır. ZFS/Btrfs her işaretçide sağlama toplamı tutar: sessiz bozulma okunurken yakalanır, aynadan onarılır (scrub).

ZFS (Sun 2005, bugün OpenZFS), Btrfs (Linux), APFS (Apple, 2017), ReFS (Windows Server). Bedeli: rastgele üzerine yazmalarda parçalanma ve yazma büyütmesi; veritabanı dosyalarında CoW kapatılabilir.

Tutarlılık ve Kurtarma · Adım adım

Günlük Yapılı Dosya Sistemi (LFS)

bellek tamponuD(A,0)D(B,0)I(A)I(B)imapdisk (günlük)CRkontrolbölgesi

Yazmalar bellekte biriktirilir: veri blokları, değişen i-node'lar ve i-node haritası (imap) parçaları.

bellek tamponudisk (günlük)CRkontrolbölgesikesim 1D(A,0)D(B,0)I(A)I(B)imap

Tampon dolunca tümü tek bir kesim (segment, ör. 1–2 MiB) olarak günlüğün sonuna sıralı yazılır. i-node'lar sabit yerde değildir; imap onları bulur, kontrol bölgesi (CR) son imap'i gösterir.

bellek tamponuD(A,0)'I(A)'imap'disk (günlük)CRkontrolbölgesikesim 1D(A,0)D(B,0)I(A)I(B)imapkesim 2D(A,0)'I(A)'imap'

A'nın bloğu değişince yeni sürüm yeni kesime yazılır; kesim 1'deki eski D(A,0), I(A) ve imap ölü olur.

bellek tamponudisk (günlük)CRkontrolbölgesikesim 1 (temizlendi, boş)kesim 3D(B,0)I(B)D(A,0)'I(A)'imap''

Temizleyici: az canlı bloğu olan kesimleri okur, canlıları yeni kesime sıkıştırır, eskiyi boşaltır. Yük altında temizleme maliyeti LFS'in zayıf noktasıdır.

Rosenblum ve Ousterhout, Sprite LFS (1991). Okumalar büyük önbellekten karşılanır varsayımıyla tasarlandı; yazma bant genişliğini neredeyse diskin sıralı hızına çıkarır. Eski sunumdaki “kullanılmıyor” güncel değil: fikir F2FS (Android), NILFS2, NetApp WAFL, ZFS/Btrfs CoW ve SSD'lerin FTL'lerinde yaşıyor.

VFS ve Ağ · Adım adım

Sanal Dosya Sistemi (VFS)

süreç: read(fd, buf, n)VFSsuperblock · inode (v-node) · dentry · file nesneleriext4XFSNFS istemcisiprocfssayfa önbelleği → blok katmanı → NVMe sürücüsüRPC → TCP/IP → ağregister_filesystem()

Kayıt: dosya sistemi açılışta ya da modül yüklenince VFS'ye kaydolur ve VFS'nin çağıracağı işlevlerin adres tablosunu verir.

süreç: read(fd, buf, n)VFSsuperblock · inode (v-node) · dentry · file nesneleriext4XFSNFS istemcisiprocfssayfa önbelleği → blok katmanı → NVMe sürücüsüRPC → TCP/IP → ağmount → s_op tablosu

Bağlama: VFS o dosya sisteminden süperblok nesnesini kurmasını ister; nesne işlem tablosunu (s_op) taşır.

süreç: read(fd, buf, n)VFSsuperblock · inode (v-node) · dentry · file nesneleriext4XFSNFS istemcisiprocfssayfa önbelleği → blok katmanı → NVMe sürücüsüRPC → TCP/IP → ağopen → i_op, f_op

open: yol dentry'lerle çözülür; somut sistem i-node bilgisini bir VFS i-node'una (v-node) yerleştirir; file nesnesi oluşur, fd tablosuna eklenir.

süreç: read(fd, buf, n)VFSsuperblock · inode (v-node) · dentry · file nesneleriext4XFSNFS istemcisiprocfssayfa önbelleği → blok katmanı → NVMe sürücüsüRPC → TCP/IP → ağf_op->read_iter()

read: VFS yalnız file->f_op->read_iter işlev işaretçisini çağırır; ext4 dosyasında ext4'ün işlevi, NFS dosyasında ağ üzerinden RPC çalışır. Uygulama farkı görmez.

VFS'nin amacı farklı dosya sistemlerine aynı anda tek arayüz sunmaktır (aynı diskte birden çok sistem bölümlemeyle zaten mümkündür). Ek maliyeti bir dolaylı çağrıdır; eski sunumdaki “düşük performans” abartılıydı. Windows'ta karşılığı G/Ç yöneticisi ve dosya sistemi sürücüleridir.

VFS ve Ağ

Ağ Dosya Sistemi (NFS)

istemcisunucusüreçVFSNFS istemcisiRPC / XDRext4 / XFS / ZFS → diskVFSnfsdRPC / XDRTCP 2049READ(dosya tanıtıcısı, ofset, n)mount sunucu:/export /mnt/proje
  • Uzaktaki bir dizin yerel ağaca bağlanır; uygulama yerel dosya gibi kullanır. Sun 1984'te SunOS için tasarladı, açık standart oldu.
  • Makine ve mimari bağımsızlığı RPC ve XDR ile sağlanır. NFSv3 durumsuzdur (UDP ya da TCP); NFSv4 durumludur, yalnız TCP, tek port, Kerberos güvenliği, kilitleme ve devretme (delegation) içerir; v4.1 pNFS.
  • Windows dünyasının karşılığı SMB 3 (şifreleme, çok kanallı). Eski sunumdaki “Ethernet üzerinden UDP/IP” yerine bugün TCP tercih edilir; tek şart IP ağıdır.

Özet

Özet

Dosya ve dizin

Dosya: adlı, kalıcı bayt dizisi + öznitelikler. Dizin: ad → i-node eşlemesi; ağaç + bağlar, bağlama ile tek ağaç.

Açık dosya

fd → sistem geneli girdi (konum) → bellek içi i-node. Yol çözümü bileşen bileşen ilerler.

Tahsis

Bitişik (hızlı, dış parçalanma), bağlı/FAT (esnek, rastgele erişim zayıf), i-node/extent (bugünkü çözüm).

Boş alan

Biteşlem, liste, gruplama, sayma; blok boyutu hız ile alan arasında ödünleşimdir.

Performans

Birleşik sayfa önbelleği, önden okuma, yakın yerleşim; SSD'de TRIM.

Tutarlılık

fsck → günlükleme → CoW/LFS. Yedek yine de şart: 3-2-1.

Özet

Kontrol Soruları

  1. 6000 baytlık dosyayı 4096 baytlık tamponla okuyan döngüde read sırasıyla ne döndürür?
  2. ln a b ve ln -s a c sonrası rm a yapılırsa b ve c ne olur?
  3. /usr/ast/mbox önbelleksiz kaç disk okumasıyla çözülür (kök i-node bellekte)?
  4. 200 GiB disk, 1 KiB blok, 4 B girdi: FAT ne kadar bellek ister?
  5. 4 KiB blok, 4 B işaretçi, 12 doğrudan + tek/çift/üç dolaylı: en büyük dosya?
  6. Aynı yapıda 5.000.000. bayt hangi düzeydedir, kaç okuma gerekir?
  7. Boş bloklar 2–5, 8–13, 17–18, 25–27: sayma yöntemiyle gösterin.
  8. Günlüklemede TxE yazılmadan önce ve sonra çökmenin farkı nedir?
  9. SSD'de dosya silindiğinde neden TRIM gerekir?
Cevaplar
  1. 4096, 1904, 0 (EOF).
  2. b çalışır (bağ sayısı 1); c askıda kalır (ENOENT).
  3. 5: kök dizin bloğu, i-node 6, blok 132, i-node 26, blok 406.
  4. 209.715.200 girdi × 4 B = 800 MiB.
  5. (12 + 1024 + 1024² + 1024³) × 4 KiB ≈ 4 TiB (4.402.345.721.856 B).
  6. Blok 1220 → çift dolaylı (0, 184); 3 okuma.
  7. (2, 4) (8, 6) (17, 2) (25, 3).
  8. Önce: işlem yok sayılır, eski tutarlı durum. Sonra: günlük yeniden oynatılır.
  9. SSD boşalan sayfaları bilmez; çöp toplamada boşuna kopyalar, yazma büyütmesi artar.

Özet

Kaynaklar

  • A. Silberschatz, P. B. Galvin, G. Gagne, Operating System Concepts, 10. baskı, Wiley, 2018 — Bölüm 13 (File-System Interface), 14 (File-System Implementation), 15 (File-System Internals).
  • A. S. Tanenbaum, H. Bos, Modern Operating Systems, 4. baskı (2014) / 5. baskı (2022), Pearson — Bölüm 4: File Systems.
  • R. H. Arpaci-Dusseau, A. C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces (OSTEP), ostep.org — “Files and Directories”, “File System Implementation”, “Fast File System”, “Crash Consistency: FSCK and Journaling”, “Log-structured File Systems”, “Flash-based SSDs”, “Data Integrity”, “Sun's NFS”.
  • M. Rosenblum, J. K. Ousterhout, “The Design and Implementation of a Log-Structured File System”, ACM TOCS, 1992; M. K. McKusick ve diğ., “A Fast File System for UNIX”, ACM TOCS, 1984.
  • Linux çekirdek belgeleri: “Overview of the Linux Virtual File System”, “ext4 Data Structures and Algorithms”; Microsoft Learn: NTFS ve exFAT belirtimi; OpenZFS ve Btrfs belgeleri; UEFI belirtimi (GPT).

Son

Bölüm 10: Dosya Sistemleri
Sonraki bölüm: Giriş/Çıkış
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.