Làm cách nào để đọc bảng phân vùng trong bộ nhớ (kernel) của / dev / sda?


14

Tôi vô tình ghi đè lên bảng phân vùng / dev / sda của mình bằng GParted ( toàn bộ câu chuyện trên AskUbfox ). Vì tôi chưa khởi động lại và hệ thống tập tin của tôi vẫn hoàn toàn có thể sử dụng được, tôi được cho biết có thể khôi phục bảng phân vùng từ bộ nhớ trong kernel. Điều đó có thể không? Nếu vậy, làm thế nào để tôi phục hồi nó và khôi phục nó?

nhập mô tả hình ảnh ở đây

Câu trả lời:


25

Có, bạn có thể làm điều này với /syshệ thống tập tin.

/syslà một hệ thống tập tin giả được tạo động bởi trình điều khiển kernel & kernel.
Trong trường hợp cụ thể này, bạn có thể truy cập /sys/block/sdavà bạn sẽ thấy một thư mục cho mỗi phân vùng trên ổ đĩa. Có 2 tệp cụ thể trong các thư mục bạn cần startsize. startchứa phần bù từ đầu ổ đĩa và sizelà kích thước của phân vùng. Chỉ cần xóa các phân vùng và tạo lại chúng với cùng một khởi đầu và kích thước chính xác như được tìm thấy trong /sys.

Ví dụ: đây là ổ đĩa của tôi trông như sau:

   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

Và đây là những gì tôi có trong /sys/block/sda:

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


Tôi đã kiểm tra điều này để xác minh thông tin là chính xác sau khi sửa đổi bảng phân vùng trên hệ thống đang chạy


1
Đôi khi khi tôi đưa ra một câu hỏi, nó có nghĩa là "này thật tiện dụng". Upvote của bạn giống như "điều này đã cứu làn da của tôi". Cảm ơn!
Alex Hirzel

Tôi không có một /dev/sdb/start. Nó đã được đổi tên thành ext_range? Hạt nhân:4.8.15-1-MANJARO
Tom Hale

@TomHale nó /sys/block/sdb/start, không phải/dev/sdb/start
Patrick

Xin lỗi, tôi trích dẫn thư mục sai. Tôi có một cái statở đó, nhưng không start.
Tom Hale

Khi tạo lại các phân vùng, tôi khuyên bạn nên sử dụng fdiskvì nó cho phép nhập trực tiếp số lượng cung và bạn có thể kiểm tra giá trị trước khi ghi vào đĩa. Tôi đã khôi phục thành công đĩa bằng cách: tạo phân vùng đầu tiên, chấp nhận tồn tại, sau đó nhập "+ size" (từ trên xuống) để kết thúc, phân vùng thứ hai nhập starttừ / sys ... và "+ size" một lần nữa, v.v. kích thước của các phân vùng trước khi viết bảng mới. Chúc may mắn!
Jörg Gottschlich

10

Tôi đã tạo một kịch bản để giúp giải quyết vấn đề này, KHÔNG CÓ BẢO HÀNH . (nhưng tôi đã thử nghiệm trên máy ảo của mình)

Chạy tập lệnh sau, với HD bị hỏng ở tham số đầu tiên: $ ./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

Đầu ra là một định dạng sfdisk. Nhưng thận trọng , tập tin này phải được sửa đổi để được sử dụng. Tại loại phân vùng mở rộng = 5, tăng kích thước, sử dụng tất cả không gian logic cộng với không gian giữa bắt đầu mở rộng và bắt đầu phân vùng logic đầu tiên.

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

Bạn phải thay đổi loại , từ XX sang số loại phân vùng. Đặt phân vùng khởi động ở dòng đầu tiên.

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

Áp dụng thay đổi này

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

Đọc lại bảng phân vùng

partprobe 
/sbin/blockdev --rereadpt

Cài đặt lại grub

grub-install /dev/sda

1
Đảm bảo sử dụng công tắc "-u B" cho sfdisk và cẩn thận, bạn có thể phải điều chỉnh các giá trị trong repart.sfdisk (chia chúng cho hai thường), nếu sfdisk đếm theo kích thước khối (kiểm tra "Đơn vị = khối của 1024 byte "trong" sudo sfdisk -u B -l / dev / sda ") khác với 512 byte (thường là 1024 ngày nay).
Florian

1
Tôi đọc sai lúc đầu: bởi Id = 5 bạn có nghĩa là phân vùng loại 5, đó là sda4, không phải sda5. Hơn nữa, trong trường hợp của tôi ls -d / sys / block / sda / sda * chỉ cung cấp cho tôi sda1 và sda5, vì vậy có vẻ như container bị thiếu.
wau

bạn không nên phân tích ls; sử dụng tìm thay thế
mèo

3

Bạn đã thử testdisk chưa? Nó có thể quét đĩa và khôi phục các bảng phân vùng bị mất, ngay cả sau khi bạn đã khởi động lại.

Nó có sẵn được đóng gói sẵn cho Debian và có lẽ là cho Ubuntu. Có lẽ các distro khác.

Nếu bạn đang khởi động một đĩa CD gparted, có lẽ bạn nên kiểm tra xem nó có được cài đặt sẵn trên đó không.


Vâng, anh ấy đã làm. Chỉ cần kiểm tra liên kết của OP (askUbfox)
Marco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.