Nội dung của một phân vùng có thể được phục hồi sau khi bảng phân vùng bị ghi đè không?


7

Tôi đã chạy một lệnh để làm cho hdd bên ngoài của tôi có khả năng khởi động khi biết rằng nó rất rủi ro khi xem chính lệnh đó không cho phép tôi chỉ định một phân vùng để viết. (Nhìn nhận lại, bây giờ tôi sẽ gọi đây là một quyết định ngu ngốc - nhưng tại thời điểm đó, tôi đã thử lệnh này :)

$ sudo dd if=/Users/MyUser/Downloads/Fedora-17-x86_64-Live-Desktop.iso \
> of=/dev/disk1 bs=1m

Mà đầu ra tôi nhận được là:

645+0 records in
645+0 records out
676331520 bytes transferred in 98.578444 secs (6860846 bytes/sec)

Tôi biết ngay rằng nó tanh vì /dev/disk1được chia thành ba phân vùng, tất cả đều như vậy hfs. Vì không thể tìm thấy thông tin tốt về việc tạo phân vùng có thể khởi động từ thiết bị USB bên ngoài, tôi đã thử điều này bất chấp rủi ro.

Tôi đã không viết thêm vào ổ cứng ngoài của mình sau thời điểm này, vì bây giờ phân vùng duy nhất tôi thấy khi tôi gắn ổ đĩa là 'Fedora 17.'

Khả năng khôi phục các tệp tôi đã lưu trữ trong phân vùng Sao lưu của tôi là gì? Và làm thế nào tôi nên làm điều này ở nơi đầu tiên?


LƯU Ý : Đây là cách phân vùng của tôi trước khi tôi thử dd.

$ diskutil list
/dev/disk0
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *160.0 GB   disk0
1:                        EFI                         209.7 MB   disk0s1
2:                  Apple_HFS Macintosh HD            159.7 GB   disk0s2
/dev/disk1
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *1.0 TB     disk1
1:                        EFI                         209.7 MB   disk1s1
2:                  Apple_HFS Linux                   50.0 GB    disk1s2
3:                  Apple_HFS Backup                  500.0 GB   disk1s3
4:                  Apple_HFS Misc                    449.6 GB   disk1s4

Câu trả lời:


6

Nhanh chóng và đơn giản: Vì là đĩa GPT nên bạn có thể chạy gpart recover /dev/disk1để sửa bảng. Bạn đã lấy đi ~ 700 MB đầu tiên của ổ đĩa, do đó, bất kỳ phân vùng nào chạm vào khu vực đó cũng sẽ biến mất (ít nhiều). Phần còn lại của đĩa sẽ ổn. Tôi không chắc chắn nếu OSX đi kèm với gpart, vì vậy bạn có thể cần phải tải xuống ở đâu đó.

Các chi tiết dài hơn: Liên quan đến (các) phân vùng chỉ bị ghi đè một phần, một số tệp có thể được phục hồi. Các công cụ để làm như vậy phức tạp hơn nhiều và bạn sẽ muốn tìm một người thực sự biết họ đang làm gì cho việc này. Nếu bạn quan tâm đến bất kỳ tệp nào trong số này, thậm chí không thử bất cứ thứ gì ngoại trừ rút ổ đĩa. Ngoài ra, dữ liệu được ghi đè có thể được phục hồi bởi một dịch vụ khôi phục dữ liệu, nhưng điều này sẽ tốn hàng chục ngàn đô la.

Ngoài ra, nếu đây là đĩa MBR, bạn sẽ hoàn toàn bị loại trừ khi bạn biết chính xác kích thước và độ lệch của tất cả các phân vùng. Thông tin này có thể được in từ fdisk, nhưng tốt nhất là đừng phạm sai lầm như thế này.


5

Theo đầu ra của bạn, bạn đã sao chép 645 MB vào đĩa, điều đó có nghĩa là EFI và ~ 440 MB đầu tiên của phân vùng Linux đã bị ghi đè. Các phân vùng Sao lưu và Linh tinh của bạn không được sửa đổi, vì vậy dữ liệu trong đó có thể được phục hồi ... nếu bạn có thể tìm thấy chúng.

Điều này có thể tương đối dễ dàng 1 . Các bảng phân vùng GUID được lưu trữ ở cả đầu và cuối ổ đĩa, miễn là OS X không ghi đè lên các bảng ở cuối, bạn có thể sử dụng chúng để tìm dữ liệu của mình.

1 Liên quan đến việc tìm kiếm các tiêu đề HFS theo cách thủ công, các lệnh sau khá dễ dàng. Tuy nhiên, quá trình này rất tế nhị và nếu bạn vô tình ghi lại dữ liệu sai, nó có thể khiến mọi thứ tồi tệ hơn.


Trước tiên, bạn cần xác định số lượng các lĩnh vực trên ổ đĩa của bạn. Trong Terminal, chạy diskutil info disk1(hoặc bất cứ thứ gì mà đĩa của bạn hiện đang được kết nối là) và tìm phần Tổng kích thước. Nó nên liệt kê số lượng chính xác của các lĩnh vực, và dưới kích thước của ngành. Tôi sẽ gọi các giá trị N và S tương ứng.

Sau đó, chạy các lệnh này, thay thế đĩa1, N và S khi thích hợp. Điều này sẽ sao chép khối cuối cùng ra khỏi ổ đĩa của bạn vào một tệp có tên partition_header.hex. Sau đó, nó in một số dữ liệu từ tập tin đó.

sudo dd if=/dev/disk1 of=partition_header.hex bs=S skip=$((N-1)) count=1
od -cN 8 partition_header.hex
od -tx4 -N 8 -j 72 partition_header.hex
-d -tu4 -N 4 -j 84 partition_header.hex

Đầu ra cho ba odlệnh sẽ trông giống như sau:

0000000    E   F   I       P   A   R   T      
0000110          xxxxxxxx        yyyyyyyy        
0000124              ssss               

Nếu đầu ra từ lệnh đầu tiên không khớp với dòng đầu tiên đó, các bảng phân vùng của bạn đã bị ghi đè. Xem đề xuất của tôi ở cuối. Các giá trị xxxxxxxxyyyyyyyylà hai số thập lục phân. Chúng phải là số và chữ cái giữa a và f và chúng cho bạn biết nơi dữ liệu phân vùng thực sự được lưu trữ. Giá trị sssslà một số cho bạn biết kích thước của một mục phân vùng. Chạy lệnh này để lấy dữ liệu phân vùng, thay thế disk1, S, xxxxxxxx, yyyyyyyy, và ssss(lưu ý rằng x sau 0 là đen). Nếu sssslớn hơn 1/4 S, bạn có thể cần tăng tham số đếm, nhưng điều này là không thể.

sudo dd if=/dev/disk1 of=partition_entry.hex bs=S skip=$((0xyyyyyyyyxxxxxxxx)) count=1
od -tc -N 8 -j $((56+2*ssss)) partition_entry.hex
od -tc -N 8 -j $((56+3*ssss)) partition_entry.hex

Hai lệnh cuối cùng in phần đầu của tên của phân vùng thứ ba và thứ tư, với mỗi chữ cái theo sau \0(do mã hóa trên đĩa). Nếu bảng phân vùng của bạn vẫn hợp lệ, các bảng này sẽ là "Quay lại" và "Linh tinh". Nếu vậy, đã đến lúc lấy toàn bộ bảng phân vùng và thực hiện các sửa đổi cần thiết để lưu trữ nó ở đầu kia của ổ đĩa. Chạy hai lệnh này để có các LBA tiêu đề phù hợp và tổng số mục phân vùng:

od -tx1 -N 16 -j 24 partition_header.hex
od -td4 -N 4 -j 80 partition_header.hex

Lệnh đầu tiên trả về aa bb cc dd ee ff gg hh ii jj kk ll mm oo pp qq. Nhiều khả năng, ii01jjqua qqđược 00. Lệnh thứ hai trả về nnnn, rất có thể là 128. Bây giờ chúng ta có thể đọc toàn bộ bảng phân vùng, thay vì chỉ một vài bảng đầu tiên. Chạy lệnh này, thực hiện các thay thế thích hợp:

sudo dd if=/dev/disk1 of=partition_entry.hex bs=ssss skip=$((0xyyyyyyyyxxxxxxxx * S / ssss)) count=nnnn

Bây giờ chúng tôi cần thực hiện một số thay đổi cho tiêu đề vì dữ liệu sẽ được lưu trữ ở một vị trí khác.

printf '\xii\xjj\xkk\xll\xmm\xoo\xpp\xqq\xaa\xbb\xcc\xdd\xee\xff\xgg\xhh' | dd of=partition_header.hex bs=8 seek=3 count=2 conv=notrunc
printf '\x02\x00\x00\x00\x00\x00\x00\x00' | dd of=partition_header.hex bs=8 seek=9 count=1 conv=notrunc

Lệnh đầu tiên hoán đổi tiêu đề hiện tại và các địa chỉ tiêu đề khác. Xin lỗi về việc thay thế từng byte riêng biệt, nhưng tôi không biết một cách dễ dàng hơn. Lệnh thứ hai ghi địa chỉ mới của dữ liệu nhập. Giá trị 2 tôi đã sử dụng giả sử iilà 1 và jjđến bằng qq0. Nếu chúng có các giá trị khác, chỉ cần tăng toàn bộ một thứ và sử dụng thay thế. Điều duy nhất chúng ta cần bây giờ là MBR đúng, không có trên đĩa của bạn vì nó không phải là một phần của bảng phân vùng. May mắn thay, bạn có thể sử dụng một từ ổ đĩa nội bộ của bạn, vì vậy bạn cần sao chép nó vào một tập tin.

sudo dd if=/dev/disk0 of=drive_mbr.hex bs=512 count=1

Bây giờ chúng tôi có tất cả các dữ liệu, chúng tôi có thể viết nó ra. Đầu tiên, ngắt kết nối khối lượng Fedora nếu nó được gắn kết.

diskutil unmountDisk disk1

Sau đó, sao chép từng mảnh vào đầu ổ đĩa. Hãy chắc chắn để thực hiện các thay thế thích hợp trong các lệnh này, ghi vào đĩa sai sẽ không tốt.

sudo dd if=partition_entry.hex of=/dev/disk1 bs=S seek=2 count=nnnn
sudo dd if=partition_header.hex of=/dev/disk1 bs=S seek=1 count=1
sudo dd if=drive_mbr.hex of=/dev/disk1 bs=512 count=1

Các giá trị tìm kiếm được dựa trên giả định rằng iithông qua qqkhớp với các giá trị có khả năng. Nếu không, sử dụng $((0xqqppoommllkkjjii))cho lệnh thứ hai và $((0xqqppoommllkkjjii+1))cho lệnh đầu tiên.

Sau khi bạn thực hiện các lệnh này, OS X có thể sẽ tự động tải lại ổ đĩa và tải các phân vùng. Nếu không, chỉ cần ngắt kết nối và kết nối lại. Phân vùng Linux rất có thể sẽ không gắn kết được, vì tiêu đề của nó đã bị ghi đè, nhưng hai phần còn lại hy vọng sẽ hoạt động tốt. Mặc dù vậy, tôi vẫn sẽ đề nghị sao chép dữ liệu của bạn ra khỏi ổ đĩa và định dạng lại nó, hoặc ít nhất là sao chép dữ liệu phân vùng EFI từ ổ đĩa trong của bạn.


Nếu bảng phân vùng của bạn bị hỏng:

Tùy chọn có khả năng thành công nhất là tìm kiếm thủ công các tiêu đề HFS ở đầu phân vùng sao lưu của bạn. Định dạng của một khối HFS được mô tả ở đây . Về cơ bản, bạn sẽ cần tính toán phần bù gần đúng của phân vùng vào ổ đĩa bằng cách sử dụng bản đồ phân vùng bạn có, sau đó tìm kiếm từng khu vực trong khu vực tìm kiếm tiêu đề âm lượng. Bạn có thể có thể viết một kịch bản để tìm kiếm cho bạn.

Một lựa chọn khác là sử dụng phần mềm khôi phục tập tin. Tôi không biết phần mềm nào có sẵn sẽ xử lý tình huống này, vì vậy tôi không thể nói gì nhiều về nó.


Holy moly đây là rất nhiều thông tin. +1 dựa trên phần đầu tiên tôi đọc cho đến nay. Cảm ơn! Tôi sẽ tiếp tục với câu hỏi nếu tôi có bất kỳ.
Có Barry

Đức Giê-hô-va! Thật là một câu trả lời. Làm thế nào bạn học được tất cả những điều này, và có tài nguyên nào bạn có thể chỉ cho cộng đồng, cho bất kỳ ai quan tâm đến việc tìm hiểu thêm hoặc thậm chí chỉ để hiểu đầy đủ câu trả lời này?
Thu thập

@Harv Tất cả những gì tôi biết trước khi viết bài này là có một bảng sao lưu có thể được sử dụng và cách sao chép mọi thứ trực tiếp vào / từ một ổ đĩa. Tôi đã sử dụng trang wikipedia làm tài liệu tham khảo cho các định dạng bảng và chỉ cần đặt các phần lại với nhau, sử dụng dữ liệu của ổ đĩa của tôi làm bài kiểm tra. Nếu bạn muốn biết thêm về một lệnh cụ thể, hãy chạy man <command>trong Terminal.
ughoavgfhw

2

Đã làm điều này bản thân mình:

# dd if=freebsd.img of=/dev/hda

tại một số thời điểm trong quá khứ (ôi! ý tôi là fd0vậy!) tôi có thể đảm bảo khá nhiều rằng nội dung của disk1s1disk1s2bị vứt đi.

Nhưng disk1s3disk1s4sẽ chỉ tốt đẹp! Bạn chỉ cần tìm ra bảng phân vùng được cho là gì và sửa nó.

Tôi đề nghị khôi phục từ bản sao lưu GPT ở cuối đĩa hoặc chỉ tìm kiếm các điểm đánh dấu hệ thống tập tin để xác định vị trí của chúng.


Cảm ơn rất nhiều vì đã trả lời. Tôi sẽ cho bạn biết ngày mai những gì tôi tìm ra ngay sau khi tôi lấy lại đĩa của mình. Bây giờ tôi sẽ đọc cuốn sách về câu trả lời dưới đây.
Có Barry
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.