Как исправить MBR 512-байтового сектора на диске сектора 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 в hex-редакторе, и

  • Разделы не выровнены для 4096-байтовых секторов. Существует ли какой-либо инструмент, позволяющий выровнять их, помимо копирования на другой диск? (У меня нет запасных дисков), или мне нужно будет создать какой-нибудь инструмент, который за один раз «сдвигает» данные в сторону? Перегородки ext3.

Благодарность!

Обновить:

Я обнаружил, что есть умный способ использовать dd для перемещения раздела на месте в этом вопросе: Как переместить раздел в GNU / Linux? Но я не знаю, будет ли это работать на каком-то участке сектора. Я не могу проверить это сейчас, но сделаю, когда у меня будет время.

Обновление 2:

Итак, я успешно выровнял раздел, используя метод выше, и отредактировал MBR вручную в шестнадцатеричном редакторе. Как только я снова подключил жесткий диск, раздел стрелы автоматически монтируется! Я не рекомендую это, хотя, во время процесса были ошибки ввода-вывода, и я мог потерять все, см. Комментарий к ответу Рода. Что касается другого раздела, я не буду рисковать и буду использовать старый жесткий диск и выравнивать порции, копируя данные, а затем вставляя их обратно в другую позицию.

Нет ничего невозможного
источник
не знаю, но замечание - звучит так, будто вы могли бы дать уроки о том, как работают компьютеры! (а затем, если это поможет решить проблему, купите другой жесткий диск за наличные)
barlop
@ barlop Спасибо! Но я уже должен разделить свой день между моей работой и колледжем, так что вторая работа сейчас не нужна;) Мне придется исправлять эти разделы трудным путем =)
NothingsImpossible
1
ЧЕЛОВЕК, 6 утра, и я потратил всю последнюю ночь вокруг этой проблемы!
Леонель
1
Итак, у меня возникла противоположная проблема: у меня есть диск объемом 1 ТБ, отформатированный с использованием корпуса. Таким образом, он был отформатирован с использованием 4096 байтов на адреса секторов. Мне не удобно редактировать MBR вручную. И мне нужно использовать жесткий диск непосредственно на SATA (512 байт на сектор). Есть предложения?
Леонель
1
@Leonel Вы можете использовать Linux fdiskдля редактирования MBR (я узнал об этом позже, нет необходимости в hex-редакторах :)). Вы можете изменить каждую начальную точку входа и размер, и просмотреть изменения перед применением. Итак: запустите fdisk, запишите текущую конфигурацию (или, лучше, сделайте резервную копию MBR dd), умножьте значения начального адреса и размера на 8 и измените их. Не забудьте проверить все с помощью калькулятора и понять, что означают значения. Вы увидите, что Size = End - Start + 1 fdiskпоказывает размер в 1000-секторных единицах, поэтому вам может потребоваться включить экспертный режим, чтобы увидеть реальное значение и т. Д.
NothingsImpossible

Ответы:

24

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

Сложность имеет значение в некоторых USB-дисках. Некоторые из этих корпусов делают обратное тому, что делает AF: они берут восемь секторов диска и объединяют их в один новый 4096-байтовый сектор. Я не уверен, в чем причина этого шага, но одно практическое преимущество заключается в том, что со старой системой разбиения MBR можно использовать диски размером более 2 ТБ. Одним из основных недостатков является то, что диск, разделенный на один из этих корпусов, нельзя использовать напрямую или в корпусе, который не выполняет этот тип перевода. Аналогично, диск, подготовленный без этого перевода, не может быть использован при переносе в такой корпус. Обратите внимание, что эта проблема выходит далеко за рамки самой 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) , который большинство дистрибутивов включает в пакет с именем gptfdiskor gdisk.

В конечном счете, лучшим решением будет найти способ подключения диска, который не будет выполнять преобразование размера сектора. Прямое подключение к новой материнской плате должно помочь; или вы можете найти внешнюю оболочку, которая не выполняет перевод. Фактически, некоторые корпуса выполняют преобразование на портах USB, но не на портах eSATA, поэтому, если в вашем корпусе есть порт eSATA, вы можете попробовать использовать это. Я понимаю, что все эти решения, вероятно, будут стоить денег, которых, как вы говорите, у вас нет, но, возможно, вы сможете обменять свое приложение для перевода на то, которое не выполняет перевод.

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

Род Смит
источник
Очень проницательный ответ, но не совсем то, что я искал ... Я уже попробовал метод виртуальной машины, но он не отменил перевод. Я только что вернулся домой и постараюсь выровнять первый раздел (меньший, менее важный), используя dd, и дать ему поработать в одночасье. В случае успеха я постараюсь отредактировать MBR вручную, если никто не поставит ответ.
Ничего
4
НЕ пытайтесь изменить содержимое диска черезdd! Если вы не очень осторожны и не понимаете вещи чрезвычайно хорошо (или чрезвычайно удачливы), вы, скорее всего, испортите вещь, чем исправите ее. Мне кажется, что вы можете настроить таблицу разделов, используяfdisk: Резервное копирование оригинала, а затем разделите начальную точку каждого раздела на 8 (и установите конечные точки как конечные непосредственно перед начальной точкой следующего раздела). Это имеет шанс только в том случае, если все значения начальной точки раздела кратны 8.
Род Смит,
1
Святая корова! Спасибо за информацию. Я уже один день пытаюсь клонировать жесткий диск Mac / Windows на твердотельный накопитель, и я наконец-то смог выявить проблему: переходник Rosewill SATA / IDE на USB, который я использовал для подключения твердотельного накопителя, выполнял это «обратное преобразование». "до 4096-байтовых секторов! Таким образом, GPT + Hybrid MBR на SSD выглядело чепухой после того, как я сделал ddклон, подключенный через USB, и я подумал, что клон не удался. Но когда я подключил SSD непосредственно к материнской плате вместо моего старого жесткого диска, все работало нормально!
Элиот
1
Не могу отредактировать мой предыдущий комментарий, но инструмент «Выровнять» в этом случае бесполезен, он используется только для оптимизации. Однако обратите внимание, что вы можете использовать TestDisk и после более глубокого сканирования нажмите P, чтобы вывести список файлов и восстановить содержимое вашего диска (именно так я восстановил свои данные, но я не нашел способа исправить сектор байтов так, чтобы этот день...).
gaborous
1
Интересное прочтение, которое подтверждает проблему и подсказку о решении (эмуляция перевода моста через устройство обратной связи Linux): goughlui.com/2013/10/02/… и this askubuntu.com/questions/337693/… . И в качестве дополнительной заметки я также попытался принудительно отредактировать логический размер, чтобы он соответствовал физическому размеру, но диск все еще не был распознан. Но форматирование это исправляет монтирование, но файлы, конечно, теряются, поэтому лучше их восстановить, прежде чем через петлевое монтирование или тестовый диск.
gaborous
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
user302662
источник
Вау! Хорошая работа!
NothingsImpossible
3

Другой, довольно простой способ сделать это - использовать функцию спасения parted. Это требует от вас создания новой метки диска, так что это сопряжено с риском. Parted действует непосредственно на диске, поэтому при необходимости создайте резервные копии перед запуском parted. Тогда начните:

parted /dev/sdb

parted скажет вам что-то вроде этого при попытке прочитать диск с размером сектора, отличным от того, с которым была создана таблица разделов:

Error: /dev/sdb: unrecognised disk label                                  

Используйте mklabel для создания нового MBR или GPT в соответствии с тем, что вы ранее использовали

(parted) mklabel
New disk label type? mbr

Затем запустите Rescue, чтобы найти свой старый раздел

(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 до 4TB. Немного нервничаю, оставляя мой раздел висеть там, но это намного быстрее, чем другие методы.
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.

Дуэйн
источник