Don't understand german? Read or subscribe to my english-only feed.

/proc/partitions und 1024 Bytes

Auf der Mailingliste der Linux-User-Group-Graz gab es die Frage, ob man sich darauf verlassen könne, dass die blocks-Einträge in /proc/partitions unter Linux immer eine Größe von 1024 Bytes haben, bzw. wie man das verifizieren kann. Nachdem die Mailingliste aktuell leider kein öffentliches Archiv hat, werfe ich meine Antwort zusätzlich auch hier ein:

Ok, zuerst schauen wir mal, was uns blockdev(8) liefern kann:

  --getsz     liefert die Anzahl an (512byte) Sektoren vom Blockdevice
              (ioctl BLKGETSIZE, siehe 'strace -eioctl blockdev ...')
  --getss     liefert die Sektorgröße des Blockdevices in Bytes (ioctl BLKSSZGET)
  --getsize64 liefert die Devicegröße des Blockdevices in Bytes (ioctl BLKGETSIZE64)

Wie man in show_partition() in $LINUXSRC/block/genhd.c nachlesen kann, wird das “#blocks” aus /proc/partitions durch Auslesen der Anzahl der Sektoren der jeweiligen Partition, dividiert durch 2 (ist ein simpler Shift nach rechts) berechnet. Schauen wir uns das in der Praxis an:

% cat /proc/partitions
major minor  #blocks  name

   8        0    8388608 sda
[...]
# blockdev --getsz /dev/sda
16777216
% echo '16777216/2' | bc
8388608

Ok, das scheint soweit mal zu stimmen – aber wir wollen uns nicht auf die 512byte-Sektoren von –getsz verlassen. Deswegen kontrollieren wir die Größe des Devices in Bytes:

# blockdev --getsize64 /dev/sda
8589934592

Ok. Und welche Sektorgröße hat das Device wirklich?

# blockdev --getss /dev/sda
512

OK. Du willst dich auf die 1024 bzw. eine Rechnung alla “X / (512 * 2)” nicht verlassen? Kein Problem. Wir wissen ja, dass der Kernel die Anzahl der Sektoren durch 2 dividiert. There we go:

# echo $(( $(blockdev --getsize64 /dev/sda) / ( $(blockdev --getss /dev/sda) * 2) ))
8388608

Das Verhältnis daraus geschlussfolgert würde jetzt wie folgt aussehen:

# echo $(( $(blockdev --getsize64 /dev/sda) / ( $(blockdev --getsize64 /dev/sda) / ( $(blockdev --getss /dev/sda) * 2)) ))
1024

Was sich noch vereinfachen lässt:

# echo $(( $(blockdev --getss /dev/sda) * 2 ))
1024

Et voila. Frage beantwortet? :)

Comments are closed.