Masalah ukuran sektor menjadi sangat kompleks. Hingga akhir 2009, sebagian besar hard disk menggunakan sektor 512 byte, dan hanya itu. Pada akhir 2009, produsen disk mulai memperkenalkan apa yang disebut Format Lanjutan (AF) disk, yang menggunakan sektor 4096-byte. Disk AF pertama ini (dan, AFAIK, semua disk AF saat ini) menghadirkan antarmuka ke komputer yang menampilkan setiap fisik 4096 byte sektor sebagai dibagi menjadi delapan 512-byte logis sektor. Konversi ini memungkinkan alat 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 tersebut, disk hampir pasti menggunakan ukuran sektor logis 512 byte, artinya antarmuka ke OS harus menggunakan sektor 512 byte.
Masalah yang rumit adalah penutup disk USB tertentu. Beberapa enklosur ini melakukan kebalikan dari 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 praktisnya adalah disk yang lebih besar dari 2TiB dapat digunakan dengan sistem partisi MBR lama. Salah satu kerugian utama adalah disk yang dipartisi di salah satu enklosur ini tidak dapat digunakan secara langsung atau di enklosur yang tidak melakukan jenis terjemahan ini. Demikian pula, disk yang disiapkan tanpa terjemahan ini tidak dapat digunakan saat dipindahkan ke enklosur tersebut. Perhatikan bahwa masalah ini melampaui MBR itu sendiri; disk Anda mungkin mengidentifikasi partisi pertama sebagai awal pada sektor (512-byte) 2048, tetapi jika OS Anda mencari (4096-byte) sektor 2048, itu tidak temukan awal dari partisi itu! Anda mengalami masalah ini. Dengan demikian, pemikiran awal Anda bahwa itu adalah kesalahan penutup USB lebih dekat dengan sasaran daripada pemikiran Anda yang lebih baru bahwa motherboard Anda mengacaukannya. Saya tidak pernah mendengar tentang motherboard yang menerjemahkan ukuran sektor dengan cara ini. (Namun, beberapa perangkat RAID perangkat keras melakukannya.)
Saya tidak tahu cara untuk memaksa Linux menyesuaikan idenya tentang ukuran sektor, tetapi jika Anda memiliki ruang disk yang cukup, melakukan penyalinan disk tingkat rendah ke disk lain dapat membantu. Misalnya:
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 memasang partisi image:
#!/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, katakanlah, mount_image
dan gunakan seperti ini:
./mount_image ~/image.img 2 /mnt
Ini akan me-mount partisi 2 dari image.img
ke /mnt
. Perhatikan bahwa skrip bergantung pada GPT fdisk (gdisk
), yang sebagian besar distribusi termasuk dalam paket yang disebut gptfdisk
atau gdisk
.
Dalam jangka panjang, solusi yang lebih baik adalah menemukan cara untuk menyambungkan disk yang tidak akan melakukan terjemahan ukuran sektor. Koneksi langsung ke motherboard baru sudah cukup; atau Anda mungkin dapat menemukan penutup eksternal yang tidak melakukan terjemahan. Faktanya, beberapa penutup melakukan terjemahan pada port USB tetapi tidak pada port eSATA, jadi jika penutup Anda memiliki port eSATA, Anda dapat mencoba menggunakannya. Saya menyadari bahwa semua solusi ini mungkin memerlukan biaya, yang menurut Anda tidak Anda miliki, tetapi mungkin Anda dapat menukar kandang terjemahan Anda dengan yang tidak melakukan terjemahan.
Opsi lain yang terpikir oleh saya adalah mencoba menggunakan mesin virtual seperti VirtualBox. Alat semacam itu mungkin menganggap ukuran sektor 512-byte saat mengakses perangkat disk, secara efektif membatalkan terjemahan; atau Anda mungkin dapat menyalin isi disk secara mentah (seperti pada dd if=/dev/sdc of=/dev/sdb
) di dalam mesin virtual, yang mungkin menyalin konten dengan kompresi, sehingga memungkinkan citra muat pada ruang disk yang lebih sedikit daripada yang digunakan aslinya.
Skrip ini menggeneralisasi proposal Rod Smith, saat Anda melakukan penggerebekan atau kripto. 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
Saya mengalami masalah ini saat melepas disk 4TB dari enklosur eksternal WD My Book. Masalahnya adalah:
- tabel partisi MBR dimatikan dengan faktor 8 dan
- tabel partisi MBR tidak dapat menangani>2TB saat ukuran sektor adalah 512.
Solusi: Tulis ulang tabel partisi menjadi GPT, ubah nilainya untuk menggunakan sektor 512 byte.
Dalam kasus saya, partisi dimulai dengan offset 1MB dan berakhir (~856kB) sebelum akhir disk. Ini bagus karena memungkinkan untuk MBR+GPT (17408 byte) sebelum partisi dan cadangan GPT (16896 byte) di akhir disk.
Saya membuat gambar 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 dapat melakukan seperti yang saya lakukan dan mengubah nilai penyelarasan menjadi 8 (4096) untuk menggunakan ruang sebanyak mungkin. Kemudian, saya membuat partisi baru dengan awal di 2048, dan akhir di akhir disk. Saya akan mengembangkan sistem file nanti.
Untungnya, perubahan ukuran sektor tidak memengaruhi sistem file, LVM, atau LUKS.