วิธีการอ่านตารางพาร์ทิชันในหน่วยความจำ (เคอร์เนล) ของ / dev / sda?


14

ฉันเขียนทับตารางพาร์ติชัน / dev / sda ของฉันโดยไม่ได้ตั้งใจด้วย GParted ( เรื่องเต็มใน AskUbuntu ) เนื่องจากฉันยังไม่ได้บูตเครื่องใหม่และระบบไฟล์ของฉันยังใช้งานได้อย่างสมบูรณ์แบบฉันจึงได้รับแจ้งว่าฉันอาจกู้คืนตารางพาร์ติชันจากหน่วยความจำในเคอร์เนลได้ เป็นไปได้ไหม ถ้าเป็นเช่นนั้นฉันจะกู้คืนและคืนค่าได้อย่างไร

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


25

ใช่คุณสามารถทำได้ด้วย/sysระบบไฟล์

/sysเป็นระบบไฟล์ปลอมที่สร้างขึ้นแบบไดนามิกโดยเคอร์เนลและเคอร์เนลไดรเวอร์
ในกรณีเฉพาะนี้คุณสามารถไปที่/sys/block/sdaและคุณจะเห็นไดเรกทอรีสำหรับแต่ละพาร์ติชันบนไดรฟ์ มี 2 ไฟล์ที่ระบุในโฟลเดอร์เหล่านั้นที่คุณต้องมี, และstart มีออฟเซ็ตจากจุดเริ่มต้นของไดรฟ์และเป็นขนาดของพาร์ติชัน เพียงแค่ลบพาร์ทิชันและสร้างพวกเขาด้วยการเริ่มต้นเดียวกันแน่นอนและขนาดที่พบในsizestartsize/sys

ตัวอย่างเช่นนี้เป็นสิ่งที่ไดรฟ์ของฉันดูเหมือนว่า:

   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

และนี่คือสิ่งที่ฉันมีใน/sys/block/sda:

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


ฉันได้ทดสอบสิ่งนี้เพื่อตรวจสอบข้อมูลว่าถูกต้องหลังจากปรับเปลี่ยนตารางพาร์ติชันบนระบบที่กำลังทำงานอยู่


1
บางครั้งเมื่อฉันลงคะแนนคำถามก็หมายความว่า "เฮ้นี่มันมีประโยชน์" upvote ของคุณเป็นเหมือน "สิ่งนี้ช่วยปกป้องผิวฉัน" ขอบคุณ!
Alex Hirzel

/dev/sdb/startฉันไม่ได้มี มันถูกเปลี่ยนชื่อเป็นext_range? เคอร์เนล:4.8.15-1-MANJARO
Tom Hale

@ TomHale มัน/sys/block/sdb/startไม่ใช่/dev/sdb/start
Patrick

ขออภัยฉันอ้างถึงไดเรกทอรีที่ไม่ถูกต้อง ฉันมีstatมี startแต่ไม่มี
Tom Hale

เมื่อสร้างพาร์ติชั่นใหม่ฉันแนะนำ usind fdiskเพราะมันอนุญาตให้ใส่จำนวนเซ็กเตอร์ได้โดยตรงและคุณสามารถตรวจสอบค่าก่อนที่จะเขียนลงดิสก์ ฉันประสบความสำเร็จในการคืนค่าดิสก์โดย: การสร้างพาร์ติชันแรกยอมรับการเป็นแล้วป้อน "+ ขนาด" (จากด้านบน) สำหรับจุดสิ้นสุดพาร์ติชันที่สองที่ป้อนstartจาก / sys ... และ "+ ขนาด" อีกครั้งและอื่น ๆ ... ตรวจสอบ ขนาดของพาร์ติชันก่อนที่จะเขียนตารางใหม่ โชคดี!
Jörg Gottschlich

10

ฉันทำสคริปต์เพื่อช่วยแก้ปัญหานี้ด้วยการไม่รับประกัน (แต่ฉันทดสอบบนเครื่องเสมือนของฉัน)

รันสคริปต์ต่อไปนี้โดยใช้ HD ที่เสียหายที่พารามิเตอร์แรก: $ ./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

เอาต์พุตเป็นรูปแบบ sfdisk แต่ข้อควรระวังไฟล์นี้จะต้องมีการแก้ไขเพื่อนำมาใช้ ที่พาร์ติชันเสริมขยาย = 5 ให้เพิ่มขนาดโดยใช้พื้นที่ตรรกะทั้งหมดบวกช่องว่างระหว่างการเริ่มต้นของการขยายและเริ่มต้นของโลจิคัลพาร์ติชันแรก

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

คุณต้องเปลี่ยนประเภทจาก XX เป็นจำนวนประเภทพาร์ติชัน ใส่พาร์ติชันที่สามารถบู๊ตได้ที่บรรทัดแรก

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

ใช้การเปลี่ยนแปลงนี้

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

อ่านตารางพาร์ติชันอีกครั้ง

partprobe 
/sbin/blockdev --rereadpt

ติดตั้งด้วงใหม่

grub-install /dev/sda

1
ตรวจสอบให้แน่ใจว่าใช้สวิตช์ "-u B" สำหรับ sfdisk และระวังคุณอาจต้องปรับค่าใน repart.sfdisk (หารด้วยสองโดยปกติ) ถ้า sfdisk นับจำนวนบล็อก (ตรวจสอบ "หน่วย = บล็อกของ 1024 ไบต์ "ใน" sudo sfdisk -u B -l / dev / sda ") นอกเหนือจาก 512 ไบต์ (ปกติแล้วคือ 1024 ในปัจจุบัน)
Florian

1
ฉันอ่านผิดครั้งแรก: โดย Id = 5 คุณหมายถึงพาร์ทิชันประเภท 5 ซึ่งเป็น sda4 ไม่ใช่ sda5 นอกจากนี้ในกรณีของฉัน ls -d / sys / block / sda / sda * ให้ฉันเพียง sda1 และ sda5 ดังนั้นมันจึงดูเหมือนว่าภาชนะหายไป
wau

คุณไม่ควรแยกคำ ls; ใช้ find แทน
cat

3

คุณลองทดสอบดิสก์แล้วหรือยัง มันสามารถสแกนดิสก์และกู้คืนตารางพาร์ติชั่นที่สูญหายได้แม้หลังจากที่คุณรีบูทแล้ว

มันพร้อมใช้งานก่อนบรรจุสำหรับ Debian และสำหรับ Ubuntu ด้วย อาจ distros อื่น ๆ

หากคุณกำลังบูทซีดี gparted มันอาจคุ้มค่าที่จะตรวจสอบว่ามีการติดตั้งไว้ล่วงหน้าหรือไม่


ใช่เขาทำ. เพียงตรวจสอบลิงก์ของ OP (AskUbuntu)
Marco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.