Sujet: [linux] udev
01/09/2008 @ 17:47:09: Jean-Christophe: [linux] udev
Bonjour/Bonsoir,

J'ai à ma disposition une carte via Epia 800 et tous les trucs pour mettre dessus.
J'ai aussi 4 disques externes de 500GB.

Du coup, je me dis : "Ouai, super, je vais faire un petit NAS!"
Avec tout ca, plus Ubuntu Server 8.04 + Webmin + mdadm, j'ai fait un raid 5, tout roule.
Par contre, il ne faut pas que je redémarre le truc. Sinon, les disques externes qui sont /dev/sdb, /dev/sdc, /dev/sdd et /dev/sde ne sont plus à la même place. Les emplacement semblent aléatoires.

La solution serait udev SI j'arrivais à trouver un truc unique dans chaque disque pour créer une rêgle d'attribution de nom de device.
C'est là qu'est l'os...

Quel que soit le disque, quand je fait
udevinfo -a -p /sys/block/[nom du disque]

j'obtiens la même chose. Même le numéro de série est le même...

Pour info, le résultat.
user@nas:~$ sudo udevinfo -a -p /sys/block/sdb

Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

looking at device '/block/sdb':
KERNEL=="sdb"
SUBSYSTEM=="block"
DRIVER==""
ATTR{dev}=="8:16"
ATTR{range}=="16"
ATTR{removable}=="0"
ATTR{size}=="976773168"
ATTR{stat}==" 4801543 117294796 976769560 356976996 410566 5522918 47467888 59108440 0 55425312 416084900"
ATTR{capability}=="12"

looking at parent device '/devices/pci0000:00/0000:00:14.2/usb5/5-4/5-4:1.0/host2/target2:0:0/2:0:0:0':
KERNELS=="2:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{vendor}=="ST350083"
ATTRS{model}=="0AS "
ATTRS{rev}==" "
ATTRS{state}=="running"
ATTRS{timeout}=="30"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest_cnt}=="0x4f87d4"
ATTRS{iodone_cnt}=="0x4f87d4"
ATTRS{ioerr_cnt}=="0x0"
ATTRS{modalias}=="scsi:t-0x00"
ATTRS{evt_media_change}=="0"
ATTRS{queue_depth}=="1"
ATTRS{queue_type}=="none"
ATTRS{max_sectors}=="240"

looking at parent device '/devices/pci0000:00/0000:00:14.2/usb5/5-4/5-4:1.0/host2/target2:0:0':
KERNELS=="target2:0:0"
SUBSYSTEMS==""
DRIVERS==""

looking at parent device '/devices/pci0000:00/0000:00:14.2/usb5/5-4/5-4:1.0/host2':
KERNELS=="host2"
SUBSYSTEMS==""
DRIVERS==""

looking at parent device '/devices/pci0000:00/0000:00:14.2/usb5/5-4/5-4:1.0':
KERNELS=="5-4:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{modalias}=="usb:v152Dp2336d0100dc00dsc00dp00ic08isc06ip50"
ATTRS{interface}=="Bulk-In, Bulk-Out Interface"

looking at parent device '/devices/pci0000:00/0000:00:14.2/usb5/5-4':
KERNELS=="5-4"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{dev}=="189:513"
ATTRS{configuration}=="USB Mass Storage"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="c0"
ATTRS{bMaxPower}==" 2mA"
ATTRS{urbnum}=="138329697"
ATTRS{idVendor}=="152d"
ATTRS{idProduct}=="2336"
ATTRS{bcdDevice}=="0100"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="5"
ATTRS{devnum}=="2"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="JMicron"
ATTRS{product}=="MEDION HDDrive2GO"
ATTRS{serial}=="883500830A88"

looking at parent device '/devices/pci0000:00/0000:00:14.2/usb5':
KERNELS=="usb5"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{dev}=="189:512"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="62"
ATTRS{idVendor}=="0000"
ATTRS{idProduct}=="0000"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="5"
ATTRS{devnum}=="1"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="5"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.24-19-generic ehci_hcd"
ATTRS{product}=="EHCI Host Controller"
ATTRS{serial}=="0000:00:14.2"
ATTRS{authorized_default}=="1"

looking at parent device '/devices/pci0000:00/0000:00:14.2':
KERNELS=="0000:00:14.2"
SUBSYSTEMS=="pci"
DRIVERS=="ehci_hcd"
ATTRS{vendor}=="0x1033"
ATTRS{device}=="0x00e0"
ATTRS{subsystem_vendor}=="0x9004"
ATTRS{subsystem_device}=="0x00e0"
ATTRS{class}=="0x0c0320"
ATTRS{irq}=="12"
ATTRS{local_cpus}=="ff"
ATTRS{modalias}=="pci:v00001033d000000E0sv00009004sd000000E0bc0Csc03i20"
ATTRS{enable}=="1"
ATTRS{broken_parity_status}=="0"
ATTRS{msi_bus}==""

looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""


une recherche sur les numéros de série est claire.
user@nas:~$ sudo udevinfo -a -p /sys/block/sdb | grep -i serial
ATTRS{serial}=="883500830A88"
ATTRS{serial}=="0000:00:14.2"
user@nas:~$ sudo udevinfo -a -p /sys/block/sdc | grep -i serial
ATTRS{serial}=="883500830A88"
ATTRS{serial}=="0000:00:14.2"
user@nas:~$ sudo udevinfo -a -p /sys/block/sdd | grep -i serial
ATTRS{serial}=="883500830A88"
ATTRS{serial}=="0000:00:14.2"
user@nas:~$ sudo udevinfo -a -p /sys/block/sde | grep -i serial
ATTRS{serial}=="883500830A88"
ATTRS{serial}=="0000:00:14.2"


Si vous avez une idée, je suis preneur.

Je vais tondre puis je viens ramasser les copies. :smile:

Merci
01/09/2008 @ 18:32:25: philfr: [linux] udev
Tu as mis le type de partition à 'fd : Linux RAID autodetect' ? mdadm devrait retrouver ses jeunes à l'aide du superblock.

Sinon, pour distinguer tes disques/partitions usb, tu as les devices /dev/disk/by-path, /dev/disk/by-uuid, etc.
01/09/2008 @ 18:44:49: Jean-Christophe: [linux] udev
je ne sais pas ce que c'est les /dev/disk/by-uuid etc. J'ai bien l'impression que ca fait appel à des notions d'identifiant unique, mais je ne sais pas comment les obtenir pour créer des règles d'attribution.

J'ai l'air de savoir de quoi je parle, mais c'est uniquement par ce que j'ai compris les tuto que j'ai suivi. Tout ce qui est à côté m'est inconu :ohwell:
01/09/2008 @ 20:16:54: kortenberg: [linux] udev
Les uuid sont les uuid attribués à la création de tes partitions.
les /dev/disk/by-uuid/* sont des lien symbolique vers les /dev/sd* ou /dev/hd*
01/09/2008 @ 20:37:26: Jean-Christophe: [linux] udev
ok, merci.
Et comment je peux fixer ces fameux lien symboliques?
Le but est que /dev/sdc reste sdc même si il n'y a que deux device au boot.
Par défaut, ca redevient sdb :ohwell:
01/09/2008 @ 20:51:21: kortenberg: [linux] udev
Je ne sais pas ce que tu fais avec /dev/sdc mais, à priori, je dirais qu'il suffit d'utiliser /dev/disk/by-uuid/... au lieu de /dev/sdc.

edit: je suis con. il n'y a que les partitions et pas les disques.
edit2: se pencher sur /dev/disk/by-id/ata-ST910021A_5MH0YYSB?
01/09/2008 @ 21:00:10: Jean-Christophe: [linux] udev
j'en fait un raid, et donc, c'est bien des partitions dont j'ai besoin :smile:
je vais faire quelques tests

merci

Pour le moment, je teste ntfsundelete :sad: , j'ai fais l'on :ohwell:
01/09/2008 @ 21:11:08: philfr: [linux] udev
Les /dev/disk/by-uuid sont aussi tes partitions. Tu dois donc remplacer /dev/sd* par ceux-là qui restent immuables.
01/09/2008 @ 21:13:45: philfr: [linux] udev

Pour le moment, je teste ntfsundelete :sad: , j'ai fais l'on :ohwell:


Tu ne fais quand même pas ton RAID linux en NTFS ? :totoz:
01/09/2008 @ 21:27:19: Jean-Christophe: [linux] udev
non, non, pas de panique.
il y a un des disques qui était ntfs, avec des données dessus, je me suis suis dit que ce serait plus facile de faire un raid en 3 disques, de déplacer les fichiers de la partition ntfs vers le raid, puis de virer l'ntfs et d'agrandir le raid avec le disque nouvellement vidé.
mais j'ai foiré mon truc :grin:
02/09/2008 @ 20:42:23: Jean-Christophe: [linux] udev
Pour faire un raid 5 avec mdadm, qu'est ce qui est le mieux comme partition de base sur chaque disque?
03/09/2008 @ 00:13:15: philfr: [linux] udev
Pour le type de partition, tu mets "fd" autodetect.
Le file system se fait sur le raid, pas sur les partitions individuelles.

Ta question n'étant pas claire, je ne suis pas sûr que ma réponse te convienne, mais tu peux préciser...
03/09/2008 @ 08:36:04: Jean-Christophe: [linux] udev
ok, ma question n'était pas claire, c'est vrai :oh:

Au moment de créer le RAID, il me demande de choisir des partitions pour le composer (et pas des disques, comme un raid hardware).
J'ai donc des partitions "en dessous" du raid. Il y a 36 sortes de formatage possible pour ses partitions. Je ne sais pas si ca change quelque chose que ce soit un ou l'autre, mais j'ai constaté que si je ne formate pas la partition (je la laisse empty), ca fonctionne MAIS, je n'ai pas le fameux UID dont nous parlions quelques lignes plus haut. En même temps, vu le temps que ca me prends pour faire un test, je n'en ai pas fait 40 et donc, je ne suis pas sur que c'est l'absence de formatage qui cause l'absence d'UID.

J'espère que maintenant, c'est plus clair.
03/09/2008 @ 09:50:12: philfr: [linux] udev
Les partitions que tu vas utiliser pour construire ton raid n'on pas à contenir de file system. Mais donc tu as raison, il n'auront pas d'uuid et ne seront dès lors pas identifiables avec un /dev/disk/by-uuid/...
Ils seront par contre toujours identifiables avec un /dev/disk/by-path/... si tu ne les déplaces pas de connecteur USB.

Cela dit, je persiste à croire que mdadm peut retrouver tout seul l'ordre des disques si l'array a été créé comme il faut, c'est à dire avec mdadm create et non avec mdadm build.
Je ne sais pas comment webmin appelle mdadm, mais je ne peux que te recommander de le faire "à la main", ça te permettra de mieux comprendre ce qui se passe et d'expérimenter avec ton raid avant de lui faire confiance pour y mettre tes données.
03/09/2008 @ 10:38:30: Jean-Christophe: [linux] udev
je ne peux que te recommander de le faire "à la main", ça te permettra de mieux comprendre ce qui se passe et d'expérimenter avec ton raid avant de lui faire confiance pour y mettre tes données.


Ben oui, j'en suis là, mais ca prend un temps bête tout ses essais.
En même temps, c'est normal, mais ca explique que ce ne soit pas simple dans la pratique.

Suite au prochain épisode, merci :smile:
04/09/2008 @ 12:54:41: philfr: [linux] udev
J'ai refait un peu joujou avec mdadm pour vérifier mes dires.
Si tu crées ton array avec

mdadm --create /dev/md0 --raid-devices=4 --level=5 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

mdadm mettra un "persistent superblock" sur chaque partition pour retrouver ses jeunes par après.
Donc si par la suite, tu réaasembles ton array avec

mdadm --assemble /dev/md0 /dev/sde1 /dev/sdb1 /dev/sdd1 /dev/sdc1

mdadm se foutra pas mal que tu les as mis dans le désordre et fera ce qu'il faut.
Ton problème initial est donc à mon avis un non problème, mais je suppose que si tu l'as posé, c'est qu'il t'est arrivé quelque chose (ou peut-être était-ce juste une inquiétude ?)
Si tu mets le type de tes partitions à fd, le kernel peut les détecter au boot, et tu ne devras même pas redémarrer ton array. Je dis ça parce que c'est comme ça chez moi, mais il semble que les arrays autodétectées soient maintenant déconseillées et plus supportées avec le nouveau format de superblock (lien)

Une bonne façon de faire des tests avec mdadm est de jouer avec les loopback devices: tu crées des fichiers normaux (p.ex. avec dd if=/dev/zero of=partition1 bs=1k count=100000 crée un fichier de 100MB) puis tu fais passer ces fichiers pour des partitions avec les loopback devices (losetup -f partition1 crée un "device" /dev/loop0) que tu peux ensuite utiliser à la place de partitions dans tes essais mdadm. Tu peux alors les corrompre exprès, les supprimer, les rajouter, et voir que ton array marche toujours...

A propos des /dev/disk/by-xxx (normalement pas utile pour les RAID, mais pour info):
Si tu fais ls -l /dev/disk/by-id, tu devrais voir tous tes disques et partitions avec un nom immuable, lié à la marque et au no. de série.
Sur une machine ici par exemple, j'ai:

[root@punch philfr]# ls -l /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root 9 2008-09-04 11:43 ata-Maxtor_6Y250P0_Y64XTEME -> ../../hdb
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 ata-Maxtor_6Y250P0_Y64XTEME-part1 -> ../../hdb1
lrwxrwxrwx 1 root root 9 2008-09-04 11:43 ata-WDC_WD400BB-60DGA0_WD-WMADK2629553 -> ../../hda
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 ata-WDC_WD400BB-60DGA0_WD-WMADK2629553-part1 -> ../../hda1
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 ata-WDC_WD400BB-60DGA0_WD-WMADK2629553-part2 -> ../../hda2
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 ata-WDC_WD400BB-60DGA0_WD-WMADK2629553-part3 -> ../../hda3
lrwxrwxrwx 1 root root 9 2008-09-04 12:45 usb-Memorex_TD_Classic_003B_07710C1702FF -> ../../sda
lrwxrwxrwx 1 root root 10 2008-09-04 12:45 usb-Memorex_TD_Classic_003B_07710C1702FF-part1 -> ../../sda1
[root@punch philfr]#


Les /dev/disk/by-path identifient la façon dont un disque est connecté à la machine et non le disque (si tu connectes un autre disque au même connecteur il aura donc ici le même nom)
Chez moi:

[root@punch raidtests]# ls -l /dev/disk/by-path/
total 0
lrwxrwxrwx 1 root root 9 2008-09-04 12:45 pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 2008-09-04 12:45 pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 9 2008-09-04 11:43 pci-0000:00:1f.1-ide-0:0 -> ../../hda
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 pci-0000:00:1f.1-ide-0:0-part1 -> ../../hda1
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 pci-0000:00:1f.1-ide-0:0-part2 -> ../../hda2
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 pci-0000:00:1f.1-ide-0:0-part3 -> ../../hda3
lrwxrwxrwx 1 root root 9 2008-09-04 11:43 pci-0000:00:1f.1-ide-0:1 -> ../../hdb
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 pci-0000:00:1f.1-ide-0:1-part1 -> ../../hdb1
lrwxrwxrwx 1 root root 9 2008-09-04 11:43 pci-0000:00:1f.1-ide-1:1 -> ../../hdd
[root@punch raidtests]#


Toujours sur ma même machine:
Le /dev/disk/by-uuid identifie uniquement les partitions qui ont un uuid:

[root@punch raidtests]# ls -l /dev/disk/by-uuid
total 0
lrwxrwxrwx 1 root root 10 2008-09-04 12:45 465D-ADAA -> ../../sda1
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 608a1fb8-0152-4cf2-ad56-c7bb6e0dc374 -> ../../hda3
lrwxrwxrwx 1 root root 10 2008-09-04 11:43 f7699bc0-376e-44c5-80ca-dac4a00408cd -> ../../hda1
[root@punch raidtests]#
Retour