Page 1 of 4
[HOWTO-KERNEL] - Libata zamiast ATA
Posted: Thu May 11, 2006 3:25 pm
by arsen
HOW-TO jest w połowie nieaktualne ("Instalacja kernela"). Standardowo w kernelu są dostępne sterowniki libata dla dyskow ATA.
Zastąpienie przestarzałych sterowników ATA nowoczesnym libata.
WSTĘP
Jak część osób się orientuje libata powstała na potrzeby dysków SATA, prawie każdy co ma dysk na interfejsie SATA korzysta z libata.
Liderem oraz głównym programistą jest Jeff Garzik, stworzył on bardzo nowoczesny i wydajny sterownik. Jednak libata ma w przyszłości w ogóle wyprzeć sterownik PATA, a nowoczesna libata ma wspierać zarówno dyski SATA jak i PATA.
Alan Cox już udostępnia patche dzięki którym z kernela można już usunąć obsługę ATA przestawiając się na libata. W dalszej części zapraszam do właściwego HOWTO.
1. Instalacja kernela.
Dla ułatwienia napisałem
ebuild, sciagamy go i umieszczamy w swoim
PORTDIR_OVERLAY, jak nie wiesz jak to zrobić to przeczytaj to
howto, następnie instalujemy kernel:
2. Konfiguracja kernela.
teraz zabieramy się za konfigurację
Wykonujemy typową dla siebie i swojego sprzętu konfigurację, następnie usuwamy suport dla PATA w ogóle
Code: Select all
Device Drivers --->
ATA/ATAPI/MFM/RLL support --->
< > ATA/ATAPI/MFM/RLL support
następnie zastąpmy te sterowniki nowymi libata, dla przykładu pokaże jak wygląda to dla kontrolorów opartych o chipset intela.
Code: Select all
Device Drivers --->
SCSI device support --->
<*> SCSI device support
<*> SCSI disk support
<*> SCSI CDROM support
<*> SCSI generic support
SCSI low-level drivers --->
<*> Serial ATA (SATA) support
<*> Intel PIIX/ICH SATA support
<*> Generic PATA support
<*> Intel PATA MPIIX support
Tak, uprzedze was, dyski ATA teraz nie będą widoczne jako /dev/hdX a jako /dev/sdX, zupełnie jakbyście mieli dysk SCSI lub SATA.
Nie będę pisał jak teraz skompilować kernel itd. myśle że ten kto porywa się na podmiane sterowników ATA na libata doskonale wie jak się to robi.
3. Korekta plików konfiguracyjnych.
Jak wspomniałem zmieni się nazewnictwo urządzeń z hdX na sdX, musimy poprawić /etc/fstab oraz /boot/grub/grub.conf, teraz możemy spokojnie zrebootować maszyne.
4. Podsumowanie.
Dla ciekawych co daje cała ta migracja z ATA na libata, oprócz bardzo nowoczesnego sterownika zyskujemy też wiekszą wydajność w liniowych transferach, są sygnały że ludzie mają poprawę np. z 20MB/s (PATA) na 30MB/s (LIBATA) (nie testujcie hdparmem, on się do benchmarków nie nadaje), nie u każdego jednak jest znacząca poprawa, ale wydajność w operacjach liniowych to nie wszystko, dyski ogólnie lepiej się zachowują, sterownik jak wspomniałem nowoczesny, lepiej wykorzystuje możliwości naszego systemu, mniej go obciążając. Testuje ogólnie kilka dni, zero problemów.
Re: [HOWTO-KERNEL] - Libata zamiast ATA
Posted: Thu May 11, 2006 6:16 pm
by Yatmai
arsen wrote:
1. Instalacja kernela.
Dla ułatwienia napisałem
ebuild, sciagamy go i umieszczamy w swoim
PORTDIR_OVERLAY, jak nie wiesz jak to zrobić to przeczytaj to
howto, następnie instalujemy kernel:
Użyłeś gentoo-sources czy jakiegoś innego jajka na podstawę ?

Posted: Thu May 11, 2006 6:33 pm
by arsen
na podstawę vanilla.
Posted: Thu May 11, 2006 6:38 pm
by manwe_
Hm, ~x86. Jest sens testować na amd64?
Posted: Thu May 11, 2006 6:42 pm
by arsen
oczywiście jest, a pominąłem ten keywords? jak tak to zmień w ebuildzie.
--EDIT
ale dałem tam jeszcze -*
Re: [HOWTO-KERNEL] - Libata zamiast ATA
Posted: Thu May 11, 2006 7:03 pm
by Poe
Art.root wrote:arsen wrote:
1. Instalacja kernela.
Dla ułatwienia napisałem
ebuild, sciagamy go i umieszczamy w swoim
PORTDIR_OVERLAY, jak nie wiesz jak to zrobić to przeczytaj to
howto, następnie instalujemy kernel:
Użyłeś gentoo-sources czy jakiegoś innego jajka na podstawę ?

nie, to jest czyste jajko z tylko tym patchem
--
edit, ups, mialem dlugo otwarte na tym temacie, nie odswiezylem i nie widzialmem powyzszych postów

Posted: Thu May 11, 2006 7:54 pm
by msch
zaaplikowalem wlasnie tego patcha na gentoo-sources-2.6.16-gentoo-r7 - działa w miare sprawnie. przy aplikowaniu byly tylko 2 rejecty, recznie trzeba bylo dopisac w sumie 3 linijki i bez problemu kernel się skompilował.
aha, jakim benchmarkiem sprawdzic sobie teraz wydajnosc dysku?

Posted: Thu May 11, 2006 7:59 pm
by arsen
Posted: Thu May 11, 2006 8:49 pm
by Raku
no a mi nie chce działać
Łatkę dorzuciłem do ck-sources-2.6.16-r9 - bez żadnych odrzutów.
Kompilacja bez problemów. W czasie bootowania pisze jednak, że nie może podmontować mojego /dev/sda5 (partycja root) i kończy się wszystko kernel panikiem.
Może to przez to, że mam dyski na kontrolerze PCI (CMD-649)? Choć w czasie bootowania widać, że dysk jest wykrywany, jego partycje też. Może jutro wrzucę zdjęcie ekranu po zatrzymaniu systemu - zobaczycie komunikaty na jakich się zatrzymuje ładowanie systemu.
Posted: Thu May 11, 2006 8:59 pm
by msch
moze w grubie masz zle root= podane?
Posted: Thu May 11, 2006 9:08 pm
by manwe_
No i poszło na amd64. Nałożyłem ten
http://zeniv.linux.org.uk/~alan/IDE/pat ... c6-ide1.gz patch na gentoo-sources-2.6.16-r7 [z małą ręczną poprawką] i póki co działa. Testy bonnie++ pokazały niewieli przyrost [ale nie wiem czy do końca dobrze to czytam, po prostu czasy trochę mniejsze]. Po 20 min pracy nie można powiedzieć, że są stabilne, ale jakby były jakieś problemy, na pewno będę pisał
Mój chipset to SIS5513, wkompilowałem obsługę generic i SIS [experimental]. Jak sprawdzić którego używa?
Posted: Thu May 11, 2006 9:11 pm
by msch
a ja wlasnie zauwazylem roznice i mi dziala stabilnie, z tym ze ja na x86. a gentoo mam na starym dysku UDMA/33

Posted: Thu May 11, 2006 9:21 pm
by Yatmai
Code: Select all
zeratul src # zeratul linux-2.6.16-r6 # patch -p1 < patch-2.6.16-rc6-ide1
patching file arch/i386/pci/fixup.c
patching file drivers/cdrom/cdrom.c
patching file drivers/pci/probe.c
patching file drivers/scsi/ata_generic.c
patching file drivers/scsi/ata_piix.c
patching file drivers/scsi/Kconfig
patching file drivers/scsi/libata-core.c
Hunk #2 FAILED at 79.
Hunk #29 succeeded at 4655 (offset 1 line).
Hunk #30 succeeded at 4675 (offset 1 line).
Hunk #31 succeeded at 4689 (offset 1 line).
Hunk #32 succeeded at 4713 (offset 1 line).
Hunk #33 succeeded at 4767 (offset 1 line).
Hunk #34 succeeded at 4942 (offset 1 line).
Hunk #35 succeeded at 4957 (offset 1 line).
Hunk #36 succeeded at 4973 (offset 1 line).
Hunk #37 succeeded at 4992 (offset 1 line).
Hunk #38 succeeded at 5018 (offset 1 line).
Hunk #39 succeeded at 5265 (offset 1 line).
Hunk #40 succeeded at 5369 (offset 1 line).
Hunk #41 succeeded at 5390 (offset 1 line).
Hunk #42 succeeded at 5403 (offset 1 line).
1 out of 42 hunks FAILED -- saving rejects to file drivers/scsi/libata-core.c.rej
patching file drivers/scsi/libata-scsi.c
patching file drivers/scsi/Makefile
patching file drivers/scsi/pata_ali.c
patching file drivers/scsi/pata_amd.c
patching file drivers/scsi/pata_artop.c
patching file drivers/scsi/pata_atiixp.c
patching file drivers/scsi/pata_cmd64x.c
patching file drivers/scsi/pata_cs5520.c
patching file drivers/scsi/pata_cs5530.c
patching file drivers/scsi/pata_cs5535.c
patching file drivers/scsi/pata_cypress.c
patching file drivers/scsi/pata_efar.c
patching file drivers/scsi/pata_hpt34x.c
patching file drivers/scsi/pata_hpt366.c
patching file drivers/scsi/pata_hpt37x.c
patching file drivers/scsi/pata_hpt3x2n.c
patching file drivers/scsi/pata_isapnp.c
patching file drivers/scsi/pata_it8172.c
patching file drivers/scsi/pata_it821x.c
patching file drivers/scsi/pata_legacy.c
patching file drivers/scsi/pata_mpiix.c
patching file drivers/scsi/pata_netcell.c
patching file drivers/scsi/pata_ns87410.c
patching file drivers/scsi/pata_oldpiix.c
patching file drivers/scsi/pata_opti.c
patching file drivers/scsi/pata_pcmcia.c
patching file drivers/scsi/pata_pdc2027x.c
patching file drivers/scsi/pata_pdc202xx_old.c
patching file drivers/scsi/pata_qdi.c
patching file drivers/scsi/pata_radisys.c
patching file drivers/scsi/pata_rz1000.c
patching file drivers/scsi/pata_sc1200.c
patching file drivers/scsi/pata_serverworks.c
patching file drivers/scsi/pata_sil680.c
patching file drivers/scsi/pata_sis.c
patching file drivers/scsi/pata_sl82c105.c
patching file drivers/scsi/pata_triflex.c
patching file drivers/scsi/pata_via.c
patching file drivers/scsi/pdc_adma.c
patching file drivers/scsi/sata_mv.c
patching file drivers/scsi/sata_nv.c
patching file drivers/scsi/sata_promise.c
Hunk #1 succeeded at 131 (offset 1 line).
Hunk #2 succeeded at 154 (offset 1 line).
patching file drivers/scsi/sata_qstor.c
patching file drivers/scsi/sata_sil24.c
patching file drivers/scsi/sata_sil.c
patching file drivers/scsi/sata_sis.c
patching file drivers/scsi/sata_svw.c
patching file drivers/scsi/sata_sx4.c
patching file drivers/scsi/sata_uli.c
patching file drivers/scsi/sata_via.c
patching file drivers/scsi/sata_vsc.c
patching file include/linux/ata.h
patching file include/linux/libata.h
Hunk #5 FAILED at 241.
Hunk #6 succeeded at 257 (offset 1 line).
Hunk #7 succeeded at 379 (offset 1 line).
Hunk #8 succeeded at 390 (offset 1 line).
Hunk #9 succeeded at 457 (offset 1 line).
Hunk #10 succeeded at 506 (offset 1 line).
Hunk #11 succeeded at 522 (offset 1 line).
1 out of 11 hunks FAILED -- saving rejects to file include/linux/libata.h.rej
zeratul linux-2.6.16-r6 # zeratul scsi # zeratul linux #
Gentoo-sources-2.6.16-r6 (zmieniłem jedynie nazwę katalogu, by zachować czystą kopię) i teraz nie wiem, czy można olać te odrzuty, czy co z tym zrobić, bo moje się, żeby mi twardziela nie uszkodziło :]
libata.h.rej
Code: Select all
***************
*** 237,244 ****
unsigned long irq;
unsigned int irq_flags;
unsigned long host_flags;
void __iomem *mmio_base;
void *private_data;
};
struct ata_host_set {
--- 241,250 ----
unsigned long irq;
unsigned int irq_flags;
unsigned long host_flags;
+ unsigned long host_set_flags;
void __iomem *mmio_base;
void *private_data;
+ struct ata_host_set *host_set; /* Return not input value */
};
struct ata_host_set {
libata.core.c.rej
Code: Select all
***************
*** 78,84 ****
static unsigned int ata_unique_id = 1;
static struct workqueue_struct *ata_wq;
- int atapi_enabled = 0;
module_param(atapi_enabled, int, 0444);
MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)");
--- 79,85 ----
static unsigned int ata_unique_id = 1;
static struct workqueue_struct *ata_wq;
+ int atapi_enabled = 1;
module_param(atapi_enabled, int, 0444);
MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)");
Posted: Thu May 11, 2006 9:35 pm
by Raku
msch wrote:moze w grubie masz zle root= podane?
/dev/sda5 (zmieniłem wpisy w grubie i fstabie)
Posted: Thu May 11, 2006 9:39 pm
by arsen
Raku wrote:msch wrote:moze w grubie masz zle root= podane?
/dev/sda5 (zmieniłem wpisy w grubie i fstabie)
Może brakuje ci jakiegoś sterownika?
Posted: Thu May 11, 2006 9:54 pm
by msch
Art.root wrote:
libata.h.rej
Code: Select all
***************
*** 237,244 ****
unsigned long irq;
unsigned int irq_flags;
unsigned long host_flags;
void __iomem *mmio_base;
void *private_data;
};
struct ata_host_set {
--- 241,250 ----
unsigned long irq;
unsigned int irq_flags;
unsigned long host_flags;
+ unsigned long host_set_flags;
void __iomem *mmio_base;
void *private_data;
+ struct ata_host_set *host_set; /* Return not input value */
};
struct ata_host_set {
libata.core.c.rej
Code: Select all
***************
*** 78,84 ****
static unsigned int ata_unique_id = 1;
static struct workqueue_struct *ata_wq;
- int atapi_enabled = 0;
module_param(atapi_enabled, int, 0444);
MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)");
--- 79,85 ----
static unsigned int ata_unique_id = 1;
static struct workqueue_struct *ata_wq;
+ int atapi_enabled = 1;
module_param(atapi_enabled, int, 0444);
MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)");
znak + na poczatku linii oznacza, ze musisz ja dopisac recznie bo z automata sie nie udalo

te cyfry x,y to x oznacza numer wiersza (gdzies w tej okolicy to ma byc)
Posted: Thu May 11, 2006 9:54 pm
by manwe_
Art.root wrote:
libata.h.rej
Code: Select all
***************
*** 237,244 ****
unsigned long irq;
unsigned int irq_flags;
unsigned long host_flags;
void __iomem *mmio_base;
void *private_data;
};
struct ata_host_set {
--- 241,250 ----
unsigned long irq;
unsigned int irq_flags;
unsigned long host_flags;
+ unsigned long host_set_flags;
void __iomem *mmio_base;
void *private_data;
+ struct ata_host_set *host_set; /* Return not input value */
};
struct ata_host_set {
libata.core.c.rej
Code: Select all
***************
*** 78,84 ****
static unsigned int ata_unique_id = 1;
static struct workqueue_struct *ata_wq;
- int atapi_enabled = 0;
module_param(atapi_enabled, int, 0444);
MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)");
--- 79,85 ----
static unsigned int ata_unique_id = 1;
static struct workqueue_struct *ata_wq;
+ int atapi_enabled = 1;
module_param(atapi_enabled, int, 0444);
MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)");
Miałem to samo (dla jajca -r7), w pierwszym (libata.h) dopisałem ręcznie obydwie zmienne (w strukturze była jeszcze jakaś tablica dlatego sobie nie poradził), a w libata.core.c atapi_enabled było = 1, więc nic nie zmieniałem. I działa...
Posted: Fri May 12, 2006 5:28 am
by Zwierzak
Jeszcze nie testowałem, ale przerobiłem ebuild no-sources do obsługi tego. Niech ktoś przetestuje i zoabaczy czy się nie wyrzuca.
no-sources-2.6.17_rc3-r2.ebuild
A do testowania najlepsze jest:
Posted: Fri May 12, 2006 5:38 am
by arsen
Zwierzak wrote:Jeszcze nie testowałem, ale przerobiłem ebuild no-sources do obsługi tego. Niech ktoś przetestuje i zoabaczy czy się nie wyrzuca.
no-sources-2.6.17_rc3-r2.ebuild
A do testowania najlepsze jest:
Jesteś w ogromnym błędzie, hdparm nie nadaje sił w ogóle jako benchmark, bardzo zły nawyk użytkowników.
Posted: Fri May 12, 2006 5:40 am
by Zwierzak
No dobra to powiedz jak się korzysta z tego bonnie++?
Posted: Fri May 12, 2006 5:54 am
by arsen
Zwierzak wrote:No dobra to powiedz jak się korzysta z tego bonnie++?
polecam manuala, ale dła ułatwienia przykład:
Posted: Fri May 12, 2006 5:59 am
by Raku
arsen wrote:Raku wrote:msch wrote:moze w grubie masz zle root= podane?
/dev/sda5 (zmieniłem wpisy w grubie i fstabie)
Może brakuje ci jakiegoś sterownika?
nie wkompilowałem jedynie
Po za tym mam zaznaczone
Code: Select all
Device Drivers --->
SCSI device support --->
<*> SCSI device support
<*> SCSI disk support
< > SCSI CDROM support
<*> SCSI generic support
SCSI low-level drivers --->
<*> Serial ATA (SATA) support
<*> Generic PATA support
+ kontroler PATA VIA (mam do niego CDROMy podłączone i jeden dysk) oraz CMD49x (dwa dyski, w tym systemowy). Za pierwszym razem nie zaznaczyłem też Generic PATA support, ale zaznaczenie nie pomogło ani trochę.
Jak wrócę do domu, zrobię zrzut ekranu z bootowania i podam dokładny konfig (teraz piszę z pamięci). Sprawdzę go też dokładnie, bo może rzeczywiście cos przeoczyłem
Posted: Sun May 14, 2006 11:29 am
by Yatmai
W sumie chciałbym się zapytać tak na przyszłość... Jeśli użyję libata, mając w systemie dysk Sata i Pata, to jak będą nazywane ?
- SDA - SDD dla pierwszego i SDE - SDH dla drugiego ?
No i który będzie liczony jako pierwszy :]
Jeszcze jedno pytanie, zakładając teraz, że mam tylko dysk Pata w systemie. /dev/sda1 to był zawsze mój pendrive czy aparat cyfrowy, a po przejściu na libata, gdzie go potem znajdę ? /dev/sde1 ??

Posted: Sun May 14, 2006 11:53 am
by arsen
nazewnictwem zarządza udev, tam możesz pewne rzeczy ustawić.
Posted: Sun May 14, 2006 12:26 pm
by manwe_
Nie mogło być zbyt pięknie. LibATA nie wstaje mi dysku po acpitool -s. Trzeba było wrócić do ATA.