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 od
lệ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ị xxxxxxxx
và yyyyyyyy
là 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ị ssss
là 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 ssss
lớ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, ii
là 01
và jj
qua 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ử ii
là 1 và jj
đến bằng qq
0. 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 ii
thông qua qq
khớ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ó.