Problem z geometrią dysku w laptopie
Objawy
SuSE 10 działa na moim IBM-ie rewelacyjnie, chodzi szybko, wszystkie (naprawdę wszystkie!) funkcje chodzą jak się patrzy. Ponieważ nie lubię wyłączać komputera, intensywnie używam funkcji "standby". No i tej używam również w ww. konfiguracji. O ile pod SuSE 9.1 po paru kombinacjach funkcja ta działała rewelacyjnie (uptime: 309 dni!), to pod SuSE 10.0 kombinacji nie musiałem uskuteczniać - po instalacji z parametrem acpi=off wszystko działało w zasadzie jak trzeba (powermanagement przez APM, nie przez ACPI).
Jednak jeden problem pojawiał się czasem i nie wiedziałem o co chodzi: po wyjściu ze standby (albo suspend to RAM, jak się to nazywa) niekiedy komputer robił się wolniejszy i okazywało się, że wyłączał sobie DMA dla twardego dysku. Rzut okiem w logi dał taki oto obraz sytuacji:
May 1 14:57:54 ibm kernel: ide0: reset: success
May 1 14:57:54 ibm kernel: hda: task_in_intr: status=0x59 { DriveReady SeekComplete DataRequest Error }
May 1 14:57:54 ibm kernel: hda: task_in_intr: error=0x10 { SectorIdNotFound }, LBAsect=156301488, high=9, low=5306544, sector=156301488
May 1 14:57:54 ibm kernel: ide: failed opcode was: unknown
May 1 14:57:54 ibm kernel: end_request: I/O error, dev hda, sector 156301488
May 1 14:57:54 ibm kernel: Buffer I/O error on device hda, logical block 156301488
Ponadto stwierdziłem, że:
- sektor, którego system chce czytać (156301488), jest poza nominalnym rozmiarem dysku (!),
- dysk ma 156301487 sektorów,
- po starcie (bez używania standby) problemów takich nie ma
Rozwiązanie
Ponieważ już znałem podobne problemy pod SuSE 9.1, szybko znalazłem podpowiedzi, w którą stronę powinienem szukać:
- problem dotyczy rozmiarów dysku
- jest on związany (być może, teraz nie jestem tego pewien) również z IBM-em, ponieważ posiada on tzw, "host protected area" (patrz tutaj: ThinkPad - Wiki)
Po 2h poszukiwań stwierdzam, że 1) God bless the internet oraz 2) Linux is the best, czyli:
- Istnieje narzędzie pt. "disk_stat", przy pomocy którego można wczytać ważne dane o dysku i wyłączyć "host protected area" (patrz tutaj: pakiet "sleuthkit")
- a jeszcze lepszy jest programik "setmax.c" (znajdziesz go tutaj)
Ten ostatni trzeba jeszcze skompilować:
cc -o setmax setmax.c
i wystartować:
./setmax /dev/hda
Ustawienie ostatniego sektora na trwałe poniżej wartości sektora, który jest ostatnim fizycznym powoduje, że:
- tworzony jest "host protected area", którego linux bez problemu rozumie i wykrywa
- system nie zagląda nie tam gdzie trzeba
- zarówno po starcie systemu jak i po wyjściu ze stanu "standby"