Je m'auto répond car la liste ayant bloqué pendant 2 ou 3 jours j'ai pu avancer
et cela peut aussi interesser d'autres personnes.

Voila donc un peu de background pour résoudre en partie les bugs de fdisk
ou format avec certains disques de grande capacité.

Les disques  sont accédés via un schéma appelé LBA (logical Block Adressing).

Dans ce schéma on définit l'adresse des blocs via :

cyl   (nombre de cylindres)
hd    (nombre de têtes ou de surfaces)
sect  ( nombre de secteur par piste)


cyl*hd*sect*512 représente la capacité totale du disque. Si au départ il
y avait corrélation entre la réalité physique du disque cela n'est plus
vrai aujourd'hui.

Sous Solaris X86 la structure d'adressage est légèrement différente de
celle de Solaris Sparc et cyl qui est sur 32 bits sur Sparc est encore
sur 16 bits sur X86 (probablement à cause du BIOS qui traîne des vieilleries).

Dans notre cas le disque 146 Gb était vu par format comme

23074 cyl alt 2 hd 4 sec 809

En effaçant la partition fdisk (une seule pour tout le disque) et en la
recréant on avait :

88610 cyl alt 2 hd 4 sec 809

Une fois la géométrie écrite on lisait à nouveau

23074 cyl alt 2 hd 4 sec 809


(23074+2) * 4 * 809 = 36 Go au lieu des attendus

(88610+2) * 4 * 809 = 146 Go


On remarque que 88612-23076 = 65536 ce qui signifie donc que lorsque cyl
dépasse 65535 il est vu modulo 65536.

Comment résoudre ce PB.

Diviser cyl par 2 et multiplier hd par 2 pour retomber sur le bon nombre
de blocs est le plus simple . Soit ici

cyl = 88612/2 = 44306
hd = 4 x 2 = 8
sect = 809 inchangé.

Ce qu'il faut aussi comprendre c'est qu'il n'est pas utile de se racrocher
à une caractéristique physique du disque d'une part et que ce mode d'adressage
fait toujours perdre quelques secteurs.

Méthode 2
---------

Si on regarde les caractéristiques constructeur du disque en question
SEAGATE ST3146707LC Rev D701 on voit qu'il est donné pour :

146,8 Gb
286 789 488 blocs
90773 cylindres
head 4
10000 RPM

qui n'est pas la géométrie vue par format. On peut néammoins partir de ces
valeurs en remarquant que 90773 est la encore > 65535 et qu'il faut donc
le diviser par 2. Les valeurs suivantes sont également valables

Ce qui donnerait :

cyl= 90773/2 = 45386,5 qu'on est obligé d'arrondir à l'inférieur

cyl 45386
head 8
sec = 286 789 488 / ( 45386 x 8 ) = 789

Ce qui donne à cause du 1/2 cylindre une capacité adressable de 286476432


On peut jouer un peu comme on veut avec ces 3 valeurs et si on ne veut perdre
aucun bloc il faut factoriser le nombre de blocs (il faut aussi le connaître)
ce qui donne éventuellement une troisème méthode :


# factor 286789488
286789488
     2
     2
     2
     2
     3
     47
     127123

A partir de la factorisation trouver 3 nombres < 65536. On ne peut le faire
que si le plus grand d'entre eux est aussi < 65536. Ici c'est donc impossible.


Suite à ces manip j'ai pu créer une VTOC déclarant une partition Solaris de
136 Gb. Hélas je n'ai pas pu repartitionner (car on a retombe sur la
limite) et de ce fait on ne peut utiliser que la partition c (2).
Le disque est néammoins visible (newfs sur la partition 2) comme un 136 Go
ce qui était le but recherché.


PS.

Les constructeurs annoncent la capacité disque en multiple de 1000 et non
de 1024 il est donc normal de voir un disque 146,8 Go apparaitre comme
136,73 (en Go multiple de 1024) car les OS travaillent ainsi :

 
# bc
scale=2 
286749488*512
146815737856
146815737856/1024^3
136.73





Extrait du fichier /usr/include/sys/dklabel.h. Je suppose que Solaris Intel
est de type VTOC_16 ou les cylindres sont sur un entier de 16 bits.


struct dk_label {
#if defined(_SUNOS_VTOC_16)
        struct  dk_vtoc dkl_vtoc;       /* vtoc inclusions from AT&T SVr4 */
        uint32_t        dkl_pcyl;       /* # of physical cylinders */
        uint32_t        dkl_ncyl;       /* # of data cylinders */
        uint16_t        dkl_acyl;       /* # of alternate cylinders */
        uint16_t        dkl_bcyl;       /* cyl offset (for fixed head area) */
        uint32_t        dkl_nhead;      /* # of heads */
        uint32_t        dkl_nsect;      /* # of data sectors per track */
        uint16_t        dkl_intrlv;     /* interleave factor */
        uint16_t        dkl_skew;       /* skew factor */
        uint16_t        dkl_apc;        /* alternates per cyl (SCSI only)   */
        uint16_t        dkl_rpm;        /* revolutions per minute */
        uint16_t        dkl_write_reinstruct;   /* # sectors to skip, writes */
        uint16_t        dkl_read_reinstruct;    /* # sectors to skip, reads  */
        uint16_t        dkl_extra[4];   /* for compatible expansion */
        char            dkl_pad[LEN_DKL_PAD];   /* unused part of 512 bytes */
#elif defined(_SUNOS_VTOC_8)
        char            dkl_asciilabel[LEN_DKL_ASCII]; /* for compatibility */
        struct dk_vtoc  dkl_vtoc;       /* vtoc inclusions from AT&T SVr4 */
        uint16_t        dkl_write_reinstruct;   /* # sectors to skip, writes */
        uint16_t        dkl_read_reinstruct;    /* # sectors to skip, reads */
        char            dkl_pad[LEN_DKL_PAD]; /* unused part of 512 bytes */
        uint16_t        dkl_rpm;        /* rotations per minute */
        uint16_t        dkl_pcyl;       /* # physical cylinders */
        uint16_t        dkl_apc;        /* alternates per cylinder */
        uint16_t        dkl_obs1;       /* obsolete */
        uint16_t        dkl_obs2;       /* obsolete */
        uint16_t        dkl_intrlv;     /* interleave factor */
        uint16_t        dkl_ncyl;       /* # of data cylinders */
        uint16_t        dkl_acyl;       /* # of alternate cylinders */
        uint16_t        dkl_nhead;      /* # of heads in this partition */
        uint16_t        dkl_nsect;      /* # of 512 byte sectors per track */
        uint16_t        dkl_obs3;       /* obsolete */
        uint16_t        dkl_obs4;       /* obsolete */
#if defined(_SYSCALL32)
        struct dk_map32 dkl_map[NDKMAP]; /* logical partition headers */
#else
        struct dk_map   dkl_map[NDKMAP]; /* logical partition headers */
#endif
#else
#error "No VTOC format defined."
#endif
        uint16_t        dkl_magic;      /* identifies this label format */
        uint16_t        dkl_cksum;      /* xor checksum of sector */
};















--
Christian Pélissier
Office National d'Études et de Recherches Aérospatiales BP 72 92322 Chatillon
Tel: 33 1 46 73 44 19, Fax: 33 1 46 73 41 50

_______________________________________________
Solaris_fr liste de diffusion en français pour Solaris, sur toutes architectures
Solaris_fr@x86.sun.com
http://x86.sun.com/mailman/listinfo/solaris_fr

Reply via email to