Як виправити 512-байтовий сектор MBR на 4096-байтному секторному диску?


23

Остаточне оновлення:

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


Спочатку

У мене був комп’ютер і мені потрібно більше місця, я придбав новий накопичувач на 500 ГБ і USB-корпус. Незабаром я помітив, що якби я розділив накопичувач на корпусі і перемістив його на комп'ютер, він не розпізнає розділи (і навпаки). Я припускав, що це проблема з корпусом, і не хвилювався з цього приводу.

Потім, трагедія

Чудовий день, мій комп'ютер вирішив більше не включати. Виявляється материнська плата (без фірмової, просто велика Зроблена в Китаї на ній надрукована) мертва. Я використовував його як файловий сервер, і накопичувач на 500 ГБ зараз переповнений даними, які я не можу дозволити собі втратити. Зараз я зламаний і не можу дозволити собі новий комп’ютер, тому моєю єдиною надією був «несправний» корпус USB.

Розслідування

Озброївшись декількома дистрибутивами Linux, ноутбуком, VirtualBox та корпусом, я зробив криміналістичний аналіз цього питання. dmesg повідомив, що розмір розділу перевищує кінець диска. Тому я переглянув таблиці даних жорсткого диска, підрахував підрахунок секторів з нуля, перевірив межі диска вручну з dd, і все виглядало нормально, поки я не запустив fdisk, і він сказав:

    Note: Sector size is 4096 (not 512).

Як скромний fdisk. Ця «записка» була корінь усіх питань. Після ще декількох підступів були зроблені наступні висновки:

  • Корпус USB не є несправним.

  • Контролер SATA на тепер уже мертвій материнській платі - це, принаймні, "дивно". Він не повідомляв 4096-байтові сектори операційній системі, тому ОС із задоволенням створила MBR, використовуючи 512-байтові секторальні адреси.

  • Тепер, коли я намагаюся отримати доступ до розділу, ОС намагається використовувати 512-байтові адреси на 4096-байтному секторному диску, і, звичайно, це не вийде.

Питання

  • Отже, як я можу виправити адреси в MBR, щоб вони були дійсними на розмір сектору 4096 байтів, окрім редагування MBR вручну в шестигранному редакторі, і

  • Розділи не вирівняні для 4096-байтних секторів. Чи є якийсь інструмент, щоб вирівняти їх, крім того, щоб скопіювати та вийти з іншого диска? (У мене немає запасних накопичувачів) чи мені потрібно буде створити якийсь інструмент, який "пересуває" дані в бік, трохи потроху? Перегородки є ext3.

Спасибі!

Оновлення:

Я виявив, що в цьому запитанні є розумний спосіб використовувати dd для переміщення розділу на місці: Як перемістити розділ у GNU / Linux? Але я не знаю, чи буде це працювати на фрагменті сектора. Я не можу перевірити це зараз, але буду робити, коли у мене є час.

Оновлення 2:

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


не знаю, але зауваження - звучить так, що ви могли б дати уроки, як працюють комп’ютери! (і тоді, якщо це допоможе вирішити проблему, придбайте ще один жорсткий диск з готівкою)
барлоп

@barlop Дякую! Але я вже повинен розділити свій день між роботою і коледжем, тому друга робота зараз не працює;) мені доведеться виправити ці розділи важким способом =)
NothingsImpossible

1
ЧОЛОВІЦЬ 6 РОКІВ, І Я ВІДПОВІДУЮ ВСІ ОСТАННІ НОЧИ В УСІЙ ЦІЙ ПРОБЛЕМІ!
Леонель

1
Гаразд, тому у мене протилежна проблема: у мене диск від 1 ТБ відформатований за допомогою корпусу. Таким чином, він був відформатований, використовуючи 4096 байт на адресу сектору. Мені не комфортно редагувати MBR вручну. І мені потрібно використовувати жорсткий диск безпосередньо на SATA (512 байт на сектор) Будь-які пропозиції?
Леонель

1
@Leonel Ви можете використовувати Linux fdiskдля редагування MBR (я дізнався про це пізніше, не потрібні шістнадцяткові редактори :)) Ви можете змінити кожну початкову точку та розмір входу та переглянути зміни перед застосуванням. Отже: почніть fdisk, запишіть поточну конфігурацію (або краще, скопіюйте резервну копію MBR dd), помножте значення стартової адреси та розміру на 8 та змініть їх. Обов’язково перевірте все за допомогою калькулятора і зрозумійте, що означають значення. Ви побачите , що розмір = End - Start + 1, і що fdiskпоказує розмір в блоці 1000-секторів, так що вам може знадобитися , щоб включити режим експерта, щоб побачити , реальну вартість і т.д.
NothingsImpossible

Відповіді:


24

Питання розміру сектору стають досить складними. До кінця 2009 року переважна більшість жорстких дисків використовувала 512-байтні сектори, і це було саме це. В кінці 2009 року виробники дисків почали впроваджувати так звані диски Advanced Format (AF), які використовують 4096-байтові сектори. Ці перші диски AF (і, AFAIK, усі AF-диски сьогодні) представляють інтерфейс до комп'ютера, який показує, що кожен 4096-байтний фізичний сектор розділений на вісім 512-байтних логічних секторів. Ця конверсія дозволяє старішим інструментам, включаючи багато BIOS, що були побудовані з припущеннями 512 байти, продовжувати працювати. Я не знаю, чи ваш диск використовує AF чи ні, але в будь-якому випадку він майже напевно використовує 512-байтний розмір логічного сектору, тобто інтерфейс до ОС повинен використовувати 512-байтовий сектор.

Ускладнення питань - це певні корпуси USB-дисків. Деякі з цих корпусів роблять зворотне до того, що робить AF: Вони беруть вісім секторів дисків і зв'язують їх в один новий 4096-байтовий сектор. Я не впевнений, які міркування стоять за цим кроком, але одна практична перевага полягає в тому, що диски розміром більше 2TiB можна використовувати зі старою системою розділення MBR. Одним з головних недоліків є те, що диск, розміщений в одному з цих корпусів, не може використовуватися безпосередньо або в корпусі, який не здійснює такого типу перекладу. Аналогічно, диск, підготовлений без цього перекладу, не може використовуватися, коли він переноситься в такий корпус. Зауважте, що ця проблема виходить далеко за межі самого MBR; ваш диск може ідентифікувати перший розділ як такий, що починається з (512-байтового) сектору 2048, але якщо ваша ОС повинна шукати (4096-байт) сектор 2048,знайдіть початок цього розділу! Ви зіткнулися з цією проблемою. Таким чином, ваша початкова думка, що це вина USB-корпусу, ближче до позначки, ніж ваша недавня думка, що ваша материнська плата зіпсувала це. Я ніколи не чув про переклад розміру сектору материнської плати таким чином. (Однак деякі апаратні RAID-пристрої роблять це.)

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

dd if=/dev/sdb of=~/image.img

Це скопіює ваш диск з /dev/sdb(USB-диска; при необхідності відрегулюйте) у файл ~/image.img. Потім ви можете використовувати наступний сценарій для монтажу розділів зображення:

#!/bin/bash
gdisk -l $1 > /tmp/mount_image.tmp
let StartSector=`egrep "^   $2|^  $2" /tmp/mount_image.tmp | fmt -u -s | sed -e 's/^[ \t]*//' | head -1 | cut -d " " -f 2`

let StartByte=($StartSector*512)

echo "Mounting partition $2, which begins at sector $StartSector"

mount -o loop,offset=$StartByte $1 $3

rm /tmp/mount_image.tmp

Збережіть сценарій як, скажімо, mount_imageі використовуйте його так:

./mount_image ~/image.img 2 /mnt

Це змонтує розділ 2 image.imgдо /mnt. Зауважте, що сценарій спирається на GPT fdisk ( gdisk) , який більшість дистрибутивів включає в себе пакет, що називається gptfdiskабо gdisk.

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

Ще один варіант, який мені трапляється, - спробувати використовувати таку віртуальну машину, як VirtualBox. Такий інструмент може приймати розмір сектору 512 байтів під час доступу до дискового пристрою, фактично скасовуючи переклад; або ви зможете скопіювати вміст диска в сирому вигляді (як в dd if=/dev/sdc of=/dev/sdb) у віртуальну машину, яка може скопіювати вміст стисненням, тим самим дозволяючи зображенню розміщуватися на меншій кількості дискового простору, ніж споживає оригінал.


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

4
НЕ намагайтеся змінювати вміст диска черезdd! Якщо ви не дуже обережним і розуміти речі дуже добре (або надзвичайно пощастило), вишвидше за все, сміття річніж виправити. Мені здається, що ви, можливо, зможете скорегувати таблицю розділів за допомогоюfdisk: Створіть резервну копію оригіналу та розділіть початкову точку кожного розділу на 8 (і встановіть кінцеві точки до кінця перед початковою точкою наступного розділу). Це є шансом лише у тому випадку, якщо значення початкової точки розділу є кратними 8.
Rod Smith

1
Свята корова! Дякуємо за інформацію. Я вже один день намагаюся клонувати свій жорсткий диск Mac / Windows на SSD, і я нарешті зміг визначити проблему: Rosewill SATA / IDE до USB-адаптера, який я використовував для підключення SSD, виконував це "зворотне перетворення "до 4096-байтних секторів! Тож GPT + гібридний MBR на SSD виглядав як нісенітниця після того, як я зробив ddклон до нього під час підключення через USB, і я подумав, що клон провалився. Але коли я підключив SSD безпосередньо до своєї материнської плати замість свого старого жорсткого диска, все працювало нормально!
Еліот

1
Не можу редагувати попередній коментар, але інструмент Вирівнювання в цьому випадку марний, це лише для оптимізації. Однак зауважте, що ви можете використовувати TestDisk і після більш глибокого сканування натисніть P, щоб перерахувати файли та відновити вміст вашого диска (саме так я відновив свої дані, але я не знайшов жодного способу зафіксувати сектор байтів У цей день...).
габоровий

1
Цікаве прочитання, яке підтверджує проблему та натяк на рішення ( емуляція перекладу мосту через пристрій петлі Linux): goughlui.com/2013/10/02/… та це askubuntu.com/questions/337693/… . І як додаткова примітка, я також намагався насильно відредагувати логічний розмір, щоб він відповідав фізичному розміру, але диск все ще не був розпізнаний. Але форматування це виправить монтаж, але файли, звичайно, втрачаються, тому краще відновити їх до цього за допомогою монтажу за допомогою петлі або testdisk.
габоровий

4

Цей сценарій узагальнив пропозицію Рода Сміта, коли у вас є рейд чи криптовалюта. Гарантії немає. Сміливо вдосконалюйте його! (Оновлено останні дані про mdadm)

#!/bin/sh
#
# This script solve the following problem:
#
# 1. create a GPT partition on a large disk while attached directly via SATA
#    when the device present itself with 512 bytes of block size:
#    sd 3:0:0:0: [sda] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB)
#
# 2. try to use a SATA to USB adapter like ID 067b:2773 Prolific Technology, Inc.
#    this present the device with 4096 bytes of block size:
#    sd 19:0:0:0: [sdc] 732566646 4096-byte logical blocks: (3.00 TB/2.72 TiB)
#
# 3. The kernel is unable to read correctly the partition table with
#    the USB adaper.
#
#
# With the current tools (kernel and gdisk) in debian wheezy is
# possible to use losetup to remap the partitions to loop devices so
# you can use them as usual with any filesystem, raid or crypto
#
# I still do not know if this issue is originated by the adapter or by
# the disk and if there are any others workarounds.
#
# Known version of the software:
# $ apt-show-versions linux-image-3.2.0-4-amd64
# linux-image-3.2.0-4-amd64/wheezy uptodate 3.2.54-2
# $ apt-show-versions gdisk
# gdisk/wheezy uptodate 0.8.5-1


attach_device() {

    device="$1";

    MYTMPDIR=`mktemp -d`
    trap "rm -rf $MYTMPDIR" EXIT

    # gdisk on the device use the 4096 sector size
    # but we need to force it to 512
    # this is a knwon workaround from http://superuser.com/a/679800
    # basically we make a copy of the gpt partition table on a file
    dd if="/dev/$device" bs=16384 count=1 of="$MYTMPDIR/gpt" 2> /dev/null

    # we extract the offset and the size of each partition
    #
    # FIXME: the "+ 1" seems strange, but it is needed to get the same
    #        size value from:
    #
    #        blockdev --getsize64
    #
    #        without the "+ 1" some funny things happens, for example
    #        you will not be able to start a recognized md device:
    #
    #        md: loop1 does not have a valid v1.2 superblock, not importing!
    #        md: md_import_device returned -22
    #
    #        even if
    #
    #        mdadm --examine /dev/loop1
    #
    #        does not complaint

    gdisk -l \
     "$MYTMPDIR/gpt" 2> /dev/null | \
     awk '/^ *[0-9]/ {printf "%.0f %.0f\n", $2 * 512, ($3 - $2 + 1) * 512}' > $MYTMPDIR/offset-size

    # we create a loop device with the give offset and size
    while read line;
    do
        offset=$(printf "$line" | cut -d ' ' -f 1);
        size=$(printf "$line" | cut -d ' ' -f 2);
        losetup --verbose --offset "$offset" --sizelimit "$size" `losetup -f` /dev/$device;
    done < $MYTMPDIR/offset-size;
}

detach_device() {

    device="$1";

    for loopdevice in `losetup -a | grep "$device" | cut -d : -f 1`;
    do
        losetup --verbose --detach "$loopdevice";
    done;
}

usage() {
cat <<EOF
Usage:
- $0 -h to print this help
- $0 sda to attach the gpt partitions of sda
- $0 -d sda to detach the gpt partitions of sda
EOF
}


detach=0;

while getopts hd action
do
    case "$action" in
        d) detach=1;;
        h) usage;;
    esac
done
shift $(($OPTIND-1))

if [ $# -ne 1 ];
then
    usage;
fi

if [ "x$detach" = "x0" ]; then
    attach_device $1;
else
    detach_device $1;
fi

Ого! Хороша робота!
NothingsImpossible

3

Ще один досить прямий шлях для цього - використання функції порятунку партера. Це вимагає, щоб ви створили нову мітку диска, тому це включає ризики. Розділена дія діє безпосередньо на диску, тому зробіть резервні копії в міру необхідності перед тим, як виконати розбиття. Потім почніть:

parted /dev/sdb

parted розкаже вам щось у цих рядках, коли намагаєтесь прочитати диск з іншим розміром сектору, ніж для якого створена таблиця розділів:

Error: /dev/sdb: unrecognised disk label                                  

Використовуйте mklabel, щоб створити новий MBR або GPT відповідно до того, що раніше використовували

(parted) mklabel
New disk label type? mbr

Потім запустіть рятування, щоб знайти старий розділ

(parted) rescue
Start? 0
End? 4001GB
Information: A ext4 primary partition was found at 1049kB -> 2000GB.  Do you
want to add it to the partition table?
Yes/No/Cancel? y

Повторіть процес порятунку, якщо у вас є більше розділів. Ви закінчили.


1
Це прекрасно працювало для мене, щоб перетворити таблицю розділів з mbr в gpt. Роблячи це так, щоб я міг розширити клонований 2TB диск до 4 ТБ. Трохи нервуючи, залишаючи мою перегородку, яка там висить, але це набагато швидше, ніж інші методи.
OregonTrail

3

У мене була ця проблема, коли я вийняв диск із 4 ТБ із зовнішнього корпусу WD My Book. Проблема полягає в наступному:

  1. таблиця розділів MBR вимикається на коефіцієнт 8 та
  2. таблиця розділів MBR не може обробити> 2 ТБ, коли розмір сектора становить 512.

Рішення: Перезапишіть таблицю розділів у GPT, перетворивши значення для використання 512 байтових секторів.

У моєму випадку розділ почався на зміщенні 1 Мб і закінчився (~ 856 кБ) до кінця диска. Це добре, тому що тоді він допускав для MBR + GPT (17408 байт) перед розділом та резервного GPT (16896 байт) в кінці диска.

Я робив зображення обох регіонів на всякий випадок (використовуючи dd).

Я відзначив вихід з fdisk -l /dev/sde.

Я використовував gdisk для видалення першого розділу. Якщо ви хочете, ви можете зробити так, як я зробив, і змінити значення вирівнювання на 8 (4096), щоб використовувати якомога більше місця. Потім я створив новий розділ із початком у 2048 році та кінцем у кінці диска. Пізніше я вирощую файлову систему.

На щастя, зміна розміру сектору не впливає на файлову систему, LVM або LUKS.

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