05 - Linux dosya sistemleri

Giriş

Linux’ta dosya sistemi; her dizinin belirli bir göreve sahip olduğu, hiyerarşik bir yapıdadır. Çoğu Linux dağıtımı, bu hiyerarşi standardına uymakla beraber; bazı dağıtımlar kullanımı etkileyen ufak değişiklikler yapmış durumda. Bu bölümde dosya sistemleri ve bulundukları (sabit diskler, DVD’ler veya RAM gibi) ortamlara ve bunların dosya sistemi ile ilişkisine de değineceğiz.

Yapı

Dosya sistemi ağaç yapısındadır. Bu yapının kökü, (orijinal deyişiyle root) diğer dosyaların tepesinde bulunur. Bu konum / karakteriyle ifade edilir. Kök dizinden daha yukarıda bir dizin bulunmaz:

    ~$ cd /
    ~$ ls -F
    bin/     home/     opt/      srv/     var/
    boot/    lib/      proc/     sys/
    dev/     media/    root/     tmp/
    etc/     mnt/      sbin/     usr/

ls -F komutu ile bulunduğumuz dizinde bulunan dosyaların tam olarak ne olduğunu anlayabiliriz: Dizinlerin sonuna “/”, sembolik linklerin sonuna “@” ve çalıştırılabilir dosyaların sonuna “*” işareti ekler. Çoğu dağıtım artık ls komutuna renk ekleyerek dosya türlerini zaten göstermekte, ancak bu belge için -Fyaklaşımı daha uygun olacak.

Dosya sisteminde kök dizini daha iyi anlamak için ağaç biçiminde gösterelim:

    /
    +- bin/
    +- boot/
    +- dev/
    +- etc/
    +- home/
    +- lib/
    +- media/
    +- mnt/
    +- opt/
    +- proc/
    +- root/
    +- sbin/
    +- srv/
    +- sys/
    +- tmp/
    +- usr/
    `- var/

Derine indikçe, ağacımız dallanacak ve sonunda bir arada gösteremeyeceğimiz kadar çok dosya/dizinle karşılaşacağız. Ancak birazcık eşelemekten zarar gelmez:

    /
    +- bin/
    +- ...
    +- home/
    |  +- thomas/
    |  |  +- Documents/
    |  |  +- Movies/
    |  |  +- Music/
    |  |  +- Pictures/
    |  |  |  `- Backgrounds/
    |  |  `- opentasks.txt
    |  +- jane/
    |  `- jack/
    +- lib/
    +- ...
    `- var/

Şu anda /home/thomas/Pictures dizininde bulunduğunuzu varsayalım. Daha derine girmek için ( Backgrounds dizinine) girmeniz gereken komut “cd Backgrounds“. Üst dizine çıkmak için ise (yani /home/thomasdizinine) kullanmanız gereken komut “cd ..” olmalı (.. “üst dizin” anlamına geliyor). Dosya sistemi hiyerarşisindeki yerlerin anlamlarına değinmeden önce, dosyalarınızın ve dosya sisteminin saklama ortamlarında (sabit disk vb.) nasıl tutulduğuna bir bakalım…

Dosya Sistemlerini Bağlamak

Dosyalarınız sistemde genellikle sabit diskinizde bulunan bir disk bölümünde saklanır. Sisteminizi tek bir disk bölümünde tutabileceğiniz gibi, dilerseniz birden çok bölümü aynı anda kullanabilir, yani dosya sisteminize bağlayabilirsiniz. Kök dosya sisteminiz yine ağaç yapısında olacak, ancak bu ağacın bazı dalları farklı ortamlara erişen dizinleri temsil edecektir (DVD, USB disk, ağ paylaşım noktası vb…).

Mount

Örneğin sisteminizi bir disk bölümünde, kullanıcılarınızın dosyalarını başka bir disk bölümünde saklamak istiyorsunuz. Bu durumda kullanıcıların ev dizinlerinin olduğu /home‘u ayrı bir diske bağlamanız gerekecek. Bağlama işlemi sırasında bağlayacağınız fiziksel donanımın vb. adını (bu örnekte diskin 2. bölümü olduğu için /dev/sda2 diyelim) ve bağlamak istediğiniz konumu (/home) vermeniz gerek. Tabi ki diskinizi kullanım amacınıza göre, istediğiniz bir klasöre bağlayabilirsiniz, örneğin: /srv/disk/kullanicilar. mount komutu parametre olmadan çalıştırıldığında sistemdeki mevcut bağlantıları listeler:

    $ mount
    /dev/sda8 on /             type ext3       (rw,noatime)
    proc      on /proc         type proc       (rw)
    sysfs     on /sys          type sysfs      (rw,nosuid,nodev,noexec,relatime)
    udev      on /dev          type devtmpfs   (rw,nosuid,relatime,size=10240k,mode=755)
    devpts    on /dev/pts      type devpts     (rw,nosuid,noexec,relatime,gid=5,mode=620)
    /dev/sda7 on /home         type ext3       (rw,noatime)
    none      on /dev/shm      type tmpfs      (rw)
    /dev/sda1 on /mnt/data     type ext3       (rw,noatime)
    usbfs     on /proc/bus/usb type usbfs      (rw,noexec,nosuid,devmode=0664,devgid=85)

Yukardaki örnek, bazılarını henüz öğrenmemiş olsak da, ağaç yapımızın aşağıdaki gibi olduğu anlamına gelir:

    /             (/dev/sda8 üzerinde)
    +- ...
    +- dev/       (özel: "udev")
    |  +- pts     (özel: "devpts")
    |  `- shm     (özel: "none")
    +- proc/      (özel: "proc")
    |  `- bus/
    |     `- usb/ (özel: "usbfs")
    +- sys/       (özel: "sys")
    +- home/      (/dev/sda7 üzerinde)
    `- mnt/
       `- data/   (/dev/sda1 üzerinde)

Buradan sistemin kök dizininin /dev/sda8 üzerinde olduğunu görebiliyoruz. Ayrıca /home dizini /dev/sda7 diskine, /mnt/data da /dev/sda1 diskine gitmekte. Özel dosya sistemlerine sonra değineceğiz. Bağlama işlemi, konsept olarak uygulamalarınızın ve kullanıcılarınızın, verilerin hangi ortamda tutulduğunu önemsemeden (sonuçta onların bakış açısına göre dosyalar /home dizininde) çalışmalarına olanak tanır.

Dosya Sistemleri

Dosyaların nasıl yerleştiğini biraz öğrendik. Şimdi az daha derine inelim. Diskimize bir bölümüne dosya yazdığımızda, bu dosyanın saklanması ve sisteme sunulması için alt katmanda organizasyonu sağlayan _dosya sistemleri_‘ne göz atalım. Microsoft Windows kullanıcıları, bahsettiğimiz kavramı FAT32 ve NTFS dosya sistemlerinden hatırlayabilir. Linux’da da bu görevi gören, yani dosyaların/dizinlerin diskte nasıl tutulması gerektiğini belirleyen dosya sistemleri mevcuttur. Ancak Linux, “sadece NTFS desteklenmektedir” gibi bir kısıtlama yapmamakta. Çekirdekte desteği bulunan ve bazı temel özellikleri (dosya sahipliği ve dosya izinleri gibi) destekleyen dilediğiniz dosya sistemini kullanabilirsiniz. Hatta çoğu Linux dağıtımında kurulum yaparken diskleri hangi dosya sistemi ile biçimlendirmek istediğiniz size sorulmaktadır. Linux’da popüler olarak kullanılan bazı dosya sistemlerine bakıp, avantaj ve dezavantajlarını kısaca gözden geçirelim.

  • ext2 dosya sistemi Linux’un eski ancak halen kullanılan ve isminin açılımı genişletilmiş anlamına gelen (extended) dosya sistemidir. Linux’un ilk zamanlarından beri kullanımdadır ve basit bir yapısı vardır. Ancak son zamanlarda daha yeni ve journaling (günlükleme) özelliğine sahip dosya sistemleri tarafından tahtı elinden alınmaktadır.

Journaling (günlükleme), dosya sisteminde yapılan işlemlerin kullanıcıların erişemeyeceği bir noktada kaydının alınarak, olası çakışma/hata durumlarının engellenmesidir.

  • ext3 dosya sistemi, ext2’nin geliştirilerek, journaling özelliği eklenmiş yeni sürümüdür. Çok uzun süre öntanımlı olarak kullanılmıştır ve halen hatırı sayılır kullanımı bulunmaktadır.
  • ext4 dosya sistemi ext3 üzerine yapılan geliştirmeler sonucunda, güncel beklentileri karşılayacak bazı özellikler (çok büyük dosyalar vb.) eklenmesiyle yayınlanan yeni sürümüdür. Belirli özelliklerini kullanmadığınız (extents gibi) durumlarda ext4 dosya sistemi ext3’e uyumludur. Yani ext4 dosya sistemi olan bir bölümü, sisteme ext3 olarak bağlayabilirsiniz. Ext4 dağıtımlar ve sistem yöneticileri tarafından genellikle tercih edilen dosya sistemidir.
  • reiserfs dosya sistemi, herhangi bir dosya sisteminin üzerine geliştirilmemiş, sıfırdan oluşturulmuştur. Journaling desteği de vermekte ama asıl eğilimi hız üzerinedir. İçerisinde binlerce dosya olan yerlere hızlı erişim sağlamaktadır (ki bu tür erişimler ext2 ve ext3’de yavaştır). Geçtiğimiz yıllarda oldukça popüler olmasına rağmen, son zamanlarda geliştirmesindeki yavaşlık ve destek eksikliğinden dolayı kullanımı önerilmemektedir. Sonraki sürümü olması planlanan reiser4 dosya sistemi ise, geliştiricisi Hans Reiser’in hapse girmesinden sonra aktif olarak geliştirilmemektedir.
  • btrfs yeni nesil bir dosya sistemi. Linux’a ZFS’in özelliklerini ve biraz daha fazlasını getirmek amacıyla yoğun şekilde geliştirildi. Büyük verilerin yönetimi (birden çok sabit disk, anlık imaj kaydetme vb.) gibi ticari özellikleri ile öne çıksa da, ev kullanıcıları için de işe yarayan özellikler barındırmakta. Bunlara dosya sistemi seviyesinde sıkıştırma ve diski çalışırken büyütme/küçültme gibi özellikleri sayabiliriz.
  • xfs uzun süredir ticari ortamlar dahil kullanılan, yüksek performanslı bir dosya sistemi.
  • zfs (ZFSonLinux) ise yakınlarda (Open)Solaris’den Linux’a uyarlanan bir dosya sistemi. Solaris dünyasındaki bilinirliği; sıkıştırma, anlık imaj, deduplication, çok büyük disk bölümü desteği, uzak konuma veri kopyalama gibi özelliklerinden gelmektedir.

Genellikle dosya sistemleri arasında direkt geçiş mümkün değildir, istisnai olarak ext2/3/4 arasındaki geçiş veya ext4’den btrfs’e geçişi belirtebiliriz. Çoğu dosya sistemi günlük kullanım için yeterince uygun olduğundan “doğru dosya sistemini seçmek” için panik yapmaya gerek yok. Zamanla, kullanım alanınıza bağlı olarak (ufak dosyalar, sıkıştırma ihtiyacı vb.) farklı dosya sistemlerini farklı disk bölümleriniz için kullanabilirsiniz. Aşağıdaki mount çıktısına baktığımızda, type ile belirtilen tür bölümünde, kullanılan dosya sistemini görebilirsiniz:

    $ 
    rootfs      on /                        type rootfs      (rw)
    sysfs       on /sys                     type sysfs       (rw,seclabel,relatime)
    selinuxfs   on /sys/fs/selinux          type selinuxfs   (rw,relatime)
    /dev/md3    on /                        type ext4        (rw,seclabel,noatime,nodelalloc)
    /dev/md4    on /srv/virt                type ext4        (rw,noatime,data=ordered,barrier=0)
    proc        on /proc                    type proc        (rw,nosuid,nodev,noexec,relatime)
    tmpfs       on /run                     type tmpfs       (rw,rootcontext=system_u:object_r:var_run_t,seclabel,nosuid,nodev,noexec,relatime)
    udev        on /dev                     type devtmpfs    (rw,seclabel,nosuid,relatime,size=10240k,nr_inodes=493003,mode=755)
    /dev/mapper/volgrp-nfs    on /srv/nfs   type ext4        (rw,noatime,data=journal)
    /dev/mapper/volgrp-usr    on /usr       type ext4        (rw,noatime,data=journal)
    /dev/mapper/volgrp-home   on /home      type ext4        (rw,noatime,nosuid,nodev,data=journal)
    /dev/mapper/volgrp-opt    on /opt       type ext4        (rw,noatime,data=journal)
    /dev/mapper/volgrp-var    on /var       type ext4        (rw,noatime,data=journal)
    /dev/mapper/volgrp-vartmp on /var/portage type ext4      (rw,noatime,data=ordered,rootcontext="system_u:object_r:tmp_t")
    mqueue      on /dev/mqueue              type mqueue      (rw,seclabel,nosuid,nodev,noexec,relatime)
    devpts      on /dev/pts                 type devpts      (rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620)
    shm         on /dev/shm                 type tmpfs       (rw,seclabel,nosuid,nodev,noexec,relatime)
    securityfs  on /sys/kernel/security     type securityfs  (rw,nosuid,nodev,noexec,relatime)
    debugfs     on /sys/kernel/debug        type debugfs     (rw,nosuid,nodev,noexec,relatime)
    none        on /selinux                 type selinuxfs   (rw)
    tmpfs       on /var/tmp                 type tmpfs       (rw,nosuid,noexec,nodev,rootcontext="system_u:object_r:tmp_t")
    tmpfs       on /tmp                     type tmpfs       (rw,nosuid,noexec,nodev,rootcontext="system_u:object_r:tmp_t")
    rc-svcdir   on /lib64/rc/init.d         type tmpfs       (rw,nosuid,nodev,noexec,relatime,rootcontext="system_u:object_r:initrc_state_t",seclabel,size=1024k,mode=755)
    binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nodev,noexec,nosuid)
    rpc_pipefs  on /var/lib/nfs/rpc_pipefs  type rpc_pipefs  (rw)
    nfsd        on /proc/fs/nfsd            type nfsd        (rw,nodev,noexec,nosuid)

Gördüğünüz gibi çoğu ext4. Peki diğerleri ne anlama geliyor?

  • proc dosya sistemi, fiziksel olarak diskte bulunmayan, ancak çekirdek ile iletişim için kullanılan bir konumdur. /proc altında gördüğünüz tüm veriler çekirdeğin size o an için ilettiği verilerdir. Buradaki dosyalara okuma/yazma işlemi yapılarak varolan yapılandırma değiştirilebilir ve çekirdekten bilgi alıp, çekirdeğe komut gönderilebilir. /proc‘a ilerde detaylı değineceğiz.
  • sysfs de /proc gibi, gerçekte olmayan bir dosya sistemidir. Ancak /proc insanların okuyup/yazması için tasarlanmış bir konum iken, sysfs sistemdeki yazılımların çekirdek ile iletişim kurmasını kolaylaştıran, içerisinde yazılımların okumasına daha elverişli biçimde veriler bulunan bir dosya sistemidir. İlerde zamanla /proc‘un yerini sysfs‘e bırakması beklenmektedir. Ancak /proc halen yaygın şekilde kullanıldığı için, henüz bu geçişin tarihi net değil.
  • tmpfs geçici bir dosya sistemidir. İçerisindekiler kalıcı olarak bir diskte değil, hafıza (RAM) üzerinde tutulur. Bu yüzden hızlı ve geçici dosya erişimi gerektiğinde kullanılır.
  • devtmpfs de tmpfs‘e benzer, ancak içerdiği dosyalar çekirdek tarafından kullanılan donanım dosyalarıdır. udev (donanım yönetim uygulaması) ortaya çıkmadan önce bu tür donanımsal işlemleri yapmak için ortaya çıkarılmıştır.
  • devpts de sysfs gibi sahte bir sistemdir. Kullanıcıların grafiksel ortamdan terminale ulaşması için (terminal emulation) gerekli dosyaların ihtiyaç anında üretilip, iş tamamlandığında sonlandırılmasına yarar.
  • usbfs devpts‘e benzer. Ancak sistemin, takılı USB donanımları ile iletişim kurmasını sağlayan ara katman dosyaları barındırır.
  • selinuxfs, SELinux güvenlik altyapısını temsil eden dosya sistemidir. SELinux etkin olmayan sunucularda bulunmaz.

Çok daha fazla sayıda özel dosya sistemi bulunmakta, ancak bunları araştırmayı da biraz okura bırakıyoruz.

Diskler ve bölümlendirme

Ağ donanımlarının arayüzleri hariç tüm donanım dosyaları sistem içerisinde /dev dizininde bir donanım dosyası ile temsil edilir. Bunlara diskler ve disk bölümleri de dahildir. Şimdi bir SATA sabit diskin sistemdeki görüntüsünü kısaca inceleyelim. Bir SATA donanımı, sisteme kendisini SCSI katmanını kullanarak tanıtır. Sisteminizdeki ilk SATA diski /dev/sda dosyasıyla, onun ilk bölümü de /dev/sda1 ile temsil edilir. sda1‘i: Sistemdeki scsi donanımlardan (sd) ilkinin (a) birinci bölümü (1) olarak okuyabilirsiniz.

    ~$ ls -lh /dev/sda1
    brw-rw---- 1 root disk 8,  1  Nov 12  10:10  /dev/sda1

Standart bir ATA disk (veya DVD-ROM sürücüsü) /dev/sdc (sd scsi anlamına geliyordu, ancak artık diğer ATA donanımlar için de kullanılıyor) veya /dev/sr0 olarak görünecektir. Sistemdeki donanım yönetici uygulama, muhtemelen (kolay kullanım için) /dev/sdc‘yi işaret eden bazı sembolik bağlar üretecektir; /dev/cdrom ve /dev/dvdrom gibi.

    $ ls -lh /dev/sdc
    brw-rw---- 1 root cdrom 3, 0  Apr 23  21:00 /dev/sdc

Standart bir Gentoo kurulumunda, donanım yönetim uygulaması (udev), donanıma rastladıkça sistem için gerekli dosyalarını üretecektir. Örnek olarak bilgisayarımızdaki ilk SATA donanımın (diskin) bölümlerine bakalım:

    $ ls -lh /dev/sda*
    brw-r----- 1 root disk 8, 0 Sep 30 18:11 /dev/sda
    brw-r----- 1 root disk 8, 1 Sep 30 18:11 /dev/sda1
    brw-r----- 1 root disk 8, 2 Sep 30 18:11 /dev/sda2
    brw-r----- 1 root disk 8, 5 Sep 30 18:11 /dev/sda5
    brw-r----- 1 root disk 8, 6 Sep 30 18:11 /dev/sda6
    brw-r----- 1 root disk 8, 7 Sep 30 18:11 /dev/sda7
    brw-r----- 1 root disk 8, 8 Sep 30 18:11 /dev/sda8

/dev dizininde ayrıca bu tür donanımların farklı amaçlarla kullanılabilmesi için yönlenen bazı sembolik bağlar da görebilirsiniz. Örneğin disklere UUID (özel kimlik tanımlayıcı) isimleri ile erişebilmek için:

    $ ls -lh /dev/disk/by-uuid
    total 0
    lrwxrwxrwx. 1 root root 10 Dec 16 20:01 1628b93d-3448-4b8c-b72b-1d68e89bd2fa -> ../../sda2
    lrwxrwxrwx. 1 root root 10 Dec 16 20:01 5550c45f-9660-44f2-8e86-05a612d028a3 -> ../../dm-2
    lrwxrwxrwx. 1 root root 10 Dec 16 20:01 77eb40be-f571-49c6-bbb0-a12677615fe3 -> ../../dm-5
    lrwxrwxrwx. 1 root root 10 Dec 16 20:01 9644f675-6eaf-4974-9e1a-0b8eafa931ae -> ../../sdb2
    lrwxrwxrwx. 1 root root 10 Dec 16 20:01 9beda062-6e15-4323-9ad1-53b6a9e39676 -> ../../dm-0
    lrwxrwxrwx. 1 root root 10 Dec 16 20:01 9e7a1178-b0ad-4cd8-8977-a471a5d2b797 -> ../../dm-4
    lrwxrwxrwx. 1 root root  9 Dec 16 20:01 b06fa545-0d5a-4c9a-97cb-83b4e1799f9a -> ../../md3
    lrwxrwxrwx. 1 root root 10 Dec 16 20:01 b80c76a3-d52f-4006-9bf5-62f4d7edc791 -> ../../dm-3
    lrwxrwxrwx. 1 root root 10 Dec 16 20:01 bdb15de1-3430-47b4-9e63-ee58557f1d17 -> ../../dm-1
    lrwxrwxrwx. 1 root root  9 Dec 16 20:01 c44503ce-e52e-452c-b4bc-767ddd1d3b27 -> ../../md1
    lrwxrwxrwx. 1 root root  9 Dec 16 20:01 d8a2bb27-15da-49bb-b205-3160c307835c -> ../../md4

UUID’nin avantajı, her diske özel bir isim vermesidir. Eğer diskler takılıp çıkarılırsa (ki USB diskler için bu durum çok olası), sistemdeki donanım adı değişebilir, ancak UUID her zaman aynı kalacaktır.

‘mount’ komutu ve fstab dosyası

Modern Linux sistemler bir disk takıldığında otomatik olarak bağlayıp, çıkarırken ayıran araçlarla geliyor. Bu yüzden muhtemelen çok fazla elle müdahale gerekmeyecek. Yine de çalışması hakkında bilgi verelim. Bir ortamı dosya sisteminde bir konuma bağlama işlemi mount komutu tarafından gerçekleştirilir. İşini yapabilmesi için, mount komutunun bazı verilere ihtiyacı vardır. Örn: bağlama noktası, dosya sistemi türü, donanımın yolu ve varsa ek bağlama parametreleri. Örneğin, ext3 dosya sistemi barındıran /dev/sda7 diskini /home dizinine bağlamak için gerekli komut şöyle olmalıdır:

    # mount -t ext3 /dev/sda7 /home

Bağlama işleminin ardından, diskinizin bu bölümüne /home dizini üzerinden erişilebilecektir. Bir nevi kapasite artırma gibi düşünebilirsiniz. Ancak bilgisayarınızı her açtığınızda mount komutunu tekrar tekrar verebilmeniz mümkün değil. Bu amaçla Linux’da dosya sistemlerinin tanımlandığı bir dosya var: /etc/fstab . Bu dosya mount işleminin otomatik olarak yapılabilmesi için tüm bilgiyi içermekte. Örnek bir fstab dosyasına bakalım:

    /dev/sda8  /          ext4    defaults,noatime      0 0
    /dev/sda5  none       swap    sw                    0 0
    /dev/sda6  /boot      ext4    noauto,noatime        0 0
    /dev/sda7  /home      ext4    defaults,noatime      0 0
    /dev/sdb1  /media/usb auto    user,noauto,gid=users 0 0

Yapı aşağıdaki şekilde:

  1. Bağlanacak donanım (buraya etiket de yazabilirsiniz, ama buna sonra değineceğiz)
  2. Donanımın bağlanacağı disk (bağlama noktası)
  3. Dosya sisteminin türü veya bunu Linux’un otomatik olarak algılamasını isterseniz “auto”
  4. noatime (dosyalara erişim zamanını kayıt etme), users (normal kullanıcıların mount/umount yapmasına izin ver) gibi ek seçenekler veya özel bir gereksinim yoksa “defaults” (öntanımlılar).
  5. Dump numarası (artık pek kullanılmayan bir yedekleme yöntemi, 0 olarak bırakabilirsiniz)
  6. Dosya düzeni numarası (bunu da 0 bırakabilirsiniz)

Bu dosya sayesinde, önceki mount komutu örneği de çok daha kolay hale geldi, fstab dosyası bu halde ve /home zaten bağlı değilse bağlamak için tek yapmanız gereken:

    # mount /home

Eğer diskle işiniz bittiyse ve geri ayırmak istiyorsanız umount komutunu kullanmalısınız:

    # umount /home

USB diskleri ve DVD’leri okumak için önce bağlamanız gerektiği gibi, işiniz bittiğinde çıkarmadan önce ayırmanız gerekmektedir:

    # umount /dev/cdrom

Swap

Sayfalama (paging) işlemi için de bir bir disk bölümü ayırmanız gerekiyor. Bu sayede Linux yeteri kadar RAM kalmadığında RAM’de tutulan ve az erişilen bazı kaynakları bu bölüme taşıyıp, aktif uygulamaların daha iyi çalışabilmesi için RAm üzerinde yer açabilecektir. Bu bölüme “swap” ismi verilir. Swap da diğerleri gibi bir disk bölümüdür. Ancak kullanıcının erişebileceği bir dosya sistemi yerine, sistemin yarı-RAM gibi kullanmasına daha uygun bir dosya sistemi kullanır. Örnek olarak bir diskin bölümlerine göz atalım:

    # fdisk -l /dev/sda
    Disk /dev/sda: 60.0 GB, 60011642880 bytes
    255 heads, 63 sectors/track, 7296 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Disk identifier: 0x8504eb57
    
       Device Boot  Start    End      Blocks   Id  System
    /dev/sda1   *       1   1275    10241406   83  Linux
    /dev/sda2        1276   7296    48363682+   5  Extended 
    /dev/sda6        1526   1532       56196   83  Linux
    /dev/sda7        1533   2778    10008463+  83  Linux
    /dev/sda8        2779   7296    36290803+  83  Linux

Swap bölümü de /etc/fstab dosyasında belirtilir ve sistem açılırken aktif hale getirilir. Aktif swap bölümleri ve dosyalarına (evet, swap olarak dosya da kullanabilirsiniz) göz atmak için /proc/swaps dosyasının içeriğine bakabilir veya swapon -s komutunu kullanabilirsiniz:

    # swapon -s
    Filename     Type      Size    Used  Priority
    /dev/sda5    partition 2008084 0     -1

Linux Dosya Sisteminde Yerleşim

Belirttiğimiz gibi, Linux dosya sisteminde her konumun özel bir anlamı vardır. /home ve /proc gibi, bazılarına zaten değindik.

Sisteme Gerekli Olan Yerler

Bu konumlar başka bir dosya sisteminde tutulamaz, çünkü sistem açılırken ihtiyaç duyulan dosyalar buralarda bulunmaktadır. mount komutu bu dizinler farklı bir dosya sisteminde ise çalışamayacağından, sistem açılamayacaktır:

  • /bin: Genellikle sistemi başlatıp çalışır duruma getirmeye yarayan programların tutulduğu dizindir. Son zamanlarda bazı sistemlerde bu dosyalar /usr/bin altına koyulsa da, uyumluluk sebebiyle /bin altına programların sembolik linkleri oluşturulmaktadır.
  • /etc: Sistem için gerekli tüm ayar dosyalarının tutulduğu dizindir (kullanıcıya özel ayarlar hariç)
  • /lib: Genellikle /bin dizininde bulunan programların çalışabilmesi için gerekli sistem kütüphanelerinin tutulduğu yerdir. Son zamanlarda bu dizin de benzer şekilde /usr/lib altına alınmaktadır.
  • /sbin: Tıpkı /bin gibidir ve çalıştırılabilir programları barındırır. Ancak/bin tüm kullanıcıların kullanabileceği komutları içerirken, /sbin‘de yalnızca sistem yönetimi için gerekli uygulamalar bulunur.

Benzer olarak, userland dizini olarak da bilinen, sistem üzerindeki bazı uygulamaları veya verilerini tutan /usr dizini bulunmaktadır. Farklı disk bölümlerinde tutulabilir, ancak bunun için sistem açılışında bir açılış ram disk dosyası (initial ram) kullanmanız gerekir (bu konuya da değineceğiz). /usr ismi “Unix system resources”dan (Unix sistem kaynakları) gelir.

Genel Dizinler

Bunlar da farklı ortamlarda tutabileceğiniz dizinlerdir…

  • /home tüm yerel kullanıcıların ev dizinlerinin olduğu yerdir.
  • /boot açılışla ilgili statik dosyaları tutar. Sistem açıldıktan sonra varlığı bir gereksinim değildir.
  • /media ayrılabilir ortamların (USB diskler, DVD’ler…) bağlandığı dizinleri içerir.
  • /mnt genelde geçici olarak bağlanan ortamların (fstab’da eklemeye gerek olmayanların) bağlandığı dizinleri tutar.
  • /opt genelde paket yönetim uygulamasının sunmadığı ve kullanıcı tarafından elle kurulan uygulamaların ve eklentilerin tutulduğu dizindir.
  • /tmp sistem araçlarının kullandığı geçici dosyaları barındırır. İçindekiler sistem açılışında silinebilir.
  • /var boyut olarak değişen dosyaların tutulduğu yerdir. Örneğin işlem kayıtları veya uygulama önbellekleri (cache).

Çekirdeğin Sağladığı Özel Dizinler

Bir disk veya dosya sistemi üzerinde saklanmayan, çekirdek tarafından direkt olarak doldurulan ve yönetilen bazı dizinler bulunmaktadır.

  • /proc çalışan sistem, çekirdek ve uygulamalar hakkında bilgileri tutar.
  • /sys erişilebilir donanımların ve çekirdeğin işlemleri ile ilgili bilgileri tutar.
  • /dev donanım dosyalarını tutar.

Genelde bunların altındaki bazı dizinlere de, benzer sahte dosya sistemlerinin bağlı olduğunu görebilirsiniz.

Kök Dosya Sistemi /

Önceden de değindiğimiz gibi, kök dosya sistemi / , Linux’da dosya sisteminin en temelinde yer alır. Kök dosya sisteminizde bir problem var ise, sisteminiz açılamayacaktır. Kök dosya sisteminizde olması gereken, yani farklı bir dosya sistemi bağlamamanız gereken konumlardan bahsedelim biraz:

  • /bin ve /sbin dizinleri, sisteminizin başka bir dosya sistemini bağlayabilmesini sağlayacak duruma getirene kadar kullandığı dizinlerdir. Çalıştırılabilir dosyaları içerirler.
  • /lib dizini /bin altındaki komutların çalışırken kullandığı kütüphane dosyalarını içerir.
  • /etc dizini yapılandırmaları içerir. Bunlara sistemin açılırken kullandığı yapılandırmalar da dahildir. Örnek olarak içerisindeki fstab dosyası olmadan, sistem hangi dosya sistemini nereye bağlaması gerektiğini bilemeyecektir.

Değişken Veri Dizini: /var

Değişen veriler /var dizininde bulunur. Sisteminiz çalışırken bu dizinin içerisi oldukça yoğun olarak kullanılır. Kayıt (log) dosyaları, uygulamaların önbellek (cache) dosyaları, geçici dosyalar vb. bu dizindedir. Hatta bu dizin herhangi bir şekilde dolarsa, kök dosya sisteminin dolup diğer kullanıcıları etkilememesi için, çoğu kullanıcı /var dizinini farklı bir dosya sistemi olarak bağlar.

Userland Dizini: /usr

/usr dizini günlük kullanılan uygulamaların dosyalarını içerir. Sisteminizi güncellemediğiniz takdirde, bu dizin içerisinde fazla bir işlem göremeyebilirsiniz. /usr dizininin ayrı dosya sisteminde olmasının (pek önemli sayılmasa da) bazı avantajları var:

  • Eğer sistem yönetimi görevleriniz var ise, işlemler sırasında /usr dizinini ayırarak kullanıcıların uygulamaları çalıştırmasını geçici olarak engelleyebilirsiniz.
  • /usr ve benzeri dizinleri farklı yerlerde tutmak, kök dosya sisteminizi önemli ölçüde küçültmeniz anlamına gelir. Bu da kök dosya sisteminizin bozulma riskini azaltacağından, genel olarak sistemin açılmaz hale gelmemesi için bir önlem sayılabilir.
  • Bu dizinde okuma işlemlerini daha hızlı gerçekleştiren bir dosya sistemini veya mount seçeneklerini kullanabilirsiniz.

Ev Dizini: /home

Son olarak /home dizinine değinelim. Bu dizin sisteminizdeki kullanıcıların ev dizinlerini içerir. Kullanıcılar ev dizinleri dışında genellikle yalnızca okuma iznine sahiptir (bazı dosya/dizinler için okuma izinleri bile yoktur) ancak kendi ev dizinleri içerisinde tam okuma/yazma yetkisine sahiptirler. Ev dizinlerinin içerisi, kullanıcının istediği gibi kullanabileceği bir ortamdır. Bu sebeple /home dizini ayrı bir dosya sisteminde olmadığı zamanlarda, kota uygulanmamış kullanıcılar diskinizi doldurabilir. Bu sebeple çok kullanıcılı sistemlerde bu dizini ayrı bir dosya sisteminde tutmak işe yarayacaktır. /home dizinini ayrı dosya sisteminde tutmanın bir avantajı daha: Sisteminizi yeniden kurmanız veya farklı bir dağıtım kullanmanız gereken durumlarda, /home dizinini kurulumun ardından tekrar bağlayarak, kullanıcıların dosyalarını yeni sisteme değişiklik olmadan geri getirebilirsiniz.

İzinler ve Nitelikler

Linux’da dosya ve dizinlerin belirli “izinleri” ve “sahipleri” bulunmaktadır. Bu sayede isteğe bağlı erişim kontrolü (DAC) ile kullanıcıların/uygulamaların erişebilecekleri kaynaklar sınırlanabilir. Ancak kullanıcıların/uygulamaların yetkilerini belirleyen politikalar hazırlayabileceğiniz, yani zorunlu erişim kontrolü (MAC) uygulayabileceğiniz uygulamalar da bulunmakta. Bunlardan bazıları:

Okuma, Yazma ve Çalıştırma

Dosya ve dizinler için desteklenen bazı izinler var demiştik. Bunlardan en sık kullanılanları okuma (read: yani r), yazma (write: yani w) ve çalıştırma (execute: yani x) izinleri. Kullanımına değineceğiz. Ancak bu üç seçenekle izinleri ayarlamanız sisteminizi yeterince güvenli yapmaya yetmeyecek. Bunların yanı sıra dosyaların/dizinlerin sahiplerinin de belirlenmesi lazım. Mesela bahsettiğimiz /etc dizini altındaki sistem ayar dosyaları, tüm kullanıcıların sistem ayarlarını değiştirememeleri için, sadece yöneticiler tarafından yazılabilir olmalı. Hatta bazı dosyalara (kullanıcı parolalarının tutulduğu dosya gibi) normal kullanıcıların okuma izni dahi olmamalı. Bu koşullarda güvenli bir sistem sağlamak için Linux, bahsettiğimiz izinleri (r,w,x) 3 grupta kullanmak üzere ayırır:

  • dosyanın sahibi (1. yetki alanı)
  • dosyanın grubu (2. yetki alanı)
  • diğerleri (3. yetki alanı)

Bu sayede tüm dosya/dizinler için her üç alan için de okuma, yazma ve çalıştırma izinlerini ayarlayabilirsiniz. Söz konusu olan dosyalar ise:

  • Okuma izni (r) dosyayı açıp, içindekilere bakma yetkisini,
  • Yazma izni (w) dosyaya müdahale etme ve içerisindekileri değiştirme yetkisini,
  • Çalıştırma izni ise (x) dosyayı bir komut gibi çalıştırma yetkisini anlatır.

Örnek olarak şu ls -l komutu çıktısına bakalım:

    $ ls -l /etc/fstab
    -rw-r--r-- 1 root root 905 Nov 21 09:10 /etc/fstab

Örneğimizde, fstab dosyasının, sahibi olan root kullanıcısı tarafından düzenlenebildiğini (r w -) ve diğerleri tarafından sadece okunabildiğini (r - -) görüyoruz. Söz konusu olan bir dizin ise:

  • Okuma izni (r) dizinin içerisindekilerin görüntülenebilme yetkisini,
  • Yazma izni (w) dizinin içerisine dosya/dizin ekleyebilme ve kaldırabilme yetkisini,
  • Çalıştırma izni ise (x) (cd komutu ile) dizine girebilme yetkisini anlatır.

Örnek olarak şu ls -ld komutunun çıktısına bakalım:

    $ ls -ld /etc/cron.daily
    drwxr-x--- 2 root root 4096 Nov 26 18:17 /etc/cron.daily/

Örneğimizde cron.daily dizininin, sahibi olan root kullanıcı tarafından görüntülenebilir (r), içerisine yazılabilir (w) ve içerisine girilebilir (x) olduğunu görüyoruz. root grubunda bulunan kullanıcılar ise dizinin içerisini görebilirler (r-x), herhangi bir düzenleme yapamazlar (-) ama dizinin içerisine girebilirler (x). Bu grupta olmayan diğer kullanıcılar ise dizine erişemezler (**- - - **).

Erişim İzinleri

Bir dosyanın izin durumuna bakmak için ls komutunun detaylı çıktısını -l kullanabilirsiniz. Örneğin passwd dosyasındaki izinlerine bakalım:

    $ ls -l /etc/passwd
    -rw-r--r-- 1 root root 3108 Dec 26 14:41 /etc/passwd

Yani dosyayı root kullanıcısının okuma ve yazma yetkisi, diğer kullanıcıların da okuma yetkisi var. İzin çıktısındaki ilk karakter, dosyanın türünü belirtir:

  • ‘-‘: normal dosya
  • ‘d’: dizin
  • ‘l’: sembolik bağ (symlink)
  • ‘b’: blok dosyası (/dev/sda1 gibi)
  • ‘c’: karakter dosyası (/dev/console gibi)
  • ‘p’: boru dosyası
  • ’s’: unix soketi

Sonrasındaki karakterler ise, önceden bahsettiğimiz gibi üçe ayrılır: İlk üç tanesi dosyanın sahibinin yetkilerini, sonraki üçü dosyaya sahip grubun yetkilerini, son üçü ise diğer kullanıcıların yetkilerini açıklar. Yani aldığımız ‘-rw-r–r–’ çıktısını şu şekilde okuyabiliriz:

  1. Bu, normal bir dosya (baştaki - karakteri)
  2. Sahibi (root - çıktıdaki 3. bölümde yazıyor) dosya üzerinde okuma ve yazma yetkisine sahip (rw-)
  3. Grubundaki kullanıcılar (yani root grubundakiler - çıktının 4. bölümünde yazıyor) okuma yetkisine sahip (r–)
  4. Diğer tüm kullanıcılar okuma yetkisine sahip (r–)

Sıradaki örneğimiz de /var/log/sandbox dizininin yetkileri. Görüntülemek için ls komutunun -d parametresini kullanıyoruz, bu sayede dizinin içerisindekileri değil, sadece kendisini gösterecek (dilerseniz -d olmadan deneyip görebilirsiniz):

    $ ls -d /var/log/sandbox
    drwxrwx--- 2 root portage 4096 Jul 14 18:47 /var/log/sandbox

Bu durumda:

  1. Bu bir dizin (d)
  2. Sahibi olan kullanıcı (root) okuma, yazma ve çalıştırma (içerisine girme) yetkisine sahip
  3. Aynı şekilde sahibi olan gruba (portage) dahil olan kullanıcılar da okuma, yazma ve çalıştırma iznine sahipler
  4. Diğer kullanıcıların ise herhangi bir izni yok; okuyamaz, yazamaz ve bu dizine giremezler.

Yetkileri görüntülemenin bir diğer yolu da, stat komutudur:

    $ stat /etc/passwd
      File: `/etc/passwd'
      Size: 3678        Blocks: 8          IO Block: 4096   regular file
    Device: 808h/2056d  Inode: 3984335     Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2013-03-18 21:46:06.000000000 +0100
    Modify: 2013-03-18 21:46:06.000000000 +0100
    Change: 2013-03-18 21:46:06.000000000 +0100

stat komutunun çıktısında anlattığımız bayrakların (-rw-r–r–) yanı sıra bazı rakamlar da olduğunu görüyoruz. Bu rakamlar, izinleri daha kısa yoldan tanımlamamıza yaramakta. Hadi bu rakamların anlamlarını çözelim! Her yetkinin bir değeri var:

  • Okuma izni (r) 4 puan
  • Yazma izni (w) 2 puan
  • Çalıştırma izni (x) 1 puan

Herhangi bir yetki alanının puanını, yetkilerin puanını toplayarak bulabiliriz. Mesela (-rw-r–r–) yetkilerinde bir dosya için hesaplama yapalım:

  • Sahibinin izinleri okuma (4) ve yazma (2), yani toplam 6
  • Grubundaki kullanıcıların izni sadece okuma, yani 4
  • Diğer kullanıcıların izinleri de sadece okuma, yani 4

Sonuç olarak, 644 ! Peki ya stats komutunun çıktısında verdiği “0644” değerinde, başta koyduğu sıfır ne anlama mı geliyor? Bu, dosyanın herhangi bir özel yetkiye sahip olmadığını belirtiyor.

Özel Yetkiler

Linux’da bazı özel yetkiler de bulunur. Silme kısıtlaması yetkisini, yani _sticky bit_‘den söz etmiştik. Dizinlere bu yetkiyi verdiğinizde dizin içerisine yazılabilir hale getiriyor, ancak standart yazma izninde olduğu gibi içindeki dosyaları silme iznini vermiyordu. Bu yetkinin en bilindik kullanım yeri /tmp dizinidir:

    $ stat /tmp
      File: `/tmp'
      Size: 28672      Blocks: 56         IO Block: 4096   directory
    Device: 808h/2056d Inode: 3096577     Links: 759
    Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2010-01-10 17:44:04.000000000 +0100
    Modify: 2013-04-02 00:04:36.000000000 +0200
    Change: 2013-04-02 00:04:36.000000000 +0200

Gördüğünüz gibi, sticky bit yetkisinin sayısal karşılığı 1. Bahsettiğimiz diğer bir özel yetki de setuid/setgid. Bu yetki de çalıştırılabilir bir dosyaya verildiğinde, çalıştıran kullanıcının değil, dosyanın sahibinin (setuid) veya grubunun (setgid) yetkileri ile çalışmasını sağlıyor. Yani root yetkilerine sahip olmayan bir kullanıcı, setuid’e sahip bir dosyayı çalıştırdığında, komut root yetkileri ile çalışıyor. Bu sebeple setuid/setgid yetkisi atanmış dosyaların sayısı az olmalı ve takibi sağlanmalı. Sonuçta her komutu root olarak çalıştırmak istemezsiniz. Bu yetkiye örnek olarak da /bin/mount komutunu verebiliriz:

    $ stat /bin/mount
      File: `/bin/mount'
      Size: 59688      Blocks: 128        IO Block: 4096   regular file
    Device: 808h/2056d Inode: 262481      Links: 1
    Access: (4711/-rws--x--x)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2010-02-06 13:50:35.000000000 +0100
    Modify: 2013-01-02 13:50:35.000000000 +0100
    Change: 2013-01-02 13:50:43.000000000 +0100

İzinleri Değiştirmek

Bir dosya veya dizinin izinlerini değiştirmek için chmod komutunu kullanabilirsiniz. Kullanımı oldukça kolay. İlk kullanmamız gereken, yetkiyi kimin için düzenleyeceğimiz:

  • Kullanıcı için u (user)
  • Grup için g (group)
  • Diğer herkes için o (others)

Ardından yapmak istediğimiz işi anlatan bir karakter kullanıyoruz. İzinleri tam olarak ayarlamak için “=“, varolan yetkilere ekleme yapmak için “+” ve yetkileri azaltmak için “-“. Örneğin, /etc/passwd dosyasının sahibi olan gruba, yazma yetkisi vermek (eklemek) istiyorsanız:

    # chmod g+w /etc/passwd

Dilerseniz istediğiniz değişiklikleri birleştirebilirsiniz. Örneğin az önce gruba verdiğimiz yazma yetkisini geri alıp, aynı zamanda diğer kullanıcılar için okuma yetkisini de yok etmek istiyorsak şu şekilde bir komut kullanabiliriz:

    # chmod g-w,o-r /etc/fstab

Dilerseniz yetki atama için rakamları da kullanabilirsiniz. Örneğin:

    # chmod 600 /etc/fstab

Sahiplik Değiştirme

Bir dosyanın veya dizinin sahibini değiştirmek için kullanmanız gereken komutlar chown veya chgrp. Örneğin bir dosyanın sahibini “ahmet” kullanıcısı yapmak için:

    # chown ahmet deneme.txt

Tabi bu işlemi yapmak için root olmanız gerek, dosyanın sahibi olmanız yeterli değil. Ama dosyanın grubunu değiştirmek istiyorsanız, (ayarlayacağınız gruba dahilseniz) yapabilirsiniz:

    $ ll dosya
    -rw-r--r-- 1 jack  users   0 May 13 20:41 dosya
    $ chgrp dialout dosya
    $ ll dosya
    -rw-r--r-- 1 jack  dialout 0 May 13 20:41 dosya

Hem kullanıcıyı, hem grubu değiştirmek istiyorsanız, aralarında iki nokta karakteri (:) kullanarak, tek chown komutu ile işlemi yapabilirsiniz:

    # chown jack:users dosya

Nitelikler

Bazı dosya sistemleri dosyalara ek nitelikler (attributes) eklemenize izin verir. Bu niteliklerin dosyaya etkileri farklıdır. Her dosya sistemi tüm nitelikleri desteklemediği için, çoğu Linux dağıtımı bu tür nitelikleri kullanmamakta.

Niteliklere Bakma ve Düzenleme

Bir dosyanın niteliklerini listelemek için, lsattr komutunu, değişiklik yapmak için ise chattr komutunu kullanacağız. Gentoo’da örnek verebileceğimiz bir dosya bulunmadığı için, bir dosya oluşturalım ve nitelik atayalım:

    # touch testdosyasi
    # chattr +asS testdosyasi

Bakalım lsattr bize ne verecek:

    # lsattr testdosyasi
    s-S--a---------  testdosyasi

Eh, chattr ile ne atadıysak, onları görüyoruz. Peki ne atadık? Dilerseniz man chattr komutu ile nitelikler hakkında detaylı bilgi alabilirsiniz. Şimdilik bazılarından hızlıca bahsedelim:

  • s: Dosya silindiğinde, sadece dosya sisteminde “silindi” olarak işaretlemek yerine, dosyanın bulunduğu yerin tamamının sıfır (0) karakteri ile doldulmasını sağlar.
  • S: Dosyada değişiklik yapıldığında, anında diske geçirilmesini sağlar,önbellek kullanılmasına izin vermez.
  • a: Dosyaya sadece ekleme yapılabilir, var olan dosya içeriğine müdahale yapılamaz. Genellikle kayıt (log) dosyaları için faydalı olabilir.
  • i: Dosyayı dokunulmaz yapar. Dosyanın içeriği veya ismi (özellik kaldırılmadıkça root tarafından dahi) değiştirilemez, dosya silinemez veya taşınamaz.

POSIX Kontrol Listeleri

Anlattığımız yetkilendirme şemasının (sahibi, grubu ve diğerleri) yanı sıra, bir dosya veya dizine POSIX listeleri ile ek yetki tanımlamaları yapabilirsiniz. Bir dosya veya dizinin (varsa) POSIX erişim yetki listesini almak için getfacl, listede düzenleme yapmak için setfacl kullanılır. Örneğin ahmet kullanıcısına, normalde yetkisi olmayan bir dosyayı okuma izni verelim:

    $ setfacl -m "u:ahmet:r" dosya2
    $ getfacl dosya2
    # file: dosya2
    # owner: jack
    # group: users
    user::rw-
    group::r--
    other::r--
    user:ahmet:r--

POSIX listeleri dosya sistemi tarafından ek özellik olarak desteklenen bir seçenektir. Yani kernel’den açık duruma getirmeniz gerekebilir. Ayrıca dosya sistemi bağlanırken mount parametrelerine “acl” eklenmesi de gerekmektedir.

Dosyaları Bulmak

Bu kadar fazla dizin içinde, istediğiniz dosyanın nerede olduğunu hatırlamak zor olabilir. Standart bir kullanıcı için çoğu kez bu arayış yazma izninizin olduğu ev dizininde olacaktır. Ancak bazen de sistemin herhangi bir yerindeki bir dosya lazım olabilir. Bunun için işimize yarayacak bazı araçlar var.

mlocate

locate komutu, kendi veritabanında sorgulama yaparak, sistemdeki dosyaların yerini hızlıca tespit etmeye yarar. Tabi kullanmak için önce sisteminize kurmanız (paketin ismi sys-apps/mlocate) ve ardından dosya veritabanını oluşturmanız gerek:

    # updatedb

Dosya veritabanını güncel tutmanın en mantıklı yollarından biri, sistem zamanlayıcıyı (cron) kullanarak bu komutu belirli aralıklarla çalıştırmak. Ancak cron konusuna ilerde değineceğiz.

Dosya veritabanınız oluştuğunda, sisteminizdeki herhangi bir dosyayı locate komutu ile arayabilirsiniz:

    # locate make.conf
    /etc/portage/make.conf
    (...)
    /usr/portage/local/layman/make.conf

Gördüğünüz gibi komut, isminde örnek olarak yazdığımız “make.conf” geçen tüm dosyaları listeliyor.

find

find komutu da aradığınızı bulmak için oldukça faydalı: locate komutunun aksine, hafızasında tuttuğu veriyi değil, güncel veriyi size iletiyor. Bu find‘ı biraz daha yavaş yapsa da, hızından daha çok sunduğu seçeneklerden dolayı kullanılıyor.

Düzenli ifadelerle arama

find komutunun en basit kullanım şekli, istediğiniz dizinler içindeki bir dosyayı bulmak. Örneğin /etc içerisinde ismi (tam olarak) dhcpcd.conf olan dosyaları aramak için:

    $ find /etc -name dhcpd.conf
    /etc/dhcp/dhcpd.conf

Yine /etc içinde, adında “dhcpcd” geçen dosyaları (dizinleri değil) bulmak için:

    $ find /etc -type f -name '*dhcpd*'
    /etc/conf.d/dhcpd
    /etc/init.d/dhcpd
    /etc/udhcpd.conf
    /etc/dhcp/dhcpd.conf

/etc dizini içinde son 7 gün içerisinde değiştirilmiş dosyaları bulmak için:

    $ find /etc -type f -mtime -7
    /etc/mtab
    /etc/adjtime
    /etc/wifi-radar.conf
    /etc/genkernel.conf

Dosyaları sahibine göre de arayabilirsiniz. Örneğin /etc içerisinde olup, “root” kullanıcısına ait olmayan dosyaları bulalım:

    $ find /etc -type f -not -user root

Arama şartlarını birleştirme

Aradığınız koşulları birlikte verebilirsiniz. Örneğin son 7 gün içerisinde düzenlenmiş ve isminde “.conf” bulunmayan dosyaları listeleyelim:

    $ find /etc -type f -mtime -7 -not -name '*.conf'
    /etc/mtab
    /etc/adjtime

Ya da az önceki aramayı ekleyelim, ancak isminde “mtab” da geçmesin:

    $ find /etc -type f -mtime -7 -not \( -name '*.conf' -or -name mtab)
    /etc/adjtime

Sonuçlar üzerinde işlem yapmak

find ile bulduğunuz dosyalarda dilediğiniz işlemleri yapabilirsiniz. Örneğin bulduğunuz dosyaların detaylarını ls -l komutu ile görüntülemek istiyoruz. Bu iş için -exec seçeneğini kullanmamız gerek. -exec ile birlikte iki özel karakter kümesini de kullanacağız:

  • '{}' bulduğumuz dosyanın adını temsil eder, -exec ile verdiğimiz komut çalıştırılırken, ‘{}’ karakterlerinin yerine dosya adı gelecek.
  • \; karakterleri de -exec ile verdiğimiz komutun sonlandığını belirtir. $ find /etc -type f -mtime -7 -exec ls -l ‘{}’ \;

Internette bu işlem için şu şekilde bir denk komut da görebilirsiniz:

    $ find /etc -type f -mtime -7 | xargs ls -l '{}'

Bu komuttan da alacağınız sonuç aynı. Ancak davranış biraz farklı olacaktır. -exec kullandığınızda, find bulduğu her sonuç için belirttiğiniz komutu çalıştıracaktır. Ancak xargs toplamda daha az komut çalıştıracaktır. Bunun sebebi xargs’ın birden fazla sonucu tek seferde komuta iletmesidir. Örneğin 10000 dosya bulacağımızı varsayalım, -exec ile aşağıdaki sonucu alırız:

    ls -l dosya1
    ls -l dosya2
    ...
    ls -l dosya10000

Eğer xargs kullanırsak, sistemde çalışan komutlar şu şekilde olur:

    ls -l dosya1 dosya2 ... dosya4210
    ls -l dosya4211 dosya4212 ... dosya9172
    ls -l dosya9173 dosya9174 ... dosya10000

Alıştırmalar

  1. Yazma izniniz olan bir dizin içerisine (örneğin ev dizininizdeki bir “deneme” dizinine) aşağıdaki dizin hiyerarşisini oluşturun:

    $ mkdir -p deneme/yetkiler/ile/bir/calisma/testi
    

Ardından “diğer kullanıcılar” için (kullanıcısı veya grubuna dahil olmayanlar için) tek komut ile yeni oluşturduğunuz deneme dizininin tüm alt dizinlerindeki izinleri kaldırın.

  1. /tmp dizininin izinlerini inceleyin. Bu izinlerin aynısını ev dizininizde oluşturduğunuz deneme dizinine ayarlayın.