Вопрос или проблема
Как рассчитать значения fdisk
Я пытаюсь продолжать понимать своп на отдельном разделе. Такой же сценарий, как в старом вопросе
Я хочу узнать, как правильно рассчитать параметр для команды fdisk, чтобы подготовить именно 2 ГБ свопа. Я ввел правильный параметр, но не понимаю, как это общее вычисление провести.
Команда (m для помощи): n
Тип раздела:
p основной (0 основных, 0 расширенных, 4 свободно)
e расширенный
Выберите (по умолчанию p):
Используется значение по умолчанию p
Номер раздела (1-4, по умолчанию 1):
Первый сектор (2048-536870911, по умолчанию 2048):
Используется значение по умолчанию 2048
Последний сектор, +сектора или +размер{K,M,G} (2048-536870911, по умолчанию 536870911): 4196366
Раздел 1 типа Linux размером 2 GiB установлен
Теперь с параметром 4196366 размер свопа ровно 2 ГБ
>>free | grep -i swap | awk '{print "scale=2; "$2" / 1024 / 1024" }' | bc -l
2.00
Вопрос в том, как рассчитать 4196366. Я думал так:
4196366 = 2 * 2 * 1024^2 + 2 * 1024 + 14
Так что 2*1024, вероятно, для того, чтобы пропустить первый сектор. Но почему мне нужно умножать 2 ГБ на 2 и что за магическая константа 14? Как мне общее понять, что нужно передать как аргумент для fdisk?
Я не знаю, почему этот ответ был удален, но я вставлю его обратно:
Входные данные в секторах, и большинство дисков работают либо с логическими секторами размером 512 байт, либо 4096 байт. (512 — это традиционный размер, и многие 4K-диски тоже эмулируют его.) Fdisk сообщит вам о логическом размере сектора диска при старте.
Иными словами, вам нужно умножить на 2, потому что один сектор — 512 байт, то есть половина килобайта.
Так что если вам нужно 2 гигабайта свопа, плюс X килобайт для заголовка свопа, проще всего сначала преобразовать оба значения в байты, а затем разделить сумму на размер сектора (512 или 4096), чтобы получить количество секторов:
swap_bytes = 2 * 1024 * 1024 * 1024
hdr_bytes = X * 1024
sector_size = 512
part_sectors = (swap_bytes + hdr_bytes) / sector_size
(Округляйте в большую сторону.)
Полезные инструменты:
$ echo 2G | numfmt --from=si
2000000000
$ echo 2G | numfmt --from=iec
2147483648
Ответ или решение
Для расчета значений fdisk для подготовки раздела под swap размером ровно 2 ГБ необходимо учитывать, что входные данные представляют собой количество секторов, а не байтов. Большинство дисков используют логический размер сектора в 512 байт или 4096 байт. Для начала, вам нужно будет определить, какой размер сектора использует ваш диск. Команда fdisk показывает размер сектора при запуске.
Шаги для расчета значений fdisk:
-
Определите размер swap в байтах:
Чтобы создать swap раздел размером 2 ГБ, необходимо преобразовать это значение в байты:
[
\text{swap_bytes} = 2 \, \text{ГБ} = 2 \times 1024 \times 1024 \times 1024 = 2147483648 \, \text{байт}
] -
Определите заголовок (если необходимо):
В некоторых случаях может потребоваться указать дополнительное количество байтов для заголовка swap. Если, например, вы используете 16 КБ для заголовка, вам нужно будет преобразовать это значение в байты:
[
\text{hdr_bytes} = 16 \, \text{КБ} = 16 \times 1024 = 16384 \, \text{байт}
] -
Определите размер сектора:
Проверить размер сектора можно с помощью команды fdisk, в зависимости от конфигурации вашего диска это может быть либо 512 байт, либо 4096 байт. -
Рассчитайте общее количество байт, необходимых для раздела:
Сложите байты для swap и заголовка:
[
\text{total_bytes} = \text{swap_bytes} + \text{hdr_bytes}
] -
Переведите байты в сектора:
Разделите общее количество байт на размер сектора:
[
\text{part_sectors} = \frac{\text{total_bytes}}{\text{sector_size}}
]
Если размер сектора 512 байт, например, выражение будет выглядеть как:
[
\text{part_sectors} = \frac{2147483648 + 16384}{512} = 4196352
]
В случае 4096 байт:
[
\text{part_sectors} = \frac{2147483648 + 16384}{4096} = 524288
] - Округлите значение:
Важно округлить значение вверх, чтобы гарантировать, что размер раздела включает всю выделенную область.
Пример:
Пусть вы хотите создать swap размером 2 ГБ с использованием 512-байтовых секторов и заголовка 16 КБ.
[
\text{swap_bytes} = 2147483648 \, \text{байт}
]
[
\text{hdr_bytes} = 16384 \, \text{байт}
]
[
\text{total_bytes} = 2147483648 + 16384 = 2147500032 \, \text{байт}
]
[
\text{part_sectors} = \frac{2147500032}{512} = 4196352 \, \text{сектора}
]
Таким образом, вы должны использовать 4196352 в качестве последнего сектора в вашей команде fdisk для создания раздела swap.
Полезные инструменты:
Вы также можете использовать команды для преобразования значений, как показано ниже:
$ echo 2G | numfmt --from=si
2147483648
$ echo 16K | numfmt --from=si
16384
Таким образом, вы сможете корректно рассчитать значение для fdisk и создать необходимый раздел под swap.