Problémy velikosti odvětví se stávají poměrně složitými. Až do konce roku 2009 drtivá většina pevných disků používala 512bajtové sektory, a to bylo vše. Koncem roku 2009 začali výrobci disků zavádět takzvaný Advanced Format (AF) disky, které používají 4096bajtové sektory. Tyto první AF disky (a, AFAIK, dnes všechny AF disky) představují rozhraní k počítači, které zobrazuje každý 4096bajtový fyzický sektor jako rozdělený na osm logických 512 bajtů sektory. Tato konverze umožňuje, aby starší nástroje, včetně mnoha BIOSů, které byly sestaveny s předpoklady o velikosti 512 bajtů, nadále fungovaly. Nevím, jestli váš disk používá AF nebo ne, ale v obou případech téměř jistě používá velikost logického sektoru 512 bajtů, což znamená, že rozhraní k OS by mělo používat 512 bajtové sektory.
Věci komplikují určité kryty USB disků. Některé z těchto krytů dělají opak toho, co dělá AF:Vezmou osm sektorů disku a spojí je do jednoho nového 4096bajtového sektoru. Nejsem si jistý, co je důvodem tohoto kroku, ale jedna praktická výhoda je, že disky větší než 2TiB lze použít se starým systémem dělení MBR. Jednou z hlavních nevýhod je, že disk rozdělený v jedné z těchto skříní nelze použít přímo nebo ve skříni, která tento typ překladu neprovádí. Stejně tak disk připravený bez tohoto překladu nelze při přenosu do takového obalu použít. Všimněte si, že tento problém přesahuje samotný MBR; váš disk může identifikovat první oddíl jako začínající na (512bajtovém) sektoru 2048, ale pokud by váš operační systém hledal (4096bajtový) sektor 2048, není najdi začátek toho oddílu! Narazili jste na tento problém. Vaše počáteční myšlenka, že je to chyba krytu USB, je tedy blíže ke značce než vaše novější myšlenka, že to vaše základní deska pokazila. nikdy slyšeli o základní desce překládající velikost sektoru tímto způsobem. (Některá hardwarová zařízení RAID to však dělají.)
Neznám způsob, jak donutit Linux, aby upravil svou představu o velikosti sektoru, ale pokud máte na disku dostatek místa, může vám pomoci nízkoúrovňová kopie disku na jiný disk. Například:
dd if=/dev/sdb of=~/image.img
Toto zkopíruje váš disk z /dev/sdb
(na USB disk; upravte podle potřeby) do souboru ~/image.img
. Potom můžete použít následující skript k připojení diskových oddílů obrazu:
#!/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
Uložte skript jako, řekněme, mount_image
a použijte jej takto:
./mount_image ~/image.img 2 /mnt
Tím se připojí oddíl 2 z image.img
až /mnt
. Všimněte si, že skript spoléhá na GPT fdisk (gdisk
), který většina distribucí obsahuje v balíčku s názvem gptfdisk
nebo gdisk
.
Z dlouhodobého hlediska je lepším řešením najít způsob připojení disku, který nebude provádět překlad velikosti sektoru. Přímé připojení k nové základní desce by mělo stačit; nebo pravděpodobně můžete najít externí přílohu, která překlad neprovádí. Ve skutečnosti některé skříně provádějí překlad na portech USB, ale ne na portech eSATA, takže pokud má vaše skříň port eSATA, můžete jej zkusit použít. Uvědomuji si, že všechna tato řešení budou pravděpodobně stát peníze, o kterých říkáte, že je nemáte, ale možná můžete vyměnit svou překládací skříň za takovou, která překlad neprovádí.
Další možností, která mě napadá, je zkusit použít virtuální stroj jako VirtualBox. Takový nástroj může při přístupu k diskovému zařízení předpokládat velikost sektoru 512 bajtů, čímž efektivně zruší překlad; nebo možná budete moci zkopírovat obsah disku nezpracovaný (jako v dd if=/dev/sdc of=/dev/sdb
) ve virtuálním počítači, který by mohl zkopírovat obsah pomocí komprese, a tím umožnit, aby se obraz vešel na méně místa na disku, než zabírá originál.
Tento skript zobecnil návrh Roda Smithe, když máte raid nebo krypto. Bez záruky. Klidně to vylepšete! (Aktualizováno o nejnovější poznatky o 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
Tento problém jsem měl, když jsem vyjímal 4TB disk z externího krytu WD My Book. Problém je:
- tabulka oddílů MBR je 8krát vypnutá a
- Tabulka oddílů MBR nemůže zpracovat>2 TB, když je velikost sektoru 512.
Řešení: Přepište tabulku oddílů na GPT a převeďte hodnoty na 512 bajtové sektory.
V mém případě oddíl začínal na offsetu 1 MB a skončil (~856 kB) před koncem disku. To je dobré, protože to umožnilo MBR+GPT (17408 bajtů) před oddílem a záložní GPT (16896 bajtů) na konci disku.
Pro jistotu jsem vytvořil obrázky obou oblastí (pomocí dd).
Zaznamenal jsem výstup z fdisk -l /dev/sde
.
Použil jsem gdisk k odstranění prvního oddílu. Pokud chcete, můžete to udělat jako já a změnit hodnotu zarovnání na 8 (4096), abyste využili co nejvíce místa. Poté jsem vytvořil nový oddíl se začátkem na 2048 a koncem na konci disku. Systém souborů rozšířím později.
Naštěstí změna velikosti sektoru neovlivní systém souborů, LVM nebo LUKS.