Как lsblk и fdisk могут отображать разные размеры одного и того же раздела?

Рабочий вариант с правильными --targetи т.д.

export GCC_VERSION=7.3.0
apk add --no-cache make build-base mpfr-dev mpc1-dev isl-dev
wget https://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.gz
tar -xzf gcc-${GCC_VERSION}.tar.gz
cd gcc-${GCC_VERSION}
./configure \
    --prefix=/usr/local \
    --build=$(uname -m)-alpine-linux-musl \
    --host=$(uname -m)-alpine-linux-musl \
    --target=$(uname -m)-alpine-linux-musl \
    --enable-checking=release \
    --disable-fixed-point \
    --disable-libmpx \
    --disable-libmudflap \
    --disable-libsanitizer \
    --disable-libssp \
    --disable-libstdcxx-pch \
    --disable-multilib \
    --disable-nls \
    --disable-symvers \
    --disable-werror
make -j $(nproc)
make install

Тестовый компилятор C:

echo '#include <stdio.h>
int main() {
    printf("Hello, C world!\n");
    return 0;
}' | gcc -x c - &&./a.out

Тестовый компилятор C++:

echo '#include <iostream>
int main () {
  std::cout << "Hello, C++ world!\n";
  return 0;
}' | g++ -x c++ - &&./a.out
1
30.08.2020, 00:21
1 ответ

Раздел sda2является разделом-контейнером. Его формат очень похож на Основная загрузочная запись(MBR )диска и известен как Расширенная загрузочная запись(EBR ), которая сама занимает один из четырех возможных слотов основного раздела. Он существует, чтобы преодолеть это историческое ограничение в 4 раздела в MBR. Он включает в себя расширенные разделы (, которые отображаются, начиная с раздела 5 в Linux )и связаны :каждый последующий расширенный раздел также имеет EBR с двумя записями :одна для ссылки на данные самого раздела, и один для ссылки на EBR следующего расширенного раздела, если таковой имеется. Все расширенные разделы (, так что здесьsda5)находятся внутри их раздела-контейнера (, здесь sda2), и, таким образом, fdisk всегда будет сообщать о перекрывающихся блоках.

С точки зрения MBR он использует все пространство, зарезервированное для добавления внутри него расширенных разделов, поэтому его размер должен быть больше, чем размер всех расширенных разделов.

С точки зрения API-интерфейса ядра, отчитывающегося перед пользовательским пространством и, следовательно, lsblk, раздел 2 — это всего лишь связующий раздел, отображаемый из любезности, и в него не следует вмешиваться. Сообщаемый размер данных представляет собой только служебные данные EBR, здесь 1 КБ, иначе чтение или запись (, что уже плохо, поскольку может разрушить первоначальную ссылку на все расширенные разделы в )на раздел 2 также позволит чтение или запись в раздел 5. Можно было бы даже указать размер 0, это не имело бы большого значения. Это отличается от обработки самого sda, который представляет весь диск. Если учесть, что дополнительные расширенные разделы связаны с EBR каждого предыдущего расширенного раздела,это имеет смысл :их внутренний EBR даже не доступен, видны только их фактические данные.

Вам следует рассмотреть возможность использования GPT разбиения вместо разбиения MBR/EBR. :Это современная схема разбиения, которая намного разумнее и не имеет таких ограничений и обходных путей. Или вы также можете выбрать LVM в одном (первичном, нет необходимости в расширенном, а затем в )разделе :это тоже форма контейнера для разделения блоков на другом уровне абстракции и обеспечивает много функций.

1
18.03.2021, 23:09

Теги

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