Bilgisayar kategorisinde ve Linux İşletim Sistemi forumunda, bulunan Lsof ile dosya kurtarma... konusunu görüntülemektesiniz. 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 ...
|
|||||||
|
Kayıt | SSS | Üye Listesi | Takvim | Konuları Okundu İşaretle |
|
|
#1 (permalink) |
|
Ö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) 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. Not: Alıntıdır... |
|
|
|
|