Какие цифры показывает fdisk?

Я запустил sudo fdisk -l и получил следующую информацию:

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Эта утилита показывает полный размер жесткого диска (120034123776 bytes) и его количество головок (255 heads) , секторов на дорожку (63 sectors/track) и количество цилиндров (14593 cylinders).

Умножая головки X секторов на дорожку X количество цилиндров, мы должны иметь количество секторов в диске.

255 X 63 X 14593 = 234436545

Учитывая, что каждый сектор имеет размер 512 байт, мы имеем

234436545 X 512 = 120031511040

На самом деле, 120031511040 != 120034123776, поэтому возникает вопрос: действительно ли fdisk показывает неверную информацию или я что-то упустил в своих вычислениях?

2
задан 12 February 2011 в 18:44

2 ответа

Хм, насколько я вижу, разница незначительна, поэтому она может быть вызвана различным значением «килограмм», «мега» и «гига» (префиксы) в мире ИТ и СИ: в обычной жизни например, «килограмм» означает 1000, в то время как в ИТ общая привычка была 1024. Теперь путаница еще больше, поскольку есть предложение (даже в Ubuntu) использовать 1000 в качестве килограмма и использовать «киби» (или что-то еще .... ) за 1024 при необходимости. Таким образом, используя эти префиксы, кто-то означает 1000, другие - 1024, и, что еще сложнее, в случае с жесткими дисками вещи даже смешиваются, что некоторые из префиксов имеют степень 2, а некоторые - степень 10.

[ 112] https://wiki.ubuntu.com/UnitsPolicy

Это немного сложная / запутанная ситуация и в других ОС ...

0
ответ дан 12 February 2011 в 18:44

Я бы сказал, что использование cylinder сейчас устарело и используется в основном по историческим причинам.

Глядя на исходный код fdisk, мне кажется, что общее число байтов устройства получается с помощью вызова ioctl

    if (ioctl(fd, BLKGETSIZE64, bytes) >= 0)
        return 0;
[ 1112] и другие цифры затем выводятся из этого.

Например, число цилиндров вычисляется с использованием

llcyls = total_number_of_sectors / (heads * sectors * sector_factor);

«Проблема» в том, что результат этого деления усечен (округлен в меньшую сторону), поэтому он должен быть неточным .

Используя ваш выход fdisk в качестве примера

120034123776 bytes / 512 bytes_per_sector / 255 / 63 = 14593.3176471 cylinders

, но выход fdisk округляет это до 14593.

0
ответ дан 12 February 2011 в 18:44

Другие вопросы по тегам:

Похожие вопросы: