GNU/LINUX 101
Ders Notları
Bölüm 1. Linux ve bu egitim hakkında
Neden Linux ?
Bu egitime geldiginize göre hepinizin kafasında üç asagı bes yukarı bir Linux nosyonu vardır. Hatta muhtemelen bazılarınız Linux kurmustur bile. Fakat kurmus olanlarınızın bile kafasında 'Neden Linux ?' sorusu vardır.
Gerçekten 'Neden Linux ?' Bu soruya cevap vermeden önce bir miktar Linux'u yüzeysel bile olsa tanımak gerekmektedir.
Linux 1992 yılında Linus Tornvalds tarafından baslatılan bir projedir. Temel olarak 1970'lerden beri süregelen Unix isletim sisteminin evlerde yaygın olan i386 (PC) tabanlı makinalarda çalısmasını hedeflemistir. Bu baslangıcın devamında proje birçok kisi tarafından desteklenmis ve su anda binlerce yazılımcının bir sekilde ilgilendigi dev bir proje halini almıstır.
Linux diye bildigimiz dagıtımların hepsi, Linux kerneli (çekirdegi) ve onun etrafındaki GNU yazılımlardan olusan bir Unix sistemidir aslında. O zaman asıl sorumuz neden Unix olacaktır ?
Unix temelde Windows ve Dos kullananlarımızın komut satırı diye bildigi ortamdan ve X-Windows sisteminden olusur. Bu ikisinin de geçmisi hem Dos'dan hem de Windows'dan çok daha eskilere dayanır.
Unix'in 1970'lerden beri temel aldıgı en önemli özellik çok görevli (multi-task) ve çok kullanıcılı (multi user) olmasıdır. Bütünlesik bir isletim sistemi olan Unix, bu iki özelligini hem komut satırı ortamında hem de gui ortamı olan X-Windows'da korur. Dahası X-Windows'da yapabileceginiz hemen herseyi komut satırından (konsoldan) gerçeklestirebilirsiniz.
Az önce bahsettigimiz gibi Unix'in temel özelligi çok görevli ve çok kullanıcılı olmasıdır. Bu sebeple Unix'de çok ciddi bir kullanıcı kısıtlaması vardır. Kullanıcılar, ancak izinleri olan harddisk alanında, izinleri olan komutları, kullanmalarına izin verilen hafıza miktarında ve hatta CPU gücü ile yaparlar. Bir kullanıcının bir programının çakılması bir baska kullanıcıyı ve makinanın genel isletimini engellemez.
Otuz yıldır gelistirilen bu özellikler Unix'i diger isletim sistemlerinden ayırmakta ve dünyanın en çok tercih edilen sunucu platformu yapmaktadır.
İste bu noktada Unix'le tanısıklıgı biraz daha ilerlemis bazıları 'iyi de kullanması kesinlikle daha zor, bir çok isi konsoldan yapıyorsunuz, Windows gibi guiden herseyi halletmek varken, 2003 senesinde ben niye konsolu kullanayım' diyebilir.
Burda bir seye açıklık getirmek lazım. Konsol, dinazorluktan, ya da eski kafalılıktan hala kullanılan bir sey degildir. Konsol kullanılmaktadır, zira bir sistem yöneticisinin islemleri en hızlı ve en kolay yoldan yapmasının yolu konsoldur. Konsoldan bir iki satır ile hallettiginiz bir emri guiden yapmak genelde çok daha uzun zamanınızı alır. Belki daha da önemlisi, konsol 'ne yapması gerektigini bilenler ' içindir, suraya buraya klikleyeyim de nasıl olsa hallederim bu isi diyerek sistemi kurcalayanlar için degil.
Bir baska önemli nokta da Unix'in gücünü biraraya gelmis binlerce küçük programdan alıyor olmasıdır. Bu kurs süresince size bu programları ihtiyacımız dogrultusunda nasıl birbiri ile ilintileyecegimizi, nasıl istedigimizi gibi sonuçlar alacagımızı gösterecegiz.
Kısa bir örnek ls komutu olabilir. Dos ortamındaki dir komutunun karsılıgı olan ls komutu size basitçe bir dizinin içerigini gösterir. Diyelim ki bu dizin uzun ve içerigini sayfa sayfa görmek istiyoruz. Bu noktada herhangibir text dosyasını bize sayfa sayfa gösteren more komutu ile ls komutunu birlestiririz. En basitinden ls -al|more dediginizde ls komutunun çıktısı takip edebileceginiz gibi sayfa sayfa karsınıza gelir. Mesela ls komutu bir dizindeki dosyaları gösterirken, ls|wc -l komutu ls komutunun çıktısını wc (wordcount) komutuna gönderek o dizinde kaç dosya oldugunu gösterir. Görüyorsunuz iki alakasız komutla ls komutuna yeni fonksionlar kazandırdık. Dahası bir dizinde kaç dosya oldugunu bilgisayara saydırdık. Kolaylıkla bir baska komutu da bu sisteme ekleyip, her dosyayı bizim için teker teker printera yollamasını saglayabilirdik. Veya baska bir sey. Birkaç kelimelik bu tür komutlarla yapabileceginiz seylerin ne kadar derine gidebildigini görseniz sasarsınız. Dahası bir shell ortamı gibi yapıstırıcı bir sahte-programlama dili ile birlestirildiginde bu komutlar gerçekten uygulama düzeyinde islerin altından kalkabilirler.
Linux kullanmayı ögrenmenizin sebeplerinden biri iste bu. Gerektigi gibi bilgisayarınızı kontrol edebilmeniz, ona istediginiz islemleri yaptırabilmeniz. Kendinizi ona degil onu kendinize uydurabilmeniz.
Bu egitim neleri içeriyor?
"Linux Temellerine" hosgeldiniz. Bu kurda sizlere bash (Linux'daki standart kabuk (shell))'i tanıstıracak, ls, cp, mv gibi standart Linux komutlarının tüm potansiyelini nasıl kullanabileceginizi gösterecek, Linux'un izin ve sahiplik modellerini ve daha birçok kavramı anlatacagız.
Bu kurun sonunda, Linux temelleri konusunda saglam bir zemin elde etmis olacak, ve hatta bazı temel Linux sistem yönetim görevlerini ögrenmeye hazır halde olacaksınız. Bütün bu serinin sonunda ise (toplam 4 kur) bir Linux Sistem Yöneticisi olmak için gerek duyabileceginiz bütün bilgilere sahip olacaksınız.
bash'e giris
Kabuk
Eger daha önce bir Linux sistemi kullandıysanız sisteme girdiginizde asagıdakine benzer bir komut satırı ile karsılasacagınızı bilirsiniz:
$
Bu komut satırı çok farklı görünebilir. Sisteminizin hostname bilgisini, içinde bulundugunuz dizini veya her iki bilgiyi birden yansıtıyor olabilir. Ancak nasıl görünürse görünsün kesin olan bir sey vardır: Bunu görüntüleyen programa "kabuk" (shell) denir ve çok büyük ihtimalle sisteminizde sizi karsılayan bash kabugudur.
bash mi kullanıyorsunuz?
bash kullanıp kullanmadıgınızı su sekilde kontrol edebilirsiniz:
$ echo $SHELL
/bin/bash
Eger üstteki ifade bir hata verirse veya yukarıdaki örnege benzemeyen bir sonuç verdiyse, bash'ten farklı bir kabuk kullanıyor olabilirsiniz. Bu durumda bile bu egitimin büyük bir bölümü hala geçerli olacaktır, fakat bash'a geçis yapmanız bu egitim sürecinde sizin için önemli bir avantaj olacaktır. (chsh komutunu kullanarak kabugu degistirmek için gerekli bilgiyi bu egitim serisinin 2. Bölümüne bakın.)
bash hakkında
"Bourne-again shell" ifadesi için bir tür kısaltma olan Bash, pek çok Linux sistemde öntanımlı kabuk olarak karsınıza çıkar. Kabugun görevi verdiginiz komutlara uyarak Linux sisteminizle etkilesime geçmenizi saglamaktır. Komut vermeyi bitirince kabuga exit ya da logout komutu ile kendini sonlandırmasını söyleyebilirsiniz, hemen ardından karsınıza login ekranı gelir. Bu arada, kabuk ile çalısırken control-D tus kombinasyonuna basarak da bash kabugunu sonlandırabilirsiniz.
"cd" kullanımı
Sizin de farkına varmıs olabileceginiz gibi bash komut satırı dünyanın en heyecan verici seyi sayılmaz. İsterseniz simdi de biraz dosya sistemi içinde gezinmek için bash kullanalım. Komut satırında iken asagıdaki komutu verin ($ karakterini yazmadan):
$ cd /
Bu komut ile bash kabuguna / içinde çalısmak istedigimizi söylemis olduk. Bu aynı zamanda kök (root) dizin olarak da bilinir; dosya sistemindeki tüm dizinler bir agacı olustururlar ve / de bu agacın en tepesinde ya da bu agacın kökü kabul edilir.
cd komutu o anda çalısmakta oldugunuz dizini belirler. cd komutunun bir adıda "halihazırda çalısılan dizin (current working directory)" dir.
Yollar
bash kabugunun halihazırda çalıstıgı dizini görmek için yazılabilecek komut:
$ pwd
/
Yukarıdaki örnekte, cd komutuna cevap olarak gelen / elemanına yol (path) denir ve cd komutuna gitmek istedigimiz yeri söyler. Burada, / elemanı mutlak yol (absolute path) olarak kullanılmıs. Gidilecek olan dizinin, dosya sistemi agacında, kökten itibaren ifade edilisine mutlak yol denir.
Mutlak Yollar
Birkaç mutlak yol örnegi:
/dev
/usr
/usr/bin
/usr/local/bin
Gördügünüz gibi bütün mutlak yol ifadelerinin ortak noktası / ile baslamaları. Örnegin /usr/local/bin yolunu yazarak, cd komutuna önce / dizinine gitmesini, oradan usr dizinine, daha sonra da usr dizininin altında local ve onunda altında bin dizinine gitmesi söyleniyor. Mutlak yol ifadeleri, her zaman / den baslayarak kullanılır.
Göreli yollar
Diger yol türü göreli yoldur. Bash, cd ve diger komutlar bu tür yolları daima içinde bulundugunuz dizine göre yorumlar. Göreli yollar kesinlikle / ile baslamaz. Yani eger /usr dizini içinde isek:
$ cd /usr
/usr/local/bin dizinine gitmek için:
$ cd local/bin
$ pwd
/usr/local/bin
yazabiliriz.
".." kullanımı
Göreli yolların içinde bir ya da daha çok .. dizini bulunabilir. ".." dizini özel bir dizindir ve bulundugunuz dizinin üstündeki dizini gösterir. Yukarıdaki örnekten devam edecek olursak:
$ pwd
/usr/local/bin
$ cd ..
$ pwd
/usr/local
Gördügünüz gibi simdi içinde bulundugumuz dizin /usr/local dizinidir. Bu sekilde içinde bulundugumuz dizine göre "geriye" dogru gidebiliriz baska bir deyisle "yukarı" dogru çıkabiliriz.
".." kullanımı, devamı
Ek olarak, içinde bulundugumuz dizinin de yer aldıgı yani bir üst dizini temsil eden ".." dizinini de kullanabiliriz. Örnegin:
$ pwd
/usr/local
$ cd ../share
$ pwd
/usr/share
Linux Komutlarının Kullanımı
"ls" tanımı
simdi ls komutuna hızlıca gözatacagız. Muhtemelen ls komutunu önceden biliyorsunuz ve sadece onu yazmanın halihazırda bulundugunuz dizinin içerigini listeleyecegini biliyorsunuz:
$ cd /usr
$ ls
bin doc etc games include info lib local man sbin share src X11R6
-a seçenegini belirterek bir dizindeki dosyaların tümünü, gizli dosyalar -. ile baslayanlar- da dahil olmak üzere görebilirsiniz. Asagıdaki örnekte de görebileceginiz gibi, ls -a . ve .. özel dizin linklerini de gösterir:
$ ls -a
. .. bin doc etc games include info lib local man sbin share src X11R6
Uzun dizin listeleri
ls komut satırında bir ya da birden fazla dosya ya da dizin belirtebilirsiniz. Eger bir dosya belirtirseniz, ls sadece o dosyayı gösterecektir. Eger bir dizin belirtirseniz, ls bu dizinin içerigini gösterecektir. -l seçenegi, dosya haklarını, sahibi olan kisi ve grupları, degisiklige ugradıgı zamanı ve boyut bilgilerini görmek istediginizde isinize yarayacaktır.
Dizinlere bakmak
Bazen bir dizinin içine degil de kendisine bakmak istersiniz. Bu gibi durumlar için -d seçenegini kullanabilirsiniz, bu sayede ls dizinlerin içine degil kendilerine bakar.
$ ls -dl /usr /usr/bin /usr/X11R6/bin ../share
drwxr-xr-x 194 root root 24576 2003-03-23 20:30 ../share
lrwxrwxrwx 1 root root 12 2003-03-23 21:05 /usr -> /KNOPPIX/usr
drwxr-xr-x 2 root root 303104 2003-03-23 21:10 /usr/bin
drwxr-xr-x 2 root root 20480 2003-03-22 18:36 /usr/X11R6/bin
mkdir
Yeni dizinler yaratmak için kullanılan mkdir komutuna hızlı bir göz atalım. Asagıdaki örnek /tmp altında 3 yeni dizin yaratır, tic, tac ve toe.
$ cd /tmp
$ mkdir tic tac toe
Varsayılan olarak, mkdir komutu üst dizinleri sizin için yaratmaz; yaratılması istenilen dizinin tüm yolunda sondan bir önceki dizin'e kadar bütün dizinlerin var olması gereklidir. Bunun anlamı /de/ne/me dizinlerini yaratmak istiyorsanız, üç ayrı mkdir komutu çalıstırmalısınız:
$ mkdir de/ne/me
mkdir: `de/ne/me' dizini olusturulamıyor: Böyle bir dosya ya da dizin yok
$ mkdir de
$ mkdir de/ne
$ mkdir de/ne/me
touch
simdi kopyalama, yeniden adlandırma, dosya ve dizin tasımak için kullanılan cp ve mv komutlarına gözatacagız. Buna baslamadan önce /tmp de bir dosya olusturmak için touch komutunu kullanacagız:
$ cd /tmp
$ touch benikopyala
touch komutu varolan bir dosyanın "mtime" degerini günceller (ls -l çıktısındaki 6. sütunu hatırlayın). touch komutuna parametre olarak verilen dosya mevcut degilse bos bir yeni dosya yaratılacaktır. Yukarıdaki komutun sonucunda sıfır boyutlu bir /tmp/benikopyala olusturmus oluyorsunuz.
cat ve cp
Terminalde dosyanın içerigini görüntülemek için cat komutunu kullanın:
$ cat benikopyala
ilkdosya
simdi cp komutunun en basit seklini kullanarak benikopyala dosyasının benikopyaladi isimli bir kopyasını çıkarabiliriz:
$ cp benikopyala benikopyaladi
Detaylı olarak incelersek görürüz ki bu ikisi gerçekten de birbirinden ayrı dosyalardır, inode numaraları farklıdır:
$ ls -i benikopyala benikopyaladi
8919 benikopyaladi 8901 benikopyala
mv
simdi "copiedme" dosyasını "movedme" olarak isimlendirmek için mv komutunu kullanalım. Bu sefer inode numarası aynı kalmakla birlikte bu inode numarasına sahip olan dosya ismi degismis olacak.
$ mv benikopyaladi benitasidi
$ ls -i benitasidi
8919 benitasidi
Tasınan (move) bir dosyanın inode numarası, söz konusu dosya kaynak dosya ile aynı dosya sisteminde bulundugu sürece aynı kalır. Bu egitimin 3. bölümünde dosya sistemlerini daha detaylı olarak inceleyecegiz.
Dosyaları silmek
rm
Artık cp, mv ve ln komutlarının nasıl kullanıldıgını biliyoruz, simdi nesneleri dosya sistemi üzerinde kaldırmayı ögrenemenin zamanı gelmistir. Normalde bu islem rm komutuyla yapılmaktadır. Dosyayı kaldırmak için basitçe bunları komut satırında belirlemek gerekmektedir.
$ cd /tmp
$ touch dosya1 dosya2
$ ls -l dosya
$ ls -l dosya1 dosya2
-rw-r--r-- 1 knoppix knoppix 0 2003-03-25 16:53 dosya1
-rw-r--r-- 1 knoppix knoppix 0 2003-03-25 16:53 dosya2
$ rm dosya1 dosya2
$ ls -l dosya1 dosya2
ls: dosya2: Böyle bir dosya ya da dizin yok
-rw-r--r-- 1 knoppix knoppix 0 2003-03-25 16:53 dosya1
rmdir
Dizinleri kaldırmak için iki seçeneginiz var. Dizinin altındaki bütün nesneleri yokedebilir ve sonra rmdir kullanarak dizinin kendisini kaldırabilirsiniz:
$ mkdir benimdir
$ touch benimdir/dosya1
$ rm benimdir/dosya1
$ rmdir benimdir
rm ve dizinler
Veya rm komutunun özyineli seçeneklerini kullanıp rm'e belirttiginiz dizini içerdigi nesnelerle birlikte kaldırmasını söyleyebilirsiniz:
$ rm -rf benimdir
Genel olarak bir dizin agacını kaldırmak için tercih edilen rm -rf 'dir. rm -f kullanırken dikkatli olun, çünkü bunun gücü iyi veya kötü niyetli kullanılabilir. :)
Bölüm 5. joker karakterler, Giris
Joker karakterler (wildcards)
Günlük linux kullanımında çok defa bir operasyonu tek seferde birden fazla nesne için çalıstırmak isteyebileceginiz (rm gibi) durumlarla karsılasabilirsiniz. Böyle durumlarda, asagıdaki gibi bütün dosyaları komut satırına yazmak çok gereksizdir:
$ rm dosya1 dosya2 dosya3 dosya4 dosya5 dosya6 dosya7 dosya8
Bu problemi çözmek için, Linux'un kendi içinde yer alan joker karakter desteginin getirdigi avantajdan yararlanabilirsiniz. Aynı zamanda "globbing" olarak da adlandırılan (tarihsel nedenlerden dolayı) bu destek, joker karakter modelini kullanarak tek seferde birden fazla dosyayı belirlemenize olanak saglar. Bash ve diger Linux komutları joker karakter modeline bakarak ve dosya üzerinde bu modele uyan dosyaları bularak komutu yorumlar. Bu durumda diyelim ki bulundugumuz dizinde file1, file2, ... , file8 isimli dosyalar varsa bu dosyaları asagıdaki sekilde yok edebilirsiniz:
$ rm dosya[1-8]
Ya da daha basitçe ismi file ile baslayan bütün dosyaları yok etmek istediginizde asagıdaki gibi yazabilirsiniz:
$ rm dosya*
Düzenli İfadeler
Düzenli ifade nedir?
Düzenli ifadeler ("regex" veya "regexp" de denir) yazı kalıplarını ifade etmek için kullanılan özel bir biçimdir.
Linux sistemlerinde, arama ve degistirme islerinde oldugu kadar yazı kalıplarının bulunmasında da düzenli ifadeler kullanılır.
Basit bir dizi parçası
Düzenli ifadelerin en basit türüne bakalım, basit dizi parçası. Bunun için grep komutunu
kullanacagız. Bu komut bir dosyanın içerigini tarayıp belli bir düzenli ifade kalıbına uyan kısımları bulur. grep, düzenli ifade kalıbına uyan her satırı basar ve buna uymayan satırları da görmezden gelir:
$ grep bash /etc/passwd
root
knoppix
Yukarıda, grep programına ilk parametre olarak bir düzenli ifade geçildigini ve ikinci parametre olarak bir dosya ismi verildigini görebilirsiniz. Grep /etc/passwd dosyasındaki her satırı okur bash olarak verilmis basit karakter dizi parçasının o satırda mevcut olup olmadıgına, baska bir deyisle o satırın kendisine verilen düzenli ifade kalıbı ile eslesip eslesmedigine bakar. Eger bir eslesme söz konusu olursa ilgili satırı basar, olmazsa bir sonraki satıra geçer
Dosyaları bulmak
"which"
Aradıgınız programın PATH ile verilen dizinlerden birinde olup olmadıgını which komutu ile bulabilirsiniz. Örnegin, asagıdaki komut ile Linux sistemimizin sagduyuya sahip olup olmadıgını sorgulayabiliriz:
$ which sagduyu
Asagıdaki örnekte ise ls komutunun nerede bulundugunu görebiliriz:
$ which ls
/usr/bin/ls
"which -a"
Son olarak -a seçenegine dikkat etmelisiniz. Bu seçenek kullanıldıgında which komutu PATH degiskeninde tanımlı tüm dizinlerde aradıgınız programın olup olmadıgını gösterir:
$ which -a ls
/bin/ls
whereis
Eger bir programın yerini ögrenmek dısında onunla ilgil daha çok bilgiye erismek istiyorsanı< whereis komutunu denemelisiniz:
$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
Buradan görürüz ki ls programı iki dizinde bulunmaktadır, /bin and /usr/bin. Buna ek olarak /usr/share/man dizininde de ls ile ilgili bir man sayfası oldugu bilgisini ediniriz. man ls yazdıgınızda karsınıza gelen sayfa yukarıda belirtilen sayfadır. whereis aynı zamanda kaynak arama, alternatif arama yolları tanımlama ve sıradısı girdileri arama gibi özelliklere de sahiptir. Detaylı bilgi için lütfen whereis man sayfasını inceleyin.
find
find alet çantanızdaki araçlardan biridir. find komutu ile artık sadece program dosyaları ile sınırlı degilsinizdir, her türlü dosyayı çok çesitli kriterlere göre arayabilirsiniz. Örnegin /usr/share/doc dizini ve alt dizinlerinde README dosyasını bulmak için su komutu vermeniz yeterlidir:
$ find /usr/share/doc -name README
/usr/share/doc/aalib1/README
/usr/share/doc/adduser/examples/README
/usr/share/doc/afio/README
locate
simdiye dek which, whereis ve find komutlarını ele aldık. find çalısırken biraz vakit geçtigini fark etmissinizdir
çünkü üzerinde her dizine tek tek girip bakmak zorundadur. locate komutu ise bir veritabanını kullanarak isleri
biraz hızlandırabilir. Bu komut yol isminin herhangi bir kısmı ile eslesme yapabilir sadece dosya ismine bakmak zorunda degildir. Örnegin:
$ locate bin/ls
/bin/ls
/bin/lspci
/sbin/lsmod
/sbin/lspci
/sbin/lspnp
/usr/bin/lsattr
/usr/bin/lsdev
/usr/bin/lsof
/usr/bin/lspgpot
/usr/bin/lss16toppm
/usr/sbin/lsof
/usr/sbin/lsusb
updatedb kullanımı
Pekçok Linux sistemi periyodik olarak veritabanını güncelleyen bir proses çalıstırır. Eger sisteminiz yukarıdaki komuta asagıdaki gibi bir hata ile cevap verirse o zaman bir veritabanı olusturmak için uptadedb komutunu çalıstırmanız gerekir:
$ locate bin/ls
locate: /var/spool/locate/locatedb: No such file or directory
$ su
Password:
# updatedb
updatedb komutunun isini tamamlaması uzun bir süre alabilir. Eger gürültücü bir harddiskiniz varsa tüm dosya sistemi indekslenirken basınız epey agrıyabilir :)
slocate
Pek çok Linux dagıtımında locate komutu yerine artık slocate komutu kullanılmaktadır. Genellikle locate isimli
bir sembolik baglantı oldugu için hangisini kullanayım diye tereddüt etmenize gerek yoktur. slocate "secure locate" yani "güvenli locate" anlamına gelmektedir. Bu komut kullandıgı veritabanında dosya ve dizin izinlerini de depolar
ve böylece normal kullanıcılar erisim izninine sahip olmadıkları dizine bakamazlar. slocat komutunun kullanım sekli locate komutunda oldugu gibidir ancak çıktı bilgisi komutu çalıstıran kullanıcıya göre degisebilir.

