Bölüm 10: Dosya Sistemleri
Giriş
Öğrenme Çıktıları
Dosyayı adı, türü, öznitelikleri ve işlemleriyle tanımlamak; açık dosya tablolarını ve dosya tanımlayıcılarını izlemek.
Dizin yapılarını karşılaştırmak, bir yolu adım adım çözmek, katı/sembolik bağ ve bağlamayı (mount) açıklamak.
rwx izin bitlerini ve özel bitleri okumak; POSIX ve NTFS ACL'lerini karşılaştırmak.
Bitişik, bağlı liste, FAT ve i-node tahsisini aynı dosya üzerinde uygulamak; en büyük dosya boyutunu hesaplamak.
Biteşlem, liste, gruplama ve sayma yöntemlerini hesaplamak; tampon/sayfa önbelleğini ve önden okumayı açıklamak.
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?
Dosya Kavramı
Dosya Adlandırma
| Dosya sistemi | Ad uzunluğu | Büyük/küçük harf | Not |
|---|---|---|---|
| FAT (MS-DOS) | 8.3 (ör. RAPOR~1.TXT) | duyarsız | VFAT uzun adı ek girdilerde: 255 UTF-16 |
| NTFS | 255 UTF-16 birimi | korur, duyarsız | \ / : * ? " < > | yasak |
| ext4, XFS | 255 bayt | duyarlı | yalnız / ve NUL yasak |
| APFS | 255 UTF-8 karakter | macOS'ta varsayılan duyarsız | Unicode normalizasyonu |
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).
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
| Grup | Uzantılar ve açılımları |
|---|---|
| Belge | docx Word (Office Open XML), doc eski ikili Word, pdf Portable Document Format, odt OpenDocument, rtf, txt |
| Görsel | jpg JPEG, png Portable Network Graphics, gif, bmp bitmap, tiff; yeni: webp, avif, heic |
| Ses / video | mp3 MPEG-1 Audio Layer III, wav, m4a, flac; mp4 MPEG-4 Part 14, mkv, webm, mov; flv artık eski |
| Tablo / sunum | xlsx, csv Comma-Separated Values, pptx, odp |
| Web | html HyperText Markup Language, css Cascading Style Sheets, js JavaScript |
| Yürütülebilir | exe Windows PE, msi Windows Installer; Linux'ta ELF uzantısızdır, kütüphane .so |
| Arşiv | zip, 7z, rar, tar Tape Archive, gz gzip, zst Zstandard |
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ı
- 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/writearayüzü aygıtlar, borular ve soketler için de çalışır. Tablodaki harfls -lçıktısının ilk karakteridir.
| Harf | Tür | Örnek |
|---|---|---|
- | normal dosya (metin ya da ikili) | notlar.txt, /bin/ls |
d | dizin | /home |
l | sembolik bağ | /bin → usr/bin |
c | karakter aygıtı (seri, bayt bayt) | /dev/tty, /dev/null |
b | blok aygıtı (blok blok, rastgele) | /dev/nvme0n1, /dev/sda |
p | adlandırılmış boru (FIFO) | mkfifo kanal |
s | UNIX soketi | /run/systemd/notify |
Dosya Kavramı
İkili Dosyalar: Yürütülebilir ve Arşiv
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
| Öznitelik | Anlam | Nerede / nasıl |
|---|---|---|
| Ad, tür, konum | dizin girdisindeki ad; i-node/MFT kaydındaki tür ve blok adresleri | tüm sistemler |
| Boyut | mantıksal boyut (st_size) ve ayrılmış alan (st_blocks) | seyrek dosyada ikisi farklıdır |
| Sahip, grup | UID / GID; Windows'ta SID | chown, icacls |
| Koruma | rwx bitleri, ACL | chmod, 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, System | salt okunur, gizli, sistem dosyası | Windows attrib; UNIX'te gizli = ad . ile başlar |
| Archive | son yedekten sonra değişti, yedeklenecek | Windows; yedekleme aracı sıfırlar |
| Compressed, Encrypted | sıkıştırılmış / şifrelenmiş | NTFS, Btrfs, APFS; fscrypt, BitLocker |
| Sparse, Temporary | sıfır blokları diskte yok; geçici (önbellek ipucu) | NTFS bayrakları |
| Reparse point | özel işleme: sembolik bağ, junction, bulut yer tutucu | NTFS |
| Genişletilmiş öznitelik | ad = değer çiftleri | xattr (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 */ };
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ı
| İşlem | POSIX çağrısı | Ne yapar? |
|---|---|---|
| Create | open(O_CREAT), creat | boş dosya ve dizin girdisi oluşturur, öznitelikleri atar |
| Delete | unlink | adı siler; bağ sayısı 0 olup son tanımlayıcı da kapanınca alan boşalır |
| Open | open | yolu çözer, i-node'u belleğe alır, tanımlayıcı (fd) döndürür |
| Close | close | fd'yi ve gerekirse tablo girdilerini serbest bırakır |
| Read / Write | read, write | dosya konumundan itibaren okur / yazar, konumu ilerletir |
| Append | open(O_APPEND) | her yazma atomik olarak dosya sonuna gider |
| Seek | lseek | konumu değiştirir (rastgele erişim); G/Ç yapmaz |
| Get / Set attributes | stat, chmod, chown, utimensat | öznitelikleri okur / değiştirir |
| Rename | rename | adı değiştirir; aynı dosya sisteminde atomiktir |
| Truncate, Map | ftruncate, mmap | boyutu 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ı
- fd: çekirdeğin süreç başına tablosunda bir indis; 0, 1, 2 standart girdi/çıktı/hata,
openen küçük boş numarayı verir. - Açık dosya girdisi konumu (offset) ve erişim kipini tutar:
forkvedupgirdiyi paylaşır (ortak konum); ikinci biropenyeni 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; }
Başlangıç: yalnız 0, 1, 2 açık (kabuktan miras: terminal).
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.
İlk read: blok(lar) önbelleğe/okunur, 4096 bayt buf'a kopyalanır, konum 4096 olur.
İkinci read: dosyada yalnız 1904 bayt kaldı; kısa okuma hata değildir. Konum 6000.
Üçüncü read 0 döndürür: dosya sonu (EOF). Hata olsaydı −1 ve errno.
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; }
in = 3; out = 4. O_TRUNC: xyz varsa içeriği silinir, yoksa O_CREAT ile 0644 izinle oluşturulur.
İlk read: 4096 bayt tampona.
write aynı 4096 baytı xyz'ye yazar (önce sayfa önbelleğine; diske sonra gider).
İkinci tur: 8192 bayt kopyalandı.
Üçüncü read yalnız 1808 bayt döndürür; write tam n bayt yazar (BUF değil!).
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ı: 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 |
|---|---|
mkdir | boş dizin oluşturur (içinde yalnız . ve ..) |
rmdir | dizini siler; dizin boş olmalıdır |
opendir / closedir | dizin akışını açar / kapatır |
readdir | açık dizindeki bir sonraki girdiyi (ad, i-node no., tür) döndürür |
rename | dosya ya da dizini yeniden adlandırır veya taşır (aynı dosya sisteminde atomik) |
link | var olan bir dosyaya yeni bir ad (katı bağ) ekler; i-node'un bağ sayısı artar |
symlink | hedef yolunu içeren sembolik bağ oluşturur |
unlink | bir 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
writeile değil, yalnızca bu çağrılarla değiştirebilir. - Eski listedeki “Link, dizini başka bir dizine bağlar” ifadesi yanlıştı:
linkdosyaya ikinci bir ad verir; dizinlere katı bağ kullanıcıya yasaktır (döngü önlenir).
Dizinler · Adım adım
Dizin Yapıları
Tek düzeyli: basit, ama adlandırma ve gruplama sorunları var.
İ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.
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.
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.
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/dersiç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).
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
Mutlak yol: kök dizinin i-node'u (UNIX'te 1; ext4'te 2) bilinir. Kök dizinde usr aranır → i-node 6.
i-node 6 okunur: /usr bir dizin, içeriği blok 132'de. (Burada izin denetimi de yapılır: dizinde x hakkı gerekir.)
Blok 132 okunur, ast aranır → i-node 26.
i-node 26: /usr/ast dizininin içeriği blok 406'da.
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
echo merhaba > a.txt: dizin girdisi a.txt → i-node 812, bağ sayısı 1.
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.
ln -s a.txt c.txt (sembolik bağ): kendi i-node'u (905) olan küçük bir dosya; içeriği hedefin yoludur.
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)
İki ayrı dosya sistemi. /mnt/usb sıradan bir dizin ve içinde eski.txt var.
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.
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
| Hak | Dosyada | Dizinde |
|---|---|---|
r | içeriği oku | girdileri listele (ls) |
w | içeriği değiştir | girdi ekle/sil/yeniden adlandır (dosyanın kendi izni önemsiz!) |
x | program olarak çalıştır | iç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ğerlerindexyok → büyükT.
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::---
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.
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şım | Artı | Eksi |
|---|---|---|
| ACL (nesne başına) | “bu dosyaya kim erişir?” kolay | liste uzar, yönetim zor |
| rwx (sahip/grup/diğer) | 9 bit, hızlı | kaba taneli |
| Yetenek (capability) | “bu süreç ne yapabilir?” kolay | geri 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
- 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
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 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.
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.
Önyükleyici çekirdeği bulur, belleğe yükler; gerekirse menü sunar. Güvenli Önyükleme (Secure Boot) imzaları bu aşamada doğrular.
Ç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
- 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
Bitişik: 5 blok yan yana (9–13). Dizin girdisinde yalnız başlangıç ve uzunluk.
Bağlı liste: bloklar diske dağılmış (9, 16, 1, 10, 25); her blok sonrakini gösterir.
FAT: aynı zincir, ama işaretçiler bloklarda değil bellekteki tabloda; bloklar tamamen veri.
İndeksli: tüm adresler tek bir indeks bloğunda (19); i. bloğa doğrudan erişilir.
Tahsis Yöntemleri · Adım adım
Bitişik Tahsis
Her dosya ardışık bloklara yerleştirildi; dizin girdisi = (başlangıç, uzunluk).
Silinen dosyalar delik bırakır; boş alan parçalara bölünür.
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.
Çözüm: birleştirme/sıkıştırma (pahalı) ya da dosyayı birden çok bitişik parçaya, extent'lere bölmek.
Basit; i. blok = başlangıç + i, rastgele erişim kolay; tüm dosya tek aramayla, art arda okunur (HDD'de en iyi performans).
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
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.
Mantıksal 3. bloğu okumak istiyoruz: önce fiziksel 4 okunur → sonraki 7.
Fiziksel 7 okunur → sonraki 2.
Fiziksel 2 okunur → sonraki 10.
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
A: 4 → 7 → 2 → 10 → 12; B: 6 → 3 → 11 → 14.
Girdi 4 = 7.
Girdi 7 = 2.
Girdi 2 = 10.
Girdi 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ı.
Tahsis Yöntemleri
FAT Ailesi: FAT12/16/32 ve exFAT
| FAT12 | FAT16 | FAT32 | exFAT | |
|---|---|---|---|---|
| FAT girdisi | 12 bit | 16 bit | 28 bit kullanılır | 32 bit |
| En büyük birim | ≈ 16 MiB | 2 GiB (32 KiB küme) | 2 TiB (512 B sektör) | 128 PiB |
| En büyük dosya | birim kadar | 2 GiB | 4 GiB − 1 bayt | 16 EiB (kuramsal) |
| Boş alan | FAT'ta 0 | FAT'ta 0 | FAT'ta 0 + FSInfo ipucu | ayrı biteşlem |
| Kullanım | disket | eski diskler | USB, UEFI ESP | SDXC/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).
Tahsis Yöntemleri
i-node Yapısı: Dolaylı Bloklar
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
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
40.000 / 4096 = 9 → 12'den küçük: doğrudan işaretçi 9. Tek okuma.
1.000.000 / 4096 = 244; 244 − 12 = 232 < 1024 → tek dolaylı bloğun 232. girdisi. 2 okuma.
5.000.000 / 4096 = 1220; 1220 − 12 − 1024 = 184 < 1024² → çift dolaylı: dış indeks 184 div 1024 = 0, iç indeks 184. 3 okuma.
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
- 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)
- 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).$LogFilemeta 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 sistemi | En büyük dosya | En büyük birim | Çökme tutarlılığı | Tipik kullanım |
|---|---|---|---|---|
| FAT32 | 4 GiB − 1 B | 2 TiB | yok (chkdsk/fsck) | USB, UEFI ESP |
| exFAT | 16 EiB* | 128 PiB | yok | SD kart, harici disk |
| NTFS | 16 EiB* (Windows: 256 TiB–8 PiB) | 256 TiB–8 PiB | meta veri günlüğü | Windows |
| ext4 | 16 TiB (4 KiB blok) | 1 EiB | günlük (jbd2) | Linux, Android |
| XFS | 8 EiB | 8 EiB | meta veri günlüğü | RHEL, büyük sunucular |
| Btrfs | 16 EiB | 16 EiB | CoW + sağlama toplamı | Fedora, openSUSE, NAS |
| ZFS | 16 EiB | 2¹²⁸ B (kuramsal) | CoW + sağlama toplamı | FreeBSD, TrueNAS, sunucu |
| APFS | 8 EiB | 8 EiB | CoW, 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
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: 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.
Karma tablosu: adın özeti kovayı seçer; arama ortalama O(1).
Ç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
- 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
Örnek disk: 32 blok, 15'i boş (Silberschatz örneği).
Biteşlem: blok başına 1 bit. Boyutu sabit ve küçük; bitişik boş blok aramak kolay. Bellekte tutulması gerekir.
Bağlı liste: boş bloklar birbirine bağlanır. Tek boş blok almak ucuz, çok sayıda bitişik blok bulmak pahalı.
Gruplama: ilk boş blok sonraki n−1 boş bloğun adresini ve bir sonraki grup bloğunu tutar (UNIX'in boş liste blokları).
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ği | Modern örnek | |
|---|---|---|
| Disk / blok | 500 GB, 1 KiB blok | 1 TiB, 4 KiB blok |
| Blok sayısı | 500 × 10⁹ / 1024 ≈ 488,3 milyon | 2⁴⁰ / 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şken | 488,3 M / 255 ≈ 1,91 milyon blok | 268,4 M / 1023 ≈ 262.401 blok (≈ 1 GiB) |
| Biteşlem | 488,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ı
- 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
EDQUOTile reddedilir. - Bugün: Linux
quotaaraçları (ext4, XFS proje kotaları), NTFS birim kotaları, ZFS veri kümesi ve Btrfs alt birim (qgroup) kotaları.
Performans
Tampon Önbelleği (Buffer Cache)
| Erişim | Gecikme (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
fsyncile zorlar.
Performans · Adım adım
Sayfa Önbelleği ve Birleşik Tampon Önbelleği
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.
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
- Ö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_fadviseile 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
A dosyası LBA 0–3'e yazılır; FTL bunları X bloğundaki sayfalara eşler.
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.
rm A: dosya sistemi bloklarını kendi biteşleminde boş işaretler, ama SSD bunu bilmez.
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üm | Mantıksal döküm | |
|---|---|---|
| Ne kopyalanır? | blok 0'dan sona tüm (kullanılan) bloklar | seçilen dizinler ve dosyalar, yollarıyla |
| Hız, basitlik | çok hızlı, basit | daha yavaş, karmaşık |
| Dizin atlama, artımlı yedek | yapamaz | yapabilir (değişenler) |
| Tek dosyayı geri yükleme | zor | kolay; başka makinede de |
| Bozuk bloklar | denetleyici yeniden eşlemeli ya da İS listeyi bilmeli | sorun 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ı
Kareler dizin, daireler dosya; sayılar i-node numarası. Turuncu: son dökümden beri değişenler (3, 6, 10).
Aşama 1: kökten başlayıp ağacı dolaş; değişen her dosyayı ve tüm dizinleri işaretle.
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).
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.
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
(a) Tutarlı: fsck tüm i-node'ları ve boş listeyi/biteşlemi okur, blok başına iki sayaç tutar.
(b) Eksik blok: zararsız ama alan kaybı; boş listeye konur.
(c) Boş listede yinelenen blok: aynı blok iki kez verilebilirdi; liste yeniden oluşturulur. (Biteşlemde bu durum oluşamaz.)
(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?
- 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
1. Veri: dosyaya eklenen blok Db önce son yerine yazılır (ordered kip, ext4 varsayılanı).
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.
3. İşlemi onayla: önceki yazmalar diske ulaşınca (bariyer/FLUSH) TxE yazılır. TxE diskteyse işlem kesinleşmiştir.
4. Kontrol noktası: I ve B son yerlerine yazılır; bu yazmalar arada kesilse de günlükten tekrarlanabilir.
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.
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
Dosya sistemi bir blok ağacıdır: süperblok (ZFS'te uberblock) → kök → iç düğümler → veri.
L3 değişecek: yerinde yazılmaz; yeni kopya L3' boş bir yere yazılır. Eski L3 hâlâ sağlam.
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.
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.
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)
Yazmalar bellekte biriktirilir: veri blokları, değişen i-node'lar ve i-node haritası (imap) parçaları.
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.
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.
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)
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.
Bağlama: VFS o dosya sisteminden süperblok nesnesini kurmasını ister; nesne işlem tablosunu (s_op) taşır.
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.
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)
- 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: adlı, kalıcı bayt dizisi + öznitelikler. Dizin: ad → i-node eşlemesi; ağaç + bağlar, bağlama ile tek ağaç.
fd → sistem geneli girdi (konum) → bellek içi i-node. Yol çözümü bileşen bileşen ilerler.
Bitişik (hızlı, dış parçalanma), bağlı/FAT (esnek, rastgele erişim zayıf), i-node/extent (bugünkü çözüm).
Biteşlem, liste, gruplama, sayma; blok boyutu hız ile alan arasında ödünleşimdir.
Birleşik sayfa önbelleği, önden okuma, yakın yerleşim; SSD'de TRIM.
fsck → günlükleme → CoW/LFS. Yedek yine de şart: 3-2-1.
Özet
Kontrol Soruları
- 6000 baytlık dosyayı 4096 baytlık tamponla okuyan döngüde
readsırasıyla ne döndürür? ln a bveln -s a csonrasırm ayapılırsa b ve c ne olur?/usr/ast/mboxönbelleksiz kaç disk okumasıyla çözülür (kök i-node bellekte)?- 200 GiB disk, 1 KiB blok, 4 B girdi: FAT ne kadar bellek ister?
- 4 KiB blok, 4 B işaretçi, 12 doğrudan + tek/çift/üç dolaylı: en büyük dosya?
- Aynı yapıda 5.000.000. bayt hangi düzeydedir, kaç okuma gerekir?
- Boş bloklar 2–5, 8–13, 17–18, 25–27: sayma yöntemiyle gösterin.
- Günlüklemede TxE yazılmadan önce ve sonra çökmenin farkı nedir?
- SSD'de dosya silindiğinde neden TRIM gerekir?
Cevaplar
- 4096, 1904, 0 (EOF).
- b çalışır (bağ sayısı 1); c askıda kalır (ENOENT).
- 5: kök dizin bloğu, i-node 6, blok 132, i-node 26, blok 406.
- 209.715.200 girdi × 4 B = 800 MiB.
- (12 + 1024 + 1024² + 1024³) × 4 KiB ≈ 4 TiB (4.402.345.721.856 B).
- Blok 1220 → çift dolaylı (0, 184); 3 okuma.
- (2, 4) (8, 6) (17, 2) (25, 3).
- Önce: işlem yok sayılır, eski tutarlı durum. Sonra: günlük yeniden oynatılır.
- 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).