Düzey: Orta
Martin Streicher
(mstreicher@linux-mag.com),
Baş Editör, Linux Magazine
28 Kasım 2006
Dosyaları sistemler arasında nasıl taşıyacağınızı ve bu kadar yayılmış
verileri, nasıl zamanuyumlu tutacağınızı gösteren birkaç tekniğe bakalım.
Son yıllarda bilgisayar donanımı komik bir şekilde ucuzladı. Bir
gigabaytlık bir sabit disk alanının maliyeti 0,50 Dolar'a indi, 19 inçlik düz
panelli ekranların 200 Dolar'ın ve UNIX® çalıştıran bir dizüstü bilgisayar 1000
Dolar'ın altında maliyeti olabiliyor. Özel sunucu donanımları bile sıradan bir mal fiyatına indi.
Bu kadar düşük fiyatlarla, orta ya da büyük ölçekli kuruluşlar, ayrı donanım parçalarını farklı görevler için ayırabiliyorlar. Bununla birlikte, bilgi işlem kapasitesini genişletmek, bir makineyi bir ağa bağlamak, bir disk görüntüsünü yeni bir beyaz kutuya (bir soysal bilgisayar) kopyalamak ve daha sonra, yeniden başlatmak kadar kolay olabiliyor. Elbette, her şeyin bir bedeli var. Her bilgisayar, elektrik, soğuk hava, sevgi ve ilgi bekliyor.
Çok sayıda bilgisayar yönetirken karşılaşılan en yaygın sorunlardan biri, bu kadar çok sistemi güncel tutmak ve tutarlı bir şekilde yönetmektir. Bazı durumlarda, tutarsız ifadelerle kullanıcıların kafası karışmasın diye bir uygulama sürümünün her yere uygulanmasını istersiniz. Ya da, başka bir örnek verirsek, her bir sunucudaki aynı işletim sisteminin aynı amaca hizmet etmesini isteyebilirsiniz. Tahmin edebilmek iyidir.
Yalnızca bir dizüstü bilgisayarınız ve bir masaüstü bilgisayarınız olsa bile, bu iki makineyi zamanuyumlu tutabilmek göz korkutucu bir görevdir.
Bugün yolda, taşınabilir bilgisayarınızla çalışıyorsunuz. Dün de masaüstünüzü
düzeltmeye çalıştınız. İki günde de dosyaları, merkezi bir dosya sunucusundan ya da
merkezi bir dosya sunucusuna yüklemiş olabilirsiniz. Veriler gelip giderken kısa
zamanda neyin nereden olduğunu karıştırabilirsiniz.
Bu dizinin 5. bölümünde, gelin birlikte dosya patlamalarını denetim altında tutmanıza yardımcı olabilecek birkaç tekniğe bakalım.
Arşivleyip iletme
Birden çok bilgisayardaki verileri tutarlı bir şekilde saklamanın en
kolay yolu, dosyalarınızı (elektronik sayfa, veritabanı, metin dosyaları, vb.)
beraberinizde tutmanızdır. Kullandığınız tüm makinelere fiziksel erişiminiz varsa,
taşınabilir bir diski, CD-RW sürücüsünü ya da büyük bir flaş bellek kösteğini
taşıyabilir ve dosyalara gereksinim duyduğunuzda depolama aygıtını hemen takabilirsiniz.
Ancak, kullandığınız bir makine uzaktaysa ya da makineye
erişilemiyorsa, diyelim ki Boise, Idaho'daki şirketinizin makine odasındaysa,
çevrebirim aygıtlarını bağlamak bir seçenek olamaz. Bunun yerine, dosyalarınızdan bir arşiv oluşturabilir (bir kısmıyla ya da tümüyle), yerel ağınıza (LAN) ya da genel ağınıza (WAN) bağlanabilir, arşivi hedefe kopyalayabilir ve çalışmanıza devam etmek için dosyaları geri yükleyebilirsiniz. (Dahası, arşivi, bilgisayarınızı takside unutmak gibi olağanüstü bir durumda dosyalarınızı korumak için basit bir yedek olarak da kullanabilirsiniz.)
UNIX sistemlerinde, stalwart yardımcı programı tar , arşiv
oluşturma gibi basit bir işi yapar. tar yardımcı programı bir ya da
daha çok dosyayı ve dizini tek bir dosyada birleştirir, baytları, sahipleri,
izinleri, dosya tipini ve özgün dosyaların dosya sistemi hiyerarşinizdeki istasyonu
korur. tar yardımcı programı, dosyalarınızı bire bir olarak manyetik
banda kaydeder -- tar , nitekim tape archiver (manyetik bant
arşivleyicisi) teriminin kısaltmasıdır.
Örneğin, çeşitli dosyalardan oluşan Liste 1'deki
gibi bir dizininiz olsun.
Liste 1. Dosya dizini
$ cd stuff
$ ls -lR
.:
drwxr-xr-x 2 mstreicher mstreicher 4096 Oct 12 19:11 css
-rwxr-xr-x 1 mstreicher mstreicher 91 Aug 17 2005 demo.rb
-rw-r--r-- 1 mstreicher mstreicher 111563 Oct 12 19:10 tech.pdf
./css:
total 16
-rw-r--r-- 1 mstreicher mstreicher 711 Mar 25 2006 style.css
-rw-r--r-- 1 mstreicher mstreicher 11353 Apr 10 2006 valid.css
|
İki dosya ve dizinden oluşan bir arşiv oluşturmak için tar yardımcı programını çalıştırın:
$ tar --create --verbose --gzip --file archive.tgz *
css/
css/style.css
css/valid.css
demo.rb
tech.pdf
|
--create seçeneği, tar yardımcı programına bir arşiv oluşturmasını söyler; --verbose seçeneği, tar yardımcı programının işlediği dosyaların bir listesini oluşturur; --gzip seçeneği, gzip stili sıkıştırmayı etkinleştirir ve arşivi sıkıştırır; --file archive.tgz de arşivin adını belirtir.
Kabuk, yıldız işaretini (*) "tüm dosyalar" olarak yorumlar ve bu
nedenle bunu iki dosya ve dizin adı şekilinde açar. Yukarıdaki çıkıştan hemen
anlayabileceğiniz gibi tar , css dizinini arşivler ve bu dizinin
içeriğini arşivlemeyi yineler.
tar yardımcı programını çalıştırdıktan sonra geçerli dizinde archive.tgz adlı yeni bir dosya bulunur:
$ ls -l archive.tgz
-rw-r--r-- 1 mstreicher mstreicher 105470 Oct 13 17:16 archive.tgz
|
Artık, archive.tgz dosyasını başka bir bilgisayara kopyalayabilir ve önceden arşivlenen dosyayı çıkarmak için uzak bilgisayarda tar yardımcı programını çalıştırabilirsiniz. Aslında, dosyaları geri yüklemeye ilişkin komut satırı, önceki komut satırının neredeyse aynısıdır. Arşivi çıkarmak için aşağıdaki komut satırını kullanın:
$ tar --extract --verbose --gunzip --preserve-permissions --file archive.tgz
|
Bu tar komutu, archive.tgz tar dosyasının içeriğini çıkarır. --extract seçeneği, --create seçeneğinin karşıtıdır; --gunzip , --gzip seçeneğinin tersidir ve --preserve-permissions , özgün dosyaların izinlerini yeniden oluşturur.
Bu komutu çalıştırdıktan sonra, sakladığınız dosyalar zaman damgası, izinleri ve dosya adı korunarak tam olarak geri yüklenir.
Ayrıca, css adlı dizin de, içeriği situ içine çıkarılmış bir şekilde yeniden
oluşturulur.
tar yardımcı programında çok sayıda seçenek kullanılır: --create , --extract ve --list (.tar dosyasından açmadan katalog oluşturur). Diğer seçenekler (--gzip ve --preserve-permissions gibi), tar yardımcı programının arşivi oluşturma şeklini denetler. Daha fazla ayrıntı ve her bir seçeneğin uygun sözdizimi için UNIX sürümünüze ilişkin tar man sayfasına bakın.
Arşiv oluşturma, bunu hedefe kopyalama ve çıkarma yararlıdır, ancak çok
zahmetli olabilir. Ayrıca, arşiv aşırı büyükse, arşivi ve açılan dosyaları saklayamayabilirsiniz. Zamandan tasarruf sağlamak için ve kaynak ve hedef bilgisayarlar bir LAN ya da WAN aracılığıyla bağlıysa, Güvenli Kabuk, SSH ve tar yardımcı programını dosyaları tek bir hamlede arşivlemek, kopyalamak ve çıkarmak için birleştirebilirsiniz. Bu işlem aşağıda gösterilmiştir:
$ (cd ~/stuff; tar --create --gzip --file - *) | \
ssh destination tar --extract --gunzip --file --verbose -C stuff
|
Bu komutta olup biten çok şey var. O zaman gelin bu komutu parçalarına ayıralım:
- Parantez içine alınmış komut dizilerine alt kabuk denir. Dizinin değiştirilmesi gibi alt kabukta yapılacak değişiklikler, komut satırınızı etkilemez, ancak alt kabuğun ortamını etkiler. Dolayısıyla, ilk sözcük grubu olan
(cd ~/stuff; tar --create --gzip --file - *) , ~/stuff dizinine geçilmesini sağlar ve tar yardımcı programını çalıştırır.
Alt kabuğun ardından bir dikey çubuk gelir ve alt kabuğun tüm çıkışı dikey çubukla
tanımlanan ardışık işlemdeki bir sonraki komuta gönderilir.
- Diğer birçok UNIX yardımcı programı gibi
tar da
standart çıkışlardan (stdout ) yazabilir ve standart girişlerden
(stdin ) okuyabilir. Hem stdout , hem de stdin genellikle bir tire işareti (-) ile belirtilir. Dolayısıyla, --create --file - sözcük grubu, arşivi stdout üzerinde oluşturur.
- Dikey çubuk (|), alt kabuğun tüm çıkışını
ssh 'de birleştirir. Bu, tüm çıkışı etkili bir şekilde kaynak bilgisayardan hedef bilgisayara aktarır.
- Son olarak, hedef makine, arşivi çıkarmak için kendi
tar örneğini çalıştırır. Ancak burada, --extract --file - , arşivi standart girişten okur. -C seçeneği, alan tar yardımcı programını, herhangi bir işleme başlamadan önce dizini stuff olarak (uzak ana dizininizdeki) değiştirmeye zorlar. Sonuçta, ssh aracılığıyla iletilen arşiv ~/stuff dizininde paketinden çıkarılır.
Tek bir komutta (biraz uzun olsa da) dosyalarınızı arşivlediğiniz,
aktardınız ve arşivinizdeki dosyaları çıkardınız. Bu arada, komut satırının sırası değiştirildiğinde uzak bilgisayarda oluşturulan bir arşivi alabilir ve yerel bilgisayarınıza çıkarabilirsiniz. Yerel makineden çalıştırılan bu çözümü aşağıda görebilirsiniz:
$ ssh destination cat archive.tgz | \
(cd ~/stuff; tar --extract --gunzip --file -)
|
Uzak arşiv, uzak bilgisayarda açılır ve cat'den gelen bayt akışı, önce
dizini değiştiren ve daha sonra, arşivi çıkaran bir alt kabuğa gönderilir.
(tar komutuna -C ~/stuff seçeneğini eklerseniz, aynı etki
gerçekleşir; örnekte yalnızca alt kabukların da giriş tüketebileceği
gösterilmektedir.)
Aynı makinede dosyaları ikizlemek için de aynı yöntemi kullanabilirsiniz. Şöyle bir şey deneyin:
tar --create --file - * | tar -C /path/to/directory --extract --file -
|
Kopyalama, kompliman yapmanın en samimi şeklidir
ssh 'nin kullanıldığı tar yardımcı programı, dosyaları bir makineden bir diğerine aktarmak için uygun bir yöntemdir. tar yardımcı programı arşivi oluşturur ve ssh , arşivin güvenli aktarımını kolaylaştırır.
Başka bir yöntem de dosyaları bir makineden başka bir makineye aktarmak
için SSH'nin doğal yeteneklerini kullanmaktır. SSH'nin başka bir "kişiliği" olan
sftp , FTP'nin (Dosya Aktarımı Protokolü) tüm özelliklerini sağlarken,
aktarma sırasında dosya verilerini de korur. (Genellikle, güvenli olmadığı için
FTP'nin kullanılması uygun görülmez; ancak, genel kullanıma açık FTP siteleri, bu
kural için önemli bir istisnadır.)
Daha önce FTP kullandıysanız, sftp sanal olarak FTP'yle aynıdır. hedef adlı uzak makineye bağlanmak için yalnızca sftp hedef yazın ve dosyaları ileri geri taşımak için cd , lcd , mput ve mget gibi FTP komutlarını çalıştırın.
Dosyaları iki makine arasında aktarmanın bir başka yöntemi de
scp ya da secure copy (güvenli kopyalama) olanağını
kullanmaktır. Adından da anlaşılacağı gibi scp , daha çok eski basit
cp gibi çalışır: Dosyaları bir yerden başka bir yere kopyalar. Bu yer
aynı makinede ya da iki makine arasında olabilir.
Örneğin, bazı dosyaları ve dizinleri yerel makinenizdeki başka bir dizine kopyalamak istediğinizde, Liste 2'dekine benzer bir kod çalıştırırsınız.
Liste 2. Dosyaların iki makine arasında kopyalanması
$ ls -lF
drwxr-xr-x 2 mstreicher mstreicher 4096 Oct 12 19:11 css/
-rwxr-xr-x 1 mstreicher mstreicher 91 Aug 17 2005 demo.rb*
-rw-r--r-- 1 mstreicher mstreicher 111563 Oct 12 19:10 tech.pdf
$ cp -pr * /home/joe/stuff
$ ls -lF /home/joe/stuff
drwxr-xr-x 2 mstreicher mstreicher 4096 Oct 12 19:11 css/
-rwxr-xr-x 1 mstreicher mstreicher 91 Aug 17 2005 demo.rb*
-rw-r--r-- 1 mstreicher mstreicher 111563 Oct 12 19:10 tech.pdf
|
Bu örnekte, cp -pr yinelemeli olarak tüm dosyaları ve dizinleri /home/joe/stuff dizinine kopyalar. -r , yinelemeye neden olur; -p , dosyaların zaman damgalarını korur.
Aynı şeyi (yerel olarak kopyalama) scp ile yapabilirsiniz:
$ scp -pr * /home/joe/stuff
|
Ancak, uzak bir sistemi belirlerseniz, scp dosyaları ağ üzerinden kopyalar:
$ scp -pr * destination:/home/joe/stuff
|
/home/joe/stuff dizininin hedef makinede var olduğunu ve sizin bu dizine yazma yetkinizin olduğunu varsayarsak, iki dosya ve dizin bire bir olarak uzak makineye kopyalanır. cp gibi, scp de korumak için -p ve yineleme için -r seçeneklerini tanır.
Özellikle her ssh/scp/sftp işlemi için parolanızı yazmamak için bir gizli-genel anahtar çifti oluşturduysanız, scp 'nin kullanımı çok kolaydır.
Ancak, scp 'nin bilmeniz gereken bir de tuhaflığı vardır. Ana dizininizde doc adlı bir dizinin bulunduğunu ve bunu, bir uzak sisteme kopyalamak istediğinizi varsayalım.
Ayrıca, ~/doc dizininin içeriğinin, bir dosya ya da dizin adının aynı olduğu
durumlarda, uzak doc dizininin içeriğinin üzerine yazılmasını istiyorsunuz. Kullanılacak komut şöyle bir şey olacaktır:
$ scp -pr ~/doc destination:/path/to/doc
|
Hedef makinedeki yolun sonunda sağa eğik çizginin (/) olmadığına dikkat edin. scp , yolu "~/doc dizininin içeriğini, hedef makinedeki /path/to/doc dizinine kopyala" olarak yorumlar. cp 'yle olduğu gibi, yerel dosya ve dizinlerle aynı adı taşıyan uzak dosyaların ve dizinlerin üzerine yazılır; uzak sistemdeki benzersiz dosyalara dokunulmaz.
Ancak, aşağıdaki gibi sona bir sağa eğik çizgi eklerseniz:
$ scp -pr ~/doc destination:/path/to/doc/
|
scp , bu yolu "~/doc dizinini /path/to/doc dizinine kopyala" olarak yorumlar. Dolayısıyla, uzak dizinin içeriğinin üzerine yazmak yerine, yerel doc dizini uzak dizine kopyalanır.
Sona eklenen sağa eğik çizgi bir hata değildir. Bazen bunu kullanmak isteyebilirsiniz; diğer zamanlarda, amacınıza bağlı olarak istemeyebilirsiniz.
Zamanuyumlu tutma
scp , oldukça yararlıdır, çünkü cp 'yi çok yakından taklit eder.
tar ve ssh biraz daha karmaşıktır; ancak bunlar da sahip ve
izinler gibi dosya meta verilerini korur.
Ancak hem tar , hem de scp yerel ve uzak dizinlerin içeriğini eşzamanlayamaz.
Örneğin, yerel sistemde bir dosyayı ve uzak sistemde başka farklı bir dosya
değiştirdiyseniz, çalışan bir ikiz yapmak için iki scp komutu
çalıştırmanız gerekir. Şimdi, değişen çok sayıda dosyanızın olduğunu düşünün,
bunların birçoğu da aynı adı taşıyor. Çok hızlı bir şekilde, eşzamanlamanın ne kadar karmaşık olabileceğini görebilirsiniz.
Dosya kümelerini eşzamanlayan rsync adlı harika bir yardımcı program olduğu için şanslısınız. Daha da iyisi, rsync yalnızca değişen verileri aktararak, aktarılan veri miktarını en alt düzeye indirir.
tar gibi rsync yardımcı programını ssh ile birleştirip uzak sistemleri bağlayabilir ve yerel ve uzak dosya topluluklarını eşzamanlayabilirsiniz. scp gibi rsync yardımcı programını dosyaları yerel olarak kopyalamak için kullanabilirsiniz. Ayrıca, rsync yardımcı programını kullanarak dosyaları listeleyebilirsiniz.
Ancak en iyisi, rsync yardımcı programında bir dizini, başka bir dizinin doğru ikizi yapacak seçenekler vardır. Özgün dizinde olmayan dosyaları silmek için seçenekler kullanılır. Gelin birlikte bazı örneklere bakalım:
$ rsync -e ssh --times *.txt destination:
|
Bu komut, geçerli çalışma dizinindeki tüm metin dosyalarını destination adlı makinedeki ana dizininize kopyalar. -times seçeneği, her bir dosyanın erişim, oluşturma ve son değiştirme zamanı bilgilerini korur.
$ rsync -e ssh --times --perms --recursive --delete doc destination:
|
Bu rsync komutu, ana dizininizde bulunan yerel doc dizinini destination makinesine ikizler. İzinler ve dosya zamanları korunurken, yabancı dosyalar (yerel dizinde var olmayan uzak dizindeki dosyalar) kaldırılır.
rsync bazı önemli değişiklikler yapabilir. Bu nedenle, resync komutu yapmayı planladığı şeyi önizlemek için komut satırına --dry-run seçeneğini eklemeyi tercih edebilirsiniz. --dry-run herhangi bir değişiklik yapmaz -- yalnızca Liste 3'teki gibi neler olacağını gösterir.
Liste 3. rsync komutunun yapacaklarının önizlenmesi
$ rsync -e ssh --dry-run --times --perms --recursive --delete bin destination:
building file list ... done
bin/
skipping non-regular file "bin/HTML.pl"
skipping non-regular file "bin/Quark.pl"
bin/Responses/
bin/Responses/DBI.pm
bin/Responses/Response.pm
skipping non-regular file "bin/XML.pl"
bin/backupdca.sh
bin/lib/
bin/report.pl
bin/report.txt
sent 724 bytes received 108 bytes 554.67 bytes/sec
total size is 168879 speedup is 202.98
|
rsync yardımcı programında birçok seçenek vardır:
-a çok değerlidir; --group --owner --perms --times --devices --links --recursive seçeneklerinin kısaltmasıdır. --devices , aygıt dosyalarını yeniden oluşturur ve --links , simgesel bağlantıları, simgesel bağlantının gösterdiği şey yerine simgesel bağlantı olarak kopyalar.
--update , rsync komutunun yeni dosyaların üzerine yazmasını önler. Uzak sistemde, yerel sistemdekinden daha yeni bir dosya varsa, uzak sistemin dosyası korunur.
rsync komutunun neler yapacağını izlemek için --verbose seçeneğini kullanın.
Yine, ince ayrıntıları öğrenmek için rsync man sayfasını
okuyabilirsiniz. Önemli özelliklerinden biri, tanımladığınız ölçüte göre dosyaları
özellikle içermesi ya da dışlamasıdır.
Veriler, veriler her yerde
UNIX, 20 yıldan fazladır ağ ortamlarında kullanılıyor. Bu süre içinde donanım büyük ölçüde değişti, ancak yazılımın büyük bir kısmı aynı kaldı. Dolayısıyla, kullanıcıların ve sistem yöneticilerinin sorunları da değişmedi. En büyük sorunlardan biri, tüm verileri takip etmek oldu. Bu sorun, disk kapasitesinin büyümesiyle devasa boyutlara ulaştı. tar , sftp/scp ve rsync gibi yardımcı programlar, en vahşi diskleri bile evcilleştirebiliyor.
Bu dizinin 6. bölümünde, zamandan ve emekten tasarruf sağlamak ve
insanlardan kaynaklanan hataları azaltmak için bir başka yöntem olan otomasyon
konusuna göz atacağız.
Kaynaklar Bilgi Edinme
Ürün ve teknoloji edinme
Tartışma
zsh : İşbirliği yapın, tartışın ve zsh deneyiminizi, zsh wiki uygulamasında paylaşın.
- AIX ve UNIX forumlarına katılın:
- developerWorks bloglarına ve developerWorks topluluğuna katılın.
Yazar
hakkında
Martin Streicher, Linux Magazine adlı dergide Baş Editör'dür. Purdue University'den bilgisayar bilimi konusunda master derecesi almış
ve 1982 yılından bu yana UNIX benzeri sistemlerde Pascal, C, Perl, Java ve (en son)
Ruby programlama dillerinde programlama yapmaktadır. Martin'e
martin.streicher@linux-mag.com
adresinden erişebilirsiniz.
|
|
UNIX'e yeni girmiş arkadaşlar bu serinin başlığındaki "UNIX"i AIX olarak değiştirirlerse, IBM'in Microsoft benzeri, her şeyi sahiplenme rahatsızlığının sebep olacağı kafa karışıklığını önlemiş olurlar.
Ayrıca "stalwart", güçlü, güvenilir demekmiş. seslisozluk.com her derde deva.