Cách xác định và sửa các tệp với các khối đĩa bị hỏng / không thể truy cập


9

Tôi có Macbook Pro cuối năm 2011, chạy Mavericks 10.9.2. Ổ cứng duy nhất của nó là ổ đĩa 750 GB, được định dạng bằng Bootcamp. Nó vẫn chạy khá tốt, nhưng khi chạy một đoạn chống phân mảnh trên nó, tôi đã xác định rằng có một loạt các tệp bị từ chối bởi trình chống phân mảnh (iDefrag).

iDefrag báo cáo mã lỗi POSIX là 5 khi truy cập các tệp. Chọn một cách ngẫu nhiên và cố gắng sao chép tệp vào một vị trí khác trong trình bao cũng báo cáo lỗi, điều này khiến tôi nghĩ rằng vấn đề là có thật và với đĩa / FS. Đầu ra của cp là:

cp: unity_nophysx.nexe: Input/output error

Mã lỗi 5 là 'truy cập bị từ chối' theo như tôi biết, nhưng quá trình chống phân mảnh đang chạy với tư cách quản trị viên và chạy cp bằng sudo trên tệp nghi ngờ không có sự khác biệt.

Disk Utility, fsck và Kiểm tra phần cứng của Apple đều khẳng định đĩa này vẫn ổn. Không có lỗi SMART nào được báo cáo và mặc dù có một số lỗi về quyền, nhưng chúng không có các tệp iDefrag đang phàn nàn và Disk Utility tuyên bố đã sửa chúng mà không có khiếu nại.

Có thể có một trăm hoặc nhiều tệp bị hỏng, nhưng vẫn là một phần rất nhỏ của ổ đĩa. Theo như tôi có thể nói, không có tệp hệ thống hoặc dữ liệu quan trọng nào bị ảnh hưởng. Mặc dù việc lấy lại dữ liệu sẽ rất tốt, tôi không ngại cài đặt lại hoặc đi sao lưu. Tại thời điểm này, tôi không biết liệu nó có thực sự là ổ đĩa chết không, chỉ là một số thành phần xấu do ổ đĩa bị di chuyển trong khi viết hoặc một số tham nhũng nhỏ khác có thể được xử lý. Tôi đang giả sử trường hợp xấu nhất và rất có thể tôi sẽ phải có một ổ cứng lớn hơn một chút và sao chép ổ đĩa hiện có để tránh phải xây dựng lại hệ thống.

Câu hỏi của tôi thực sự là làm thế nào để tôi đánh dấu các tệp bị hỏng đó là hỏng đúng cách và sửa chữa hoặc xóa chúng , để một bản sao của đĩa sẽ thành công và không bị treo trên các tệp / khối mà nó không thể truy cập. Disk Utility không thấy vấn đề và tôi không biết bất kỳ công cụ dòng lệnh hoặc công cụ bên thứ ba nào sẽ thực hiện công việc. Tôi không muốn xóa toàn bộ đĩa và bắt đầu lại từ đầu, vì ổ đĩa có vẻ khỏe mạnh, vì vậy tôi đang tìm kiếm các công cụ sửa chữa / chẩn đoán.


Tôi khuyên bạn nên đọc cuộc thảo luận tương tự khá chi tiết này trên SuperUser: superuser.com/q/148227 .
dan

Tôi đã thử nghiệm, không may trên một đĩa khỏe :), volitans-software.com/smart_utility.php . Nó trông giống như một công cụ khá đơn giản và nghiêm túc. Bạn có thể thử nó và đáng chú ý nhất là kiểm tra bộ đếm "các khu vực được phân bổ lại".
dan

Câu trả lời:


8

Nếu bạn đang phải đối mặt với một hệ thống tệp lành mạnh ở cấp cấu trúc của nó và muốn tìm các tệp có các khối bị lỗi đĩa, đây là cách tôi sẽ tiến hành:

  1. Tạo một bản sao lưu đầy đủ của đĩa của bạn với Time Machinehoặc Carbon Copy Cloner

    Kiểm tra bản sao lưu này.

  2. Chạy lệnh nặng và rủi ro sau (trong trường hợp bạn có các khối xấu bên ngoài cấu trúc hệ thống tệp của bạn) (đảm bảo {} được trích dẫn để tên tệp chứa khoảng trắng hoạt động):

    find / -type f -print -exec dd if="{}" of=/dev/null bs=1m \;
    

Lệnh nặng findnày sẽ in cho bất kỳ tệp đơn giản nào tên của nó (do đó không đọc nó, mà chỉ nhập mục thư mục của nó) và sau đó tiếp tục thực hiện đọc đầy đủ và nhanh chóng tất cả các khối dữ liệu của nó.

Khi hiting file đầu tiên có chứa khối xấu, điều này findsẽ gây ra hạt nhân để đăng nhập read errorvào /var/log/system.log, và nó hoặc là sẽ làm chậm hoặc mang lại hệ thống của bạn để tổng dừng lại. Điều này chủ yếu sẽ phụ thuộc vào dung lượng ổ cứng để di chuyển các khối xấu được tìm thấy trên nhóm bên trong dành riêng cho tác vụ sửa lỗi thông thường này. Tập tin này chứa các khối xấu sẽ là tên cuối cùng được in bởi find.

Viết tên tập tin này trên một tờ giấy! Hãy nói rằng tên tệp này là:

/.DocumentRevisions-V100/.cs/ChunkStorage/0/0/0/9

Tại thời điểm này, bạn có thể có khả năng tiêu diệt findnhanh bằng cách đánh ctrl+ C. Nếu giết nó một cách độc đáo là thất bại, chỉ cần đánh sập máy Mac của bạn.

Khi khởi động lại máy Mac của bạn, hãy kiểm tra trực tiếp tệp chứa các khối xấu:

dd if='/.DocumentRevisions-V100/.cs/ChunkStorage/0/0/0/9' of=/dev/null bs=1m

Nếu lệnh chấm dứt chính xác, thì lỗi đủ nhẹ để đĩa của bạn có thể đọc tệp này và phân bổ lại các khối xấu.

  • Nếu lệnh không chấm dứt, bạn sẽ không thể giết nó bình thường, dữ liệu của bạn hoàn toàn bị mất và bạn sẽ phải làm hỏng máy Mac của mình một lần nữa.

Trong trường hợp cuối cùng này, bạn phải xem xét việc thay thế đĩa của mình và làm việc từ các bản sao lưu cuối cùng. Một số tệp khác cũng có thể chứa các khối xấu và có thể vẫn không bị phát hiện trong một thời gian dài miễn là bạn không đọc chúng.

Hạt nhân sẽ không phát sinh lỗi đọc trên một khối bạn không bao giờ đọc.


Aha, đây hoàn toàn là mánh khóe mà tôi đã hy vọng. Đầu tiên vượt qua với tập lệnh find / dd chạm vào tất cả các tệp / khối trên đĩa và chắc chắn tôi tìm thấy một loạt các tệp có "Lỗi đầu vào / đầu ra" và tôi chỉ có thể xuất nhật ký của lệnh vào một tệp và sau đó grep nó để tìm ra tập tin nào là duff. Có vẻ như lệnh dd không đủ để kích hoạt bất kỳ loại sửa lỗi tự động nào (tôi thậm chí không biết OS X đã làm điều đó), nhưng ít nhất nó cho tôi một cách đáng tin cậy để xác định các tệp.
MrCranky

Về mặt tích cực, khi HĐH cố đọc từ các tệp có các khối xấu này, nó không bị sập hoặc treo lên khủng khiếp. Tôi thấy một May 10 20:42:15 ICE kernel[0]: disk0s2: I/O error.cửa sổ bật lên trong nhật ký, nhưng không biết tập tin nào đã kích hoạt nó. Nhưng sau đó lệnh chạy khá vui vẻ.
MrCranky

Hạt nhân của bạn không bị treo với BBFH vì đĩa của bạn vẫn có đủ các khối có sẵn trong nhóm của nó để sửa các khối xấu. ddkhông sửa chữa bất cứ điều gì, mục đích lệnh này là sao chép dữ liệu và chuyển đổi chúng nhanh nhất có thể. Đĩa vẫn có thể sửa chữa các lỗi ánh sáng. Hãy cẩn thận, giá của một đĩa không có gì sánh được với công việc của bạn.
dan

Mmm, vâng, tôi đã giả định rằng: dd chỉ là một công cụ ngu ngốc để trích xuất tất cả dữ liệu từ một tệp và đặt nó ở một nơi khác (trong trường hợp của chúng tôi, trong không khí mỏng). Điều thực sự quan trọng là mọi khối liên quan đến tệp được đọc. Những gì tôi không nhận được là những gì bạn mong đợi OS X sẽ làm trong trường hợp đó. Rõ ràng kernel không thể đọc được các khối xấu này, nhưng bạn có nghĩ rằng bản thân đĩa có thể và có thể sửa chúng không? Nếu nó không thể lấy dữ liệu ra khỏi khối xấu ban đầu, làm thế nào để chuyển nó đi nơi khác?
MrCranky

Câu hỏi tuyệt vời. Đĩa sẽ tự động thực hiện thử lại trên các khối đọc. Mỗi khi vị trí đầu là cơ học ở một vị trí khác nhau. Nếu một trong những nỗ lực này thành công, dữ liệu sẽ được sao chép trên một trong các khối có sẵn để sửa chữa các khối xấu. Khối xấu được gắn cờ là xấu và sẽ không bao giờ được sử dụng lại. Mặt khác, nếu tất cả các lần thử lại thất bại, thì dữ liệu sẽ không được lưu và sau một thời gian rất dài, đĩa sẽ gắn cờ khối là xấu và phân bổ một khối trống mới vào đĩa hiển thị. Nhân sẽ báo lỗi đĩa không thể phục hồi.
dan

4

Khởi động lại ở chế độ người dùng bằng cách giữ dấu Command+ Strong khi khởi động. Khi bạn thấy một dấu nhắc (sẽ giống như root #hoặc một cái gì đó tương tự), nhập fsck -fvà nhấn Return. Đây là công cụ kiểm tra tính nhất quán của hệ thống tệp tích hợp của Mac và cho phép bạn tìm và sửa lỗi với hệ thống tệp khởi động. Chạy lệnh này cho đến khi bạn không nhìn thấy **The volume [volume name] was modified.**hoặc công cụ thất bại ba lần liên tiếp.

Nếu công cụ thất bại, nó có thể là dấu hiệu của một vấn đề lớn hơn (nhưng tôi không thể nói cho bạn biết những gì mà không thấy đầu ra của công cụ). Trong mọi trường hợp, hãy đảm bảo bạn đã sao lưu mọi thứ bạn có thể trước khi chạy bất kỳ công cụ đĩa nào. Khi bạn đã hoàn tất, nhập rebootvào dấu nhắc và nhấn enter để (bạn đoán nó!) Khởi động lại máy tính của bạn.

Để biết thêm thông tin, bạn có thể tìm thấy các trang hướng dẫn fsck ở đây .


Thú vị, nhưng nó trông rất giống fsck, ngay cả với -f và ở chế độ một người dùng, đang làm đúng như những gì Disk Utility đã làm. Giống như Disk Utility, nó không tìm thấy gì và nghĩ rằng đĩa chỉ hoạt động tốt. Tôi cho rằng nó đang quét các bản ghi hệ thống tệp, nhưng tôi nghĩ vấn đề của tôi là ở cấp độ khối - tức là hệ thống tệp có cấu trúc tốt, nhưng dữ liệu thực tế trong các tệp không thể truy cập được khi đọc / sao chép / chống phân mảnh chúng.
MrCranky

1
→ MrCranky: đúng! fsck& Disk Utilityđang kiểm tra tính toàn vẹn cấu trúc hệ thống tệp. Họ đọc các khối đĩa được phân bổ cho cấu trúc hệ thống tệp. Chúng không được thực hiện để xác minh tính toàn vẹn của khối dữ liệu. Do đó, chúng có thể chạy trên đĩa với các khối bị lỗi mà không tăng bất kỳ lỗi đọc nào. Nếu bạn muốn kiểm tra đĩa của mình, ngay cả các khối có thể bị lỗi nhưng thực sự không được sử dụng, chỉ cần sử dụng một công cụ cơ bản như dd if=/dev/disk0 of=/dev/null ibs=1ktrong một cửa sổ shell khác chạy tail -f /var/log/system.log. Điều này là miễn phí, cực kỳ và sẽ không che giấu bạn bất kỳ lỗi nào.
dan

2

Tôi rất muốn giới thiệu DiskWar Warrior để xây dựng lại danh mục đĩa và để quét các tệp có khả năng bị hỏng .

Trong quá trình xây dựng lại danh mục, nó cũng có thể cho bạn biết nếu nó gặp sự cố chậm do trục trặc đĩa.


Tôi không phản đối việc mua một công cụ để giúp đỡ, nhưng không có bản dùng thử và không đảm bảo rằng nó thậm chí còn được thiết kế để tìm ra loại lỗi tôi gặp phải, tôi cần thêm rất nhiều đề xuất để sao lưu trước khi chuẩn bị giảm 100 đô la trên một công cụ.
MrCranky

-1 Không chỉ là một câu trả lời, mà là sự pha trộn giữa nhận xét và trả lời.
Tối đa

2

Làm việc với câu trả lời của Buscar, bạn có thể tự động thực hiện việc này bằng cách sử dụng một số dòng lệnh khá nặng.

sudo find / -type f -print0  | xargs -0 -I{} dd if='{}' of=/dev/null bs=1m 2>&1 | grep 'error' >>badfiles.txt  & 
  • sudo: Chế độ quản trị viên
  • tìm -print0: đường dẫn tuyệt đối
  • xargs -0 -I {}: thay thế {} trong lệnh tiếp theo
  • dd 2> & 1: chuyển hướng lỗi std sang thiết bị xuất chuẩn
  • stdout ống để grep tìm kiếm lỗi chuỗi
  • Nối kết quả vào một tệp danh sách. ( Lưu ý : Điều này sẽ có trên phương tiện bên ngoài nếu bạn tin rằng ổ đĩa trong của bạn là iffy)

1

Như bạn nói, thậm chí không rõ các tệp đó bị hỏng, ít nhất là máy Mac của bạn không nghĩ vậy.

Mỗi hệ điều hành làm cho các tệp không thể di chuyển được cần thiết cho các hoạt động của nó (Khôi phục điểm, các tệp hiện đang hoạt động ....). Một số phân mảnh sẽ cho họ thấy, một số thì không.

Việc bạn không thể truy cập hoặc di chuyển chúng không có nghĩa là chúng bị hỏng.

Thông thường Mac rất giỏi trong việc tự chăm sóc chúng.

Sử dụng bảo trì Apple được thực hiện bằng cách: mở Terminal và gõ:

sudo periodic daily weekly monthly 

theo sau là Return, nhập mật khẩu Quản trị viên và OS X sẽ giải quyết mọi việc cho bạn.

Tìm trong Bảng điều khiển cho các báo cáo về những báo cáo nếu bạn quan tâm.

Mặc dù trong Giao diện điều khiển (tìm kiếm) cho bất kỳ lỗi I / O nào cho thấy đĩa của bạn đang bắt đầu có vấn đề, hãy khen ngợi Disk Utility và các phát hiện fsck.

Thỉnh thoảng tôi sử dụng một công cụ miễn phí có tên OnyX cho nhiệm vụ bảo trì bổ sung. Nó được làm bởi người Pháp và vì họ ăn nó rất tuyệt :)

OnyX là một tiện ích đa chức năng cho OS X, cho phép bạn xác minh đĩa khởi động và cấu trúc của các tệp hệ thống của nó, để chạy các tác vụ linh tinh của bảo trì hệ thống, để định cấu hình một số tham số ẩn của Finder, Dock, QuickTime, Safari, Mail, iTunes , cửa sổ đăng nhập, Spotlight và nhiều ứng dụng của Apple, để xóa bộ nhớ cache, để xóa một số tệp và thư mục nhất định có thể trở nên cồng kềnh và hơn thế nữa.

Với tất cả những gì đã nói, tôi không đặt câu hỏi về quyết định của bạn về việc sử dụng trình chống phân mảnh (iDefrag) vì tôi không biết điều đó, mà chỉ đưa ra các giải pháp thay thế.


Việc sử dụng trình chống phân mảnh không phải là vấn đề, tôi hoàn toàn nhận thức được OS X làm gì và không làm gì trong vấn đề đó. Các tệp này chắc chắn không được sử dụng, đây là các tệp dữ liệu cho một ứng dụng không hoạt động và thực sự ứng dụng này hiện không thể di chuyển được.
MrCranky

Trên Onyx - một lần nữa nó hoạt động ít hơn so với Disk Utility - kiểm tra trạng thái SMART của đĩa và sau đó chạy chẩn đoán kiểu fsck (như chúng tôi đã nghĩ rằng không có gì sai)
MrCranky

Nói rõ hơn, đối với bất kỳ ai khác đọc câu trả lời này, các tệp chắc chắn đã bị hỏng và Mac biết điều đó, vì tôi không được phép đọc từ chúng (sao chép chúng, bất cứ điều gì). Đó không phải là vì chúng là các tệp hệ thống hoặc được sử dụng vào thời điểm đó, điều đó đúng ngay cả với các tệp dữ liệu người dùng. Bảo trì định kỳ không giúp ích gì cho vấn đề, một lần nữa bởi vì fscknó dường như chỉ quan tâm đến các vấn đề hệ thống tệp, không chặn các vấn đề về khả năng truy cập. Bảng điều khiển chỉ hiển thị lỗi khi tôi cố gắng sao chép / đọc dữ liệu từ một trong những tệp bị hỏng này một cách thủ công, không có ích gì trong việc tìm kiếm chúng.
MrCranky

0

Nghe có vẻ không hợp lý, trước khi làm bất cứ điều gì bạn nên sao chép tất cả dữ liệu của mình vào một ổ đĩa tốt đã biết. Nếu khởi động từ trình cài đặt và sao chép dữ liệu không thành công, có một tiện ích dòng lệnh được gọi là 'dd' có thể thực hiện sao chép ở mức độ thấp và theo cách không thỏa hiệp hơn nhiều.

 man dd

để biết thêm thông tin về dd bao gồm sử dụng và cú pháp thích hợp.


Một phiếu bầu khác cho bài đăng của Matt, khởi động chế độ một người dùng và chạy

 fsck -fy 

lặp đi lặp lại cho đến khi fsck dừng báo cáo lỗi.


Một phiếu bầu cho bài đăng của Adam, DiskWar Warrior là một ứng dụng đơn giản nhưng rất mạnh mẽ sẽ báo cáo lỗi ổ cứng, kiểm tra các tệp riêng lẻ để sửa lỗi và sửa chữa chúng nếu có thể, xây dựng lại và tối ưu hóa cấu trúc thư mục.


Một giải pháp khả thi khác nghe có vẻ không hợp lý nhưng thường là nỗ lực cuối cùng để khôi phục dữ liệu với nhiều bằng chứng xác thực cho sự thành công là kéo ổ đĩa, bảo vệ nó khỏi hơi ẩm bằng cách sử dụng một vài lớp túi cấp đông và đặt nó trong tủ đông của bạn 30-45 phút. Sau đó, trong khi ổ đĩa lạnh, gắn ổ đĩa vào ổ cắm USB bên ngoài và sử dụng một hệ thống tạm thời khác để cố gắng sao chép dữ liệu bị hỏng sang ổ đĩa khác. Nói chung, điều này được sử dụng nếu có vấn đề về phần cứng và ổ đĩa bị lỗi. Nếu bạn có thể sao chép toàn bộ ổ đĩa với dữ liệu của mình nguyên vẹn, điều này là lý tưởng, vì thường thì việc phân vùng lại và định dạng lại sẽ cho ổ đĩa một hợp đồng mới trong cuộc sống.


Như tôi đã nói, fsck không báo cáo bất kỳ lỗi nào. Đĩa vẫn chưa bình thường hoặc báo cáo lỗi ngẫu nhiên và danh sách các tệp bị hỏng dường như không tăng, vì vậy tôi không tin rằng tôi đang ở bất kỳ đâu gần giai đoạn 'đóng băng cho lần kéo khẩn cấp cuối cùng'. Tôi cũng đã sao lưu rất tốt ở cấp độ tệp / thư mục và không lo lắng về việc mất dữ liệu, như tôi đã nói trong câu hỏi. Thật tốt khi nghe một phiếu bầu khác cho DiskWar Warrior.
MrCranky

@MrCranky: Tôi tin rằng bạn đề cập đến một cái gì đó được đăng trước khi cập nhật câu hỏi của bạn; Tôi đã củng cố ý tưởng fsck cho bất kỳ ai tìm thấy trang này để tìm giải pháp cho các triệu chứng tương tự. Đối với bất cứ điều gì tôi đã đăng về lỗi ổ cứng, nó không bao giờ bị tổn thương để trở nên toàn diện, một lần nữa, cho người khác và không nhất thiết là cá nhân bạn. Tôi đã nhìn thấy sự chia sẻ công bằng của tôi về các lỗi ổ cứng. Thường thì không có dấu hiệu cho thấy sự thất bại, ngay cả với công nghệ SMART, cho đến khi bạn không còn có thể truy cập dữ liệu bằng bất kỳ phương tiện nào. Nếu bạn quan tâm đến dữ liệu, tôi thực sự khuyên bạn nên có một ổ đĩa mới và sao lưu dữ liệu của mình.
chillin

Tôi chắc chắn không đồng ý với đề xuất sao lưu, nhưng tinh thần của định dạng Hỏi & Đáp là trả lời câu hỏi được đặt ra, không phải là câu hỏi "làm cách nào để sửa đĩa bị hỏng" (trong đó có nhiều câu hỏi). Ngay trước khi tôi chỉnh sửa nó để thêm fsckvào danh sách "những thứ cho rằng đĩa này ổn", tôi đã trả lời câu trả lời đề cập đến việc fsckgiảm giá trị của nó. fsckvà Disk Utility thực hiện nhiều chức năng tương tự, và đó là hoạt động trên các cấu trúc hệ thống tệp, không phải ở cấp độ khối. Tôi đã cố gắng để được khá cụ thể rằng đây là một vấn đề khối, không phải là một vấn đề hệ thống tập tin.
MrCranky

0

Đối với một tệp không thể đọc toàn bộ do lỗi đọc đĩa, bạn có thể sử dụng ddtiện ích để sao chép tệp thành một ổ đĩa ngoài, thay thế các byte NUL cho các khối không thể đọc được. Rất khuyến khích nhân đôi sang một ổ đĩa khác (ví dụ: "Đĩa USB" trong ví dụ bên dưới).

Thí dụ:

dd if=/path/to/damaged/file of=/Volumes/USB\ Disk/file bs=512 conv=noerror,sync

Bằng cách sử dụng các khối 512 byte, số khối tối đa có thể đọc được sẽ được phục hồi.

Việc khôi phục có thể mất nhiều thời gian, vì kernel sẽ chặn một thời gian cho mỗi lần đọc thất bại.

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.