Linux’u Bildiğimi Sanıyordum, Sonra Gerçekten Öğrendim (1. Hafta)
Giriş: Yüzeydeki Bilgiden Derin Anlayışa Yolculuk
Birçok teknoloji meraklısı gibi, ben de uzun süre Linux’u “bildiğimi” düşündüm. Terminalde birkaç komut yazmak, dosya sisteminde gezinmek ve belki birkaç paket kurmak, bana yeterli geliyordu. Ancak zamanla fark ettim ki, bu yüzeysel bilgi, Linux’un sunduğu gerçek gücün ve esnekliğin sadece küçük bir parçasıydı. Tıpkı bir buzdağının görünen yüzü gibi, bildiklerim Linux dünyasının derinliklerinde yatan sayısız kavramın, aracın ve metodolojinin çok azını kapsıyordu. Bu makale, benim “Linux’u gerçekten öğrenme” yolculuğumun ilk haftasını ve bu süreçte edindiğim temel ama kritik farkındalıkları ele alıyor. Amacım, sizin de bu yolculuğa çıkarken karşılaşabileceğiniz zorlukları aşmanıza yardımcı olmak ve Linux’a bakış açınızı kökten değiştirecek temel bilgileri adım adım sunmaktır. Eğer siz de kendinizi Linux’u bildiğini sanan ama aslında daha derinlere inmesi gerektiğini hisseden biri olarak görüyorsanız, doğru yerdesiniz. Bu, sadece komut ezberlemekten öte, sistemin nasıl çalıştığını anlamaya yönelik bir başlangıç rehberidir. Linux’un temel taşlarını anlamak, sadece günlük işlerinizi kolaylaştırmakla kalmaz, aynı zamanda sorun giderme yeteneğinizi geliştirir ve sistem yönetimi konusunda size büyük bir avantaj sağlar. Bu hafta, kabuk, dosya sistemi, kullanıcı izinleri ve süreç yönetimi gibi temel kavramlara odaklanarak, Linux’un mantığını ve felsefesini kavramaya çalışacağız. Hadi, Linux’un gerçek gücünü keşfetmeye başlayalım!
Kabuk ve Komut Satırı Arayüzü (CLI): Temelleri Yeniden Keşfetmek
Neden Kabuk Sandığınızdan Daha Güçlü?
Linux ile etkileşimin kalbi, kabuk (shell) ve komut satırı arayüzüdür (CLI). Birçok yeni kullanıcı için bu siyah ekran ve yanıp sönen imleç korkutucu gelebilir. Oysa kabuk, sistemle iletişim kurduğumuz, komutları çalıştırdığımız ve hatta basit programlar (kabuk betikleri) yazdığımız inanılmaz güçlü bir araçtır. Ben de ilk başlarda sadece basit komutları çalıştırmak için kullandığımı sanıyordum. Ancak kabuğun sadece bir komut yorumlayıcısı olmadığını, aynı zamanda bir programlama ortamı olduğunu fark ettiğimde gerçek potansiyelini anlamaya başladım. En yaygın kabuklar arasında Bash (Bourne Again SHell) ve Zsh (Z Shell) bulunur. Her ikisi de güçlü özellikler sunar, ancak Zsh, özellikle otomatik tamamlama, komut geçmişi yönetimi ve tema desteği gibi konularda daha gelişmiş seçenekler sunarak kullanıcı deneyimini zenginleştirir. Kabuğunuzu anlamak, sadece komutları doğru yazmakla kalmaz, aynı zamanda sisteminizle daha verimli bir şekilde etkileşim kurmanızı sağlar. Örneğin, .bashrc veya .zshrc gibi yapılandırma dosyalarını düzenleyerek, kendi takma adlarınızı (alias) tanımlayabilir, çevre değişkenleri (environment variables) ayarlayabilir ve kabuğunuzu kişiselleştirebilirsiniz. Bu dosyalar, kabuk başlatıldığında otomatik olarak çalıştırılan betikler içerir ve çalışma ortamınızı sizin için daha uygun hale getirir. Bu seviyede bir kişiselleştirme, günlük görevlerinizi otomatikleştirmek ve tekrarlayan işlemleri tek bir komutla halletmek için zemin hazırlar. Unutmayın, kabuk sadece bir arayüz değil, aynı zamanda bir düşünce biçimidir; sistemle doğrudan, aracısız bir bağlantı kurmanın en etkili yoludur. Bu derinlemesine anlayış, Linux’u gerçekten öğrenme yolculuğunuzun ilk ve en önemli adımıdır.
Temel Komutların Derinlikleri: ls, cd, pwd, man
Linux’ta her şey bir dosyadır ve bu dosyalarla etkileşim kurmak için temel komutlara ihtiyacımız vardır. İlk öğrendiğimiz komutlar genellikle ls (listeleme), cd (dizin değiştirme) ve pwd (mevcut dizini yazdırma) olur. Ancak bu komutların sadece basit işlevleri yerine getirmediğini, aynı zamanda derinlemesine bilgi sağlayabildiğini anlamak, “gerçek öğrenme” sürecimin önemli bir parçasıydı. Örneğin, ls -l komutu sadece dosya adlarını listelemekle kalmaz, aynı zamanda dosya izinleri, sahip kullanıcı, sahip grup, dosya boyutu, son değiştirilme tarihi ve dosya adı gibi detaylı bilgileri de gösterir. Bu detaylar, bir dosyanın güvenliği ve yönetimi hakkında kritik bilgiler sunar. cd komutu ise basitçe dizinler arasında gezinmekten ibaret değildir. Mutlak (absolute) yollar (/home/kullanici/belgeler gibi) ve göreceli (relative) yollar (../resimler gibi) arasındaki farkı anlamak, dosya sisteminde kaybolmadan hareket etmenizi sağlar. Özellikle cd - komutunun sizi bir önceki dizine geri götürdüğünü bilmek, sık sık dizinler arasında geçiş yapanlar için hayat kurtarıcı olabilir. En önemlisi ise man (manual) komutudur. Bir komutun ne işe yaradığını, hangi seçeneklere sahip olduğunu ve nasıl kullanıldığını öğrenmek için internette arama yapmak yerine, doğrudan sistemin kendi kılavuz sayfalarına başvurmak, Linux öğreniminde altın bir kuraldır. Örneğin, man ls yazarak ls komutunun tüm seçeneklerini ve açıklamalarını görebilirsiniz. Bu, sadece bir komutun işlevini öğrenmekle kalmaz, aynı zamanda problem çözme ve kendi kendine öğrenme becerilerinizi de geliştirir. Bu temel komutları sadece ezberlemek yerine, onların arkasındaki mantığı ve sundukları tüm seçenekleri anlamak, Linux ile daha bilinçli ve etkili bir şekilde çalışmanın kapılarını aralar. Her bir komutun, sistemle etkileşim kurmak için birer araç olduğunu ve bu araçları ne kadar iyi tanırsak, o kadar verimli olacağımızı unutmamak gerekir.
Komut Zincirleme ve Girdi/Çıktı Yönlendirme: Veri Akışını Kontrol Etmek
Linux’un gücünü gerçekten hissettiğim anlardan biri, basit komutları bir araya getirerek karmaşık görevleri tek bir satırda çözebildiğimi fark ettiğim zamandı. Bu, komut zincirleme ve girdi/çıktı yönlendirme (I/O redirection) kavramlarıyla mümkün olur. Standart girdi (stdin), standart çıktı (stdout) ve standart hata (stderr) kavramları, Linux’ta veri akışının temelini oluşturur. Bir komutun çıktısını başka bir komutun girdisi olarak kullanmak için “boru hattı” (pipe) operatörünü (|) kullanırız. Örneğin, bir dizindeki dosyaları listelemek (ls) ve bu listenin içinde belirli bir kelimeyi aramak (grep) için şu komutu kullanabiliriz:
ls -l | grep ".txt"
Bu komut, mevcut dizindeki tüm dosyaları detaylı bir şekilde listeler ve ardından bu listeden sadece “.txt” uzantısına sahip olanları filtreler. Bu basit örnek bile, iki farklı komutun bir araya gelerek nasıl daha güçlü bir işlevsellik sunduğunu gösterir. Girdi/çıktı yönlendirme ise, bir komutun çıktısını bir dosyaya yazmak (> veya >>) veya bir dosyanın içeriğini bir komutun girdisi olarak kullanmak (<) için kullanılır. Örneğin, bir komutun çıktısını yeni bir dosyaya yazmak için > operatörünü kullanırız:
ls -l > dosya_listesi.txt
Eğer dosyanın üzerine yazmak yerine mevcut içeriğe eklemek istersek, >> operatörünü kullanırız. Hata mesajlarını ayrı bir dosyaya yönlendirmek için ise 2> operatörü kullanılır. Bu yetenekler, günlük sistem yönetimi, log analizi ve veri işleme gibi birçok alanda vazgeçilmezdir. Komutları zincirleyerek ve girdi/çıktı akışını kontrol ederek, karmaşık görevleri otomatikleştirebilir, büyük veri kümelerini işleyebilir ve sisteminiz üzerinde tam kontrol sağlayabilirsiniz. Bu, Linux'un modüler yapısının ve Unix felsefesinin ("Her aracı tek bir işi iyi yapacak şekilde tasarla ve bu araçları bir araya getirerek daha karmaşık görevleri çöz") en güzel örneklerinden biridir. Bu kavramları anlamak, sadece komutları kullanmak değil, aynı zamanda onları birleştirerek kendi çözümlerinizi üretme yeteneğinizi geliştirir.
Linux Dosya Sistemi Hiyerarşisi (FHS): Neden Her Şey Bir Yerde Değil?
Her Dizin Ne İşe Yarar? /etc, /var, /usr, /opt Anlamak
Linux dosya sistemi, ilk bakışta karmaşık gelebilir, ancak aslında belirli bir mantık ve düzen içinde yapılandırılmıştır. Dosya Sistemi Hiyerarşi Standardı (FHS), Linux dağıtımlarının bu yapıyı tutarlı bir şekilde kullanmasını sağlar. Bu standardı anlamak, sistemin neresinde ne tür dosyalar bulacağınızı bilmek, sorun giderme ve sistem yönetimi için kritik öneme sahiptir. Ben de ilk başlarda her şeyin neden /home dizinimde olmadığını merak ederdim. Ancak her dizinin belirli bir amaca hizmet ettiğini öğrendiğimde, bu yapının ne kadar mantıklı olduğunu kavradım.
/(Kök Dizin): Tüm dosya sisteminin başlangıç noktasıdır. Her şey buradan dallanır./bin: Temel kullanıcı komutlarını (ls,cp,mvvb.) içerir. Sistem açılışı için gerekli olan komutlardır./sbin: Sistem yöneticisi komutlarını (fdisk,mkfsvb.) içerir. Genellikle root yetkisi gerektiren komutlardır./etc: Sistem genelindeki yapılandırma dosyalarını (configuration files) barındırır. Örneğin, ağ ayarları, kullanıcı bilgileri (/etc/passwd) ve sistem hizmetlerinin ayarları burada bulunur. Bu dizin, sistemin davranışını belirleyen en önemli yerlerden biridir ve bu dosyaları değiştirmeden önce mutlaka yedek almak iyi bir pratiktir./home: Kullanıcıların kişisel dosyalarını ve dizinlerini içerir. Her kullanıcı için ayrı bir dizin (/home/kullaniciadi) bulunur./var: Değişken verileri (variable data) içerir. Log dosyaları (/var/log), geçici internet dosyaları (/var/cache), e-posta kuyrukları (/var/mail) ve web sunucusu dosyaları (/var/www) gibi sürekli değişen veya büyüyen veriler burada saklanır. Bu dizin, sistem performansı ve disk alanı yönetimi açısından sıkça izlenmesi gereken bir yerdir./tmp: Geçici dosyalar için kullanılır. Sistem yeniden başlatıldığında içeriği genellikle silinir./usr: Kullanıcı programları ve verileri için kullanılır./usr/bin,/usr/sbin,/usr/libgibi alt dizinleri vardır ve sistemin büyük bir kısmını oluşturan uygulamaları ve kütüphaneleri barındırır. Geleneksel olarak "Unix System Resources" anlamına gelir ve salt okunur olarak kabul edilir./opt: Ek yazılımlar (optional software) için kullanılır. Üçüncü taraf yazılımların genellikle buraya kurulması beklenir.
Bu yapıyı anlamak, sadece dosyaları bulmanıza yardımcı olmakla kalmaz, aynı zamanda sistemin nasıl organize edildiğini ve farklı bileşenlerin birbiriyle nasıl etkileşim kurduğunu anlamanızı sağlar. Bir sorunla karşılaştığınızda, hangi dizine bakmanız gerektiğini bilmek, teşhis sürecini önemli ölçüde hızlandırır. Bu hiyerarşi, Linux'un sağlamlığının ve yönetilebilirliğinin temelini oluşturur.
Sembolik Bağlantılar (Symbolic Links) ve Sabit Bağlantılar (Hard Links): Dosya Yönetiminde Esneklik
Linux dosya sistemini daha derinlemesine incelerken karşılaştığım ve başlangıçta kafa karıştırıcı bulduğum kavramlardan ikisi, sembolik bağlantılar (symbolic links veya symlinks) ve sabit bağlantılar (hard links) oldu. Bunlar, dosyaları farklı konumlardan erişilebilir kılmanın yollarıdır ve dosya yönetiminde büyük bir esneklik sağlarlar. Ancak çalışma prensipleri ve kullanım senaryoları birbirinden oldukça farklıdır.
Sembolik Bağlantılar (Symlinks): Bir sembolik bağlantı, Windows'taki kısayollara benzer. Aslında, orijinal dosyanın veya dizinin yolunu içeren küçük bir dosyadır. Orijinal dosya silinirse, sembolik bağlantı çalışmaz hale gelir ("kırık" bir bağlantı olur). Sembolik bağlantılar farklı dosya sistemleri arasında da oluşturulabilir. Bir sembolik bağlantı oluşturmak için ln -s komutu kullanılır:
ln -s /path/to/original_file /path/to/symlink
Örneğin, /home/kullanici/belgeler/rapor.pdf dosyanıza masaüstünüzden kolayca erişmek isterseniz:
ln -s /home/kullanici/belgeler/rapor.pdf ~/Masaüstü/rapor_kisayol.pdf
Bu, özellikle sık kullanılan dosyalara veya dizinlere farklı konumlardan erişim sağlamak için çok kullanışlıdır. Uygulama yapılandırmalarında veya web sunucusu ayarlamalarında da sıkça karşımıza çıkar.
Sabit Bağlantılar (Hard Links): Sabit bağlantılar ise biraz daha karmaşıktır ve dosya sisteminin çalışma prensiplerini daha iyi anlamayı gerektirir. Bir sabit bağlantı, orijinal dosyanın kendisiyle aynı inode (indeks düğümü) numarasına sahip başka bir dosya girişidir. Yani, aynı veriye işaret eden birden fazla isim gibidir. Orijinal dosya silinse bile, sabit bağlantı var olduğu sürece dosyanın içeriği diskte kalmaya devam eder. Sadece tüm sabit bağlantılar silindiğinde dosyanın diskteki alanı serbest bırakılır. Sabit bağlantılar sadece aynı dosya sistemi içinde oluşturulabilir ve dizinler için kullanılamazlar. Bir sabit bağlantı oluşturmak için ln komutu kullanılır (-s seçeneği olmadan):
ln /path/to/original_file /path/to/hardlink
Sabit bağlantılar, özellikle yedekleme ve dosya tutarlılığı gerektiren durumlarda faydalıdır. Bir dosyaya birden fazla isim vermek veya bir dosyanın içeriğinin silinmesini engellemek için kullanılabilirler. Ancak dikkatli kullanılmalıdır, çünkü dosyanın diskteki fiziksel konumunu paylaşırlar. Bu iki bağlantı türü arasındaki farkı anlamak, Linux'ta dosya yönetimi becerilerinizi önemli ölçüde artırır ve daha esnek ve güvenli çözümler geliştirmenize olanak tanır.
Kullanıcı ve İzin Yönetimi: Güvenliğin Temel Taşı
Kim Kimdir? Kullanıcılar, Gruplar ve UID/GID Kavramları
Linux'un çok kullanıcılı bir işletim sistemi olmasının temelinde, sağlam bir kullanıcı ve izin yönetimi sistemi yatar. Her dosya ve dizinin bir sahibi ve bir grubu vardır, bu da sistem güvenliğinin temelini oluşturur. İlk başlarda sadece "root" ve "normal kullanıcı" ayrımını bilirdim, ancak her kullanıcının ve grubun sistemde benzersiz bir kimliği olduğunu öğrendiğimde işler daha anlamlı hale geldi. Her kullanıcının bir Kullanıcı Kimliği (UID - User ID) ve her grubun bir Grup Kimliği (GID - Group ID) bulunur. Bu kimlikler, sistem tarafından kullanıcıları ve grupları tanımak için kullanılır. İnsanlar için okunabilir isimler (kullanıcı adları gibi) sadece birer etikettir, sistem arka planda bu sayısal kimliklerle çalışır.
Kullanıcı bilgileri genellikle /etc/passwd dosyasında saklanır. Bu dosya, her satırda bir kullanıcı için kullanıcı adı, UID, GID, ana dizin ve varsayılan kabuk gibi bilgileri içerir. Şifreler ise genellikle /etc/shadow dosyasında şifrelenmiş olarak tutulur ve bu dosya sadece root kullanıcısı tarafından okunabilir, bu da güvenlik için kritik bir adımdır.
cat /etc/passwd | head -n 5
Yukarıdaki komut, /etc/passwd dosyasının ilk 5 satırını gösterir. Her satırda bir kullanıcının temel bilgilerini görürsünüz. Gruplar ise /etc/group dosyasında tanımlanır. Bu dosya, her grubun GID'sini ve o gruba ait kullanıcıları listeler. Bir kullanıcının birden fazla gruba ait olması mümkündür. Bir kullanıcının hangi gruplara ait olduğunu görmek için id komutunu kullanabiliriz:
id kullaniciadi
Kullanıcılar ve gruplar arasındaki ilişkiyi anlamak, dosya izinlerini ve sistemdeki yetkilendirme mekanizmalarını kavramanın ilk adımıdır. Doğru kullanıcı ve grup atamaları, sistemin güvenliğini sağlamanın ve yetkisiz erişimi engellemenin anahtarıdır. Bu yapıyı iyi anlamak, sadece günlük görevlerinizi kolaylaştırmakla kalmaz, aynı zamanda sisteminizi daha güvenli ve yönetilebilir hale getirir.
Dosya İzinleri (Permissions): rwx ve chmod ile Kontrol
Linux'ta her dosya ve dizinin, kimlerin ne tür işlemler yapabileceğini belirleyen izinleri vardır. Bu izinler, dosya sisteminin en temel güvenlik katmanını oluşturur ve her Linux kullanıcısının derinlemesine anlaması gereken bir konudur. İzinler üç kategoriye ayrılır: sahip kullanıcı (owner), sahip grup (group) ve diğerleri (others). Her kategori için üç temel izin tipi bulunur: okuma (read - r), yazma (write - w) ve çalıştırma (execute - x).
ls -l komutuyla bir dosyanın izinlerini görebiliriz. Çıktının ilk karakterleri (örneğin, -rwxr-xr--) bize izinler hakkında bilgi verir. İlk karakter dosya tipini (- dosya, d dizin), sonraki üçlüler ise sırasıyla sahip kullanıcı, sahip grup ve diğerleri için izinleri gösterir. Örneğin, -rwxr-xr-- şu anlama gelir:
rwx: Sahip kullanıcı okuyabilir, yazabilir ve çalıştırabilir.r-x: Sahip grup okuyabilir ve çalıştırabilir (yazamaz).r--: Diğerleri sadece okuyabilir (yazamaz ve çalıştıramaz).
Bu izinleri değiştirmek için chmod komutu kullanılır. chmod komutu hem sembolik (u+rwx gibi) hem de oktal (sayısal) modda (754 gibi) kullanılabilir. Oktal modda, r için 4, w için 2 ve x için 1 değeri atanır. Bu değerlerin toplamı, her kategori için izin kodunu oluşturur:
7 (rwx): Okuma, yazma, çalıştırma (4+2+1)6 (rw-): Okuma, yazma (4+2+0)5 (r-x): Okuma, çalıştırma (4+0+1)4 (r--): Sadece okuma (4+0+0)
Örneğin, bir dosyaya sahip kullanıcıya tam yetki (7), gruba okuma ve çalıştırma (5), diğerlerine sadece okuma (4) izni vermek için:
chmod 754 dosya.sh
Dosyanın sahibini değiştirmek için chown (change owner) ve grubunu değiştirmek için chgrp (change group) komutları kullanılır. Örneğin, dosya.txt dosyasının sahibini ali, grubunu devs yapmak için:
sudo chown ali:devs dosya.txt
Bu komutları ve izin sistemini anlamak, sistem güvenliğini sağlamak, yetkisiz erişimi engellemek ve uygulamaların doğru bir şekilde çalışmasını sağlamak için hayati öneme sahiptir. Yanlış izinler, güvenlik açıklarına veya uygulama hatalarına yol açabilir, bu yüzden bu konuda dikkatli olmak gerekir. Ayrıca, yeni oluşturulan dosyaların ve dizinlerin varsayılan izinlerini belirleyen umask kavramı da önemlidir; bu, dosya oluşturulurken hangi izinlerin otomatik olarak kaldırılacağını tanımlar.
Sudo ve Yetki Yükseltme: Güvenli Yönetimin Anahtarı
Linux sistemlerinde güvenlik, yetki ayrımı prensibi üzerine kuruludur. Normal kullanıcılar, sistem genelinde değişiklik yapma yetkisine sahip değildir. Ancak sistem yönetimi görevleri (paket kurulumu, servis başlatma/durdurma, kritik yapılandırma dosyalarını düzenleme gibi) için bu yetkilere ihtiyaç duyarız. İşte bu noktada sudo (superuser do) komutu devreye girer. sudo, yetkili kullanıcıların (genellikle sistem yöneticileri) belirli komutları, başka bir kullanıcının (varsayılan olarak root kullanıcısının) yetkileriyle çalıştırmasına olanak tanır.
İlk başlarda, her şeyi root olarak yapmanın daha kolay olduğunu düşünürdüm. Ancak bu, büyük bir güvenlik riski taşır. Root kullanıcısı, sistemdeki her şeyi yapabilir ve yanlış bir komutla sistemi tamamen bozabilir. sudo, bu riski minimize eder çünkü:
- Kullanıcılar, kendi şifrelerini kullanarak geçici olarak yetki yükseltir, root şifresini bilmelerine gerek kalmaz.
- Hangi kullanıcıların hangi komutları
sudoile çalıştırabileceği,/etc/sudoersdosyasında detaylı bir şekilde yapılandırılabilir. Bu, belirli kullanıcılara sadece belirli görevler için yetki verme esnekliği sağlar. - Her
sudokomutu genellikle sistemin log dosyalarına kaydedilir, bu da denetlenebilirlik (auditing) açısından önemlidir.
Örneğin, bir paketi kurmak için apt install komutunu kullanırken root yetkisine ihtiyacınız varsa:
sudo apt update
sudo apt install uygulama_adi
sudo komutunu kullandığınızda, sistem sizden kendi kullanıcı şifrenizi isteyecektir. Şifrenizi doğru girdiğinizde, komut root yetkileriyle çalıştırılır. /etc/sudoers dosyasını doğrudan düzenlemek yerine, visudo komutunu kullanmak daha güvenlidir. visudo, dosyayı düzenlerken sözdizimi hatalarını kontrol eder ve hatalı bir yapılandırmanın sistemi kilitlenmesini engeller. Bu dosya, genellikle bir kullanıcının tüm komutları root olarak çalıştırmasına izin veren aşağıdaki gibi bir satır içerir:
kullaniciadi ALL=(ALL:ALL) ALL
Bu satır, kullaniciadi kullanıcısının herhangi bir terminalden, herhangi bir kullanıcı olarak, herhangi bir grubu kullanarak herhangi bir komutu çalıştırmasına izin verir. Ancak daha kısıtlı yetkilendirmeler de mümkündür. sudo'yu doğru bir şekilde kullanmak, Linux sistemlerinde güvenliği ve yönetilebilirliği artırmanın temelidir. Her zaman en az yetki prensibini (principle of least privilege) benimseyerek, sadece gerçekten ihtiyaç duyduğunuz yetkileri kullanmaya özen gösterin.
Süreç Yönetimi ve Sistem İzleme: Ne Olup Bittiğini Anlamak
Arka Planda Ne Çalışıyor? ps, top, htop ile Süreçleri Gözlemlemek
Linux, aynı anda birden fazla programın (süreçlerin) çalıştığı çok görevli bir işletim sistemidir. Bu süreçleri anlamak ve yönetmek, sistemin sağlığını izlemek ve sorunları gidermek için hayati öneme sahiptir. İlk zamanlar, bilgisayarın sadece benim çalıştırdığım uygulamalardan ibaret olduğunu sanırdım. Ancak ps ve top gibi komutlarla sistemin arka planında çalışan yüzlerce sürecin olduğunu gördüğümde, gerçek bir şaşkınlık yaşadım. Her süreç, benzersiz bir Süreç Kimliği (PID - Process ID) ile tanımlanır ve sistemde belirli kaynakları (CPU, bellek, disk I/O) kullanır.
ps komutu, mevcut süreçlerin anlık bir görüntüsünü sağlar. En yaygın kullanımı, tüm süreçleri detaylı bir şekilde listelemek için ps aux komutudur:
ps aux | head -n 5
Bu komutun çıktısı, kullanıcı, PID, CPU kullanımı, bellek kullanımı, süreç durumu (örneğin, S uyku, R çalışıyor, Z zombi), başlangıç zamanı ve komut adı gibi birçok bilgiyi içerir. Özellikle süreç durumu, bir uygulamanın neden yanıt vermediğini anlamak için önemlidir. Ancak ps anlık bir görüntü sağlarken, top komutu süreçleri gerçek zamanlı ve etkileşimli bir şekilde izlemenizi sağlar:
top
top, CPU ve bellek kullanımına göre sıralanmış süreçleri sürekli günceller. Bu sayede hangi sürecin en çok kaynak tükettiğini kolayca görebilirsiniz. top içinde klavye kısayolları (örneğin, M ile belleğe göre sıralama, P ile CPU'ya göre sıralama, k ile süreç sonlandırma) kullanarak etkileşimli bir şekilde süreçleri yönetebilirsiniz.
htop ise top'un daha gelişmiş ve kullanıcı dostu bir alternatifidir. Renkli arayüzü, fare desteği ve daha kolay filtreleme/sıralama seçenekleri sunar. Genellikle sistemlere varsayılan olarak yüklü gelmez, ancak çoğu dağıtımda kolayca kurulabilir:
sudo apt install htop
htop'u çalıştırdığınızda, CPU çekirdeklerinin kullanımını, bellek ve swap kullanımını grafiksel olarak görürsünüz. Süreçleri PID, kullanıcı, CPU veya bellek kullanımına göre sıralayabilir, arama yapabilir ve hatta bir süreç ağacını görüntüleyebilirsiniz. Bu araçlar, sisteminizde neyin çalışıp neyin çalışmadığını, hangi uygulamanın kaynakları sömürdüğünü veya neden bir uygulamanın yavaşladığını anlamak için vazgeçilmezdir. Süreç yönetimi, sistem performansını optimize etme ve sorunları hızlı bir şekilde teşhis etme yeteneğinizin temelini oluşturur.
Süreçleri Yönetmek: kill, nohup ve Arka Plan İşlemleri
Süreçleri gözlemlemek kadar, onları yönetmek de Linux sistem yönetiminin önemli bir parçasıdır. Bazen bir uygulama donar, kaynakları tüketir veya arka planda çalışmasını istediğimiz bir işlem olur. İşte bu senaryolarda kill, nohup ve arka plan işlemleri devreye girer. Bir süreci sonlandırmak (kill etmek) için kill komutu kullanılır. Bu komut, bir sürece belirli bir sinyal göndererek onun davranışını kontrol etmeye yarar. En yaygın kullanılan sinyaller şunlardır:
SIGTERM (15): Sürece nazikçe sonlanmasını söyler. Uygulama kendini temizleyip kapanabilir. Bu varsayılan sinyaldir.SIGKILL (9): Süreci anında ve zorla sonlandırır. Uygulamanın kendini temizlemesine izin vermez, bu yüzden dikkatli kullanılmalıdır.SIGHUP (1): Genellikle bir sürece yapılandırma dosyalarını yeniden yüklemesini söylemek için kullanılır.
Bir süreci PID'sine göre sonlandırmak için:
kill PID_numarasi
Zorla sonlandırmak için:
kill -9 PID_numarasi
Bazen bir komutu veya betiği terminali kapatmadan veya oturumu sonlandırmadan arka planda çalıştırmak isteriz. Bunun için komutun sonuna & (ampersand) işareti eklenir:
uzun_suren_komut &
Bu, komutu arka planda çalıştırır ve terminali tekrar kullanıma açar. Ancak terminal oturumu kapatıldığında, bu arka plan süreci de varsayılan olarak sonlanır. İşte burada nohup (no hang up) komutu devreye girer. nohup, komutun terminal oturumu kapatılsa bile çalışmaya devam etmesini sağlar:
nohup uzun_suren_komut &
nohup ile çalıştırılan komutlar genellikle çıktısını nohup.out adlı bir dosyaya yazar. Bu, uzun süreli sunucu işlemleri, veri işleme betikleri veya arka planda sürekli çalışması gereken uygulamalar için vazgeçilmez bir yöntemdir. Ayrıca, jobs komutu ile mevcut terminal oturumunuzda arka planda çalışan işleri görebilir, fg (foreground) ile bir işi ön plana alabilir ve bg (background) ile duraklatılmış bir işi arka plana gönderebilirsiniz. Süreç yönetimi becerileri, sistem yöneticileri, geliştiriciler ve hatta günlük kullanıcılar için sistem üzerinde tam kontrol sağlamak, verimliliği artırmak ve olası sorunları çözmek adına kritik öneme sahiptir. Bu komutları doğru ve bilinçli bir şekilde kullanmak, Linux deneyiminizi bir üst seviyeye taşıyacaktır.
Vaka Analizi: Bir Log Dosyasını Anlamak ve Temizlemek
Gerçek dünya senaryolarında, Linux komutlarının gücü, onları bir araya getirerek karmaşık problemleri çözebilme yeteneğinde yatar. Diyelim ki, bir web sunucusunda (örneğin Apache) disk alanının beklenmedik bir şekilde dolduğunu fark ettiniz ve /var/log/apache2/access.log dosyasının çok büyük boyutlara ulaştığını gördünüz. Bu log dosyasını hem analiz etmek hem de disk alanını boşaltmak istiyorsunuz. İşte bu senaryoda, öğrendiğimiz komutları nasıl birleştirebileceğimize dair bir örnek:
Adım 1: Log Dosyasının Boyutunu Kontrol Etmek
Öncelikle dosyanın boyutunu kontrol ederek problemin büyüklüğünü anlamakla başlarız:
du -sh /var/log/apache2/access.log
du -sh komutu, dosyanın insan tarafından okunabilir (human-readable) boyutunu özet olarak gösterir.
Adım 2: En Çok Erişim Yapan IP Adreslerini Bulmak
Log dosyasının neden bu kadar büyüdüğünü anlamak için, en çok hangi IP adreslerinden erişim geldiğini bulmak isteyebiliriz. Bunun için awk, sort ve uniq komutlarını bir araya getirebiliriz:
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -n 10
Bu komut zinciri:
awk '{print $1}': Log dosyasındaki her satırın ilk alanını (genellikle IP adresi) yazdırır.sort: IP adreslerini alfabetik sıraya göre sıralar.uniq -c: Ardışık tekrarlayan satırları sayar ve her IP adresinin kaç kez geçtiğini gösterir.sort -nr: Sayıları ters alfabetik (en yüksekten en düşüğe) ve sayısal olarak sıralar.head -n 10: İlk 10 sonucu gösterir.
Bu analiz, potansiyel bir DDoS saldırısını veya bir botun sunucuyu aşırı yüklediğini ortaya çıkarabilir.
Adım 3: Belirli Bir Tarihten Önceki Logları Arşivlemek ve Temizlemek
Log dosyasını tamamen silmek yerine, eski kayıtları arşivleyip mevcut dosyayı temizlemek daha iyi bir yaklaşımdır. Diyelim ki, 1 ay öncesine ait tüm kayıtları sıkıştırıp ayrı bir dosyaya taşımak istiyorsunuz. Bu biraz daha karmaşık bir betik gerektirse de, temel adımlar şunlardır:
- Mevcut log dosyasını yedeklemek/arşivlemek:
- Apache servisinin yeni bir log dosyası oluşturmasını sağlamak (servisi yeniden başlatarak veya logrotate kullanarak):
- Eski log dosyasını sıkıştırmak:
- Belirli bir tarihten önceki logları filtreleyerek ayrı bir dosyaya yazmak (daha ileri düzey,
sedveyaawkile tarih karşılaştırması gerektirir).
sudo mv /var/log/apache2/access.log /var/log/apache2/access.log.eski
sudo systemctl reload apache2
sudo gzip /var/log/apache2/access.log.eski
Bu vaka analizi, tek tek öğrendiğimiz komutların (du, awk, sort, uniq, head, mv, systemctl, gzip) bir araya gelerek nasıl güçlü ve pratik çözümler üretebildiğini göstermektedir. Linux'u gerçekten öğrenmek, bu araç setini kendi sorunlarınızı çözmek için yaratıcı bir şekilde kullanabilme yeteneğini geliştirmek demektir.
Sonuç: Öğrenme Yolculuğu Asla Bitmez
Linux'u bildiğimi sandığım günlerden, onu gerçekten anlamaya başladığım bu ilk haftaya kadar, öğrendiğim en değerli ders, Linux'un sadece bir işletim sistemi olmaktan çok daha fazlası olduğuydu. Bu, bir felsefe, bir araç seti ve sürekli keşfedilmeyi bekleyen bir dünya. Kabuktan dosya sistemine, kullanıcı izinlerinden süreç yönetimine kadar her kavram, sistemle etkileşim kurma biçimimizi zenginleştiriyor ve bize daha fazla kontrol sağlıyor. Bu ilk hafta, temel komutların sadece birer araç değil, aynı zamanda sistemin nasıl çalıştığına dair ipuçları sunduğunu gösterdi. Dosya sistemi hiyerarşisinin mantığını kavramak, dosyaları nerede arayacağımızı ve sistemin neden belirli bir şekilde yapılandırıldığını anlamamızı sağladı. Kullanıcı ve izin yönetimi, güvenliğin temel taşı olduğunu ve her kullanıcının ve dosyanın belirli bir yetkiyle sınırlı olmasının önemini vurguladı. Son olarak, süreç yönetimi, sistemimizin arka planında neler olup bittiğini görmemizi ve gerektiğinde müdahale etmemizi sağladı.
Bu yolculuk, sadece teknik bilgileri öğrenmekle kalmıyor, aynı zamanda problem çözme becerilerinizi geliştiriyor ve size sistem üzerinde derinlemesine bir hakimiyet sağlıyor. Linux'un açık kaynak yapısı, sürekli öğrenme ve toplulukla etkileşim kurma fırsatları sunar. Unutmayın, Linux'u öğrenmek bir maraton, sprint değil. Her yeni komut, her yeni kavram, sizi daha yetkin bir kullanıcı veya sistem yöneticisi yapacak birer adımdır. Bu ilk hafta sadece bir başlangıç. Önümüzdeki haftalarda daha ileri düzey konulara dalacak, kabuk betiklerinin gücünü keşfedecek ve Linux'un sunduğu sınırsız olanakları daha yakından tanıyacağız. Merakınızı canlı tutun, denemekten çekinmeyin ve her zaman man sayfalarını kontrol etmeyi unutmayın. Linux'un gerçek gücü, onu ne kadar derinlemesine anladığınızla doğru orantılıdır. Başarılar dilerim!
Sıkça Sorulan Sorular (SSS)
-
S: Linux'u öğrenmeye yeni başlayanlar için hangi dağıtımı önerirsiniz?
C: Linux'a yeni başlayanlar için Ubuntu veya Linux Mint gibi kullanıcı dostu dağıtımlar önerilir. Bu dağıtımlar, geniş topluluk desteği, kolay kurulum ve zengin yazılım depoları sunar.
-
S: Kabuk betiği (shell script) nedir ve neden önemlidir?
C: Kabuk betiği, kabuk tarafından çalıştırılabilen komutların bir araya getirildiği bir metin dosyasıdır. Tekrarlayan görevleri otomatikleştirmek, karmaşık iş akışlarını basitleştirmek ve sistem yönetimini kolaylaştırmak için hayati öneme sahiptir.
-
S:
sudokullanmadan root yetkilerine nasıl erişebilirim?C:
sudokullanmadan root yetkilerine erişmek içinsu -komutunu kullanabilirsiniz. Bu komut, sizi doğrudan root kullanıcısının kabuğuna geçirir ve root şifresini girmenizi ister. Ancak, güvenlik nedenleriyle genelliklesudokullanmak daha güvenli ve denetlenebilirdir. -
S: Linux'ta dosya izinlerini değiştirirken nelere dikkat etmeliyim?
C: Dosya izinlerini değiştirirken (
chmod), özellikle sistem dosyaları ve dizinleri için çok dikkatli olmalısınız. Yanlış izinler, güvenlik açıklarına yol açabilir veya sisteminizin çalışmasını engelleyebilir. Her zaman en az yetki prensibini uygulayın ve emin olmadığınız durumlarda değişiklik yapmaktan kaçının veya bir uzmana danışın. -
S:
/optve/usr/localdizinleri arasındaki fark nedir?C: Her ikisi de ek yazılımlar için kullanılır.
/optgenellikle büyük, bağımsız yazılım paketleri (örneğin, Google Chrome, VS Code) için kullanılırken,/usr/local, sistem tarafından sağlanan yazılımlarla çakışmayacak şekilde elle derlenmiş veya yüklenmiş yazılımlar için tercih edilir.
Etiketler
#Linux #KomutSatırı #SistemYönetimi #Kabuk #DosyaSistemi #Güvenlik #Teknoloji
