Bagaimana cara membaca tabel partisi in-memory (kernel) dari / dev / sda?

14

Saya tidak sengaja menimpa tabel partisi / dev / sda saya dengan GParted ( cerita lengkap tentang AskUbuntu ). Karena saya belum reboot dan sistem file saya masih dapat digunakan dengan sempurna, saya diberitahu bahwa saya mungkin dapat memulihkan tabel partisi dari memori di-kernel. Apakah itu mungkin? Jika demikian, bagaimana cara memulihkan dan mengembalikannya?

masukkan deskripsi gambar di sini

Olivier Lalonde
sumber

Jawaban:

25

Ya, Anda dapat melakukan ini dengan sistem /sysfile.

/sysadalah filesystem palsu yang dihasilkan secara dinamis oleh driver kernel & kernel.
Dalam kasus khusus ini Anda dapat pergi ke /sys/block/sdadan Anda akan melihat direktori untuk setiap partisi pada drive. Ada 2 file spesifik dalam folder yang Anda butuhkan, startdan size. startberisi offset dari awal drive, dan sizemerupakan ukuran partisi. Hapus saja partisi dan buat ulang dengan awal dan ukuran yang sama persis seperti yang ditemukan di /sys.

Contohnya seperti inilah tampilan drive saya:

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536   83  Linux
/dev/sda2   *      133120   134340607    67103744    7  HPFS/NTFS/exFAT
/dev/sda3       134340608   974675967   420167680   8e  Linux LVM
/dev/sda4       974675968   976773167     1048600   82  Linux swap / Solaris

Dan inilah yang saya miliki /sys/block/sda:

sda1/
 start: 2048
 size: 131072
sda2/
 start: 133120
 size: 134207488
sda3/
 start: 134340608
 size: 840335360
sda4/
 start: 974675968
 size: 2097200


Saya telah menguji ini untuk memverifikasi informasi yang akurat setelah memodifikasi tabel partisi pada sistem yang sedang berjalan

Patrick
sumber
1
Kadang-kadang ketika saya menjawab pertanyaan, itu berarti "hei ini berguna". Suara positif Anda lebih seperti "ini menyelamatkan kulitku". Terima kasih!
Alex Hirzel
Saya tidak punya /dev/sdb/start. Apakah sudah diubah namanya menjadi ext_range? Kernel:4.8.15-1-MANJARO
Tom Hale
@ Tomale itu /sys/block/sdb/start, bukan/dev/sdb/start
Patrick
Maaf, saya mengutip direktori yang salah. Saya punya di statsana, tetapi tidak start.
Tom Hale
Saat membuat ulang partisi, saya sarankan usind fdiskkarena memungkinkan untuk memasukkan jumlah sektor secara langsung dan Anda dapat memeriksa nilai sebelum menulis ke disk. Saya berhasil memulihkan disk dengan: membuat partisi pertama, menerima makhluk, lalu memasukkan "ukuran +" (dari atas) untuk akhir, partisi kedua masuk startdari / sys ... dan "+ ukuran" lagi dan seterusnya ... Periksa ukuran partisi sebelum menulis tabel baru. Semoga berhasil!
Jörg Gottschlich
10

Saya membuat skrip untuk membantu menyelesaikan masalah ini, TANPA GARANSI . (tapi saya diuji pada mesin virtual saya)

Menjalankan skrip berikut, dengan HD yang rusak pada parameter pertama: $ ./repart.sh sda

#!/bin/bash

HARDDISK=$1

PARTITIONS=$(ls -d /sys/block/${HARDDISK}/${HARDDISK}?/)

echo "unit: sectors" 
for i in $PARTITIONS; do
    DEVICE=$(basename $i)
    START=$(cat $i/start)
    SIZE=$(cat $i/size)
    echo "/dev/$DEVICE : start=$START, size=$SIZE, type=XX" 
done

Outputnya adalah format sfdisk. Tapi hati-hati , file ini harus dimodifikasi untuk digunakan. Pada tipe partisi extended = 5, tambah ukurannya, menggunakan semua ruang logis plus ruang antara mulai diperluas dan mulai partisi logis pertama.

unit: sectors
/dev/sda1 : start=63, size=2040192, type=XX
/dev/sda2 : start=2040255, size=20482875, type=XX
/dev/sda3 : start=22523130, size=19197675, type=XX
/dev/sda4 : start=41720805, size=2, type=XX
/dev/sda5 : start=41720868, size=208782, type=XX

Anda harus mengubah jenisnya , dari XX ke jumlah tipe partisi. Letakkan partisi yang dapat di - boot pada baris pertama.

unit: sectors
/dev/sda1 : start=63, size=2040192, type=83, bootable
/dev/sda2 : start=2040255, size=20482875, type=83
/dev/sda3 : start=22523130, size=19197675, type=fd
/dev/sda4 : start=41720805, size=208845, type=5
/dev/sda5 : start=41720868, size=208782, type=82

Terapkan perubahan ini

cat repart.sfdisk | sfdisk -f /dev/sda

Baca kembali tabel partisi

partprobe 
/sbin/blockdev --rereadpt

Instal ulang grub

grub-install /dev/sda
fabceolin
sumber
1
Pastikan untuk menggunakan sakelar "-u B" untuk sfdisk dan berhati-hatilah, Anda mungkin harus menyesuaikan nilainya dalam repart.sfdisk (bagi dengan dua biasanya), jika sfdisk menghitung dalam ukuran blok (periksa "Unit = blok dari 1024 byte "di" sudo sfdisk -u B -l / dev / sda ") selain 512 byte (biasanya 1024 saat ini).
Florian
1
Saya salah membaca pada awalnya: dengan Id = 5 maksud Anda tipe partisi 5, yang merupakan sda4, bukan sda5. Selanjutnya, dalam kasus saya ls -d / sys / block / sda / sda * memberi saya hanya sda1 dan sda5, jadi sepertinya wadahnya hilang.
wau
Anda tidak harus menguraikan ls; gunakan find
cat
3

Sudahkah Anda mencoba testdisk ? Itu dapat memindai disk dan memulihkan tabel partisi yang hilang, bahkan setelah Anda reboot.

Ini tersedia pra-paket untuk Debian dan mungkin juga untuk Ubuntu. Mungkin distro lain.

Jika Anda mem-boot CD gparted, mungkin perlu diperiksa untuk melihat apakah CD tersebut sudah diinstal sebelumnya.

cas
sumber
Iya, dia melakukannya. Periksa saja tautan OP (askUbuntu)
Marco