Linux’ta yollar ikiye ayrılır:
1. Mutlak (Absolute) Yol
Nerede bulunduğumuza bağlı olarak değişmeyen yollardır. Örneğin, /var/log .
2. Göreceli (Relative) Yol
Nerede bulunduğumuza bağlı olarak değişen yollardır. Örneğin, ../../../
Not: Pratik olarak kullanabileceğimiz bir yöntem, / ile başlayan yolların mutlak, başlamayan yolların göreceli olduğu şeklindedir.
Linux’ta Dosya Yapısı
Öncelikle derste de sayısız kere tekrar ettiğimiz bir konuyu belirtmek istiyorum, linux’ta her şey birer dosyadır. Kullandığımız aygıtlar, sürücüler, servisler, paketler, dizinler ve kalan her şey birer dosyadır.
Dosyalar 3 temel ana birimden oluşurlar. Bunlar,
- Dosyanın adı (dizin kaydı)
- Dosyanın inode’u (ne olduğunu yazının ilerleyen bölümlerinde detaylı bir biçimde ele alacağız)
- Veri blokları
ls -l komutunu kullandığımızda karşımıza dizinde yer alan dosyaların listesi gelir.

Yukarıdaki çıktıda bazı sütunlar görünüyor. Bunların neler olduğunu kısaca,
- dosya türü ve izinleri
- hard link sayısı (yazının devamında ne olduğu detaylıca anlatılıyor)
- sahibi
- grubu
- boyutu
- son değiştirilme zamanı
- adı
şeklinde ifade edebiliriz. Bu saydığımız bilgiler yukarıda saydığımız dosya yapısına göre belirli alanlarda bulunurlar. Bu alanları şöyle ifade edebiliriz:
Dizin kaydı
- Dosya adı
- Dosya adı ile inode numarası arasındaki eşleştirme
Inode
- Dosya türü
- Sahip
- Grup
- İzinler
- Dosya boyutu
- Hard link sayısı
- Zaman bilgileri
- Veri bloklarının adresleri
Veri blokları
- Dosyanın gerçek içeriği
- Metin, görüntü ve program verisi gibi baytlar
Buradaki bilgilere biraz daha detaylıca göz atmak istersek stat <dosya_adi> komutunu kullanabiliriz.

Inode, tabloda gösterilen bilgileri tutar ve diskte dosyanın içeriğinin bulunduğu blokları işaret eder. ls -li komutunu verdiğimizde inode numaralarını da içeren aşağıdaki çıktıyı alabiliriz,

bu çıktı da görüldüğü üzere ilk sütunda her dosyaya ait inode numarası belirtilmiş.
grep – find ve diff
grep ve find komutları filtreleme yapmamıza yarayan komutlardır. Bu komutlar arasında önemli bir ayrım vardır. grep doğrudan dosyanın içeriği yani veri kısmında arama yaparken find komutuysa bazı parametreleriyle dizin kaydında, bazı parametreleriyleyse Inode bilgilerinde inceleme yapar.

Bir dosyayı kopyalayıp diff komutuyla aslını ve kopyasını karşılaştırdığınızda alacağınız çıktı iki farklı dosya olmasına rağmen boş olacaktır. Çünkü bu komut, dosyaların içeriğinde yani veri kısmında çalışır
mv, cp ve rm
mv, bir dosyayı farklı bir konuma taşımak için kullandığımız bir komuttur. Aynı dosya sistemi içinde çalıştırıldığında kısa bir süre içinde gerçekleşir çünkü verileri gerçekten fiziksel olarak bir noktadan başka bir noktaya taşımaz. Yalnızca dizin kaydına müdahale eder. Eğer farklı dosya sistemleri arasında taşıma yapmak isterseniz, hedef sistemde yeni bir dosya ve inode oluşturulur. Ardından mevcut sistemdeki bilgiler karşı tarafa kopyalanır ve kopyalama başarılı olduktan sonra kaynak bilgiler silinir (dizin kaydı kaldırılır) .
cp, verileri diskte bir noktadan başka bir noktaya kopyalar. Asıl ve kopya dosyalar farklı bloklarda saklanırlar ve farklı inode’lara sahip olurlar, yani birbirlerinden tamamen bağımsızdırlar.
rm, bir dosyanın dizin kaydıyla inode bağlantısı keser. Bağlantı kesildikten sonra inode boşa düşer ve diskte ilgili alan yeniden kullanılabilir hale gelir yani doğrudan veriler silinir diyemeyiz. Verileri kurtarma yazılımları da buradaki duruma göre başarılı veya başarısız sonuç verebilirler.
rm dosya_adi
Dosya adı kaldırılır
Hard link sayısı azaltılır
Başka bir hard link veya dosyayı açık tutan program var mı?
Evet
Inode ve veri blokları kullanımda kalır
İçeriğe diğer hard link veya açık program üzerinden erişilebilir
Son hard link kaldırıldığında ve dosyayı açık tutan program kapandığında Hayır tarafındaki adımlar uygulanır
Hayır
Inode ve veri blokları yeniden kullanılabilir olarak işaretlenir
Eski veri bir süre fiziksel olarak kalabilir
Alanın üzerine yeni veriler yazılabilir
Linkler
Linux’ta iki çeşit linkleme yöntemi vardır. Bunlar,
- Hard Link: mevcut inode’a bağlanan yeni bir dizin kaydıdır. Başka bir ifadeyle iki farklı dosya adı aynı inode’u ve aynı veri bloklarını gösterir

Hard linklerden biri silinirse hiçbir şey olmaz, diğer link sorunsuz şekilde çalışmaya devam eder. Hard link sayısı bir eksilir.
Her dizin oluşturulduğunda varsayılan olarak 2 adet hard link ile beraber gelir. Bunlar,
- Üst dizindeki dizin adı
- Dizinin kendi içindeki .
Mesela,

/var dizini için hard link hesabını yapalım. ls çıktısında ikinci sütundaki alan o dizinin hard link sayısını gösterir. Burada dizinleri saydığımızda 11 adet dizin bulunuyor, 2 adet de varsayılan olarak geliyordu. Bu durumda /var dizini için 13 adet hardlink olduğunu söyleyebiliriz.
Not: Bu dizinde yer alan .. bu dizinin hardlink sayısına etki etmez, bir üst dizinin hardlink sayısına etki eder.
ln kaynak_dosya yeni_ad ile hard link oluşturabiliriz.
Not: cp komutu sahip dosyadan bağımsız yeni bir kopya oluştururken hard linkler, kaynak dosya ile aynı inode’yi kullanan bir dosya oluşturur.
Not2: Bir dosyaya hardlink yapılmış diğer tüm dosyaları görebilmek için doğru kabul edilen 2 yöntem vardır:
1-) : find’in -samefile parametresiyle bulabiliriz.
2-) : find’in -inum parametresiyle bulabiliriz (önce inode numarasına bakıp onunla filtrelememiz gerekir)
- Sembolik Link: hedef dosyanın inode’una doğrudan bağlanmaz. Hedefin yolunu saklayan, kendisine ait inode’u bulunan özel bir dosyadır.

Sembolik link silinirse hiçbir şey olmaz, ancak şemada gördüğümüz hedef (gerçek) dosya silinirse sembolik linkte geçersiz duruma düşer.
Not: Sembolik linkler dosya içeriklerini değil, yollarını kayıt altına alırlar. Bunu bir örnek üzerinden anlayabiliriz,
İlk önce bu işlemleri yapabileceğimiz temiz bir dizin oluşturarak başlıyorum ve içine giriyorum.
Ardından dosya isminde bir dosya oluşturup içine ayırt edici bir metin yazıyorum, oluşturduğum dosyanın adı mehmet ve içerisindeki veri de dosya1 olsun.
Ardından yeni bir dosya daha oluşturup onun içine de ayırt edici bir metin yazıyorum, dosyanın adı can ve içerisindeki metin de dosya2 olsun.
Sembolik link oluşturuyorum, İlk oluşturduğum dosyaya bağlıyorum.
Dosyanın içeriğini okuyorum, dosya1 yazıyor.
Ardından ilk oluşturduğum dosyayı siliyorum ve sembolik linki okumaya çalıştığımda hata alıyorum.
İkinci oluşturduğum dosyaya ilk oluşturduğum ve sildiğim dosyanın adını verip sembolik linkimi tekrar okuduğumda içerisinde can yazdığını görüyorum ve sembolik linklerin sadece yolu tuttuğunu öğreniyorum.
Bir dosyaya bağlı tüm sembolik linkleri görebilmek için find’in lname parametresini kullanabiliriz.
Not1: Sembolik linkleri taşıyacağımız zaman hedefin absolute ya da relative path olması sembolik linkin çalışıp çalışmayacağını değiştirebilir. Eğer absolute hedefte taşıyorsak çalışır ama relative hedefte taşıyorsak çalışmaz. Çünkü sembolik linkin kaynağını ararken öncelikle bulunduğumuz dizinde arama yaparız, relative de bulamayacağımız için link kırılır.
Not2: Farklı dosya sistemleri arasında hard link oluşturulamaz ama sembolik link oluşturulabilir. Dizinler için ise aynı dosya sisteminde olunsa dahi hiçbir şekilde hard link tanımlanamaz; dizinleri bağlamak için sadece sembolik link kullanılabilir.
| Özellik | Hard link | Sembolik link |
|---|---|---|
| Aynı inode’u kullanır mı? | Evet | Hayır |
| Hedef yolunu saklar mı? | Hayır | Evet |
| Hedefin bir adı silinirse çalışır mı? | Evet | Link durumuna bağlı |
| Farklı dosya sistemine geçebilir mi? | Hayır | Evet |
| Dizine bağlantı oluşturabilir mi? | Normalde sınırlandırılmıştır | Evet |
| Kendi inode’u var mı? | Hayır | Evet |
lsblk
Sistemimizde bulunan depolama birimlerini lsblk komutu ile görüntüleyebiliriz.

Çıktısında görüldüğü üzere birimler, onlar üzerinde yaptığımız yapılandırmalar, boyutları, bağlandıkları noktalar gibi bilgiler yer alıyor.
Sistemimize yeni bir disk takacağımız zaman buradaki çıktıyı kullanarak hareket ederiz. Örneğin sda isimli disk , sda1, sda2 ve sda3 alanlarına bölünmüş durumda. Ya da SWAP alanımızın ne büyüklükte olduğu gibi bilgilere rastlayabiliyoruz.
Buradaki alanlar,
| Sütun | Anlamı |
|---|---|
NAME |
Depolama biriminin adı |
MAJ:MIN |
Çekirdeğin aygıtı tanımak için kullandığı ana ve alt aygıt numaraları(MAJ hangi aygıta ait olduğı, MIN ise aygıtın altında hangi birimde olduğunu tanımlar |
RM |
Aygıtın çıkarılabilir olup olmadığı (0 ise çıkarılamaz, 1 ise çıkarılabilir) |
SIZE |
Birimin toplam boyutu |
RO |
Birimin salt okunur olup olmadığı (read only, 0 salt okunur değil, 1 salt okunabilir) |
TYPE |
Disk, bölüm, LVM veya ROM gibi birim türü |
MOUNTPOINTS |
Dosya sisteminin bağlandığı dizin veya dizinler |
lsblk ile sadece mevcut durumu görüntüleyebiliriz, değişiklik yapmak istersek farklı araçlar kullanmamız gerekli.
Depolama Birimi Yapılandırma ve Bağlama
lsblk çıktısında gördüğümüz üzere diskin yanında farklı depolama aygıtları da takabiliyoruz. Sanal makinede bu süreci simüle etmek için şöyle bir yol izleyeceğiz:
Öncelikle sanal makineyi kapatıp, makinenin ayarlarından depolama bölümüne geliyoruz.

mavi ile odaklanılmış bölümde üstteki oluştur seçeneğine tıklıyoruz.

Burada var olan depolama birimlerini görüyoruz, yukarıdaki oluştur seçeneğine tıklayıp

gelen yeni bölümde disk alanımızı da belirleyip işlemi tamamlıyoruz.
Not: Burada tam boyutu önceden ayır seçeneği işaretlendiğinde ana bilgisayarımızda ilgili alan doğrudan ayrılır, ilgili alan işaretlenmediği taktirde birim üzerine yazdıkça dosyanın boyutu artar ve tam kapasiteye ulaştığında durur.
Sistemimize geri döndüğümüzde lsblk çıktımızda ilgili alan sistemde görünecektir.

Biz bir diski sistemimize takarken şu adımları izleyerek ilerliyoruz:
1-) diski sistemimize taktıktan sonra lsblk ile durumunu kontrol ediyoruz.
2-) diski kullanmaya karar verdiysek bölümleme yapıp yapmayacağımızı kararlaştırıyoruz.
Bir diski eğer farklı dosya sistemleriyle birlikte kullanmak istersek diski bölümlere (partition) ayırmamız gerekebilir. Örneğin sda’da olduğu gibi sda1, sda2, sda3 şeklinde bir bölümleme yapmamız muhtemeldir.
Bölümleme işlemlerini fdisk ya da parted (daha kapsamlı bir araç olduğu söylendi, inşallah onu da denerim) aracıyla yapabiliriz. fdisk disklerimizi bölümlememize yardımcı olan bir araçtır.
Fdisk ile bölümleyeceğimiz alanının yolunu vererek başlıyoruz.

çıktısı ile karşılaşıyoruz. Burada yardım almak için m tuşuna basabileceğimiz söyleniyor, basıyoruz.

burada fdisk ile bölümleme sürecinde hangi seçenekleri kullanabileceğimiz ve bu seçeneklerin ne anlama geldiği açıkça yazıyor.
Diski bölümlemeye başlamadan önce kullanabileceğimiz partition tablosu türlerine göz atalım:
- MBR partition tablosu
- GPT partition tablosu
MBR, eski sistemlerde yaygın olarak kullanılan bir partition tablosu türüdür. Partition konumlarını 32 bitlik sektör adresleriyle kaydeder. Sektör boyutunun 512 bayt olduğu disklerde erişebildiği alan şu şekilde hesaplanır:
2³² sektör × 512 bayt ≈ 2 Tb
Bu nedenle MBR, bu koşullarda yaklaşık 2 tb’ye kadar olan diskleri destekler.
MBR partition tablosunda en fazla dört ana partition kaydı bulunur. Bu kayıtların tamamı primary partition olarak kullanılabilir. Dörtten fazla bölüm oluşturmak istiyorsak kayıtlardan birini extended partition olarak ayırabiliriz (birden fazla extended olamaz) .
Örneğin şu yapı oluşturulabilir:
- 3 primary partition
- 1 extended partition ( ve içinde bir sürü logical partition)
Extended partition normal bir dizin veya doğrudan dosya saklamak için kullanılan bir dosya sistemi değildir. Logical partition’ları içerisinde barındıran özel bir kapsayıcı görevi görür. Extended partition içerisinde disk alanı ve sistem sınırları elverdiği ölçüde birden fazla logical partition oluşturulabilir.
Linux’ta primary ve extended partition’lar için genellikle 1–4 arasındaki numaralar kullanılır. Logical partition’ların numaralandırılması ise 5’ten başlar.
GPT, MBR’nin sınırlamalarını ortadan kaldırmak amacıyla geliştirilmiş daha modern bir partition tablosu türüdür.
GPT, partition konumlarını 64 bitlik sektör adresleriyle kaydeder. Bu nedenle MBR’nin yaklaşık 2 tb’lik sınırından çok daha büyük diskleri destekleyebilir.
GPT partition tabloları genellikle 128 partition kaydını destekleyecek şekilde oluşturulur. Ancak bu sayı kullanılan sisteme ve partition tablosunun yapılandırmasına göre değişebilir.
İlk önce bir MBR oluşturacağım, sonrasında yeni bir disk alanı ekleyip onda da GPT ile düzenleme yapacağım.
MBR için o ile devam ediyorum.

n’ye basarak yeni bir partition oluştur diyorum.

p’ye basarak primary oluşturuyorum ve default olarak devam etmesi için enter’a basıyorum.

Ardından bitiş vektörü, yani alanın ayarlanması için +512M büyüklüğünde bir alan ayırıyorum. Tekrar n bastığımda,

3 boş alanımın kaldığını görüyorum. Bu sefer kalan alanın tamamını bir extended oluşturum ona veriyorum.

extended alanımı oluşturduktan sonra bu alanın içerisinde logical alanlar oluşturmak için yeniden n basıyorum.

Not: Disk içerisinde herhangi bir alan kalmadığı için sistem doğrudan bizi extended içerisinde logical alan bölümlemeye itti.
Bu kısmı fazla da uzatmadan kalan boşluğu da son kalan logical alanıma verip tamamlıyorum. Kaydetmeden önce çıktıyı görmek için p basıyorum,

işlemin sorunsuz bir şekilde tamamlandığını görüp w basıyorum ve kaydediyorum.
Yeni lsblk çıktısında,

sdd alanının partition’lara bölündüğünü görüyorum.
Bir defa da GPT ile bölümleme yapmak istiyorum (bunun için yeni bir disk ekledim ve onu bölümlüyorum)

Öncelikle g basarak gpt bölümlemesi yapacağımı söylüyorum, devamında herhangi bir bölüm seçmeden doğrudan alanı belirterek bölümleme yapmaya devam ediyorum, w ile kaydediyorum ve ayrılıyorum.
İster gpt ister mbr kullanalım, bölümlemeyi bitirdikten sonra ayırdığımız bölümlere dosya sistemi kuruyoruz. Günümüzde sıklıkla kullanılan iki farklı dosya sistemi bulunuyor: ext4 ve xfs.
ext4, dosya sistemi oluşturulurken belirli sayıda inode için yer ayırır. Sabit boyutlu bir ext4 dosya sistemindeki inode kapasitesi, dosya sistemi oluşturulurken belirlenir. Diskte boş alan bulunsa bile inode’lar tükenirse yeni dosya oluşturulamaz.
XFS ise inode’ları ihtiyaç ortaya çıktıkça dinamik olarak oluşturur. Bu nedenle başlangıçta sabit sayıda inode ayrılması gerekmez.
Biz yapacağımız işlemde ext4 kullanacağız. Birçok partition’a sahip olduğumuz için her biri için sırasıyla şu komutu uygulayacağız
Not: Extended partition için ayrıca bir dosya sistemi uygulamayız, yalnızca logical birimlere uygularız.
Not2: mkfs işlemi hedef partition’daki mevcut verileri siler. Yapmadan önce partition adı kontrol edilmelidir.
Geriye son bir işlem olarak oluşturduğumuz ve yapılandırdığımız depolama birimlerini mevcut yapımıza bağlamak kalır.
Öncelikle mount point (depolama birimini bu alana bağlayacağız) olarak kullanacağımız dizini oluşturuyoruz:
Ardından /dev/sdd1 partition’ını bu dizine bağlıyoruz:
İşlemi lsblk ile kontrol ediyoruz:

Çıktıda /dev/sdd1 partition’ının /mnt/sdd1 dizinine bağlandığını görebiliriz. Artık partition’ın içerisindeki verilere bu dizin üzerinden erişebiliriz.
mount komutuyla yaptığımız bağlantı geçicidir. Bilgisayarı yeniden başlattığımızda bağlantı kaldırılır. Partition’ın sistem açılırken otomatik olarak bağlanması için /etc/fstab dosyasına eklenmesi gerekir.
İlk olarak partition’ın UUID değerini öğreniyoruz:
UUID, dosya sistemine ait benzersiz kimliktir. Sisteme yeni diskler eklendiğinde /dev/sdd1 gibi aygıt adları değişebileceği için /etc/fstab içerisinde UUID kullanmak daha güvenlidir.
Dosyada hata yapma ihtimaline karşı önce yedeğini alıyoruz:
Dosyanın sonuna aşağıdaki satırı ekliyoruz. buraya_UUID_degeri kısmına blkid çıktısında gördüğümüz UUID değerini yazmamız gerekir:
UUID=buraya_UUID_degeri /mnt/sdd1 ext4 defaults,nofail 0 2
Bu satırdaki alanlar sırasıyla bağlanacak dosya sistemini, bağlama noktasını, dosya sistemi türünü ve mount seçeneklerini belirtir. nofail, disk sistemde bulunmadığında açılışın bu disk nedeniyle engellenmemesini sağlar. Sondaki 0, dosya sisteminin dump ile yedeklenmeyeceğini; 2 ise root dosya sisteminden sonra kontrol edilebileceğini belirtir.
Dosyayı kaydettikten sonra systemd’nin yeni yapılandırmayı okumasını sağlıyoruz:
Ardından /etc/fstab dosyasını hata açısından kontrol ediyoruz:

Çıktıda parse veya bağlantı hatası bulunmuyor, mevcut bağlantıyı kaldırıyoruz:
Bu defa yalnızca bağlama noktasını belirterek partition’ı tekrar bağlıyoruz:
Kaynak aygıtı komutta belirtmediğimiz için mount, gerekli bilgileri /etc/fstab dosyasından bulur. Bağlantıyı kontrol etmek için:

Son olarak sistemi yeniden başlatıp bağlantının kalıcı olduğunu kontrol ediyoruz.
Sistem tekrar açıldığında aşağıdaki komut /dev/sdd1 bölümünün /mnt/sdd1 dizinine bağlı olduğunu gösteriyorsa işlem başarıyla tamamlanmıştır:
diski fdisk ile bölümlendirirken sektörler üzerinden işlem yaparız. Ardından mkfs ile bölümün üzerine bir dosya sistemi kurarız. Kurduğumuz dosya sistemi, bölümdeki sektörleri bloklar hâlinde gruplandırarak kullanır.
Umount işlemi
Partition ile işimiz bittiğinde bağlantıyı kaldırmak için umount komutunu kullanıyoruz:
Bağlantının kaldırıldığını tekrar kontrol ediyoruz.

/dev/sdd1 satırındaki bağlanma noktasında artık /mnt/sdd1 görünmüyor yani başarıyla umount edebildik (/mnt/mkfs-deneyi hala görünüyor ancak biz onu kaldırmayı hedeflememiştik, kaldırmak istersek sdd1 için aynı işlemi tekrar ederiz)
Not: İçinde veri bulunan bir dizinin üzerine başka bir dosya sistemi mount edilirse dizinin eski içeriği silinmez, mount işlemi devam ettiği sürece görünmez hâle gelir (bir nevi yeni bölüm eski bölümün üstünü örter)
Verileri görebilmemizin bir yolu, altta kalan bölümü başka bir alana mount etmektir. Bu sayede verilere yeniden erişebiliriz.

Örneğin burada, /dev/sdd1 veri2 dizinine bağlı. Üstüne /dev/sdd5 bağlandığında sdd1 içindeki verilere veri2 dizininden erişemez oluyoruz. Bunun için yeni bir veri dizini açıp sdd1’i oraya mount ediyoruz, işimizi bitiriyoruz.
Not:Aynı disk üzerinde bulunan iki boş alanı tek parça hâline getirebilmek için bu alanların fiziksel olarak yan yana bulunması gerekir.

Soldaki bölümün ana bölüm olduğunu düşünelim. Dosya sistemine ait başlangıç bilgileri bölümün başında bulunduğu için ana bölüm, hemen sağında bulunan boş alana doğru kolayca genişletilebilir. Ancak boş alan ana bölümün solundaysa bu alan doğrudan bölüme eklenemez. Önce bölümün başlangıcının sola taşınması gerekir.