Newsgroup: it.comp.os.linux.iniziare
Titolo: fdisk: cilindri, settori, bytes

Conisderando i seguenti output:
# fdisk -lu /dev/mmcblk0
Disk /dev/mmcblk0: 513 MB, 513277952 bytes
4 heads, 16 sectors/track, 15664 cylinders, total 1002496 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x00000000
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1              16      102399       51192   83  Linux
/dev/mmcblk0p2          102400     1002495      450048    c  W95 FAT32 (LBA)
# fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 513 MB, 513277952 bytes
4 heads, 16 sectors/track, 15664 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Disk identifier: 0x00000000
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1        1600       51192   83  Linux
/dev/mmcblk0p2            1601       15664      450048    c  W95 FAT32 (LBA)
------------------------------------------
Prendiamo la prima partizione ad esempio:
1) copre 1600 cilindri e ciascun cilindro ha una dimensione di
   32768 bytes. Da ciň deduco che la dimensione della prima
	partizione dovrebbe essere:
	1600 cilindri * 32768 bytes/cilindro = 52428800 bytes
2) si estende su (102399-16) settori da 512 bytes ciascuno.
   Quindi dovrebbe avere una dimensione di
	(102399-16) settori * 512 bytes/settore = 52420096 bytes
3) fdisk parla anche di blocchi e la prima partizione ne ha
   51192, qualche ricerca parla di blocchi generalmente da 1024
	bytes. Pertanto ipotizzando giusto quel valore avrei:
	51192 blocchi * 1024 bytes/blocco = 52420608 bytes
Insomma si ottengono dei risultati differenti.
Chi ha ragione, a patto che non abbia sbagliato i conti:
la 1 laa 2 o la 3 ???

 2) si estende su (102399-16) settori da 512 bytes ciascuno.
La formula giusta è:
( 102399 - 16 + 1 ) * 512

>         51192 blocchi * 1024 bytes/blocco = 52420608 bytes
Ricapitolando quindi:
1) 1600 cyl * 32768 B/cyl = 52428800
2) 102399 sect * 512 B/sect = 52420608
3) 51192 block * 1024 B/block = 52420608
Ok, quindi la 2 e la 3 coincidono.
Perch� invece lavorando in cilindri i conti non tornano?
Quale sarebbe la formula in questo caso?

 Quale sarebbe la formula in questo caso?
Nessuna formula. stai lavorando con i numeri interi invece 
che con i numeri razionali.
Fai mente locale: un cilindro è 32 settori mentre la prima 
partizione inizia al 16° settore... 


Prima di proseguire (più o meno mi pare di aver capito dove sta
il problema) toglimi un dubbio:
"fdisk -l" dice:
Units = cylinders of 64 * 512 = 32768 bytes
"fdisk -ul" dice:
Units = sectors of 1 * 512 = 512 bytes
Per cui senza troppa fantasia immaginavo:
cylinders/sectors = 64
ovvero 1 cilindro = 64 settori
Cioè
una cassa di mele pesa 10Kg
una mela pesa 100g
In una cassa di mele ci sono 10000g/100g = 100 mele
Ma leggendo questo documento:
http://tldp.org/HOWTO/Partition/recovering.html#BlockSize
Sono rimasto ancora più spiazzato, non mi tornano le dimensioni:
================================================================
(number of needed cylinders) = (number of blocks) / (block size)
(block size) = (unit size) / 1024
(unit size) = (number of heads) * (number of sectors/cylinder)
                                      * (number of bytes/sector)
================================================================
unit size cosa sarebbe di preciso? bytes? cipolle? pomodori?
dimensionalmente sarebbero:
heads*bytes/cylinders = ( unit size )
anche così comunque mi manda un po' in crisi la differenza tra
numero di settori per traccia e numero di settori per cilindro.
Sembra non esserci differenza... ma il cilindro e la traccia non
dovrebbero essere du cose diverse del tipo
Ncylindri = Ntraccia * heads o qualcosa del genere?
da cui se è corretto:
unit size = heads*bytes/(tracks*heads) = bytes/tracks
passando ai blocchi:
block size = (bytes/tracks) / (1024 bytes ????
Insomma, come si vede ho poche idee e piuttosto confuse in merito
a cilindri, blocchi, heads, settori ecc...
Non è che potresti/e fare un attimo di chiarezza. Mi pare che il
discorso sia terra terra, e quali siano i miei dubbi spero sia
evidente da quanto ho scritto sopra...
In ogni caso grazie per la disponibilità  :-)

 partizione inizia al 16° settore...
Scusate l'errore.

 Unità = settori di 1 * 512 = 512 byte
L'unità di misura è un settore ed equivale a 512 byte.
... e così via.
Stai affogando in un bicchiere d'acqua.

 Stai affogando in un bicchiere d'acqua.
M'era andata di traverso, mii serviva solo una pacca sulla
schiena!  ;-)
Grazie della risposta.

 /dev/mmcblk0p2            1601       15664      450048    c  W95 FAT32 (LBA)
ALtre domande:
1) Il disco ha 1002496 settori. Però l'ultima partizione termina
   al settore 1002495.
	In alte parole l'ultimo settore dell'ultima partizione è
	vuoto.
	Mi postete confermare se questa affermazione è corretta?
	Lo so, potrebbe sembrare banale...

 vuoto.
Aridaje! La formula giusta è 
1002495 - 0 + 1 = 1002496
Sei de coccio!

 Sei de coccio!
:-)
Ecco, allora potresti spiegarmi da dove spunta la formula sopra?
Chiedo perchč m'č parso di capire i settori siano numerati a
partire da 1, mentre le testine (heads) e i cilindri partono da
zero.
Anche qui viene spiegato:
http://en.wikipedia.org/wiki/Cylinder-head-sector#Sectors
Ne riporto un pezzo...
"A "1.44 MB"[4] floppy disk has 80 cylinders (numbered 0 to 79),
2 heads (numbered 0 to 1) and 18 sectors (numbered 1 to 18).
Therefore, its capacity in sectors is computed as follows:
[...]"
Scusa la testardaggine e grazie per la disponibilitŕ.

 [...]"
A me sembra che dica che la numerazione parte da zero. 

 A me sembra che dica che la numerazione parte da zero. 
A me invece sembra dire:
cylinders (numbered 0 to 79) = 80 cyl
heads     (numbered 0 to 1)  =  2 heads
sectors   (numbered 1 to 18) = 18 sect
Mi pare sacrosanto.
Il punto perň potrebbe essere un altro:
per fare queste operazioni mi baso sull'output di fdisk, versione
linux.
Ora, i dati che riporta fdisk, seguono o non seguono quella
convenzione soprariportata di indirizzamento c/h/s ???
In altre parole, quando fdisk parla di cilindro di inizio/fine o di
settore di inizio/fine di una partizione, come numera settori e
cilindri?

 convenzione soprariportata di indirizzamento c/h/s ???
Si  usa LBA, C/H/S è obsoleto da anni; ormai viene usato 
solo per i floppy.


Non ci capiamo, LBA parla di blocchi, tra l'altro non sono
neanche certo che i blocchi che riporta fdisk siano la stessa
cosa dei blocchi su cui si basa il reindirizzamento LBA. Ma
quello è un altro discorso.
Vero è che fdisk parla di settori e cilindri, io sto facendo
qualche prova di resize di partizioni/filesystems manuale e
pertanto devo essere preciso.
A me per il momento interessa capire come usare fdisk e ricavare
dai dati che riporta le informazioni che mi interessano.
Pertanto vorrei capire come vengono numerati i cilindri e i
settori. In particolare mi interessa capire come viene indicato
il primo cilindro e il primo settore da fdisk, ovvero che numero
gli viene assegnato:
ci sono ovviamente 2 possibilità
a- 0
b- 1
Per quanto riguarda i cilindri mi pare quasi ovvio, lo si vede
bene da qua:
===========================
# losetup /dev/loop0 sdcard 
# fdisk -l /dev/loop0
Disk /dev/loop0: 513 MB, 513277952 bytes
4 heads, 16 sectors/track, 15664 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Disk identifier: 0x00000000
      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1       15664      501240   83  Linux
================================================================
Se fdisk indicasse il primo cilindro come "cilindro numero 0",
alla voce "start" avrei il valore "0" come inizio dell'unica
partizione. Invece in questo caso ho 1.
Mi pare quindi ovvio che fdisk numeri i cilindri da 1 a 15664, nel
caso soprariportato, dove 15664 è il cilindro finale del disco.
A sostegno di questa conlusione (ripeto, quasi ovvia imho)
riporto anche questo:
http://www.partitionsupport.com/partitionnotes.htm
dove dice:
"Note that Linux fdisk numbers cylinders from 1."
Il discorso pensavo fosse analogo anche per i settori:
cioè fdisk numera i settori da 1 al settore finale.
E invece no...  :-\
fdisk numera i cilindri a aprtire da 1 ma i settori li numera a
partire da 0, così il primo settore lo chiama "settore numero 0",
mentre il primo cilindro lo chiama "cilindro numero 1".
Insomma, fdisk non riporta valori di settori e cilindri che non
hanno a che fare con le coordinate chs.
A riprova di quanto ho affermato porto l'output di
sfdisk, che più sottilmente di fdisk specifica anche da quale
cilindro o settore parte la numerazione.
Rivediamo quindi fdisk:
----------------------------------------
# fdisk -l /dev/loop0
Disk /dev/loop0: 513 MB, 513277952 bytes
4 heads, 16 sectors/track, 15664 cylinders
Units = cylinders of 64 * 512 = 32768 bytes
Disk identifier: 0x00000000
		Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1               1       15664      501240   83  Linux
------------
# fdisk -ul /dev/loop0
Disk /dev/loop0: 513 MB, 513277952 bytes
4 heads, 16 sectors/track, 15664 cylinders, total 1002496 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x00000000
		Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1              16     1002495      501240   83  Linux
================================================================
Ed ecco invece cosa riporta sfdisk:
--------------------------
# sfdisk -l -uC /dev/loop0
Disk /dev/loop0: cannot get geometry
Disk /dev/loop0: 62 cylinders, 255 heads, 63 sectors/track
Warning: The partition table looks like it was made
  for C/H/S=*/4/16 (instead of 62/255/63).
For this listing I'll assume that geometry.
Units = cylinders of 32768 bytes, blocks of 1024 bytes, counting from 0
		Device Boot Start     End   #cyls    #blocks   Id  System
/dev/loop0p1          0+  15663   15664-    501240   83  Linux
/dev/loop0p2          0       -       0          0    0  Empty
/dev/loop0p3          0       -       0          0    0  Empty
/dev/loop0p4          0       -       0          0    0  Empty
---------------------------------- ---------------------------
# sfdisk -l -uS /dev/loop0
Disk /dev/loop0: cannot get geometry
Disk /dev/loop0: 62 cylinders, 255 heads, 63 sectors/track
Warning: The partition table looks like it was made
  for C/H/S=*/4/16 (instead of 62/255/63).
For this listing I'll assume that geometry.
Units = sectors of 512 bytes, counting from 0
		Device Boot    Start       End   #sectors  Id  System
/dev/loop0p1            16   1002495    1002480  83  Linux
/dev/loop0p2             0         -          0   0  Empty
/dev/loop0p3             0         -          0   0  Empty
/dev/loop0p4             0         -          0   0  Empty
----------------------------------------------------------
In sintesi, fdisk numera i cilindri dal numero 1 al numero N
e dice che ci sono N cilindri.
sfdisk invece li numera dallo 0 al N-1, poichè in questo caso la
partizione è unica e occupa tutto il disco, finisce sull'ultimo
cilindro (N-1), insomma  a conti fatti anche fdisk conferma che ci
sono N cilindri.
Poi, per quanto riguarda i settori fdisk li conta da 0 a N, nel
mio caso la prima partizione va dal settore 16 compreso, al
settore 1002495 per un totale di (1002495-16+1=) 1002480 settori.
Il disco contiene 1002496 settori e i conti tornano in quanto i
settori da 0 a 15 compreso non appartengono alla partizione:
1002496 = 1002480 + (15 - 0 + 1)
Quindi la partizione arriva a coprire tutto l'ultimo settore.
sfdisk concorda con fdisk e specifica di numerare i settori
dallo zero. Specifica la dimensione in settori della partizione,
pertanto è facile verificare che anche in questo caso i conti
tornano e coincidono con l'output di fdisk.
Insomma, penso di aver risolto i miei dubbi. Tra l'altrocosì
torna anche il discorso dell'offset quando si usa losetup per
agganciare un pezzo di file immagine (aka una partizione), ad
un loopdevice device.
losetup ha l'opzione -o che permette di far partire il device da
dove inizia la partizione. il conto sarebbe rifacendomi al caso
sopra:
16 settori * 512 bytes/settore = 8192 bytes
Perchè è giusto? perchè 16 sono i settori precedenti la
partizione ( 0, 1, 2, .., 14, 15).
La partizione inizia infatti dal diciassettesimo settore, il
numero 16, in quanto appunto fdisk e sfdisk li numerano da zero!
se la partizione iniziasse dal sedicesimo settore come si
potrebbe pensare guardando l'output di fdisk, l'offset 16*512 NON
ci porrebbe all'inizio della partizione, ma già dentro la
partizione "inoltrati" di un settore in più rispetto all'inizio
della stessa.
|-- 0 --|-- 1 --|-- 2 --|-- ... --|-- 15 --|-- 16 --|-- ecc ->
|-- I --|- II --|- III -|-- ... --|- XVI --|- XVII -|-- ecc ->
|---- settori precedenti la partizione ----|- partizione ---->
|----  16 x 512 bytes = 8192 bytes --------|- partizone ----->
In questo caso potremmo usare losetup per "mappare" la sola
partizione e non tutta l'immagine del disco  nel seguente modo:
losetup -o 8192 /dev/loop0 diskimage.img
funziona perchè è l'unica partizione e arriva fino alla fine del
device, altrimenti, funzionerebbe ugualmente ma non per tutti gli
scopi.

 settori. ... 
Se non lo capisci leggendo i manuali, se non lo capisci quando
qualcuno su icoli te lo spiega, non credo che riuscirai mai a capirlo.

 qualcuno su icoli te lo spiega, non credo che riuscirai mai a capirlo.
Nel manuale di fdisk non ho trovato una spiegazione sulla
numerazione che adotta il programma.
Ad ogni modo, nonostante il mio messaggio precedente sia
obiettivamente lungo, mi pare di aver snocciolato la faccenda in
termini abbastanza chiari.
Anyway, se ti pare che ci sia qualche errore entra pure nel
merito.

 merito.
Premesso che ognuno impiega il proprio tempo come vuole.
Premesso che, per motivi diversi, tempo fa ho avuto a che fare con 
partizioni, resize e clone delle partizioni ntfs, immagini di partizioni, 
loopback file, ecc.,  in maniera abbastanza poco approfondita ma molto 
dolorosa (ci si lascia il fegato).
Ti ribadisco che i file di loopback non hanno una giometria (e ti avevo già 
fatto notare che mi pareva di ricordare che qualcuno aveva forzato i C H S 
sul file di loopback forse per questo motivo), e ribadisco che i file di  
loopback non sono per niente simili a una unità a blocchi (e relative 
partizioni), quindi non ci deve aspettare che si comportino correttamente 
con tutti i programmi di gestione dei dischi e delle partizioni.
Ti ririririrbadisco il consiglio di utilizzare un disco aggiunto o un paio 
di dischi virtuali di virtualbox (uno per il sistema operativo e uno per i 
vari esperimenti).