Alper Yazar - ayazar.dev Logo
  • 🤓 About
    • ✉️ Contact
    • Education
    • Work Experience
    • Publication
      • Patent
      • Thesis
      • Conference
      • Poster
      • Lecture Note
    • Project
      • Funded
      • Hobby
      • Class
        • PhD
        • MSc
        • BSc
    • Attended Trainings
      • Hardware
      • Embedded/Software
      • Digital/FPGA
    • Honor & Award
    • Event
    • Membership
    • Activity
    • Follow
    • Site Info
  • ➡️ Follow
  • 📝 Blog
    • 2025
      • Yeni Mezun Sistem Mühendisi Olur mu?
        • Temelde neden ayrıştık?
        • Güzel gelişmeler 👍
        • Ama yine de…
        • Zor olan hedef belirlemek
        • Görev tanımlarına dikkat ❗
    • 2024
      • Why do we have programming languages in the first place? Part 1
        • Why do computers exist in the first place? 💻
        • Processors
        • Talking with Processors
        • ISA: The Contract
        • ISA: Bad and Good News
        • Putting Instructions into The Memory
        • Machine Language
        • Assembly: The First Step Towards to Programming Languages
      • 12 Yaşındaki Laptop’uma Hafta Sonu Linux Bakımı
        • Taşınma Hazırlıkları
        • Ventoy
        • Kurulum
        • Kullanım
      • Sadece İki Tıklama ile ChatGPT Export! Markdown, HTML, txt, png…
      • My Zsh Setup
        • Oh My Zsh
        • powerlevel10k
        • plugins
        • In action
    • 2023
      • TIOBE Index nedir? Güvenebilir miyiz?
        • TIOBE Index nasıl hesaplanıyor?
        • Alternatifler
        • Popülerlik nedir?
        • Yani?
        • İlgili Kaynaklar
      • Muhendislik Yapabilirim
        • Yeteri kadar zeki değilim sanırım
        • Neticede kul yapımı
        • Roma uno die non est condita
        • İşin tarihini de biraz öğrenelim
        • Bugün anlamak zorunda değiliz
        • O benden daha çok biliyor
        • Eyvah, geride kaldım!
        • Ama eğim çok düşük, arttırmam lazım
        • İlerlediğimi nasıl anlayabilirim?
        • Her katmanı (stack) (çok iyi) bilmek zorunda değiliz
        • O konuda motivasyonum hiç yok
        • Başka?
      • Full Stack Elektronik Mühendisi?
        • Full Stack Developer kimdir?
        • Stack nedir?
        • Elektronik sistemlerdeki katmanlar
        • Full Stack Elektronik Mühendisi
        • Full Stack Electronics kavramı
        • Tartışma
      • İlk CTF Deneyimim
        • CTF (Capture the Flag)
        • “Ee, peki sen nasıl ikinci oldun?”
        • Son Sözler
      • lychee: Kırık Link Kalmasın
        • Neden kullanıyorum?
        • Docker
        • CI
        • Github Actions
        • Son Sözler
    • 2022
      • Kod ile beraber Visual Studio Code eklentileri öneriyoruz
        • Referanslar
      • Recommend Visual Studio Code extensions along with your code
        • Basics
        • Working with git
        • extensions.json
        • Finding names of extensions
        • Why?
        • Do not trust developers!
      • Merhaba (go)Hugo!
        • Neden değiştirdim?
        • Bundan sonra ne olacak?
      • WinDirStat
        • Linux
    • 2021
      • Create search link between SumatraPDF and TeXstudio with SyncTeX
      • Sumatra PDF
        • Giriş
        • Fare Desteği
        • LaTeX ve SyncTeX Kolaylığı
        • Küçük Boyut, Hız, Taşınabilir Sürüm
        • Kişiselleştirme
        • Eksiler
      • Raspberry Pi SD kart taşıma ve büyütme
        • SD kartı bilgisayara kopyalama
        • Bilgisayardan yeni SD karta kopyalama
        • Raspberry Pi üzerinde alanların genişletilmesi
        • Sonuç
      • Tekrar Merhaba Jekyll!
        • Neden?
        • Değerlendirme
      • Using WSL on an offline Windows machine
        • Getting files
        • Enabling WSL on Windows
        • Installing WSL package
        • Error: “The service has not been started”
        • Pitfall: Moving Ubuntu 20.04 After Installation
        • Error: “WslRegisterDistribution failed with error: 0x80070005”
        • Conclusion
    • 2020
      • Using VS Code with self signed SSL certificates behind proxy
        • Solution
      • Use pip and pipenv with self signed SSL certificates
        • Solution
      • Tekrar Merhaba MkDocs!
      • Tekrar Merhaba DokuWiki!
      • Güncel (Sayısal Tasarım) Doğrulama Yöntemleri ve Araçları
      • Microsoft Word: ‘You can’t make this change because this selection is locked.’
      • Merhaba MkDocs!
    • 2019
      • Dokuwiki ile Blog Deneme
      • Yazamayanlara
      • Crash Course Computer Science
      • Windows 10 1803->1903 Yükseltmesi Sırasında GRUB’un Bozulması
        • Sorun
        • Çözüm
        • Sebebi neydi ki?
      • Merhaba Sphinx!
    • 2018
      • Tensorflow (NVIDIA GPU Desteği ile) ve Keras Kurulumu
        • Windows 10 İçin
        • Windows 7 İçin
        • Hata Ayıklama
    • 2017
      • Camcorder DVD Video Recovery on Ubuntu with photorec
        • TL;DR
        • Introduction
        • Data Recovery Tools
        • Conclusion
    • 2014
      • Install DokuWiki without Mail Support
      • ZofzPCB
        • Features That I Like
        • Features That I Love
        • Features That I Will Like
      • 235.000’in 9.000’e Tam Olarak Bölünmemesi
      • Windows’un Sunduğu ‘Hazırda Beklet’ ve ‘Uyku’ Seçeneklerini Sürekli Ters Algılamam
    • 2013
      • Yeni Enstrüman: Elektro Gitar + Amfi 🎵
        • Seçim Sebebim
        • Tremolo Koluna Dikkat!
        • Amfi (Amplifikatör)
    • 2012
      • Ubuntu Üzerinde Disket Sürücüsünü Kullanma
      • LaTeX’te Otomatik Hecelemeyi Kapatma
      • Ankara Bitirme Projeleri Sergisi 29 Haziran - 1 Temmuz 2012
    • 2011
      • Atari Kolu (NES Controller) Arayüzü
        • Atari Kolunun Sinyalleri
        • PIC ile Atari Kolunun Kullanılması
        • Kaynaklar
      • Altera DE0 FPGA Geliştirme Kiti
      • Ninite
      • Türkçe Ubuntu Üzerinde MATLAB Çalıştırma Problemi ve Çözümü
      • AirTies RT-205 Açma - Kapama Düğmesi Arızası
        • Modemi Tamir Ediyoruz
        • Son Sözler
  • 📹 Video
    • Gömülü (Embedded) C ???
      • Videoda Geçen Bağlantılar
    • Linux Terminalinizi Kaydedin ve Paylaşın! asciinema ile Tanışın!
      • Bağlantılar
      • Jekyll ve asciinema Kullanımı
      • Sphinx ve asciinema Kullanımı
      • İlginizi Çekebilir
    • 🔴 Yapay Zeka Hızlandırıcıları, NPU | M. Sezgin Baloğlu, ML Compiler Engineer
    • Hard ve Soft Processor (İşlemci) ve IP Kavramı, FPGA ve SoC’ler
      • Notlar
    • GÖMÜLÜ YAZILIMIN olmazsa olmazı CROSS COMPILATION nedir?
      • Notlar
  • ❤️ Destek / Support
    • Yorum bırakın
    • Pull Request gönderin
    • Arkadaşlarınızla paylaşın
    • Finansal olarak destekleyin 💸
    • Leave a comment
    • Submit a Pull Request
    • Share with your friends
    • Support Financially 💳

Notlarım

  • ⁉️ Notlarım Hakkında
    • Eğitim veya Ders Amaçlı Değildir
    • Yarı Türkçe ve Yarı İngilizce Notlar
    • İçerik Doğruluğu
    • Dilbilgisi Hataları ve Düşük Cümleler
    • İçerik Yarım ve Canlıdır
    • İçerik Yarım ve Eskidir
  • 👷 Buildroot
    • 📝 Notlarım
      • Buildroot İle Gömülü Linux: Başlıyoruz!
        • Bağlantılar
      • Gömülü (Embedded) Linux nedir? Buildroot ve Yocto ne işe yarar?
        • Videoda Geçen Bağlantılar
        • Notlar
      • Buildroot ile Tanşıyoruz
        • Videoda Geçen Bağlantılar
        • Notlar
      • Buildroot ile ilk derleme!
        • Geliştirme Ortamının Oluşturulması 💻
        • Buildroot’un Edinilmesi ⬇️
        • Paketlerin Kurulması 📦
        • Buildroot’u Kullanmaya Başlama 🚀
        • Derleyelim 🛠️
        • Kapanış
  • 🇨 C
    • 📝 Notlarım
      • 📜 History of C
        • 70s
        • 80s
        • 90s
        • 2000s
        • Standards Summarized
        • UNIX and C
        • Long live C!
        • Related
        • Resources
        • Changelog
      • 🌈 15 Features of The C Programming Language
        • 🤖 artificial
        • 🔨 compiled
        • 💚 efficient
        • 🎨 expressive
        • ⭕ general purpose
        • 👮 imperative
        • ⬇ middle-low level
        • 🆓 non-proprietary
        • 🎊 popular
        • 👜 portable
        • 〽 procedural
        • 📓 standard
        • ⚓ statically typed
        • 🏗️ structured
        • 〰 weakly typed
        • 📚 Resources
      • 🏗️ Bir C Programı Derlenirken Olanlar
        • Derleme Adımları
        • Time’lar
        • Kaynaklar
      • 🔤 Character Set(s) - Karakter Set(leri)
        • Basic ve Extended Karakterler
        • Escape Sequence
        • Null Character
        • Basic Source ve Execution Character Sets
        • Trigraph sequences ??x
        • Kaynaklar
      • 🔨 Translation Phases - Çevirim Aşamaları
        • Faz 1
        • Faz 2
        • Faz 3
        • Faz 4
        • Faz 5
        • Faz 6
        • Faz 7
        • Faz 8
        • Kaynaklar
      • 📚 Resources
        • Standard Documents
        • Web
        • Online Compilers
        • Exercise
        • Books
    • Diğer İçerikler
      • 220 saatlik C kursu alınır mı?
        • Aldığım kurs
        • C ve Sistem Programcıları Derneği (CSD)
        • Kurs kimler için uygun ve değil? 🤷‍♂️
        • Kurs tarihçesi ⏳
        • Kurs pahalı 💰 ve uzun mu ⏱️? Diğer kurumsal kurslar? Udemy?
        • Kurumsal, özel sınıf ders 🏢
        • Gömülü (Embedded) C anlatılıyor mu?
        • Okula faydası olur mu? 🏫
        • Mülakatlara hazırlık 👔
        • Programlamayı yeni öğrenenler için? 🐣
        • Kaan Aslan vs Necati Ergin ⚔️
        • Olası mutsuzluklar 😔
        • Kursu alacaklara öneriler 💡
        • Meraklılara… 🔍
      • Do not let the structure padding ruin your day
        • Moral of the story
      • C programlamada gördüğüm en sık yapılan hata
        • Bu neden hatalı?
        • Bu hatayı neden yapıyoruz?
        • Örnek
        • Derleme sırasında yakalayalım
        • Özetle
      • Programlama dillerinde Statik ve Dinamik Tür kavramı
        • Python, Dinamik Tür Kavramına Örnek
        • C, Statik Tür Kavramına Örnek
        • İlgili
        • Kaynaklar
      • Yoda Notation
        • Further Read
      • C is a procedural language
        • resources
      • C is an imperative language
        • imperative vs declarative
        • a declarative example
        • computer architecture and imperative programming
        • functional programming
        • summary
        • resources
    • 📹 Video
  • 🤯 C++
    • 📝 Notlarım
    • 📚 Kaynaklar
  • ♾️ DevOps
    • 🧰 Araçlar
      • Asciinema
        • Kurulum ve Kullanım
        • Online ve Self-Hosted Kullanım
      • CyberChef
      • draw.io
      • Excalidraw
      • HedgeDoc
      • Jirafeau
      • JSON Editor Online
      • Uptime Kuma
      • Mattermost
      • Word to Markdown Converter
    • GitLab
      • CI/CD Variables
        • Kaynaklar
      • Gitlab Private Container Registry, Runner Konfigürasyonu
        • Access Token Oluşturulması
        • Runner Konfigürasyonu
        • Test
    • Podman
      • Podman Kurulumu
        • /etc/subuid ve /etc/subgid
      • Podman’i Self Hosted Registry İle Kullanma
  • 🪦 Gömülü Sistemler
    • 🤝 Arayüzler
      • Modbus
        • Protokol
        • MODBUS PDU
        • Data Encoding
        • Data Model
        • Function Codes
        • Kaynaklar
      • Modbus RTU
        • Master State Diagram
        • Slave State Diagram
        • Örnek Akış
        • Transmission Modes
        • RTU
        • CRC
        • Framing
      • Modbus Function Codes
        • Read Coils, 0x01
        • Read Discrete Inputs, 0x02
        • Read Holding Registers, 0x03
        • Read Input Registers, 0x04
        • Write Single Coil, 0x05
        • Write Single Register, 0x06
        • Read Exception Status, 0x07
        • Diagnostics, 0x08
        • Get Comm Event Counter, 0x0B ve Get Comm Event Log, 0x0C
        • Write Multiple Coils, 0x0F
        • Write Multiple Registers, 0x10
        • Report Server ID, 0x11
        • Read File Record, 0x14
        • Write File Record, 0x15
        • Mask Write Register, 0x16
        • Read/Write Multiple registers, 0x17
        • Read FIFO Queue, 0x18
        • Encapsulated Interface Transport, 0x2B
        • MODBUS Exception Responses
    • 📹 Video
  • 🐧 Linux Aygıt Sürücü
    • 📝 Notlarım
      • Aygıt Sürücüleri ve Çekirdek Modülleri
        • Gerekli Dosyaların Elde Edilmesi
        • Kernel Fonksiyonları
        • Kernel Modüllerinin Derlenmesi ve Link Edilmesi
        • Kaynaklar
      • “Merhaba Dunya!”
        • Kernel’e Modülün Yüklenmesi ve Çıkartılması
        • Kaynaklar
      • 3
        • Kaynaklar
    • 📚 Kaynaklar
  • 🐧 Linux Sistem Programlama
    • 📝 Notlarım
      • Linux Sistem Programlama nedir? + bazı SSS
        • Sistem Programlama nedir?
        • Linux Sistem Programlama nedir?
        • Bu Seri Hakkında
        • Kaynaklar
      • Soyutlama Katmanları, Arayüzler ve Standart C Kütüphanesi
        • Standart C Kütüphanesi ve POSIX Fonksiyonları
        • Daha Yüksek Seviyeli Diller
        • Özet
        • Öneriler ve Kaynaklar
      • POSIX, SUS ve LSB
        • Özet
        • Kaynaklar
      • Linux Kernel Arayüzü
        • Kaynaklar
      • man Sayfalarında Yolumuzu Bulma
        • Yerel man sayfaları
        • Section(s)
        • GNU Info System
        • GUI Yardım Araçları
        • Online
        • Kaynaklar
      • Merhaba Dünya!
        • 🛣️ strace
        • 🪨 Statik Bağlama, Static Linking
        • 🏃 libc’den Kaçış
        • Assembly
        • 📁 Her yer dosya!
        • stdio.h, stdin, stdout, stderr
        • write()
        • Özet
        • İlgili Kaynaklar
      • size_t ve ssize_t Sorunsalı
        • Uçtan Uca
        • Özet
      • Hata Durumları, errno
        • errno
        • POSIX ve Sistem Fonksiyonları
        • errno Değerleri
        • Bakınız
      • Dosya Yaratma ve Açma: open()
      • Process Kavramı
        • Prosesler ile İlgili Komutlar
        • task_struct
        • PID
        • getpid() ve pid_t
        • Kullanıcı ve Grup ID
        • uid_t ve gid_t
        • Bakmaya Değer
      • Dosya Dizin İzin
        • Dosya Türleri
        • Dosya İzinleri
        • Dizin İzinleri
      • Inode Kavramı
        • Bazı Terimler
        • inode Kavramı
        • inode Temelli Dosya Sistemleri
        • İlgili Kaynaklar
      • rwx, Dosya, Dizin
        • İzinlerin Kontrol Sırası
        • Tekrar: Dizin ve inode Kavramı
        • Özet
        • İlgili Bağlantılar
      • Dizin İzinleri
        • Oda, Kapı, Kilit, Cam
        • r--
        • -w-
        • --x
        • rw-
        • r-x
        • -wx
        • rwx
        • ---
        • Özet
        • Dosya İzinleri
        • Kaynaklar
      • Soft Link ve Hard Link Kavramları
        • Hard Link
        • Soft Link (Symlink)
      • . and ..
        • Are they virtual or real?
        • Symlinks, Weird cd and pwd Behavior on . and ..
      • Özel Dosya İzinleri
        • Sticky Bit (1000)
        • Set UID, SUID (4000)
        • Set GID, SGID (2000)
        • Kaynaklar
      • DAC, ACL, MAC
        • DAC, Discretionary Access Controls
        • MAC, Mandatory Access Controls
        • ACL, Access Control List
        • Kaynaklar
      • Zaman Paylaşımlı Çalışma (Time Sharing Execution)
        • Quanta ve Context Switch Kavramları
        • Preemption Kavramı
        • Çok Çekirdekli Sistemler
        • Bloke Olma, Blocking Kavramı
        • I/O ve CPU Bound yani Yoğun Thread’ler
        • Örnek
        • time Programı
        • Kaynaklar
      • Sayfalama, Paging
        • Sanal Adres, Virtual Address
        • Sayfa Tablosu, Page Table
        • Ama neden?
        • Bölünme, Parçalanma, Fragmentation
        • Kaynaklar
      • Sanal Bellek, Virtual Memory
        • Swap In/Out
        • Nasıl çalışır? Page fault kavramı
        • Peki ama neden?
        • Sanal Bellek ve Kernel
        • Kaynaklar
      • Sanal Bellek Deneyleri (BİTMEDİ)
        • Sürekli malloc()
        • Overcommit Kavramı
    • 📚 Kaynaklar
      • Kaynaklar
        • 🌐 İçerik
        • 📚 man Sayfaları
        • 📖 Kitaplar
        • 📝 Standartlar
        • 👓 Bakmaya Değer
        • 🔤 Tercüme ve İçerik
  • 🐍 Python
    • 📝 Notlarım
      • Merhaba Python
        • Python nasıl bir dildir?
        • Tarihsel gelişim
        • Python Gerçekleştirimleri ve Dağıtımları
      • Temel Kavramlar
        • Çeviriciler, Derleyiciler ve Yorumlayıcılar
        • Doğal Kod, Ara Kod, JIT
        • Mülkiyet Kavramı
        • Dil Olgusu
        • Programlama Dilleri Kategorileri
        • Python nerededir?
      • Başlıyoruz!
        • REPL Çalışma
        • IDE
      • Token, Keyword, White Space, Statement ve Expression Kavramları
        • Python’da Atomlar, Tokens
        • White Space, Boşluk Karakterleri
        • Statement, Deyim Kavramı
        • Expression, İfade Kavramı
      • Temel Veri Türleri
        • 1 - int
        • 2 - float
        • 3 - bool
        • 4 - str
        • 5 - complex
        • 6 - NoneType
        • Çeşitli Sorular
        • Özet
      • Sabitlerin Türleri
        • 1 - int Türden Sabitler
        • 2 - float Türden Sabitler
        • 3 - bool Türden Sabitler
        • 4 - str Türden Sabitler
        • Escape Sequences - Ters Bölü, \, Karakterleri
        • ' içinde ', " içinde "
        • Regular String, r ve R
        • String Concatenation
        • """ ve ''' Kullanımı
        • Unicode Strings, u ve U
        • Bytes, b ve B
        • 5 - complex Türden Sabitler
        • 6 - NoneType Türden Sabitler
      • Yorum ve Etkisiz Kod Kavramları
        • Etkisiz Kod, Dead Code, Code as No Effect Kavramı
      • Değişken İsimlendirme Kuralları
        • Naming Conventions, Coding Conventions, İsimlendirme/Kodlama Stilleri
        • Hangisini kullanalım?
      • Değişkenler ve Nesneler
        • Tür Bilgileri?
        • id() Fonksiyonu
        • Adres Atamaları
        • Garbage Collector - Çöp Toplayıcı 🗑️
      • Immutable (Değiştirilemez) ve Mutable (Değiştirilebilir) Nesneler
      • Python Standart Kütüphanesi ve Modüller
        • Built-in Fonksiyonlar
      • print() ve input()
        • input()
        • input() ve Tür Dönüşümleri
        • Exception
        • print()
      • Fonksiyon ve Metot Kavramı
      • id(), is, is not ve Optimizasyon
        • is not Operatörü
        • == ve is
        • Tek Bir None Nesnesi
        • Optimizasyon Kavramı
      • Operatör Kavramı ve Sınıflandırılması
        • Operatörlerin Sınıflandırılması
        • Örnekler
      • Operatör Öncelikleri
        • Parantez, ()
        • Operatör Öncelik Tablosu
        • Tabloyu nasıl okumalıyız?
        • Örnekler
      • Temel Aritmetik Operatörler
        • Bölme, /, Operatörüne Dikkat
        • floordiv Operatörü, //
        • Mod Alma Operatörü, Modulo Operator, %
      • İşaret Artı + ve Eski - Operatörleri
      • 💥 Üs Operatörü, **
      • ⚖️ Karşılaştırma Operatörleri
        • ⛓️ Chained Comparisons, Zincirleme Karşılaştırmalar
      • 🧠 Mantıksal Operatörler
        • ⚡ Kısa Devre Özelliği, Short Circuit
        • not Operatörü
        • and ve or Operatörlerinin Birlikte Kullanımı
      • 🕳️ Türlerin Mantıksal Olarak Yorumlanması
      • 🟰 Atama “Operatörü”, =
      • 🦭 Walrus Operatörü, :=
      • İşlemli Atama “Operatörleri”, +=, *= vb
        • Kaynaklar
      • 🖨️ print() Fonksiyonunun Kullanımı
        • sep
        • end
      • ♻️ Temel Tür Dönüşümleri
        • float → int ✅
        • bool → int ✅
        • str → int ✅
        • complex → int 🚫
        • NoneType → int 🚫
        • int → float ✅
        • bool → float ✅
        • str → float ✅
        • complex → float 🚫
        • NoneType → float 🚫
        • int → bool ✅
        • float → bool ✅
        • str → bool ✅
        • complex → bool ✅
        • NoneType → bool ✅
        • Diğer Veri Türleri → bool ✅
        • int → complex ✅
        • float → complex ✅
        • bool → complex ✅
        • str → complex ✅
        • NoneType → complex 🚫
        • int → str ✅
        • float → str ✅
        • bool → str ✅
        • complex → str ✅
        • NoneType → str ✅
        • NoneType Türüne Dönüşüm 🚫
        • Argümansız Tür Dönüşüm Fonksiyonları
      • Farklı Temel Türlerin Birlikte İşleme Sokulması
        • int ve float
        • bool Türü
        • complex Türü
        • str Türü
      • Veri Yapısı ve Iterable Nesne Kavramı
        • Dolaşılabilir, Iterable Nesne Kavramı
      • Liste, List Veri Yapısı - 1
        • Liste Elemanlarına Erişim, [] Operatörü
        • IndexError Exception
        • “Adres Tutan Dizi”
        • Listeler değiştirilebilir
        • len() built-in Fonksiyonu
        • Boş Liste
        • list()
        • “list sınıfı da dolaşılabilir.”
        • list Nesnelerinin Bellek Orgranizasyonları
        • “str bir liste değildir.”
      • Liste, List Veri Yapısı - 2
        • Liste İçerisinde Liste
        • Python’da Matrisler (Matrix)
        • Negatif İndeks Değerleri
        • Dilimleme, Slicing
        • Listeyi Ters Çevirme
        • Dilimleme Yolu ile Listenin Güncellenmesi
        • Walrus, :=, Operatörünün Kullanımı
      • Listeler ve Shallow Copy, Sığ Kopyalama Kavramı
      • list Sınıfı ve Metotlar
        • append()
        • extend()
        • index()
        • count()
        • pop()
        • remove()
        • clear()
        • reverse()
        • sort()
      • reversed() ve sorted() Built-in Fonksiyonları
        • reversed() Fonksiyonu
        • sorted() Fonksiyonu
      • in ve not in Operatörleri
        • in Operatörü
        • not in Operatörü
        • not ve not in
      • del Deyimi
        • del ve ,
      • Listelerin Toplanması
        • Boş Listelerin Toplanması
        • += ≠ = + ❗
        • a.extend(b)
      • list * int
      • Listeler, Optimizasyon ve İç İçe Listeler
      • List Comprehension - Liste İçlemi
        • Döngü Kullanmak
        • List Comprehension
      • Demet, tuple Veri Yapısı - 1 (YARIM)
        • Demetler ve Listeler
    • 📚 Kaynaklar
  • ✖️ Xilinx
    • Genel
      • Xilinx (AMD) Remote Debugging Neden Kullanışlı ve Nasıl Yapılır?
        • Peki Ama Neden?
        • Nasıl yapılır? 🤓
        • Geliştirme Bilgisayarı
        • SSH Tünel 🚇
        • Vivado, Vitis, SDK, XSCT, program_flash
        • Hata Ayıklama 🐛
        • Arkadaşlarınıza Şaka Yapın! 😜
    • PetaLinux
      • Running PetaLinux on an offline machine
        • Prerequisites
        • Configuring the PetaLinux project
        • Problem: Still I can’t compile some PetaLinux projects
        • Further read
      • Ubuntu 16.04.5 Üzerinde Petalinux 2018.3 Kurulumu
      • Ubuntu 20.04 üzerine PetaLinux 2022.2 kurulumu
        • Desteklenmeyen işletim sistemi?
        • petalinux-config’te patlıyoruz
        • Özet
    • Vivado
      • awk: symbol lookup error: awk: undefined symbol: mpfr_z_sub
        • Symptoms
        • Solution
        • Ref
      • Vivado 2016.4 Node Locked License Not Working on Ubuntu 16.04
        • Symptoms
        • Diagnosis
        • Solution
        • Ref
  • 6️⃣ xv6
    • MIT İşletim Sistemi Kursları ve Tarihçesi
    • Diğer Üniversitelerdeki Kurslar
    • Kitap Hakkında
    • 📝 Notlarım
      • Merhaba Dünya!
        • riscv-gnu-toolchain
        • QEMU
        • xv6-riscv
        • Pre-built Binary
        • Sonuç
      • İşletim Sistemi nedir? + Unix
        • Unix
        • Kaynaklar
      • User Space Programlamaya Giriş: write() ve read()
        • read() ve write()
        • Özet
        • Kaynaklar
      • GDB ile Hata Ayıklama (Debug 🐛)
        • Çekirdek, Hardware Thread, hart Sayısı Ayarlama
        • GDB
      • open() ve close()
        • open()
        • close()
        • Örnekler
        • Kaynaklar
      • Process Kavramı ve xv6 Çekirdeğindeki Gerçekleştirimi
        • xv6: proc, struct proc ve struct file
        • Verilerin Bellekte Tahsis Edilmesi
        • Hadi Gözlemleyelim! 👀
        • Özet
      • İşletim Sistemleri ve Bellek Yönetimi
        • Her Programa Bir Bellek Alanı
        • Relocation
        • Fragmentation
        • Virtual Memory ve Paging
        • Swapping
        • xv6
        • Kaynaklar
    • 📚 Kaynaklar
      • RISC-V
  • 🪁 Zephyr
    • 📝 Notlarım
      • Nedir bu Zephyr?
        • Kconfig, Devicetree ve West
        • Tarihçe
        • Kaynaklar
      • Zephyr Kullanmalı mıyım? “Bana da mı Zephyr?”
        • Popülerliğe Dikkat ❗
        • Zephyr ne zaman uygun olabilir?
        • Zephyr ne zaman uygun olmayabilir?
        • Hangisini öğrenelim? Zephyr mi FreeRTOS mu?
        • Projemde Zephyr mi kullanmalıyım?
    • 📚 Kaynaklar
  • 📦 Diğer
    • FFmpeg Video ve Ses Birleştirme
    • FFMmpeg ile Tek Resim ve Ses Dosyası ile Video Oluşturma
      • Kaynaklar
    • YouTube, Vimeo (Şifreli Videolar Dahil) Video İndirme
      • yt-dlp ve FFmpeg
        • FFmpeg
      • YouTube Video İndirme
      • Vimeo
        • Şifreli Videoları İndirme
        • Protected ve Private Videolar
        • Chrome Üzerinden İndirme
      • Kapanış
      • Kaynaklar

Eski

  • 📋 Olan Biten
    • Kayıt - 7
    • Kayıt - 6
    • Kayıt - 5
    • Kayıt - 4
    • Kayıt - 3
    • Kayıt - 2
    • Kayıt - 1

---

  • 📜 İlerleme Kaydı
    • 2025-05
      • Yazılar
        • 🐍 Python
    • 2025-04
      • Yazılar
        • 🐍 Python
      • Diğer Değişiklikler
      • Diğer Çalışmalar
    • 2025-03
      • Yazılar
        • 🇨 C
        • ♾️ DevOps
        • 🐧 Linux Sistem Programlama
        • 🐍 Python
        • 🪁 Zephyr
        • Diğer Değişiklikler
      • Videolar
        • Canlı Yayınlar
      • Diğer Değişiklikler
  • 🌀 Miscellaneous
    • ❤️ Destek / Support
      • Yorum bırakın
      • Pull Request gönderin
      • Arkadaşlarınızla paylaşın
      • Finansal olarak destekleyin 💸
      • Leave a comment
      • Submit a Pull Request
      • Share with your friends
      • Support Financially 💳
    • ❗ Disclaimer
    • Todo List
    • Specimen
      • Admonition
      • Todo
      • Visual
      • YouTube
      • giphy
      • giscus
      • reST Specific
        • Code Block
      • Asciinema
  • ❗ Disclaimer
Alper Yazar - ayazar.dev
  • 🐧 Linux Sistem Programlama
  • Soft Link ve Hard Link Kavramları
  • GitHub'da Düzenle
Önceki Sonraki

Soft Link ve Hard Link Kavramları

Linux üzerinde dosyalarla çalışırken karşılacağımız kavramlardan biri de soft link ve hard link kavramıdır. Şimdi bunların ne olduğuna bir bakalım.

Her ikisini de aslında birer kısayol gibi düşünebiliriz. Windows kullanıyorsanız masaüstünde bulunan kısayollar yani shortcut dediğimiz şeyler, kenarlarında bir ok sembolü olur, Linux’taki soft/hard link kavramına benzer.

Linux’ta iki tip kısayol, link, vardır: soft ve hard. Benzer amaçlara hizmet etselerde implement edilme şekilleri farklıdır.

Hard Link

İlk olarak hard link kavramından bahsetmek istiyorum. Linux sistemimizde bir çalışma klasörü oluşturup içine gidip birkaç dosya oluşturalım:

$ touch a b c

$ ls -l
total 0
-rw-r--r-- 1 ay ay 0 Jul  7 09:40 a
-rw-r--r-- 1 ay ay 0 Jul  7 09:40 b
-rw-r--r-- 1 ay ay 0 Jul  7 09:40 c

Burada a, b ve c isimli birer dosya oluşturduk ve ls ile listeledik. rwx kısmından yani izin kısmından sonra tüm dosyalarda 1 yazmaktadır. İşte ls in gösterdiği bu sayı o dosyaya verilen hard link sayısıdır.

İlk olarak bir hard link oluşturup, örnek üzerinden anlamaya çalışalım.


$ ln a d

ln kabuk komutu bizim hard link oluşturmamızı sağlamaktadır. Aynı komutu başkaşekilde kullanarak birazdan soft link de oluşturacağız. ln <hedef> <link adı> şeklinde bir kullanımı vardır. Biz burada var olan a dosyasını gösteren d isimli bir link oluşturduk.

$ ls -l

total 0
-rw-r--r-- 2 ay ay 0 Jul  7 09:40 a
-rw-r--r-- 1 ay ay 0 Jul  7 09:40 b
-rw-r--r-- 1 ay ay 0 Jul  7 09:40 c
-rw-r--r-- 2 ay ay 0 Jul  7 09:40 d

Şimdi ls çıktısı biraz değişti. İlk olarak d isimli bir dosya geldi. En başındaki - karakteri bunun sıradan bir dosya olduğunu sölüyor, yani diğerlerinden bir farkı yok. a ve d nin hard link sayıları da 1 değil artık 2 oldu. Şimdi a dosyasına bir şeyler yazalım.

$ echo "Ben a dosyasıyım" > a

$ ls -l
total 8
-rw-r--r-- 2 ay ay 19 Jul  7 09:48 a
-rw-r--r-- 1 ay ay  0 Jul  7 09:40 b
-rw-r--r-- 1 ay ay  0 Jul  7 09:40 c
-rw-r--r-- 2 ay ay 19 Jul  7 09:48 d

a dosyasına bir satır yazı yazdık ve ls ile tekrar baktık. a nın boyutu artık 0 byte değil 19 byte oldu. Ayrıca a nın değiştirilme tarihi artık 9:40 değil, 9:48 oldu. Peki bir şey ilginizi çekti mi? Aynı meta data lar d de yazıyor. d nin de boyutu ve tarihi aynı oldu.

ay@400:~/sys $ cat d
Ben a dosyasıyım

ay@400:~/sys $ echo "Ben d dosyasıyım" > d

ay@400:~/sys $ cat d
Ben d dosyasıyım

ay@400:~/sys $ cat a
Ben d dosyasıyım

d dosyasını bastırdığımız zaman da a nın içeriğini gördük. d ye bir şey yazarsak da a yı okuduğumuz zaman aynı yazıyı görüyoruz. Yani bunlar birbirinin aynısı mı? inode numaralarına bakalım mı?

ay@400:~/sys $ ls -li

total 8
391711 -rw-r--r-- 2 ay ay 19 Jul  7 09:50 a
391713 -rw-r--r-- 1 ay ay  0 Jul  7 09:40 b
391714 -rw-r--r-- 1 ay ay  0 Jul  7 09:40 c
391711 -rw-r--r-- 2 ay ay 19 Jul  7 09:50 d

Hem a hem de d nin inode sayıları aynı. Peki bu ne demek? Bir dosya sisteminde dosya ve dizinler ile o dosya sisteminde inode numaraları arasında bire bir ve tekil bir eşleşme olduğundan bahsetmiştik. Yani a ve d aslında aynı dosyayı gösteriyor.

Hatırlarsanız dizinlerin aslında dosya adı-inode çiftlerini tuttuğunu söylemiştik. İşte bu durumda da olan aslında bu. Çalıştığım dizin içerisinde aslında aynı inode’a yani aynı dosyaya referans veren iki isim var, a ve d.

a 391711
b 391713
c 391714
d 391711

gibi bir kayıt var aslında. Bunları birer pointer gibi düşünebiliriz.

inode içerisinde de aslında o inode’a kaç farklı yerden referans verildiğini tutan bir hard link counter bulunmaktadır. Sıradan bir dosyayı yarattığımızda bu değer 1 olmaktadır. Fakat biz burada 391711 numaralı inode’a hem a hem d ismiyle ulaşabildiğimiz için sayı 2’dir.


Aynı dosya sisteminde kalmak şartı ile başka yerlerden de hard link oluşturabiliriz.

ay@400:~/sys $ mkdir -p x/y/z
ay@400:~/sys $ cd x/y/z/

ay@400:~/sys/x/y/z $ ln ../../../d e

ay@400:~/sys/x/y/z $ ls -li
total 4
391711 -rw-r--r-- 3 ay ay 19 Jul  7 09:50 e

ay@400:~/sys/x/y/z $ cd ../../..

ay@400:~/sys $ ls -li
total 12
391711 -rw-r--r-- 3 ay ay   19 Jul  7 09:50 a
391713 -rw-r--r-- 1 ay ay    0 Jul  7 09:40 b
391714 -rw-r--r-- 1 ay ay    0 Jul  7 09:40 c
391711 -rw-r--r-- 3 ay ay   19 Jul  7 09:50 d
391783 drwxr-xr-x 3 ay ay 4096 Jul  7 09:59 x

Örneğin yukarıdaki örnekte x/y/z şeklinde başka dizinler oluşturup, en alttaki dizinden aynı inode’a bir hard link daha oluşturdum. Bu durumda hard link sayısı 3’e çıktı.

ay@400:~/sys $ rm a

ay@400:~/sys $ cat d
Ben d dosyasıyım

ay@400:~/sys $ cat x/y/z/e
Ben d dosyasıyım

ay@400:~/sys $ ls -li d
391711 -rw-r--r-- 2 ay ay 19 Jul  7 09:50 d

Yukarıda a yı sildim. Fakat d ve x/y/z/e aynı inode’u gösterdiği için aslında dosyanın kendisi silinmedi ve cat ile içeriğine bakabildim.

Mesela find komutu ile değerini bildiğimiz bir inode’a link veren dosyaları dosya sistemimizde bulabiliriz:

$ find / -inum 391711 2>/dev/null

/home/ay/sys/x/y/z/e
/home/ay/sys/d

Bizim dosyamıza referans veren 2 yer varmış. Sondaki 2>/dev/null kısmı kafa karıştırmasın, hata mesajlarını (permission denied) bastırmak için var, önemli değil.


Biz bir hard link oluşturduğumuz zaman bu yeni link yeni bir inode yani dosya oluşmasına sebep olmamaktadır. Sadece zaten var olan bir dosyaya yani inode’a yeni bir isim veriyoruz. Dosya konusunun en başında dosya isimlerinin, inode’un bir parçası olmaması belki garip gelmiştir. Ama isim ile inode’u yani dosyanın kendisini ayırdığımız zaman işte bu tarz esnekliklerimiz oluyor. Aynı inode’a referans veren başka isimler oluşturabiliyoruz. Ayni inode demek, sevabıyla günahıyla aynı dosya demek, meta data kısmı ve içeriği.

Kısıtlamalar

Hard link kullanımının da çeşitli kısıtlamaları vardır.

Hard linkler, aynı inode’a referanslar vererek oluşturulurlar. Olmayan bir dosyaya hard link oluşturamazsınız.

ay@400:~/sys $ ls -l
total 8
-rw-r--r-- 1 ay ay    0 Jul  7 09:40 b
-rw-r--r-- 1 ay ay    0 Jul  7 09:40 c
-rw-r--r-- 2 ay ay   19 Jul  7 09:50 d
drwxr-xr-x 3 ay ay 4096 Jul  7 09:59 x

ay@400:~/sys $ ln e f
ln: failed to access 'e': No such file or directory

Örneğin burada e dosyasına link oluşturmak istedik fakat yapamadık çünkü e dosyası yok. Yani e ismine karşılık gelen bir inode yok. Bu durumda hard link oluşturamadık.


Farklı dosya sistemleri arasında hard link oluşturamayız.

Linux, Windows’tan farklı olarak bize tek bir dosya sistemi sunuyormuş gibi durabiliyor. Yani birden fazla diskimiz, dosya sistemimiz olsa bile bunlarında hepsi / altında bir yerlere mount edilmiş durumda. Linux’ta, Windows’taki gibi her diske özel ayrı tree yapıları yok, C, D, E gibi. Ama bu demek değil ki Linux’ta her şey yapılabiliyor. Farklı dosya sistemleri aynı ağaç altında gözükse de dosya sistemleri arasında hard link oluşturmak mümkün değil. Peki neden?

Hard linklerin aslında var olan bir inode’a referans olduğundan bahsetmiştik. inode’lar tekildir fakat dosya sistemi içerisinde tekildir. İki farklı dosya sisteminde aynı inode sayısı bambaşka dosyaları gösterebilir. inode değeri o dosya sistemi içerisinde bir referanstır. Hatırlarsanız dosya adı - inode çiftleri vardı. Burada “şu dosya sisteminin inode’u” gibi bir alan yok. O yüzden sadece var olan dosya sistemi içerisinde hard link oluşturabiliriz, dosya sistemleri arasında oluşturamayız. Bir demo yapalım:

ay@400:~/sys $ dd if=/dev/zero of=1.img bs=1M count=16
ay@400:~/sys $ dd if=/dev/zero of=2.img bs=1M count=16

ay@400:~/sys $ ls -l *.img
-rw-r--r-- 1 ay ay 16777216 Jul  7 10:19 1.img
-rw-r--r-- 1 ay ay 16777216 Jul  7 10:19 2.img

ay@400:~/sys $ mkfs.ext4 1.img
ay@400:~/sys $ mkfs.ext4 2.img

ay@400:~/sys $ mkdir 1 2
ay@400:~/sys $ sudo mount -o loop 1.img ./1
ay@400:~/sys $ sudo mount -o loop 2.img ./2

ay@400:~/sys $ ls -lh
total 2.5M
drwxr-xr-x 3 root root 1.0K Jul  7 10:20 1
-rw-r--r-- 1 ay   ay    16M Jul  7 10:20 1.img
drwxr-xr-x 3 root root 1.0K Jul  7 10:20 2
-rw-r--r-- 1 ay   ay    16M Jul  7 10:20 2.img
-rw-r--r-- 1 ay   ay      0 Jul  7 09:40 b
-rw-r--r-- 1 ay   ay      0 Jul  7 09:40 c
-rw-r--r-- 2 ay   ay     19 Jul  7 09:50 d
drwxr-xr-x 3 ay   ay   4.0K Jul  7 09:59 x

ay@400:~/sys $ cd 1
ay@400:~/sys/1 $ sudo touch i
ay@400:~/sys/1 $ cd ..
ay@400:~/sys $ cd 2

ay@400:~/sys/2 $ sudo ln ../1/i j
ln: failed to create hard link 'j' => '../1/i': Invalid cross-device link

Yukarıda sanal olarak iki adet 16 MB disk oluşturdum, ikisini de ext4 olarak formatlayıp mount ettim. Fakat iki farklı dosya sistemi arasında hard link oluşturmaya çalıştığım zaman Invalid cross-device link hatası aldım. Yani farklı dosya sistemleri arasında hard link yapamıyoruz. Gerçi POSIX standartına göre bunun olabileceği söyleniyor ama Linux buna izin vermiyor. [1]


Dizinlere hard link verilemez.

ay@400:~/sys $ mkdir dizin
ay@400:~/sys $ ln dizin link

ln: dizin: hard link not allowed for directory

Gördüğünüz üzere hard link not allowed for directory. Bunu sudo ile yapsanız da olmuyor, eskiden sistemler root a bu yetkiyi veriyorlarmış ama “tehlikeli” olabileceği için şu an herkese yasak diyebiliriz. [1] [2] Peki ama neden tehlikeli?

Bir dizine hard link verilmesinin oluşturacağı risk, dosya sisteminde sonsuz döngüler yani loop yaratma ihtimalidir. Linux üzerinde dosya sistemleri, birer ağaç yani tree veri yapısına benzer. En tepede / olmak üzere dizin ve dosyalar aşağıya doğru dallanır. Ağaç veri yapısının en önemli özelliklerinden biri de içerisinde loop bulundurmamasıdır. Şu örneğe bir bakalım: [3]

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Şöyle görselleştirebiliriz:

../_images/inode-hard-link-loop.png

Örnekte l, tekrar a yı gösteren bir hard link

Diyelim ki bu kısmı gezmek istiyorsunuz, /tmp/a/b ye gittiniz bir klasör gördünüz, l. cd ile ona geçtiniz ve ls dediniz. Aslında a ya gitmiş oldunuz ve b yi gördünüz, /tmp/a/b/l/b/l/b/l bu şekilde sonsuza kadar gidebilirsiniz. Tabi diyebilirsiniz ki kernel bunu tespit edemez mi? Yani loop durumu kernel tarafından bulunamaz mı? Teknik olarak bulunabilir. Fakat bu maliyetli bir işlem olacaktır. Kernelin sürekli geçilen path’lerin inode bilgilerini tutması gerekir ki loop olduğunu anlasın. Linux veya herhangi bir işletim sisteminde dosya işlemleri oldukça büyük yer tutmaktadır. Burasının olabildiğince performanslı olması istenir. Kernelin sürekli ve çok çok nadir olacak bir loop durumu için sürekli “Acaba loop içerisinde miyiz?” diye bakması oldukça verimsiz olacaktır. O yüzden kernel tarafında bildiğim kadarıyla bir loop tespiti yapılmamaktadır. Soft link kısmında değineceğiz, ELOOP isminde bir hata var. Diyebilirsiniz ki “Kernel bu kontrolü yapmıyorsa ELOOP hatası nasıl oluşturuluyor?”, buna geleceğiz.

Dosyalar arası hard link oluşturmak, tree yapısını bir miktar değiştiriyor. Yani veri yapılarında bildiğimiz klasik tree yapısından biraz uzaklaşıyoruz. Çünkü hard link sayesinde bir daldan diğerine doğrudan atlayabiliyoruz. Fakat dosyaları tree içerisinde leaf node olarak düşünürsek hard link dediğimiz şey bir leaf node’tan diğerine geçişimizi sağlıyor. Hep leaf node’lar arasında geçiş yaptığımız için, daha üst bir seviyeye yani bir dizine çıkamıyoruz. Böylece loop oluşturmamış oluyoruz.

Ayrıca find ya da ls gibi birçok program, dosya sisteminde sonsuz döngülerin olmadığını düşünmektedir. Elbette loop detection kısmı, user space tarafında da yapılabilir. Ama bu programlar bu şekilde tasarlanmamışlardır.


Dosya sisteminin bir özelliği de bir dizinin yalnızca bir üst yani parent dizini olmasıdır. Dizinlere hard link oluşturduğumuz zaman bu özellik bozulacaktır. Üstteki örnekten devam edelim.

Diyelim ki /tmp/a/b nin içindeyiz, bunun parent’ı /tmp/a olmaktadır. Eğer /tmp/a/b/l/b içine girersek bunun parent’ı ise /tmp/a/b/l olmaktadır. Fakat biz aslında yine /tmp/a/b ye geldik. E o zaman bu dizinin iki parent’ı var: /tmp/a ve /tmp/a/b/l. Bunu devam ettirirsek aslında sonsuz sayıda parent oluşmaktadır.

Bunun gibi çeşitli sorunlardan dolayı dizinlere hard link verilmesi Linux sistemlerde izin verilmemektedir, root kullanıcı dahil.

Peki dizinlere hiç mi link oluşturamayız? Bunu yapabiliyoruz ama onun için soft link konusunu incelememiz lazım. Hard link konusu kabaca böyle, şimdi soft link konusuna bakalım.

Soft Link (Symlink)

Soft link, symlink olarak da bilinmektedir. Çalışma dizinimizi temizleyip, soft link için bir ortam oluşturalım.

ay@400:~/sys $ touch a
ay@400:~/sys $ ln -s a b

ln komutunu hard link oluşturmak için kullanmıştık. Eğer -s seçeneği ile kullanırsak bu sefer bize soft link oluşturacaktır. Burada b, bir soft link olmuştur.

ay@400:~/sys $ ls -li

total 0
391711 -rw-r--r-- 1 ay ay 0 Jul  7 14:29 a
391713 lrwxrwxrwx 1 ay ay 1 Jul  7 14:29 b -> a

ls ile baktığımız zaman ls, b yi adeta bir pointer gibi gösteriyor, -> ile. Hard linkten bağımsız olarak a ve b nin inode numaraları ve izinleri farklı. Yani b adeta ayrı bir dosya. Fakat tür olarak - yani sıradan bir dosya değil, l yani link türünden bir dosya. Şimdi a ya bir şeyler yazıp okumaya çalışalım.

ay@400:~/sys $ echo "Ben a yım" > a

ay@400:~/sys $ cat b
Ben a yım
ay@400:~/sys $ echo "Ben b yim" > b
ay@400:~/sys $ cat a
Ben b yim

ay@400:~/sys $ ls -li
total 4
391711 -rw-r--r-- 1 ay ay 10 Jul  7 14:32 a
391713 lrwxrwxrwx 1 ay ay  1 Jul  7 14:29 b -> a

Her ne kadar ayrı dosyalar gibi dursalar da a ya yazdığımızı b den, b ye yazdığımızı a dan okuyabiliyoruz. a ya bir yazı yazdığımız zaman a nın boyutu 10 oldu ve değiştirilme saati 14:32 olarak güncellendi. Oysa b ye bir şeyler yazdık, değiştirilme saati güncellenmedi. Aynı zamanda boyutu da 1 olarak gözüküyor.

Soft linkler, aslında tek başlarına birer dosyalardır. Kendilerine ait bir inode’ları vardır. b yi bir metin belgesi gibi düşünün, içinde a yazıyor, normal metin gibi. Fakat dosyanın türü - değil, l olduğu için kernel bu a içeriğini symlink olarak yorumluyor. Yani b ye bir şey yazmak istediğimizde ya da okuduğumuzda önce a yı görüyor kernel, sonra gidip a yı buluyor ve işlemleri a üzerinden yapıyor. Elbette a da bir symlink olabilirdi, bu sefer de onun içeriğini takip edecekti.

ay@400:~/sys $ ln -s b c

ay@400:~/sys $ echo "Ben a yım" > a
ay@400:~/sys $ ls -li
total 4
391711 -rw-r--r-- 1 ay ay 11 Jul  7 14:43 a
391713 lrwxrwxrwx 1 ay ay  1 Jul  7 14:29 b -> a
395113 lrwxrwxrwx 1 ay ay  1 Jul  7 14:42 c -> b

ay@400:~/sys $ cat c
Ben a yım

Mesela burada c, b yi gösteren bir symlink, b ise a yı gösteren bir symlink. c yi yazdırdığımızda yine a nın içeriğini görüyoruz.


Şimdi farklı bir şey deneyelim:

ay@400:~/sys $ ln -s d e
ay@400:~/sys $ ln -s e d

ay@400:~/sys $ ls -li
total 4
391711 -rw-r--r-- 1 ay ay 11 Jul  7 14:43 a
391713 lrwxrwxrwx 1 ay ay  1 Jul  7 14:29 b -> a
395113 lrwxrwxrwx 1 ay ay  1 Jul  7 14:42 c -> b
395127 lrwxrwxrwx 1 ay ay  1 Jul  7 14:45 d -> e
395126 lrwxrwxrwx 1 ay ay  1 Jul  7 14:45 e -> d

ay@400:~/sys $ cat d
cat: d: Too many levels of symbolic links

İlk olarak ln -s d e komutu ile d yi gösteren e isimli bir symlink oluşturdum. Dikkat ederseniz d diye bir dosyamız yok. Bu durumda hard link hata veriyordu çünkü olmayan bir inode’a referans veremiyorduk. Soft link’te durum böyle değil. Soft linklerin içinde aslında dosya adı açık açık yazdığından içinde d yazan e isimli bir symlink oluşturabildim. ln -s e d ile de d nin e yi göstermesini sağladım, yani babalar gibi bir loop yaptım. Sonra cat d dedim, bakalım ne olacak. Hemen bana çok fazla symlink var dedi. Yani loop’u kırabildi.

Peki bunu nasıl yaptı?

Kendi kodumuzu yazdığımız zaman bunu daha iyi anlayacağız ama kernel symlinkleri takip ederken kaç adet symlink takip ettiğini sayıyor. Ama takip ettiği şey hangi symlinkleri geçtiği değil, kaç adet symlink geçtiği. Burada bir eşik değer var, N diyelim. Eğer bir dosyaya ulaşana kadar N den fazla symlink geçerse artık takip etmeyi bırakıyor ve ELOOP hatası dönüyor, yani bir loopta olduğunu düşünüyor. Eğer siz loop olmasa bile birbirini takip eden symlinkler oluşturursanız ve derinliği N yi geçerse yine aynı hatayı verecektir. Bu N sayısına sonra bakacağız ama mantık bu, pratikte karşılaşmayacağımız kadar yüksek bir sayı. Bundan daha fazla symlink gezersem bu loop olmalı diyor, dolaylı olarak.


rm b ya da unlink b diyerek sembolik bağlantıyı kaldırabiliriz, orijinal dosya silinmeyecektir.

Hard linkerin aksine symlink’ler yani soft link’ler dizinlere verilebilir.

ay@400:~/sys $ mkdir dizin
ay@400:~/sys $ ln -s dizin link

ay@400:~/sys $ ls -li
total 4
391711 drwxr-xr-x 2 ay ay 4096 Jul  7 15:06 dizin
391713 lrwxrwxrwx 1 ay ay    5 Jul  7 15:06 link -> dizin

Burada görüldüğü gibi link, dizin i göstermektedir. link isimli symlink’in boyutu 5 byte’tır. Çünkü içinde gerçekten de metin olarak dizin yazmaktadır.

ay@400:~/sys $ mkdir uzunbirdosyaveyadizin
ay@400:~/sys $ ln -s uzunbirdosyaveyadizin l

ay@400:~/sys $ ls -li
total 8
391711 drwxr-xr-x 2 ay ay 4096 Jul  7 15:06 dizin
395118 lrwxrwxrwx 1 ay ay   21 Jul  7 15:06 l -> uzunbirdosyaveyadizin
391713 lrwxrwxrwx 1 ay ay    5 Jul  7 15:06 link -> dizin
395113 drwxr-xr-x 2 ay ay 4096 Jul  7 15:06 uzunbirdosyaveyadizin

Mesela burada l nin boyutu ise 21 byte’tır, çünkü gösterdiği yerin ismi 21 karakterden oluşmaktadır. Yani symlink’lerin içi birer metin gibi düşünülebilir.

Dikkat Edilecek Noktalar

Symlinklerin içinde text bilgisi olduğundan bahsettik. Eğer işaret ettiği yer taşınırsa symlink artık doğru yeri göstermeyecektir, dangling olacaktır.

ay@400:~/sys $ echo "Merhaba Dunya!" > dunya

ay@400:~/sys $ ln -s dunya soft
ay@400:~/sys $ ln dunya hard

ay@400:~/sys $ ls -lih
total 8.0K
391711 -rw-r--r-- 2 ay ay 15 Jul  7 15:50 dunya
391711 -rw-r--r-- 2 ay ay 15 Jul  7 15:50 hard
391713 lrwxrwxrwx 1 ay ay  5 Jul  7 15:50 soft -> dunya

ay@400:~/sys $ cat hard
Merhaba Dunya!

ay@400:~/sys $ cat soft
Merhaba Dunya!

ay@400:~/sys $ mkdir dizin
ay@400:~/sys $ mv dunya dizin
ay@400:~/sys $ ls -lih
total 8.0K
395113 drwxr-xr-x 2 ay ay 4.0K Jul  7 15:51 dizin
391711 -rw-r--r-- 2 ay ay   15 Jul  7 15:50 hard
391713 lrwxrwxrwx 1 ay ay    5 Jul  7 15:50 soft -> dunya

ay@400:~/sys $ cat hard
Merhaba Dunya!

ay@400:~/sys $ cat soft
cat: soft: No such file or directory

ay@400:~/sys $ ls -lih dizin
total 4.0K
391711 -rw-r--r-- 2 ay ay 15 Jul  7 15:50 dunya

Yukarıdaki örnekte dunya isimli bir dosyaya hem bir soft link hem de bir hard link oluşturuyorum. Daha sonra dunya dosyasını bir dizin altına taşıdığım zaman soft link bozuluyor, çünkü onun içinde hala dunya yazıyor fakat öyle bir dosya yok. Hard link ise çalışmaya devam ediyor çünkü tipik olarak mv işleminde dosyanın inode’u değişmediği için hard isimli hard link aynı dosyayı göstermeye devam ediyor. Ama bildiğim kadarıyla mv sırasında inode sayısının değişmeyeceğinin bir garantisi yok.


Soft linkler aslında path içeren text dosyaları olduğu için hard linklerin aksine dosya sistemleri arasında kurulabiliyor, sonuçta içinde ../../mnt/disk2/dosya gibi bir şey yazabilir, doğrudan hedefin inode’u ile ilgilenmiyor. Yani soft linkin, hard linke kıyasla daha “üst” seviyede bir link olduğunu söyleyebiliriz.


cd komutu ile soft linkler arasında gezerken garip davranışlar sezebilirsiniz, cd .. vs dediğinizde. Burada cd komutunun -L ve -P seçeneklerine bakabilirsiniz. cd, shell’lerin iç komutu olmaktadır. O yüzden cd nin davranışı shell’den shell’e (BASH, ZSH vs) değişebilir. Yazı çok uzun olduğu için bu detaya artık girmiyorum.

Yapılacaklar

Bununla ilgili yazı yazabilirsin.


Sistem programlama açısından open() gibi fonksiyonların bir çoğu symlink’leri takip etmektedir. Yani gerçek dosyaya ulaşana kadar otomatik olarak çözümleme yapılacaktır. Fakat bazı fonksiyonları symlinkleri takip etmez. Bunlara yeri geldikçe bakarız.


[1] (1,2)

Advanced Programming in the UNIX Environment, 3rd Edition

[2]

https://raw.githubusercontent.com/CSD-1993/KursNotlari/master/Unix-Linux-SysProg-OzetNotlar-Ornekler.txt

[3]

https://askubuntu.com/a/525129

Önceki Sonraki

© Copyright 2011-2025, Alper Yazar. Licensed under CC BY-SA 4.0. Son güncelleme: 2024-07-07 UTC.

Built with Sphinx using a tema kullanılarak Read the Docs tarafından sağlanmasıyla oluşturuldu.
❤️ Destek / Support
Türk Bayrağı