Рейтинг:20

Зачем сегодняшнему обновлению ядра нужно полгигабайта дискового пространства?

флаг ru

Я получил уведомление об обновлениях Ubuntu 20.04. Я всегда проверяю список обновлений, чтобы решить, насколько серьезную резервную копию мне нужно сделать перед обновлением. Сегодняшнее обновление ядра (5.13.0.28.31~20.04.15) требует полгигабайта дополнительного дискового пространства:

$ sudo подходящее обновление 
...
Будут установлены следующие НОВЫЕ пакеты:
  linux-заголовки-5.13.0-28-универсальные linux-hwe-5.13-заголовки-5.13.0-28
  Linux-образ-5.13.0-28-общий Linux-модули-5.13.0-28-общий
  Linux-модули-экстра-5.13.0-28-общий
Будут обновлены следующие пакеты:
  linux-generic-hwe-20.04 linux-заголовки-generic-hwe-20.04
  linux-image-generic-hwe-20.04 linux-libc-dev
4 для обновления, 5 для новой установки, 0 для обновления и 0 для отказа от обновления
Нужно получить 95,0 МБ архивов.
После этой операции, Будет использовано 508 МБ дополнительного места на диске..

Я знаю, что Ubuntu позволяет сосуществовать нескольким ядрам, поэтому это ядро ​​должно использовать новое дисковое пространство, а не заменять существующее программное обеспечение, но оно все еще кажется большим. Я не вел заметок, но думал, что обновление ядра обычно занимает пару сотен МБ.Я просто раньше не замечал размер ядер или что-то необычное в сегодняшнем обновлении?

Рейтинг:43
флаг pw
Oli

Здесь происходит несколько разных вещей, в зависимости от вашего любопытства...

Обновления ядер поставляются в виде отдельных пакетов, а не простых обновлений.

Большая часть вашей системы упакована таким образом, что при извлечении обновления оно заменяет последнюю версию. Ядра упакованы с их версией в имени пакета. Это дает вам возможность вернуться к предыдущей версии, если что-то пойдет не так.

Вам не нужно хранить старые ядра. Как только вы узнаете, что новый работает, вы можете удалить старые. sudo apt автоудаление сделает это за вас, но сначала убедитесь, что новая версия работает.

ядра находятся большой (и становится больше)

Итак, мы выяснили, почему установка обновленного ядра занимает дополнительное место, а почему так много пространство?

Ubuntu поставляет ядро, созданное для широкого спектра оборудования. Canonical хочет, чтобы он «Просто работал» при подключении. В каждую младшую версию добавлено больше драйверов. Скорость удаления старых драйверов обычно намного ниже.

Так что со временем мы ожидаем, что ядро ​​увеличится в размерах. Bionic 4.15.0-101.102 примерно на 60% меньше, чем Focal HWE 5.13.0. В основном это выражается в меньшем количестве модулей, особенно в модули-экстра.

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

Но почему их упаковки такие маленькие? Как загрузка размером 94 МБ занимает 508 МБ дискового пространства?

Они сжимаются [действительно] хорошо. Вы можете убедиться в этом, загрузив пакеты и используя небольшой скрипт, чтобы показать их размер в распакованном виде.

  • Получить пакеты: подходящая загрузка 28 linux-image-5.13.0-28-generic linux-modules-5.13.0-28-generic linux-modules-extra-5.13.0-28-generic
  • Сравните их «физический» размер с размером их содержимого: для f в *.deb; do stat --printf="%5n\t%s\t" "$f"; dpkg -c $f; сделано

Это довольно грубо на тот момент. Вы можете запустить его в Calc, чтобы показать итоги и проценты:

введите описание изображения здесь

В сумме несколько более 508 МБ дискового пространства (даже до DKMS), но, возможно, у вас уже были загружены некоторые пакеты. В любом случае вы можете видеть, что некоторые пакеты значительно больше.

Я хочу ядра меньшего размера!

И вы можете иметь их. Просто просматривая содержимое пакета modules-extra, я вижу сотни мегабайт вещей, которые мне не нужны. Увы, кое-что мне действительно нужно.

Ты может (довольно легко) создавать свои собственные ядра. Есть скрипты сборки (в данный момент я использую линукс-tkg). На данный момент на диске 450 МБ, но я мог бы запустить его с помощью помощника, такого как сделать локальный модконфиг чтобы сократить встроенные модули только до загруженных в данный момент вещей. Это позволит вырезать около 95% модулей.

Проблема с этим подходом заключается в том, что он требует процессорного времени и моего времени для его обновления, когда есть обновления. Ты сам по себе. Большинству людей лучше с поддерживаемым ядром.

флаг in
Другая проблема, связанная с подходом к сборке собственных, заключается в том, что вам все еще нужно включать драйверы, которые вам _могут_ понадобиться (например, я собираю свои собственные ядра, но все же активирую большинство аппаратных драйверов USB, потому что могу разумно ожидать, что мне могут понадобиться любой из них в короткие сроки), или вам придется пересобирать каждый раз, когда что-то меняется в вашем оборудовании (и `localmodconfig`, последний раз, когда я проверял, нуждается в полном ядре для работы).
флаг pw
Oli
@AustinHemmelgarn Я согласен, вам определенно нужно заранее спланировать `localmodconfig`. Добавление обратно вещей может быть трудоемким. Запуск такого инструмента, как [modprobed-db](https://github.com/graysky2/modprobed-db) на регулярной основе заранее, может быть полезен для отслеживания модулей, которые вы фактически используете в течение определенного периода времени. Но да, даже сброс сетевых адаптеров, которые вы не используете, экономит 50 МБ. Промойте и повторите с контроллерами памяти, графическими адаптерами, и вы очень быстро дойдете до 150 МБ без особых усилий.
флаг in
@Oli Согласен, даже простое избавление от вещей, которые, как вы знаете, вам не нужны, действительно может быть огромной экономией, это часть того, почему я вообще создаю свои собственные ядра (другая часть заключается в том, что я хочу определенные вещи что большинство дистрибутивов не включают по умолчанию).
флаг in
@Oli было бы неплохо, если бы дистрибутив обернул обновления modprobed-db и ядра из исходного кода таким образом, чтобы ненужные модули продолжали выбрасываться за кулисы без необходимости ручного взаимодействия с пользователем.
флаг et
Вы можете создать файл `dpkg.cfg.d` с записями `path-exclude`/`path-include`, чтобы избежать извлечения модулей, которые вам не нужны – это сделано аккуратно, это уменьшает дисковое пространство, необходимое для модулей ядра. избегая при этом необходимости создавать их из исходного кода.
Рейтинг:22
флаг my

Зачем сегодняшнему обновлению ядра нужно полгигабайта дискового пространства?

Это не совсем то, на что это похоже.Он показывает вам, что будет использоваться 508 МБ диска, но говорит ли он вам, что это хранилище является постоянным? Что, если я скажу вам, что почти 450 МБ из них будут освобождены после выполнения простой команды?

Как правило, при серьезном обновлении необходимо размещать новые файлы и каталоги. Однако он не будет автоматически удалять старые. В результате увеличивается использование диска!

После обновления ядра вы можете удалить эти старые неподдерживаемые модули ядра, запустив:

sudo apt автоудаление

Он удалит все предыдущие ядра и их модули, что освободит почти 450 МБ дискового пространства.


вопросы и ответы

Зачем сегодняшнему обновлению ядра нужно полгигабайта дискового пространства?

Это потому, что он должен размещать новые файлы. Он не удалит старые файлы, что приведет к увеличению использования диска.

Я не вел заметок, но я думал, что обновление ядра обычно занимает пару сотен МБ.

Да они ведь и есть, этот апгрейд всего 60-80мб.

Есть ли что-то необычное в сегодняшнем обновлении?

Да, это серьезное обновление ядра. Возможно, вы не знаете, что Ubuntu 20.04 скоро будет обновлена ​​до 4-й стадии. Таким образом, вы получите много обновлений, подобных этому. Будьте готовы к Ubuntu 20.04.04!!


Почему ядра такие большие?

Ядро Linux управляет и контролирует аппаратные ресурсы, такие как ввод-вывод (сеть, хранилище, графика и различные устройства пользовательского интерфейса и т. д.), память и процессор для вашего устройства или компьютера. Каждый раз, когда приходит новое обновление, вы получаете новые драйверы и ресурсы для улучшения аппаратных ресурсов.

Если вы используете беспроводную карту со специально созданными драйверами, вам придется перекомпилировать драйверы после запуска нового ядра. Однако как насчет других модулей? Модули, которые вам не нужны, все еще находятся в вашей системе. Почему айлвайфи когда я использую rtw99? Ядро Linux поставляется с тысячами различных драйверов для всех видов устройств. По умолчанию, подходящий установит их ВСЕ. Это одна из основных причин, по которой вам следует самостоятельно скомпилировать ядро ​​Linux.Чтобы самостоятельно скомпилировать ядро ​​Linux без лишних вещей, обратитесь к эта тема, комментарий №2.


Разница между размером загрузки и установленным размером.

Почему показывает:

Нужно получить 95,0 МБ архивов.

Несмотря на то, что он говорит, что «будет использовано 508 МБ дополнительного места на диске»?

Это из-за компрессии.

.deb также известный как «архивный» формат, использует алгоритмы сжатия без потерь, чтобы уместить огромное количество файлов в одном .deb без увеличения его размера. Вы можете запустить следующую команду, чтобы увидеть разницу между установленным размером и размером загрузки.

apt show linux-generic-hwe-20.04 linux-headers-generic-hwe-20.04 linux-image-generic-hwe-20.04 linux-headers-5.13.0-28-generic linux-hwe-5.13-headers-5.13.0- 28 linux-image-5.13.0-28-generic linux-modules-5.13.0-28-generic linux-modules-extra-5.13.0-28-generic | egrep "Размер|Пакет" | grep -v АПТ

Вот таблица, показывающая разницу:

Упаковка Установленный размер Размер загрузки
Пакет: linux-generic-hwe-20.04 Установленный размер: 19,5 КБ Размер загрузки: 1928 Б
Пакет: linux-headers-generic-hwe-20.04 Установленный размер: 19,5 КБ Размер загрузки: 2516 Б
Пакет: linux-image-generic-hwe-20.04 Установленный размер: 19,5 КБ Размер загрузки: 2628 Б
Пакет: linux-headers-5.13.0-28-generic Установленный размер: 24,5 МБ Размер загрузки: 2569 КБ
Пакет: linux-hwe-5.13-headers-5.13.0-28 Установленный размер: 75,9 МБ Размер загрузки: 11,8 МБ
Пакет: linux-image-5.13.0-28-generic Установленный размер: 10,2 МБ Размер загрузки: 10,0 МБ
Пакет: linux-modules-5.13.0-28-generic Установленный размер: 99,3 МБ Размер загрузки: 18,3 МБ
Пакет: linux-modules-extra-5.13.0-28-generic Установленный размер: 298 МБ Размер загрузки: 51,1 МБ
raj avatar
флаг cn
raj
Мой опыт показывает, что средство обновления программного обеспечения в Ubuntu обычно просит удалить старые ядра вскоре после установки нового обновления ядра. Обычно мне не нужно ничего удалять вручную.
raj avatar
флаг cn
raj
Трудно использовать настольный компьютер без графического интерфейса (как бы вы просматривали веб-страницы?) :) и поскольку программа обновления программного обеспечения все равно обрабатывает обновления, я не вижу ничего ненормального в том, что он просит меня как установить новые обновления, так и удалить старые неиспользуемые ядра.Это происходит не через "долгое время", а обычно в течение нескольких часов после установки новой версии ядра, иногда сразу после установки нового ядра. Я рассматриваю это как правильный способ работы. КСТАТИ. Я определенно предпочитаю Synaptic запускать apt вручную :)
Рейтинг:0
флаг in

Все вышесказанное абсолютно верно.

Однако часть ответа (и почему приведенные выше ответы работают) основана на том, как Linux обрабатывает «удаленный» файл — это не так. В самом деле удаляться до тех пор, пока все, что его использует, не будет завершено.

Пример:
Предположим, что у вас есть приложение «Супер-дупер-текстовый редактор», а также предположим, что у вас открыто несколько окон с текстом, который вы редактируете.

Кроме того, предположим, что установлено обновление для Super Duper Text Editor. Ваши существующие сеансы редактирования не стираются сразу, они исчезают после того, как вы их закроете.

Как это:

  1. У вас открыто несколько экземпляров текстового редактора.
  2. Вы обновите его.
    • Средство обновления «отвязывает» запись каталога от старого файла (или воссоздает его) и добавляет ссылку на новый файл, при этом исходная запись каталога помечается как «удаленная».
    • Существующие ссылки на ваши сеансы остаются до тех пор, пока существующие сеансы не будут закрыты.
  3. Все новые файлы добавляются, но существующие файлы, которые все еще используются, не уничтожаются, поскольку они все еще используются.
  4. В конце концов, когда вы сохраняете работу и закрываете окна, количество активных ссылок на старые файлы падает до нуля. (помните, что ссылка на каталог была удалена при обновлении пакета.)

Когда количество ссылок на файл падает до нуля, считается, что файл «удален», и это пространство восстанавливается для повторного использования файловой системой и помечается как доступное в суперблоке и/или растровом изображении тома.

В конце концов (или особенно после перезагрузки) все старые файлы имеют нулевые ссылки и могут быть перезаписаны.

Я уверен, что есть детали, которые я упустил, но в целом это работает.

флаг pw
Oli
Я не понимаю, как это связано с обновлениями ядра. Это может относиться к другим вещам, но ядра упакованы со своей строкой версии в имени пакета; есть просто метапакет, который указывает на новую версию. Когда вы выполняете обновление ядра, оно не просто является резидентным в памяти, это совершенно новая копия ядра, устанавливаемая вместе со старыми.
Jim JR Harris avatar
флаг in
«это совершенно новая копия ядра, устанавливаемая вместе со старыми». . . и вследствие того, как Linux обрабатывает удаление файлов, объем дискового пространства будет удвоен до следующей перезагрузки. Как это не связано??
muru avatar
флаг us
@JimJRHarris «объем дискового пространства будет удвоен до следующей перезагрузки» ... это не относится к тому, как обновляются ядра, поскольку каждый образ ядра представляет собой файл с другим именем. Таким образом, пока пакет старого ядра не будет удален, этот файл останется. Перезагружаетесь вы или нет, значения не имеет.
Jim JR Harris avatar
флаг in
Хорошая точка зрения. Спасибо за разъяснения.
marcelm avatar
флаг cn
_"следствие того, как Linux обрабатывает удаление файлов, объем дискового пространства будет удвоен до следующей перезагрузки."_ - Нет, дисковое пространство освобождается при удалении старого ядра, перезагрузка не требуется. Это не имеет ничего общего с семантикой разъединения Linux, потому что ни работающий образ ядра, ни загруженные модули ядра не заставляют файлы так сильно загружаться. Вы можете убедиться в этом сами, используя `lsof`, `df` и `rm`; удаленные образы/модули ядра немедленно освобождают место на диске. К сожалению, ваш ответ не относится к этому сценарию.
raj avatar
флаг cn
raj
@marcelm У меня всегда работало так, что вскоре после установки нового обновления ядра программа обновления программного обеспечения просит удалить старое ядро, которое больше не нужно. Так что мне почти никогда не приходится удалять старые ядра вручную.
marcelm avatar
флаг cn
@raj Я никогда не заявлял, что требуется ручное удаление. Я просто указал, что «удаленные файлы, которые все еще заняты, не освобождают место на диске» здесь неприменимы.
Matthew avatar
флаг ru
Спасибо за этот ответ. Это информативно, но, похоже, не отвечает на этот точный вопрос.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.