En fait tu étais sur la bonne piste, mais c’était plus vicieux que ça.
Le problème vient bien des modules, mais il ne vient pas du chargement du module, j’ai les mêmes modules chargés sous Squeeze et Lenny, et mes modules chargés lorsqu’une Squeeze gère l’hotplug ou ne le gère pas. Le problème vient de quel module est utilisé pour gérer le sata, et c’est cela qui diffère.
La raison de mon problème est que le chipset ICH6 peut être géré soit en mode IDE, soit en mode SATA, nous l’avions déjà vu avec le BIOS, mais le problème là est de l’ordre du noyau. Sous linux il y a deux modules qui savent gérer le chipset ICH6, le module ata_piix, qui ne sait pas gérer l’hotplug, et le module ahci, qui comme son nom l’indique sait gérer tout ce que supporte l’AHCI, dont l’hotplug.
les lsmod sont similaires sous Lenny et Squeeze, les modules ahci et ata_piix sont tout deux chargés. La différence se voit dans le lspci -vv.
Sous Lenny :
# lspci -vv -s 00:1f.2 | tee lspci-lenny
00:1f.2 SATA controller: Intel Corporation 82801FR/FRW (ICH6R/ICH6RW) SATA Controller (rev 03) (prog-if 01 [AHCI 1.0])
Subsystem: Super Micro Computer Inc Device 6280
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin B routed to IRQ 19
Region 0: I/O ports at e900 [size=8]
Region 1: I/O ports at ea00 [size=4]
Region 2: I/O ports at eb00 [size=8]
Region 3: I/O ports at ec00 [size=4]
Region 4: I/O ports at ed00 [size=16]
Region 5: Memory at d03c3000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [70] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
Status: D0 PME-Enable- DSel=0 DScale=0 PME-
Kernel driver in use: ahci
Kernel modules: ahci, ata_piix
Sous Squeeze :
# lspci -vv -s 00:1f.2 | tee lspci-squeeze
00:1f.2 SATA controller: Intel Corporation 82801FR/FRW (ICH6R/ICH6RW) SATA Controller (rev 03) (prog-if 01 [AHCI 1.0])
Subsystem: Super Micro Computer Inc Device 6280
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin B routed to IRQ 19
Region 0: I/O ports at e900 [size=8]
Region 1: I/O ports at ea00 [size=4]
Region 2: I/O ports at eb00 [size=8]
Region 3: I/O ports at ec00 [size=4]
Region 4: I/O ports at ed00 [size=16]
Region 5: Memory at d03c3000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [70] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Kernel driver in use: ata_piix
Le diff des deux est révélateur :
[code]# diff lspci-lenny lspci-squeeze
16,18c16,17
< Status: D0 PME-Enable- DSel=0 DScale=0 PME-
< Kernel driver in use: ahci
< Kernel modules: ahci, ata_piix
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Kernel driver in use: ata_piix[/code]
J’ai installé une Debian Squeeze sur une clé usb pour pouvoir manipuler sans crainte les modules ide/sata, les charger/décharger sans perdre mon système de fichier racine…
Par défaut j’ai mes deux modules ata_piix et ahci chargés
[code]# lsmod | grep ahci
ahci 27246 0
libata 115721 3 ata_piix,ata_generic,ahci
lsmod | grep ata_piix
ata_piix 17640 1
libata 115721 3 ata_piix,ata_generic,ahci[/code]
Mais comme nous l’avons vu, lspci montre que c’est le module ata_piix qui est utilisé.
Si je décharge le module ata_piix et le module ahci, mon contrôleur sata n’est plus géré.
[code]# modprobe -r ata_piix
modprobe -r ahci
lspci -vv -s 00:1f.2
00:1f.2 SATA controller: Intel Corporation 82801FR/FRW (ICH6R/ICH6RW) SATA Controller (rev 03) (prog-if 01 [AHCI 1.0])
Subsystem: Super Micro Computer Inc Device 6280
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- SERR- <PERR- INTx-
Interrupt: pin B routed to IRQ 19
Region 0: I/O ports at e900 [size=8]
Region 1: I/O ports at ea00 [size=4]
Region 2: I/O ports at eb00 [size=8]
Region 3: I/O ports at ec00 [size=4]
Region 4: I/O ports at ed00 [size=16]
Region 5: Memory at d03c3000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [70] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-[/code]
Si je charge le module ata_piix avant le module ahci, c’est lui qui gère mon contrôleur sata, mais je n’ai pas d’hotplug fonctionnel.
[code]# modprobe ata_piix
lspci -vv -s 00:1f.2
00:1f.2 SATA controller: Intel Corporation 82801FR/FRW (ICH6R/ICH6RW) SATA Controller (rev 03) (prog-if 01 [AHCI 1.0])
Subsystem: Super Micro Computer Inc Device 6280
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- SERR- <PERR- INTx-
Latency: 0
Interrupt: pin B routed to IRQ 19
Region 0: I/O ports at e900 [size=8]
Region 1: I/O ports at ea00 [size=4]
Region 2: I/O ports at eb00 [size=8]
Region 3: I/O ports at ec00 [size=4]
Region 4: I/O ports at ed00 [size=16]
Region 5: Memory at d03c3000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [70] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Kernel driver in use: ata_piix
modprobe ahci
lspci -vv -s 00:1f.2
00:1f.2 SATA controller: Intel Corporation 82801FR/FRW (ICH6R/ICH6RW) SATA Controller (rev 03) (prog-if 01 [AHCI 1.0])
Subsystem: Super Micro Computer Inc Device 6280
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- SERR- <PERR- INTx-
Latency: 0
Interrupt: pin B routed to IRQ 19
Region 0: I/O ports at e900 [size=8]
Region 1: I/O ports at ea00 [size=4]
Region 2: I/O ports at eb00 [size=8]
Region 3: I/O ports at ec00 [size=4]
Region 4: I/O ports at ed00 [size=16]
Region 5: Memory at d03c3000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [70] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Kernel driver in use: ata_piix[/code]
Si je décharge le module ata_piix, mon contrôleur n’est plus géré, si je recharge le module ahci, alors le contrôleur est à nouveau géré, et l’hotplug fonctionne !
[code]# modprobe -r ata_piix
lspci -vv -s 00:1f.2
00:1f.2 SATA controller: Intel Corporation 82801FR/FRW (ICH6R/ICH6RW) SATA Controller (rev 03) (prog-if 01 [AHCI 1.0])
Subsystem: Super Micro Computer Inc Device 6280
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- SERR- <PERR- INTx-
Interrupt: pin B routed to IRQ 19
Region 0: I/O ports at e900 [size=8]
Region 1: I/O ports at ea00 [size=4]
Region 2: I/O ports at eb00 [size=8]
Region 3: I/O ports at ec00 [size=4]
Region 4: I/O ports at ed00 [size=16]
Region 5: Memory at d03c3000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [70] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
modprobe -r ahci
modprobe ahci
lspci -vv -s 00:1f.2
00:1f.2 SATA controller: Intel Corporation 82801FR/FRW (ICH6R/ICH6RW) SATA Controller (rev 03) (prog-if 01 [AHCI 1.0])
Subsystem: Super Micro Computer Inc Device 6280
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- SERR- <PERR- INTx-
Latency: 0
Interrupt: pin B routed to IRQ 19
Region 0: I/O ports at e900 [size=8]
Region 1: I/O ports at ea00 [size=4]
Region 2: I/O ports at eb00 [size=8]
Region 3: I/O ports at ec00 [size=4]
Region 4: I/O ports at ed00 [size=16]
Region 5: Memory at d03c3000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [70] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Kernel driver in use: ahci[/code]
Ayant déchargé le module ata_piix, mon lecteur cd ne fonctione plus, mais si je recharge le module ata_piix, il sera géré, et comme le contrôleur Sata est déjà géré par le module ahci, le module ata_piix ne s’occupe pas d’autre chose que ce qui est encore disponible : le lecteur cd.
[code]# modprobe ata_piix
lspci -vv -s 00:1f.2
00:1f.2 SATA controller: Intel Corporation 82801FR/FRW (ICH6R/ICH6RW) SATA Controller (rev 03) (prog-if 01 [AHCI 1.0])
Subsystem: Super Micro Computer Inc Device 6280
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- SERR- <PERR- INTx-
Latency: 0
Interrupt: pin B routed to IRQ 19
Region 0: I/O ports at e900 [size=8]
Region 1: I/O ports at ea00 [size=4]
Region 2: I/O ports at eb00 [size=8]
Region 3: I/O ports at ec00 [size=4]
Region 4: I/O ports at ed00 [size=16]
Region 5: Memory at d03c3000 (32-bit, non-prefetchable) [size=1K]
Capabilities: [70] Power Management version 2
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Kernel driver in use: ahci[/code]
C’est toujours le module AHCI qui est utilisé, et pourtant le module ATA fonctionne .
Il est NÉCÉSSAIRE de charger le module ahci avant le module ata_piix, si l’ordre est inversé, puisque le module ata_piix sait aussi gérer le matériel, il prend le contrôle à la place du module ahci, mais avec un fonctionnement limité.
Une solution gruik est de mettre en liste noire le module ata_piix, pour qu’il ne soit pas chargé au démarrage, et de charger ce module ensuite, manuellement ou de manière très sale dans le rc.local, ainsi on est certain que le module ahci est chargé avant le module ata_piix.
Voici un apperçu du comportement d’une Squeeze dont le pilote ata_piix est en liste noir au démarrage, puis chargé manuellement ensuite.
[code]# echo ‘blacklist ata_piix’ >> /etc/modprobe.d/blacklist.conf
update-initramfs -k all -u
reboot[/code]
Nous n’avons qu’un seul disque SATA
# ls /dev/sd*
/dev/sda /dev/sda1
Le CD IDE n’est pas géré
# ls /dev/sr*
ls: cannot access /dev/sr*: No such file or directory
Insérons un disque à chaud, il est détecté correctement.
[code]# dmesg
[ 168.135380] ata4: exception Emask 0x10 SAct 0x0 SErr 0x4050000 action 0xe frozen
[ 168.135450] ata4: irq_stat 0x00400040, connection status changed
[ 168.135500] ata4: SError: { PHYRdyChg CommWake DevExch }
[ 168.135558] ata4: hard resetting link
[ 173.896016] ata4: link is slow to respond, please be patient (ready=0)
[ 176.080025] ata4: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
[ 176.097162] ata4.00: ATA-8: MAXTOR STM3500320AS, MX1A, max UDMA/133
[ 176.097166] ata4.00: 976773168 sectors, multi 0: LBA48 NCQ (depth 31/32)
[ 176.099149] ata4.00: configured for UDMA/133
[ 176.099159] ata4: EH complete
[ 176.099280] scsi 3:0:0:0: Direct-Access ATA MAXTOR STM350032 MX1A PQ: 0 ANSI: 5
[ 176.099832] sd 3:0:0:0: [sdb] 976773168 512-byte logical blocks: (500 GB/465 GiB)
[ 176.099942] sd 3:0:0:0: [sdb] Write Protect is off
[ 176.099949] sd 3:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[ 176.099997] sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn’t support DPO or FUA
[ 176.100264] sdb: sdb1
[ 176.132414] sd 3:0:0:0: [sdb] Attached SCSI disk
ls /dev/sd*
/dev/sda /dev/sda1 /dev/sdb /dev/sdb1
sfdisk -s /dev/sdb
488386584
sfdisk -l /dev/sdb
Disk /dev/sdb: 60801 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/sdb1 * 0+ 60666 60667- 487307646 fd Linux raid autodetect
/dev/sdb2 0 - 0 0 0 Empty
/dev/sdb3 0 - 0 0 0 Empty
/dev/sdb4 0 - 0 0 0 Empty[/code]
Chargeons le module ata_piix, le CD est reconnu.
[code]# modprobe ata_piix
dmesg
[ 326.542856] ata_piix 0000:00:1f.1: version 2.13
[ 326.542882] ata_piix 0000:00:1f.1: PCI INT A -> GSI 18 (level, low) -> IRQ 18
[ 326.542943] ata_piix 0000:00:1f.1: setting latency timer to 64
[ 326.543051] scsi5 : ata_piix
[ 326.543200] scsi6 : ata_piix
[ 326.544470] ata5: PATA max UDMA/100 cmd 0x1f0 ctl 0x3f6 bmdma 0xf000 irq 14
[ 326.544475] ata6: PATA max UDMA/100 cmd 0x170 ctl 0x376 bmdma 0xf008 irq 15
[ 326.711446] ata5.01: ATAPI: MATSHITADVD-ROM SR-8178, PZ16, max UDMA/66
[ 326.711479] ata5.01: limited to UDMA/33 due to 40-wire cable
[ 326.724304] ata5.01: configured for UDMA/33
[ 326.727103] scsi 5:0:1:0: CD-ROM MATSHITA DVD-ROM SR-8178 PZ16 PQ: 0 ANSI: 5
[ 326.753876] sr0: scsi3-mmc drive: 24x/24x cd/rw xa/form2 cdda tray
[ 326.753881] Uniform CD-ROM driver Revision: 3.20
[ 326.754169] sr 5:0:1:0: Attached scsi CD-ROM sr0
[ 326.785463] sd 4:0:0:0: Attached scsi generic sg0 type 0
[ 326.786133] sd 3:0:0:0: Attached scsi generic sg1 type 0
[ 326.786261] sr 5:0:1:0: Attached scsi generic sg2 type 5
ls /dev/sr*
/dev/sr0
mount /dev/sr0 /mnt
mount: block device /dev/sr0 is write-protected, mounting read-only
ls /mnt/
autorun.inf debian dists g2ldr install isolinux pics README.html README.mirrors.txt README.txt tools
css dedication.txt doc g2ldr.mbr install.386 md5sum.txt pool README.mirrors.html README.source setup.exe win32-loader.ini[/code]
Donc nous avons bien un cadavre dans la penderie, Squeeze va sortir avec un gros bug de gestion du contrôleur AHCI ICH6 ! En effet, lorsque le module ata_piix est chargé avant le module ahci (et l’ordre de chargement semble dépendre de l’âge du capitaine) l’hotplug n’est pas supporté. Voici pourquoi selon les redémarrage l’hotplug fontionne ou non. Sous Lenny nous avions peut-être de la chance en fait !
J’ai montré plus haut un vilain hack très sale, mais tout comme on peut mettre en liste noire un module, il est peut-être possible d’établir un ordre de chargement, ce serait plus propre que de mettre un modprobe dans le rc.local d’un module en liste noire !
Quelqu’un sait-il comment faire cela proprement ?
À votre avis, dans quel paquet faut-il rapporter le bug ?
Il serait excellent que Squeeze sorte avec cette correction !
(Je ne marque pas le sujet comme résolu, puisqu’il me faut encore savoir comment établir une priorité de chargement des modules, et surtout comment résoudre ce bug chez Debian )