Bagaimana cara memperbaiki MBR sektor 512-byte pada disk sektor 4096-byte?

23

Pembaruan terakhir:

Saya sudah tahu apa yang harus saya lakukan untuk memperbaiki masalah ini; Saya hanya tidak tahu bagaimana melakukannya. Saya berharap akan ada alat yang siap pakai untuk melakukan itu secara otomatis - tetapi tidak dapat menemukannya. Saya menerima jawaban Rod karena walaupun tidak secara langsung menyelesaikan masalah saya, ini memberikan latar belakang yang sangat baik pada masalah ukuran sektor, dan memberi saya kepercayaan diri bahwa masalah tersebut benar-benar adalah penyelarasan dan pengalamatan partisi. Bagi mereka yang datang ke pertanyaan ini memiliki masalah yang sama, baca dengan seksama dan hati-hati, termasuk komentar, sebelum melakukan apa pun.


Pada awalnya

Saya memiliki komputer dan membutuhkan lebih banyak ruang. Saya telah membeli drive 500GB baru dan penutup USB. Segera saya perhatikan bahwa jika saya mempartisi drive pada enklosur dan memindahkannya ke komputer, ia tidak akan mengenali partisi (dan sebaliknya). Saya berasumsi itu adalah masalah dengan kandang dan tidak khawatir tentang hal itu.

Lalu, tragedi

Hari yang indah, komputer saya memutuskan untuk tidak hidup lagi. Ternyata motherboard (tidak bermerek, hanya MADE IN CHINA yang dicetak di atasnya) sudah mati. Saya telah menggunakannya sebagai file-server dan drive 500GB itu sekarang penuh dengan data yang saya tidak mampu kehilangannya. Saya bangkrut sekarang dan tidak mampu membeli komputer baru, jadi satu-satunya harapan saya adalah kandang USB "rusak".

Investigasi

Berbekal beberapa distribusi Linux, laptop, VirtualBox dan enklosur saya melakukan analisis forensik tentang masalah ini. dmesg melaporkan ukuran partisi berada di luar end-of-drive. Jadi saya membaca lembar data hard drive, menghitung jumlah sektor dari awal, menguji batas drive secara manual dengan dd, dan semuanya tampak OK, sampai saya menjalankan fdisk dan mengatakan:

    Note: Sector size is 4096 (not 512).

Betapa sederhana fdisk. "Catatan" ini adalah akar dari semua masalah. Setelah lebih mengutak-atik kesimpulan ini ditarik:

  • Enklosur USB tidak rusak.

  • Pengontrol SATA pada motherboard yang sekarang sudah mati adalah yang "aneh", setidaknya. Itu tidak melaporkan sektor 4096-byte ke sistem operasi, jadi OS dengan senang hati menciptakan MBR menggunakan alamat sektor 512-byte.

  • Sekarang ketika saya mencoba mengakses partisi, OS mencoba menggunakan alamat berbasis 512-byte pada drive sektor 4096-byte, dan tentu saja, itu tidak akan berhasil.

Pertanyaan

  • Jadi, bagaimana saya bisa memperbaiki alamat di MBR sehingga mereka valid pada ukuran sektor 4096-byte, selain dari mengedit MBR secara manual pada hex-editor, dan

  • Partisi tidak disejajarkan untuk sektor 4096-byte. Ada beberapa alat yang tersedia untuk menyelaraskannya selain menyalin masuk dan keluar dari drive lain? (Saya tidak punya drive cadangan), atau apakah saya perlu membuat beberapa alat yang "menggeser" data ke samping sedikit demi sedikit? Partisi adalah ext3.

Terima kasih!

Memperbarui:

Saya menemukan ada cara pintar untuk menggunakan dd untuk menggeser partisi di tempat dalam pertanyaan ini: Bagaimana cara memindahkan partisi di GNU / Linux? Tapi saya tidak tahu apakah itu akan bekerja pada sepotong sektor. Saya tidak bisa mengujinya sekarang tetapi akan dilakukan ketika saya punya waktu.

Pembaruan 2:

Jadi saya telah berhasil menyelaraskan partisi menggunakan metode di atas dan mengedit MBR pada hex editor. Segera setelah saya memasang kembali HDD, partisi boom dipasang secara otomatis! Saya tidak merekomendasikan ini, ada kesalahan I / O selama proses dan saya bisa kehilangan segalanya, lihat komentar pada jawaban Rod. Untuk partisi lain saya tidak akan mengambil risiko dan akan menggunakan HDD lama dan menyelaraskan potongan sekaligus dengan menyalin data dan kemudian menempelkannya kembali pada posisi yang berbeda.

Tidak mungkin
sumber
tidak tahu tapi terdengar seperti Anda bisa memberi pelajaran tentang cara kerja komputer! (dan kemudian jika itu membantu menyelesaikan masalah, beli hard drive lain dengan uang tunai)
barlop
@barlop Terima kasih! Tapi saya sudah harus membagi hari saya antara pekerjaan saya dan kuliah sehingga pekerjaan kedua adalah tidak ada sekarang;) Saya harus memperbaiki partisi ini dengan cara yang keras =)
NothingsImpossible
1
PRIA pukul 6 pagi DAN AKU MENGHABISKAN SEMUA MALAM TERAKHIR DI SELURUH MASALAH INI!
Leonel
1
Ok, jadi saya memiliki masalah sebaliknya: Saya memiliki disk 1TB yang diformat menggunakan enklosur. Jadi itu diformat menggunakan 4.096 byte per alamat sektor. Saya tidak nyaman mengedit MBR dengan tangan. Dan saya harus menggunakan HDD langsung pada SATA (512 byte per sektor) Ada saran?
Leonel
1
@Leonel Anda dapat menggunakan Linux fdiskuntuk mengedit MBR (Saya mempelajari ini nanti, tidak perlu editor hex :)) Anda dapat mengubah setiap titik dan ukuran awal entri, dan meninjau perubahan sebelum menerapkan. Jadi: mulai fdisk, catat konfigurasi saat ini (atau lebih baik, buat cadangan MBR dengan dd), gandakan nilai mulai alamat dan ukuran dengan 8 dan mengubahnya. Pastikan untuk memeriksa semuanya dengan kalkulator dan memahami apa artinya nilainya. Anda akan melihat bahwa Ukuran = Akhir - Mulai + 1, dan yang fdiskmenunjukkan ukuran dalam unit 1000-sektor, jadi Anda mungkin perlu mengaktifkan mode ahli untuk melihat nilai sebenarnya, dll.
NothingsImpossible

Jawaban:

24

Masalah ukuran sektor menjadi cukup kompleks. Hingga akhir 2009, sebagian besar hard disk menggunakan sektor 512-byte, dan hanya itu. Pada akhir 2009, produsen disk mulai memperkenalkan disk yang disebut Format Lanjutan (AF), yang menggunakan sektor 4.096 byte. Disk AF pertama ini (dan, AFAIK, semua disk AF hari ini) menghadirkan antarmuka ke komputer yang memperlihatkan masing-masing sektor fisik 4096-byte sebagai terbagi menjadi delapan sektor logis 512-byte . Konversi ini memungkinkan alat yang lebih lama, termasuk banyak BIOS, yang dibangun dengan asumsi 512-byte, untuk terus bekerja. Saya tidak tahu apakah disk Anda menggunakan AF atau tidak, tetapi dalam kedua kasus itu, hampir pasti menggunakan ukuran sektor logis 512-byte, yang berarti bahwa antarmuka ke OS harus menggunakan sektor 512-byte.

Masalah yang rumit adalah penutup disk USB tertentu. Beberapa penutup ini melakukan kebalikan dari yang dilakukan AF: Mereka mengambil delapan sektor disk dan menggabungkannya menjadi satu sektor 4096-byte baru. Saya tidak yakin apa alasan di balik langkah ini, tetapi satu keuntungan praktis adalah bahwa disk yang lebih besar dari 2TiB dapat digunakan dengan sistem partisi MBR yang lama. Salah satu kelemahan utama adalah bahwa disk yang dipartisi di salah satu lampiran ini tidak dapat digunakan secara langsung atau dalam lampiran yang tidak melakukan terjemahan jenis ini. Demikian juga, disk yang disiapkan tanpa terjemahan ini tidak dapat digunakan ketika dipindahkan ke enklosur seperti itu. Perhatikan bahwa masalah ini melampaui MBR itu sendiri; disk Anda mungkin mengidentifikasi partisi pertama sebagai dimulai pada sektor (512-byte) 2048, tetapi jika OS Anda mencari ke (4096-byte) sektor 2048,temukan awal dari partisi itu! Anda mengalami masalah ini. Dengan demikian, pemikiran awal Anda bahwa itu adalah kesalahan enklosur USB lebih dekat ke tanda daripada yang lebih baru Anda pikirkan bahwa motherboard Anda mengacaukannya. Saya belum pernah mendengar motherboard menerjemahkan ukuran sektor dengan cara ini. (Meskipun demikian, beberapa perangkat RAID perangkat keras melakukannya.)

Saya tidak tahu cara memaksa Linux untuk menyesuaikan idenya tentang ukuran sektor, tetapi jika Anda memiliki ruang disk yang cukup, melakukan salinan disk tingkat rendah ke disk lain dapat membantu. Contohnya:

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

Ini akan menyalin disk Anda dari /dev/sdb(disk USB; sesuaikan seperlunya) ke file ~/image.img. Anda kemudian dapat menggunakan skrip berikut untuk me-mount partisi gambar:

#!/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

Simpan skrip sebagai, katakan, mount_imagedan gunakan seperti ini:

./mount_image ~/image.img 2 /mnt

Ini akan me-mount partisi 2 image.imgke /mnt. Perhatikan bahwa skrip bergantung pada GPT fdisk ( gdisk) , yang sebagian besar distribusi menyertakan dalam paket yang disebut gptfdiskatau gdisk.

Dalam jangka panjang, solusi yang lebih baik adalah menemukan cara untuk menghubungkan disk yang tidak akan melakukan terjemahan ukuran sektor. Koneksi langsung ke motherboard baru harus melakukan trik; atau Anda mungkin dapat menemukan kandang eksternal yang tidak melakukan terjemahan. Bahkan, beberapa enklosur melakukan terjemahan pada port USB tetapi tidak pada port eSATA, jadi jika enklosur Anda memiliki port eSATA, Anda dapat mencoba menggunakannya. Saya menyadari bahwa semua solusi ini kemungkinan membutuhkan biaya, yang menurut Anda tidak Anda miliki, tetapi mungkin Anda dapat menukar enklosur terjemahan Anda dengan yang tidak melakukan terjemahan.

Pilihan lain yang terjadi pada saya adalah mencoba menggunakan mesin virtual seperti VirtualBox. Alat semacam itu mungkin mengasumsikan ukuran sektor 512-byte ketika mengakses perangkat disk, secara efektif membatalkan terjemahan; atau Anda mungkin dapat menyalin isi disk mentah (seperti di dd if=/dev/sdc of=/dev/sdb) dalam mesin virtual, yang mungkin menyalin konten dengan kompresi, sehingga memungkinkan gambar untuk masuk pada ruang disk yang lebih sedikit daripada yang asli dikonsumsi.

Rod Smith
sumber
Jawaban yang sangat mendalam, tetapi tidak cukup apa yang saya cari .. Saya sudah mencoba metode mesin virtual tetapi tidak membatalkan terjemahan. Saya baru saja tiba di rumah, dan akan mencoba menyelaraskan partisi pertama (yang lebih kecil, yang kurang penting) menggunakan dd, dan membiarkannya berjalan dalam semalam. Jika berhasil, saya akan mencoba mengedit MBR dengan tangan jika tidak ada yang memberi jawaban.
Mungkin
4
JANGAN mencoba mengubah isi diska viadd! Kecuali jika Anda sangat berhati-hati dan memahami hal-hal dengan sangat baik (atau sangat beruntung), Anda lebih cenderung membuangnya daripada memperbaikinya. Terjadi pada saya bahwa Anda mungkin dapat menyesuaikan tabel partisi menggunakanfdisk: Cadangkan yang asli dan kemudian bagi titik awal setiap partisi dengan 8 (dan atur titik akhir untuk mengakhiri tepat sebelum titik awal partisi berikut). Ini merupakan peluang hanya jika nilai titik awal partisi semuanya adalah kelipatan 8.
Rod Smith
1
Astaga! Terimakasih atas infonya. Saya telah mencoba untuk mengkloning Mac / Windows HDD saya ke SSD selama sehari sekarang dan saya akhirnya dapat mengidentifikasi masalah: Rosewill SATA / IDE ke USB adapter yang saya gunakan untuk menghubungkan SSD sedang melakukan "konversi balik "ke sektor 4096-byte! Jadi GPT + Hybrid MBR pada SSD tampak seperti omong kosong setelah saya melakukan ddklon saat terhubung melalui USB, dan saya pikir klon telah gagal. Tetapi ketika saya menghubungkan SSD langsung ke motherboard saya di tempat HDD lama saya, semuanya bekerja dengan baik!
Eliot
1
Tidak dapat mengedit komentar saya sebelumnya, tetapi alat Align tidak berguna dalam hal ini, itu hanya untuk keperluan optimasi. Namun, perhatikan bahwa Anda dapat menggunakan TestDisk dan setelah pemindaian lebih dalam, tekan P untuk membuat daftar file dan memulihkan konten disk Anda (ini adalah bagaimana saya memulihkan data saya, tetapi saya tidak menemukan cara untuk memperbaiki sektor byte ke Hari ini...).
Gaborous
1
Bacaan menarik yang mengkonfirmasi masalah dan memberi petunjuk pada solusinya (meniru terjemahan jembatan melalui perangkat loopback Linux): goughlui.com/2013/10/02/… dan ini askubuntu.com/questions/337693/… . Dan sebagai catatan tambahan, saya juga mencoba untuk secara paksa mengedit ukuran logis agar sesuai dengan ukuran fisik, tetapi drive masih tidak dikenali. Tetapi memformatnya memperbaiki pemasangan, tetapi file-file tersebut tentu saja hilang, jadi lebih baik memulihkannya sebelum melalui pemasangan loopback atau testdisk.
Gaborous
4

Skrip ini menggeneralisasi proposal Rod Smith, saat Anda melakukan razia atau crypto. Tidak ada jaminan. Jangan ragu untuk memperbaikinya! (Diperbarui dengan temuan terbaru tentang 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
pengguna302662
sumber
Wah! Pekerjaan yang baik!
Mungkin
3

Cara lain, cukup lurus ke depan untuk melakukan ini adalah menggunakan fungsi penyelamatan parted. Ini mengharuskan Anda untuk membuat label disk baru, jadi itu melibatkan risiko. Parted bertindak langsung pada disk sehingga membuat cadangan seperlunya sebelum menjalankan parted. Kemudian mulailah:

parted /dev/sdb

parted akan memberi tahu Anda sesuatu di sepanjang baris ini ketika mencoba membaca disk dengan ukuran sektor yang berbeda dengan yang dibuat tabel partisi:

Error: /dev/sdb: unrecognised disk label                                  

Gunakan mklabel untuk membuat MBR atau GPT baru sesuai dengan apa yang Anda gunakan sebelumnya

(parted) mklabel
New disk label type? mbr

Kemudian jalankan penyelamatan untuk menemukan partisi lama Anda

(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

Ulangi proses penyelamatan jika Anda memiliki lebih banyak partisi. Anda sudah selesai.

Johan Ehnberg
sumber
1
Ini berfungsi dengan baik bagi saya untuk mengubah tabel partisi saya dari mbr ke gpt. Melakukan ini sehingga saya dapat memperluas disk 2TB yang dikloning menjadi 4TB. Sedikit gugup meninggalkan partisi saya tergantung di sana tetapi ini jauh lebih cepat daripada metode lain.
OregonTrail
3

Saya mengalami masalah ini ketika saya melepaskan disk 4TB dari kandang eksternal WD My Book. Masalahnya adalah:

  1. tabel partisi MBR dimatikan oleh faktor 8 dan
  2. tabel partisi MBR tidak dapat menangani> 2TB ketika ukuran sektor adalah 512.

Solusi: Tulis ulang tabel partisi menjadi GPT, mengonversi nilai untuk menggunakan sektor 512 byte.

Dalam kasus saya, partisi dimulai dengan offset 1MB dan berakhir (~ 856kB) sebelum akhir disk. Ini bagus karena kemudian diperbolehkan untuk MBR + GPT (17408 bytes) sebelum partisi dan cadangan GPT (16896 bytes) di akhir disk.

Saya membuat gambar dari kedua wilayah untuk berjaga-jaga (menggunakan dd).

Saya mencatat output dari fdisk -l /dev/sde.

Saya menggunakan gdisk untuk menghapus partisi pertama. Jika mau, Anda bisa melakukan seperti yang saya lakukan dan mengubah nilai align ke 8 (4096) untuk menggunakan ruang sebanyak mungkin. Kemudian, saya membuat partisi baru dengan mulai pada 2048, dan akhir di akhir disk. Saya akan menumbuhkan sistem file nanti.

Untungnya, perubahan ukuran sektor tidak mempengaruhi sistem file, LVM, atau LUKS.

Duane
sumber