Як визначити та виправити файли із пошкодженими / недоступними блоками диска


9

У мене наприкінці 2011 року Macbook Pro, який працює Mavericks 10.9.2. Його єдиний жорсткий диск - це накопичувач об'ємом 750 ГБ, відформатований з Bootcamp. Він все ще працює досить добре, але, виконуючи пропуск дефрагментації на ньому, я виявив, що існує купа файлів, які відмовляються переміщуватися дефрагментатором (iDefrag).

iDefrag повідомляє код помилки POSIX 5 при доступі до файлів. Вибір одного випадковим чином і спроба скопіювати файл в інше місце в оболонці також повідомляє про помилку, через що я думаю, що проблема справжня і з диском / FS. Вихід CP є:

cp: unity_nophysx.nexe: Input/output error

Код помилки 5 - "заборонено доступ", наскільки мені відомо, але процес дефрагментації працює як адміністратор, а запуск cp за допомогою sudo на підозрюваному файлі не має ніякої різниці.

Disk Utility, fsck і тест апаратного забезпечення Apple, всі стверджують, що диск є нормальним. Не було повідомлено про помилки SMART, і, хоча були деякі помилки дозволів, вони були не з файлами, на які скаржаться iDefrag, а Disk Utility стверджує, що їх виправили без скарги.

Можливо, є сто і більше пошкоджених файлів, але все ще дуже мала частина диска. Наскільки я можу сказати, жодних системних файлів чи важливих даних це не впливає. Хоча було б непогано отримати дані, я не проти перевстановити чи збиратися робити резервні копії. На даний момент я не знаю, чи насправді диск вмирає, лише якісь погані сектори через переміщення диска під час написання чи інша незначна корупція, яку можна вирішити. Я припускаю найгірший випадок, і, швидше за все, мені доведеться отримати трохи більший жорсткий диск і клонувати існуючий диск, щоб уникнути необхідності відновлення системи.

В мене справді питання, як я беруся до маркування цих зламаних файлів як належних помилок та їх виправлення чи очищення , так що клон диска матиме успіх і не зависає на файлах / блоках, до яких він не може отримати доступ. Disk Utility не бачить проблеми, і я не знаю жодного командного рядка чи інструментів сторонніх розробників, які б справили цю роботу. Я не хочу списати весь диск і почати з нуля, оскільки накопичувач здається інакше здоровим, тому я шукаю інструменти для ремонту / діагностики.


Раджу прочитати цю досить детальну подібну дискусію на SuperUser: superuser.com/q/148227 .
дан

Я тестував, на жаль, на здоровому диску :), volitans-software.com/smart_utility.php . Це схоже на досить простий і серйозний інструмент. Ви можете спробувати, і особливо помітити лічильник "перерозподілених секторів".
дан

Відповіді:


9

Якщо ви зіткнулися зі здоровою файловою системою на рівні її структури і хочете знайти файли, які мають несправні блоки на диску, ось як би я діяв:

  1. Зробіть повну резервну копію диска за допомогою Time Machineабо Carbon Copy Cloner

    Перевірте цю резервну копію.

  2. Запустіть таку важку та ризиковану команду (якщо у вас погані блоки поза структурою файлової системи) (переконайтесь, що {} цитується так, щоб файли, що містять пробіли):

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

Ця важка findкоманда надрукує для будь-якого простого файлу його ім’я (таким чином, не читаючи його, а лише його запис у каталог), а потім продовжить робити повне та швидке зчитування всіх його блоків даних.

Після hiting першого файлу , що містить дефектні блоки, це findзмусить ядро увійти read errorна /var/log/system.log, і це буде або уповільнити або привести вашу систему до повної зупинки. В основному це залежатиме від ємності жорсткого диска для переміщення поганих блоків, знайдених у його внутрішньому пулі, присвяченому цій звичайній задачі виправлення. Цей файл, що містить неправильні блоки, буде прізвищем, надрукованим користувачем find.

Запишіть це ім’я файлу на аркуші паперу! Скажімо, що це ім'я файлу:

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

У цей момент у вас може бути можливість findшвидко вбити, натиснувши ctrl+ C. Якщо вдало вбити це не вдасться, просто розбийте ваш Mac.

Перезавантаживши свій Mac, безпосередньо перевірте файл, що містить погані блоки:

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

Якщо команда закінчується правильно, то помилка була достатньо легкою, щоб ваш диск міг прочитати цей файл і перерозподілити погані блоки.

  • Якщо команда не завершиться, ви не зможете нормально її вбити, ваші дані повністю втрачені, і вам доведеться ще раз зламати ваш Mac.

В останньому випадку вам доведеться розглянути можливість заміни диска та працювати з останніми резервними копіями. Деякі інші файли також можуть містити погані блоки та можуть залишатися невизначеними протягом тривалого часу, поки ви їх не читали.

Ядро не запустить помилку читання на блоці, який ви ніколи не читали.


Ага, це абсолютно та сама хитрість, на яку я сподівався. Перший перехід зі скриптом find / dd зачіпає всі файли / блоки на диску, і я досить знайшов купу файлів, які дають "Помилка вводу / виводу", і я можу просто вивести журнал команди в файл і потім переконайтеся, щоб дізнатися, які файли є дафф. Здається, що команда dd сама по собі недостатня для запуску автоматичного виправлення (я навіть не знала, що це робило OS X), але, принаймні, це дає мені надійний спосіб визначити файли.
MrCranky

З іншого боку, коли ОС намагається прочитати з файлів ці погані блоки, вона не виходить з ладу або зависає. Я бачу May 10 20:42:15 ICE kernel[0]: disk0s2: I/O error.спливаюче вікно в журналах, але ніякої підказки про те, який файл його викликав. Але тоді команда працює досить щасливо.
MrCranky

Ядро не зависає з BBFH, оскільки на вашому диску все ще є достатня кількість блоків у його пулі, щоб виправити погані блоки. ddнічого не виправляє, мета цієї команди - скопіювати дані та перетворити їх якомога швидше. Диск все ще може виправити легкі помилки. Будьте уважні, ціна диска ні з чим не порівнюється з вашою роботою.
дан

Ммм, так, я б припустив, що: ДД - це просто тупий інструмент для перекомпонування всіх даних з одного файлу та розміщення їх десь в іншому місці (в нашому випадку - в повітря). Що насправді важливо, це те, що кожен блок, пов'язаний з файлом, читається. Те, що я не отримую, - це те, що ви очікуєте зробити в такому випадку OS X. Ясно, що ядро ​​не може прочитати ці погані блоки, але ви думаєте, що сам диск може і може їх виправити? Якщо він не може витягнути дані з оригінального поганого блоку, як це перенести їх в інше місце?
MrCranky

Відмінне запитання. Диск автоматично здійснюватиме повторення на блоках читання. Кожен раз, коли положення голови механічно знаходиться в іншому положенні. Якщо одна з цих спроб є успішною, дані копіюються в один з блоків, доступних для відновлення поганих блоків. Поганий блок позначений як поганий і більше ніколи не буде використовуватися. З іншого боку, якщо всі спроби не вдаються, дані не зберігаються, і через дуже довгий час диск позначить блок як поганий і виділить новий порожній на видимий диск. Ядро повідомить про помилку диска, яку не можна знайти.
дан

5

Перезавантажте в режимі одиночного користувача, утримуючи Command+ Sпід час завантаження. Коли ви побачите підказку (має виглядати root #або щось подібне), введіть fsck -fі натисніть Return. Це вбудований інструмент перевірки узгодженості файлової системи Mac і дозволяє знаходити та виправляти помилки за допомогою файлової системи запуску. Виконайте цю команду, поки ви не побачите **The volume [volume name] was modified.**або інструмент не вийде з ладу три рази поспіль.

Якщо інструмент виходить з ладу, це може свідчити про більшу проблему (але я не можу сказати вам, що не побачивши вихід цього інструменту). У будь-якому випадку перед тим, як запустити будь-який дисковий інструмент, переконайтесь, що ви створили резервну копію всього, що можна. Закінчивши, введіть rebootпідказку та натисніть клавішу Enter, щоб (ви здогадалися!) Перезавантажте комп'ютер.

Для отримання додаткової інформації ви можете знайти тут сторінки керівництва fsck .


Цікаво, але це дуже схоже на fsck, навіть при -f і в режимі для одного користувача, робить саме те, що зробила Disk Utility. Як і Disk Utility, він нічого не знаходить і вважає, що диск просто чудовий. Я припускаю, що це сканування записів файлової системи, але я думаю, що моя проблема знаходиться на рівні блоку - тобто файлова система добре структурована, але фактичні дані в файлах не можуть бути доступні, коли мова йде про читання / копіювання / дефрагментація їх.
MrCranky

1
→ MrCranky: так! fsck& Disk Utilityперевіряють цілісність структури файлової системи. Вони зчитують дискові блоки, виділені для структури файлової системи. Вони не створені для перевірки цілісності блоків даних. Отже, вони можуть працювати на диску з відмовними блоками, не збільшуючи помилок читання. Якщо ви хочете перевірити свій диск, навіть блоки, які можуть бути несправними, але насправді не використовуються, просто використовуйте основний інструмент dd if=/dev/disk0 of=/dev/null ibs=1kпід час виконання іншого вікна оболонки tail -f /var/log/system.log. Це безкоштовно, екстремально і не приховає вас жодної помилки.
дан

2

Я дуже рекомендую DiskWarrior для відновлення каталогів дисків та для сканування потенційно пошкоджених файлів .

Під час відновлення каталогу він також може повідомити вам про те, що у нього затримка через несправність диска.


Я не проти купувати інструмент, який допоможе, але без судового розгляду і без гарантії, що він навіть розроблений для пошуку тих помилок, які я відчуваю, мені знадобиться набагато більше рекомендацій, щоб створити резервну копію ваших, перш ніж бути готовий скинути 100 доларів на інструмент.
MrCranky

-1 Не просто відповідь, а поєднання коментарів та відповідей.
bot47

2

Опрацьовуючи відповідь Бускара, ви можете це зробити автоматично, використовуючи досить важкий командний рядок foo.

sudo find / -type f -print0  | xargs -0 -I{} dd if='{}' of=/dev/null bs=1m 2>&1 | grep 'error' >>badfiles.txt  & 
  • sudo: Режим адміністратора
  • знайти -print0: абсолютний шлях
  • xargs -0 -I {}: заміна {} у наступній команді
  • dd 2> & 1: помилка перенаправлення std на stdout
  • трубопровід на греп, шукаючи рядкову помилку
  • Додайте результати до файлу списку. ( Примітка . Це має бути на зовнішніх носіях, якщо ви вважаєте, що ваш внутрішній диск накопичується)

1

Як ви кажете, навіть не ясно, що ці файли пошкоджені, принаймні ваш Mac не вважає цього.

Кожна ОС створює незмінні файли, необхідні для її роботи (Точки відновлення, активні в даний час файли тощо). Деякі дефраги покажуть їх, деякі - ні.

Те, що ви не можете отримати доступ до них або перемістити їх, не означає, що вони пошкоджені.

Зазвичай Mac дуже добре піклується про них.

Використання Apple обслуговування здійснюється за допомогою: відкрийте термінал і введіть:

sudo periodic daily weekly monthly 

після чого повернеться, введіть пароль адміністратора, і OS X подбає про вас.

Подивіться у консолі звіти про тих, хто вас цікавить.

Перебуваючи в консолі, шукайте будь-які помилки вводу / виводу, які вказували б на ваш диск, починають виникати проблеми, щоб зробити комплімент Disk Utility та fsck.

При нагоді я використовую безкоштовний інструмент під назвою OnyX для додаткового завдання з обслуговування. Його роблять французи, і як вони їдять, це просто чудово :)

OnyX - це багатофункціональна утиліта для OS X, яка дозволяє перевірити стартовий диск та структуру його системних файлів, виконувати різні завдання системного обслуговування, налаштовувати деякі приховані параметри Finder, Dock, QuickTime, Safari, Mail, iTunes , вікно входу, прожектор та багато програм Apple, щоб видалити кеші, видалити певну кількість файлів і папок, які можуть стати громіздкими тощо.

Зважаючи на все це, я не ставлю під сумнів ваше рішення щодо використання дефрагментатора (iDefrag), оскільки я цього не знаю, але пропоную альтернативні рішення.


Використання дефрагментатора - це не проблема, я прекрасно знаю, що робить і чим займається OS X у цьому плані. Файли точно не використовувались - це файли даних для програми, яка не була активною, і програму зараз не можна переміщувати.
MrCranky

У Onyx - це знову робиться трохи більше, ніж утиліта Disk Utility - перевірка статусу SMART диска, а потім запуск діагностики у стилі fsck (яка, як ми встановили, думає, що немає нічого поганого)
MrCranky

Щоб було зрозуміло, для всіх, хто читав цю відповідь, файли, безумовно, були пошкоджені, і Mac це знав, тому що мені не було дозволено читати з них (копіювати їх, що завгодно). Це було не тому, що вони були системними файлами або використовувались у той час, це було правдою навіть для файлів даних користувачів. Періодичне обслуговування не допомогло усунути проблему, знову ж таки тому, що, як fsckвидається, це стосується лише проблем з файловою системою, а не блокування проблем із доступністю. Консоль виявляла помилки лише тоді, коли я вручну намагався скопіювати / прочитати дані з одного з цих зламаних файлів, це не допомогло їх знайти.
MrCranky

0

Як би це нерозумно не звучало, перед тим, як робити що-небудь, слід дублювати всі свої дані на відомому хорошому диску. Якщо завантаження з інсталятора та копіювання даних не вдається, існує утиліта командного рядка під назвою 'dd', яка може робити дублювання низького рівня та набагато більш безкомпромісним способом.

 man dd

для отримання додаткової інформації про dd, включаючи використання та належний синтаксис.


Ще одне голосування за допис Метта, завантажте однокористувацький режим та запустіть

 fsck -fy 

знову і знову, поки fsck не припинить повідомляти про помилки.


Голосуючи за посаду Адама, DiskWarrior - це простий у використанні, але дуже потужний додаток, який повідомлятиме про помилки на жорсткому диску, перевіряє окремі файли на помилки та, по можливості, відновлює їх, а також відновлює та оптимізує структури каталогів.


Ще одне можливе рішення, яке може здатися необґрунтованим, але часто є останньою спробою канави відновити дані з великою кількістю неонових доказів успіху, - витягнути накопичувач, захистити його від вологи за допомогою декількох шарів морозильних мішків та помістити його у морозильну камеру для 30-45 хвилин. Потім, поки диск не холодний, встановіть його у зовнішній док-станцію USB та використовуйте іншу тимчасову систему, щоб знову спробувати скопіювати пошкоджені дані на інший диск. Як правило, це використовується, якщо є проблема з апаратним забезпеченням, а диск не працює. Якщо ви можете дублювати весь диск із недоторканими, це ідеально, оскільки часто перерозподіл та переформатування дадуть диску нову оренду на життя.


Як я вже говорив, fsck не повідомляє про помилки. Диск ще не темпераментний або не повідомляє про випадкові помилки, і список файлів, які пошкоджені, схоже, не зростає, тому я не вірю, що я ще десь поруч із етапом «заморожування для останнього аварійного витягування». Я також дуже добре створив резервну копію на рівні файлів / папок і не переживаю за втрату даних, як я сказав у запитанні. Приємно почути ще один голос за DiskWarrior.
MrCranky

@MrCranky: Я вважаю, що ви посилаєтесь на щось, розміщене до оновлення свого питання; Я підкріплював ідею fsck для тих, хто знаходив цю сторінку, шукаючи рішення для подібних симптомів. Що стосується всього, що я писав про збій жорсткого диска, це ніколи не зашкодить бути всеосяжним для інших, а не обов'язково особисто для вас. Я бачив свою справедливу частку відмов жорсткого диска. Часто немає жодних ознак збою, навіть якщо не застосовується технологія SMART, поки ви більше не зможете отримати доступ до даних будь-якими способами. Якщо ви дбаєте про дані, я настійно рекомендую вам отримати новий диск і створити резервну копію даних.
чилін

Я, звичайно, не погоджуюся з рекомендацією щодо резервного копіювання, але дух формату запиту - відповісти на поставлене питання, а не на загальне питання "як виправити зламаний диск" (яких існує багато). Перед тим, як я її відредагував, щоб додати fsckдо списку "речей, які вважають диск добре", я відповів на відповідь, де згадується fsckйого корисність. fsckі Disk Utility виконують майже таку ж функцію, і це працювати в структурах файлової системи, а не на рівні блоку. Я намагався бути досить конкретним, що це проблема блоку, а не проблема файлової системи.
MrCranky

0

Для одного файлу, який не може бути прочитаний у повному обсязі через помилку читання диска, ви можете скористатися ddутилітою для дублювання файлу на зовнішній об'єм, замінивши NUL байтами для блоків, які неможливо прочитати. Дуже рекомендується дублювати на інший об'єм (наприклад, "USB-диск" у прикладі нижче).

Приклад:

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

За допомогою 512-байтних блоків буде відновлено максимальну кількість читабельних блоків.

Відновлення може зайняти тривалий час, оскільки ядро ​​буде блокуватися деякий час на кожному невдалому прочитаному.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.