4096バイトセクターディスク上の512バイトセクターMBRを修正する方法


23

最終更新:

この問題を解決するために何をする必要があるかはすでにわかっていました。私はそれを行う方法を知りませんでした。私はそれを自動的に行う既成のツールがあればいいのにと思っていましたが、見つかりませんでした。私の問題を直接解決していないにもかかわらず、セクターサイズの問題に関する非常に良い背景を提供し、問題が本当にパーティションの調整と対処であるという自信を与えたため、Rodの答えを受け入れます。同じ問題を抱えているこの質問に出くわした人のために、何かをする前に、コメントを含めて、それを徹底的かつ注意深く読んでください。


はじめに

コンピューターがあり、新しい500GBドライブとUSBエンクロージャーを購入したため、さらに多くのスペースが必要でした。すぐに、エンクロージャーでドライブをパーティション分割してコンピューターに移動した場合、パーティションが認識されないことに気付きました(逆も同様です)。私はそれがエンクロージャの問題だと思い、それについて心配しませんでした。

その後、悲劇

素晴らしい一日、私のコンピューターはもう電源を入れないことに決めました。マザーボード(ブランド化されていない、大きなMADE IN CHINAが印刷されている)が死んでいることが判明しました。私はそれをファイルサーバーとして使用してきましたが、500GBのドライブは今では失うことのできないデータでいっぱいです。私は今壊れており、新しいコンピューターを買う余裕がないので、私の唯一の希望は「欠陥のある」USBエンクロージャーでした。

調査

いくつかのLinuxディストリビューション、ラップトップ、VirtualBox、およびエンクロージャーを装備して、この問題についてフォレンジック分析を行いました。dmesgは、パーティションサイズがドライブの終わりを超えていると報告しました。そのため、ハードディスクのデータシートを調べ、セクターカウントをゼロから計算し、ddを使用してドライブの境界を手動でテストしました。

    Note: Sector size is 4096 (not 512).

fdiskの控えめさ。この「メモ」は、すべての問題の根本でした。さらにいじくり回した後、これらの結論が引き出されました。

  • USBエンクロージャーに欠陥はありません。

  • いまや死んだマザーボードのSATAコントローラーは、少なくとも「奇妙な」ものです。オペレーティングシステムに4096バイトのセクターを報告しなかったため、OSは512バイトのセクターアドレスを使用してMBRを作成しました。

  • パーティションにアクセスしようとすると、OSは4096バイトのセクタードライブで512バイトベースのアドレスを使用しようとしますが、もちろん動作しません。

質問

  • したがって、16進エディタでMBRを手動で編集する以外に、MBRのアドレスを4096バイトのセクタサイズで有効になるように修正するにはどうすればよいですか?

  • パーティションは4096バイトセクターに合わせて整列されていません。別のドライブにコピーインおよびコピーアウトする以外に、それらを調整するために使用できるツールがありますか?(予備のドライブはありません)、または一度に少しずつデータをサイドに「シフト」するツールを作成する必要がありますか?パーティションはext3です。

ありがとう!

更新:

この質問には、ddを使用してパーティションをその場でシフトする賢い方法があることがわかりました。GNU/ Linuxでパーティションを移動する方法は? しかし、それがセクターのスライスで機能するかどうかはわかりません。私は今それをテストすることはできませんが、時間があればそれを行います。

アップデート2:

そのため、上記の方法を使用してパーティションを正常に位置合わせし、16進エディターでMBRを手動で編集しました。HDDを再接続すると、ブームパーティションが自動的にマウントされます!しかし、これはお勧めしません。プロセス中にI / Oエラーが発生し、すべてを失う可能性がありました。Rodの回答に関するコメントを参照してください。もう一方のパーティションについては、リスクをとらず、古いHDDを使用し、データをコピーしてから別の位置に貼り付けることで、チャンクを一度に調整します。


わからないが、コンピューターがどのように機能するかについての教訓を与えることができるという発言が聞こえる!(そして、問題の解決に役立つ場合は、現金で別のハードドライブを購入します)
-barlop

@barlopありがとう!しかし、私はすでに私の仕事と大学の間で一日を分割しなければならないので、今は2番目の仕事は不必要です;)私はこれらのパーティションをハードな方法で修正する必要があります=)
NothingsImpossible

1
午前6時で、この問題の最後の夜をすべて過ごしました!
レオネル14

1
わかりましたので、私は反対の問題があります:私はエンクロージャを使用してフォーマットされた1TBの​​ディスクを持っています。したがって、セクタアドレスあたり4096バイトを使用してフォーマットされました。手作業でMBRを編集するのは苦手です。また、SATA(セクターあたり512バイト)で直接HDDを使用する必要があります。
レオネル14

1
@Leonel Linux fdiskを使用してMBRを編集できます(16進エディターの必要はありませんが、後で学びました)。各エントリの開始点とサイズを変更し、変更を確認してから適用できます。だから:start fdisk、現在の構成を書き留め(または、より良い、MBRをバックアップdd)、開始アドレスとサイズの値を8倍して、それらを変更します。計算機ですべてを確認し、値の意味を理解してください。スタート+ 1、およびその-あなたはそのサイズ=終了参照してくださいよfdisk、あなたがなど、実際の値を見るために上のエキスパートモードをオンにする必要があるかもしれないので、1000セクタ単位でのショーのサイズを
NothingsImpossible

回答:


24

セクターサイズの問題は非常に複雑になっています。2009年後半まで、ハードディスクの大部分は512バイトのセクターを使用していましたが、それはそれでした。2009年後半に、ディスクメーカーは、4096バイトセクターを使用するいわゆるAdvanced Format(AF)ディスクの導入を開始しました。これらの最初のAFディスク(および今日のすべてのAFディスク)は、各4096バイトの物理セクターが8つの512バイトの論理セクターに分割されていることを示すコンピューターへのインターフェイスを提供します。セクターます。この変換により、512バイトの前提で構築された多くのBIOSを含む古いツールが引き続き機能します。ディスクがAFを使用しているかどうかはわかりませんが、いずれの場合も、ほぼ確実に512バイトの論理セクターサイズを使用します。つまり、OSへのインターフェイスは512バイトセクターを使用する必要があります。

問題を複雑にしているのは、特定のUSBディスクエンクロージャです。これらのエンクロージャーのいくつかは、AFが行うことの逆を行います。8つのディスクセクターを取得し、1つの新しい4096バイトセクターにバンドルします。この動きの背後にある理由は定かではありませんが、実用的な利点の1つは、2TiBより大きいディスクを古いMBRパーティションシステムで使用できることです。1つの大きな欠点は、これらのエンクロージャーのいずれかでパーティション化されたディスクを直接使用したり、このタイプの変換を行わないエンクロージャーで使用したりできないことです。同様に、この変換なしで準備されたディスクは、そのようなエンクロージャーに転送される場合は使用できません。この問題はMBR自体をはるかに超えていることに注意してください。ディスクは、最初のパーティションを(512バイト)セクター2048で始まると識別しますが、OSが(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

これによりimage.img、のパーティション2がマウントされ/mntます。このスクリプトはGPT fdisk(gdisk)に依存していることに注意してください。これは、ほとんどのディストリビューションに含まれるgptfdiskor というパッケージに含まれています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 HDDをSSDにクローンしようとしていましたが、ついに問題を特定することができました。SSDの接続に使用していたRosewill SATA / IDEからUSBへのアダプターは、この「逆変換「4096バイトのセクターに!そのため、SSD上のGPT +ハイブリッドMBRは、ddUSB経由で接続している間にクローンを作成した後、ナンセンスに見え、クローンが失敗したと思いました。しかし、古いHDDの代わりにSSDをマザーボードに直接接続すると、すべて正常に機能しました!
エリオット14

1
以前のコメントを編集することはできませんが、この場合、Alignツールは役に立ちません。最適化のためだけです。ただし、TestDiskを使用できます。詳細なスキャンの後、Pキーを押してファイルをリストし、ディスクのコンテンツを復元します(これがデータの復元方法ですが、バイトセクタを修正する方法が見つかりませんでした)この日...)。
貪欲な

1
:溶液(Linuxのループバックデバイスを介してブリッジの翻訳をエミュレート)で問題とヒントを確認し、興味深い読み取りgoughlui.com/2013/10/02/...このaskubuntu.com/questions/337693/...を。また、追加のメモとして、論理サイズを物理サイズに合わせて強制的に編集しようとしましたが、ドライブはまだ認識されませんでした。ただし、フォーマットするとマウントは修正されますが、ファイルはもちろん失われるため、ループバックマウントまたはテストディスクを使用してファイルを回復する前に、それらをより適切に回復してください。
貪欲な

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

おっ!良くやった!
何も不可能14

3

これを行うもう1つのかなり簡単な方法は、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に拡張できます。パーティションをそこにぶら下げたままにしておくと少し緊張しますが、これは他の方法よりはるかに高速です。
オレゴントレイル

3

WD My Book外部エンクロージャーから4TBディスクを取り外したときに、この問題が発生しました。問題は:

  1. MBRパーティションテーブルは8倍オフで、
  2. セクターサイズが512の場合、MBRパーティションテーブルは2 TBを超える処理ができません。

解決策:パーティションテーブルをGPTに書き換え、512バイトセクターを使用するように値を変換します。

私の場合、パーティションは1MBのオフセットで開始し、ディスクの終了前に終了しました(〜856kB)。これは、パーティションの前にMBR + GPT(17408バイト)を許可し、ディスクの最後にバックアップGPT(16896バイト)を許可したためです。

念のため(ddを使用して)両方の領域の画像を作成しました。

からの出力に注意しましたfdisk -l /dev/sde

gdiskを使用して最初のパーティションを削除しました。必要に応じて、できる限り多くのスペースを使用するために、私が行ったように、align値を8(4096)に変更できます。次に、2048で始まり、ディスクの終わりで終わる新しいパーティションを作成しました。後でファイルシステムを拡張します。

ありがたいことに、セクタサイズの変更は、ファイルシステム、LVM、またはLUKSには影響しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.