Bir ext4 dosya sisteminin ofsetini nasıl bulabilirim?


9

Diskin ilk sektörlerini yazamayan veya okuyamayan bir sabit diskim var. Sadece G / Ç hataları veriyor ve hepsi var. Diskte (çoğunlukla) iyi görünen başka alanlar da var. Bir bölüm (ext4) monte etmeye çalışıyorum ve kurtarmak istediğiniz bazı dosyalara erişip erişemediğimi görüyorum. Yana mountkomut bir destek offsetseçeneği, ben bölüm tablosu okunmaz ve unwriteable rağmen dosya sistemini monte etmek gerekir. Sorun, ofseti nasıl bulacağınızdır. Ext4 araçlarının hiçbirinde bu özel özellik bulunmuyor.


1
Testdisk'i ve beraberindeki fotoselleri deneyin .
jippie

@jippie tüm diski taramak için testdisk 6 saat sürdü ve sonunda herhangi bir bölüm bulamadı. en iyi strateji doğrudan dosya sisteminin yerini bulmak ve monte etmek olduğunu düşünüyorum.
Ernest A

photorec muhtemelen dosyalarınızı diskten çıkarabilir, ancak dosya adları ve yol adları kaybolacaktır. Tabii ki daha iyi bir seçenek olan dosya sistemini bağlamayı başarırsanız, ancak testdisk herhangi bir şey bulamadıysa, dosya sisteminin başlamasının da bozulma olasılığı vardır.
jippie

Yanıtlar:


13

Standart bir ofset per se yoktur, tabii ki bölümü istediğiniz yere başlatabilirsiniz. Ancak bir an için ilk bölümü aradığınızı varsayalım ve bu daha fazla veya daha az varsayılan kabul ederek oluşturuldu. Geleneksel bir DOS bölüm tablosu kullandığınızı varsayarak, bulabileceğiniz iki yer vardır:

  1. (512 bayt) sektörden başlayarak 63. Bu çok uzun bir süredir gelen bir gelenekti ve biri 4K diskleri bulana kadar çalıştı ...
  2. (512 bayt) 2048 sektöründen başlayarak. 4K diskleri barındıran yeni gelenek budur.
  3. Bir bonus seçenek! 56. sektörde sarting. Birisi 63-start bölümünü bir 4K sektörle hizalamak için hareket ettirirse bu olur.

Şimdi, devam etmek için en sevdiğiniz onaltılık döküm aracını alıp ext4 Disk Düzeni hakkında biraz bilgi edineceksiniz . Özellikle, ext4'ün yok saydığı 1024 bayt dolgu ile başlar. Sonra süper blok geliyor. Süper bloğu, 0x38 uzaklığındaki 0xEF53 sihirli numarasını (süper blok başlangıcından itibaren 0x438 veya bölüm başlangıcından itibaren 0x438 veya ondalık olarak 1080) kontrol ederek tanıyabilirsiniz. Sihirli sayı küçük endian. Yani aslında diskte 0x53EF olarak saklanır.

İşte böyle görünüyor xxd -a:

0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 0000400: 0040 5d00 0084 7401 33a0 1200 33db a600 .@]...t.3...3... 0000410: 4963 5300 0000 0000 0200 0000 0200 0000 IcS............. 0000420: 0080 0000 0080 0000 0020 0000 6637 0952 ......... ..f7.R 0000430: 6637 0952 0200 1600 53ef 0100 0100 0000 f7.R....S....... 0000440: 9938 f851 004e ed00 0000 0000 0100 0000 .8.Q.N..........

Ofseti takmak (veya losetup) vermek için dengelemeyi, doldurma işleminin başladığı yere vermeniz gerekir; süper blok değil.

Şimdi, eğer bu ilk bölüm değilse veya başka bir şekilde beklenen iki (üç) noktadan birinde değilse, temel olarak 0xEF53 sihirli numarasını arayabilirsiniz. Bu testdisk(bir yorumda tavsiye edilir) sizin için yapar.


2
BAŞARI !!! Kendi senaryomu yazmak zorunda kaldım. testdiskbulamaz. Yardımlarınız için hepinize teşekkürler.
Ernest A

Buna dayanarak, dd if=/dev/sda skip=$start_sector | xxd -a | grep '[02468]30: .... .... .... .... 53ef'olası bazı eşleşmeler almak gibi bir şey kullanabilirsiniz . Muhtemelen çok hızlı değil, ancak daha iyi bir yöntem bulurken çalışmasına izin verebilirsiniz.
mwfearnley

Şimdi "daha iyi yöntem" için aşağıdaki cevabımı görün. Not: Bu sayıyı rastgele verilerle taramak, her 65536 sektörde (32 MB) yanlış pozitif bulacaktır.
mwfearnley

Bunun için teşekkürler. beni ikinci bir okumaya testdisktl;dr:
ayırdığı

5

Dayanarak @ derobert cevabı , ben bir program (yazdığı özü bir giriş akışı ayrıştırmak olacak) ddbir şey için her sektör ve tarama dair bir dahili bölümünün başlangıç gibi görünüyor.

En azından ddsabit diskinizden okuyabileceğiniz kadar hızlı çalışır . Kısaltılmış bir sürüm aşağıdadır.

Blok boyutunu iyileştirmek veya aramak için bir bölge seçmek sudo dd if=/dev/xxx | ext2scaniçin ddkomutu değiştirmek isteyeceksiniz, ancak en basit kullanım sadece .

#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main() {
  unsigned char const MAGIC[2] = {0x53, 0xef};
  unsigned char const ZEROS[512] = {0};

  long long int sector = 0;

  char buf[4][512];
  int empty1, empty2;

  while (read(STDIN_FILENO, buf[sector&3], 512) > 0) {
    if (!memcmp(buf[sector&3] + 0x38, MAGIC, 2)) {
      printf("Found a possible ext2 partition at sector %lld", sector-2);

      empty1 = !memcmp(buf[(sector-2)&3], ZEROS, 512);
      empty2 = !memcmp(buf[(sector-1)&3], ZEROS, 512);

      if (empty1 && empty2) printf(" (first two sectors are empty :)\n");
    }
    sector++;
  }
}

Not: sadece bölümlerin başlangıcını değil, aynı zamanda bunların içindeki süper blokları da bulacaktır .

Her iki durumda da, dumpe2fssonuçları analiz etmek için kullanmanızı tavsiye ederim . Şüpheli süper bloğun başlangıcını bir dosyaya (gayri resmi testime göre en azından ilk altı sektör) dökebilir ve eğer bir süper blok ise, o dumpe2fszaman (diğer şeylerin yanı sıra) diğer süper blokların göreli konumlarını söyler .


2

Bölümün nerede başladığını tahmin edin ve kaba kuvvet uygulayın:

bsz=512 # or 1024, 2048, 4096 higher = faster

for i in {2..10000000}; do
    echo "--->$i<---"
    mount -o offset=$(($bsz*$i)) -t ext4 /dev/whatever /mnt/foo
    if [ $? == 0 ]; then # whahoo!
        echo Eureka
        break
    fi
done

Bunun biraz zaman alabileceğini düşünüyorum, ancak testdisk ile zaten 6 saat geçirdiyseniz, belki de denemeye değer.


Hah, bu çok kaba bir kuvvet!
derobert

Çalışıyor ama yavaş; Bunu, ofsetlerini bildiğim çok bölümlü bir görüntüde denedim, böylece oldukça yakın başlayabilirim. echo "--->$i<---"Aksi halde ilerlemeyi ölçmek imkansız olduğu için çizgiye attı . Sanırım bsz4096'ya yükselebilirsin , bu da işleri hızlandıracak.
goldilocks

Bölümlerin bir "pist" (veya silindir mi?) Sınırında başladığı geleneksel düzeni varsa, bunu çok hızlandırabilirsiniz.
derobert

benim tahminim bu çözümün pratik olması için fakirdi ama başka koşullarda da işe yarayabilir
Ernest A

2

Farklı bir seçenek deneyin (örneğin, debugfs ve fsck.ext4 kullanma):

debugfs:

Önce hata ayıklayıcıları bağlamanız gerekir (arızalı sabit diskin kendisi değil):

http://johnsofteng.wordpress.com/2013/11/20/sysfs-procfs-sysctl-debugfs-and-other-similar-kernel-interfaces/

http://afzalkhanlinuxtalk.wordpress.com/2013/08/07/how-to-recover-deleted-file-in-linux/comment-page-1/#comment-8

http://blesseddlo.wordpress.com/2010/10/12/using-debugfs/

(temel olarak, "debugfs -w" komutunu yazma özellikli modda kullanmak ve ardından "lsdel" ifadesini kullanarak silinen tüm dosyaları listeler. alternatif olarak kullanabilirsiniz

ve işte fsck.ext4:

http://linuxexpresso.wordpress.com/2010/03/31/repair-a-broken-ext4-superblock-in-ubuntu/

Diğeri ise, inotlar hakkında blok bilgisi sağlamak için "istat" komutuna sahip olan "sleuthkit" ("sudo apt-get install sleuthkit") 'dır - bu şekilde ofseti alabilir ve böylece veri içeriğini kolayca engelleyebilirsiniz.

https://www.ibm.com/developerworks/cn/linux/l-cn-ext4resize/

(BTW, blok boyutu 1024 ise, hata ayıklayıcıların "show_super_stats" komutundan, blok 1'in diskin başlangıcından 1024 bayt uzaklığı olduğunu ve her blok grubunun da birkaç bloğu olabileceğini gösterir.)


1

Ext3fs sihirli numarasının tüm konumlarını bulmak ve bulunan ofsetleri kullanarak monte etmeye çalışmak için bgrep aracını kullanarak görüntüyü taramak zorunda kaldım 0x53EF.

İşte montajı yapan kısaltılmış bir komut dosyası:

#!/bin/sh
FW_IMAGE=$1
MOUNT_POINT=$2

FS_TYPE=ext3
EXTFS_MAGIC_NUM=53ef
MAGIC_OFFSET=1080

OFFSETS=`bgrep $EXTFS_MAGIC_NUM $FW_IMAGE | awk '{print toupper($NF)}'`
for OFFSET in $OFFSETS; do
  OFFSET=`echo "ibase=16; $OFFSET" | bc`
  OFFSET=`expr $OFFSET - $MAGIC_OFFSET`
  sudo mount -t $FS_TYPE -o loop,offset=$OFFSET $FW_IMAGE $MOUNT_POINT 2>/dev/null
  if [ $? -eq 0 ]; then
    echo "Success!  Offset is: $OFFSET."
    break
  fi
done

Komut dosyası burada bulunur .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.