Lsof ile dosya kurtarma

From Lapis Wiki

Jump to: navigation, search
Bu makale IPUCU bölümü serisinin bir parçasıdır
Ses Çekirdek Terminal/Kabuk
Dosya İşlemleri Tarayıcılar Diğer

Konu başlıkları

Giriş

Öncelikle şunu belirterek yazıya başlayalım; kazayla sildiğimiz dosyaları lsof kullanarak kurtarabilmemiz için o an dosyayı kullanan bir uygulamanın açık olması gerekir. Bir örnek verecek olursak,diyelim ki mp3 oynatıcınızla bir mp3 dinliyorsunuz ve yanlışlıkla dinlediğiniz mp3 dosyasını sildiniz. Daha önce başınıza böyle bir durum gelmişse bilirsiniz ki mp3 çalmaya devam edecektir. Eğer mp3 oynatıcınızı kapamazsanız (durdursanız da olur ancak kapadığınız sürece geri getirmek olanaksız olacaktır) dosyayı geri getirme şansınız vardır.

Dosya işlemleri

Linux dosya sistemlerinde bir dosya aslında bu dosyanın inode'unu gösteren bir linkten ibarettir. Burada dosyaya ait izinler, sahiplik hakları, dosyanın disk üzerinde kapladığı yerin adres bilgileri gibi bir takım özellikler tutulur. Biz rm ile dosyayı sildiğimizde aslında inode'a işaret eden linki silmiş oluruz. Eğer bu dosyayı kullanan bir uygulama varsa, bu uygulama kapatılıp, dosyaya işaret eden tüm linkler silinmedikçe dosyanın kendisi silinmiş olmaz. İşte biz bunu kullanarak dosyayı kurtarmayı başarabiliriz.

Bu işlemi yapmamızı sağlayan Linux üzerindeki process pseudo-filesystem namıyla bilinen /proc dizinidir. Sistem üzerindeki her işlem bu dizin altında bu işleme ait bir isimle bir alt dizinde bulunur. Bu alt dizinde birçok bilgi bulunur, işte bunlar birisi de fd(file descriptor) alt dizinidir. Bu dizin altında dosyanın yapıldığı işleme ait linkler mevcuttur. Dosya silinse bile bilginin bir kopyası (dosyayı çalıştıran işlem devam ettiği sürüece) şurada kalmaya devam eder:

/proc/process id/fd/file descriptor

Bu bilgiyi nerede bulabileceğinizi bilmeniz için işlemin id numarasını ve file descriptor'ı bulmanız lazım, işte burada devreye lsof (list open files) uygulaması girer.

lsof ile bilgiyi aldıktan sonra artık tek yapmanız gereken dosyayı /proc dizininden geri kopyalamanız. Bunu 2 örnekle göstermeye çalışalım.

Örnek 1

Elimizde bir mp3 dosyası olsun ve bu dosyayı bir oynatıcı ile yürütelim, ardından dosyayı silelim ve geri getirelim.

 ls -l Bond_-_Shine.mp3
 
 -rw-r--r-- 1 serkan serkan 3798498 2006-11-17 01:39 Bond_-_Shine.mp3

Gördüğümüz gibi kurban mp3 dosyamızın ismi Bond_-_Shine.mp3 ve yerli yerinde durmakta. Şimdi dosyayı yürütelim:

mplayer Bond_-_Shine.mp3

Playing Bond_-_Shine.mp3.

Ardınan yanlışlıkla! silelim.

rm Bond_-_Shine.mp3

ls Bond_-_Shine.mp3

ls: Bond_-_Shine.mp3: No such file or directory

Burada önemli olan dosyayı sildiğiniz anda yürütme işlemini durdurmanız ancak kesinlikle kapatmayın. Durdurmamızın sebebi yürütme işleminin tamamen bitip, yani mp3 dosyasının sonuna gelip, geri getirecek dosyanın /proc dizini altından dahi silinmesidir.

=====  PAUSE  =====
A: 143.3 (02:23.3) of 237.0 (03:57.0)  4.6% 

Şimdi kurtarma işlemine dönebiliriz.

lsof | grep Bond

mplayer   5481     serkan    3r      REG        8,5  3798498   1261587 /home/serkan/lsof/Bond_-_Shine.mp3 (deleted)

Evet lsof ile bilgileri gördük. En sondaki deleted ibaresine dikkat edin, dosyanın silindiğini buradan anlayabiliriz. Bu bilgilerden ilk sütundaki dosyayı hangi uygulamanın kullandığını gösterir. 2. sütun process id, 4. sütun ise file descriptor'dır. Tüm bilmemiz gereken bunlar. Gördüğümüz gibi mp3 dosyamızın process id'si 5481, file descriptor'ı ise 3'tür. Şimdi /proc altından bu dosyayı kurtarabiliriz.

cp /proc/5481/fd/3 Bond.Shine.mp3

ls -l Bond.Shine.mp3

-rw-r--r-- 1 serkan serkan 3798498 2006-11-17 01:48 Bond.Shine.mp3

Gördüğümüz gibi dosyamız sağ salim geri geldi, ben sadece kopyalarken ismi değiştirdim.

Not: Kopyalama işlemini doğrudan cp ile yapın, sahiplik vs. özellikleri düşünerek -a parametresi kullanmayın. Bir sonraki örnekte durumu açıklamaya çalışacağım.

Örnek 2

Şimdi less ile görüntülediğimiz bir dosya silme-kurtarma provası yapalım.Görüntüleyeceğimiz dosya da lsof komutunun man sayfası olsun.

man lsof | col -b > kurban.dosya

Bu dosyanın içeriği lsof dosyasının man sayfası olacaktır. Şimdi less'i kullanarak bu dosyaya göz atalım.

less kurban.dosya

Dosya orda eminiz:

ls -l kurban.dosya

Hatta daha fazlası için:

stat kurban.dosya

 File: `kurban.dosya'
 Size: 115333          Blocks: 240        IO Block: 4096   regular file
Device: 805h/2053d      Inode: 1261675     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  serkan)   Gid: ( 1000/  serkan)
Access: 2006-11-17 01:54:14.000000000 +0200
Modify: 2006-11-17 01:53:08.000000000 +0200
Change: 2006-11-17 01:53:08.000000000 +0200

Dosya hakkındaki detaylı bilgileri stat komutu ile gördük, şimdi dosyayı silelim:

rm kurban.dosya
ls -l kurban.dosya

ls: kurban.dosya: No such file or directory

Evet dosya silindi ancak siz less'i kapatana değin /proc altında kalmaya devam edecektir. Eğer kurtarmak istiyorsanız less'i kapatmamanız gerekli. İşlemlere başlayalım.

lsof | grep kurban
less      5641     serkan    4r      REG        8,5   115333   1261675 /home/serkan/lsof/kurban.dosya (deleted)

Evet yine bilgileri gördük. /proc altına bir göz atalım.

ls -l /proc/5641/fd/4
lr-x------ 1 serkan serkan 64 2006-11-17 02:00 /proc/5641/fd/4 -> /home/serkan/lsof/kurban.dosya (deleted)

Göründüğü gibi dosyamız orada durmakta.

Bu aşamada cp ile dosyayı geri kopyalayabiliriz. Ancak yukarıda belirttiğim gibi bunu parametre kullanmadan yapın. Örneğin -a gibi bir parametre ile kopyalama yapmaya çalıştığınızda elde edeceğiniz tek şey bu dosyaya ait kırık bir link olacaktır. Şimdi bu yanlış örneğe bakalım:

cp -a /proc/5641/fd/4 kurban.dosya.yanlış
ls -l kurban.dosya.yanlış
lrwxrwxrwx 1 serkan serkan 40 2006-11-17 02:04 kurban.dosya.yanlış -> /home/serkan/lsof/kurban.dosya (deleted)

Gördüğünüz gibi tek elde ettiğimiz kırık bir link oldu. Doğru şekli şöyle:

cp /proc/5641/fd/4 kurban.dosya.doğru

ls -l kurban.dosya.doğru
-rw-r--r-- 1 serkan serkan 115333 2006-11-17 02:05 kurban.dosya.doğru

Peki dosyayı kopyaladık, acaba içerik olarak hatasız olarak mı kopyalandı? Bunu da kontrol edelim.

Öncelikle ilk etapta oluşturduğumuz şekilde dosyayı yeniden oluşturalım:

man lsof | col -b > kurban.dosya

Şimdi elimizdeki doğru kopyaladığımız kurban.dosya.doğru ile karşılaştıralım:

cmp kurban.dosya kurban.dosya.doğru

Eğer cmp hiçbir çıktı vermediyse dosyaların ikisi de aynı demektir, yani kopyalama sorunsuz bir şekilde gerçekleşti.

Yararlanılan makale: http://applications.linux.com/article.pl?sid=06/10/30/1652211