Обновить журнал Имя пакета для загрузки Имя пакета

Вопрос или проблема

Я хочу иметь возможность получить копию всех пакетов, обновленных в ‘Апгрейде’, в собственное хранилище, чтобы я мог передать его в систему без доступа к интернету (да, никакого wifi или других подключений, только USB-носители).
Я могу получить все обновленные пакеты из лога apt в /var/log.
Однако
Журнал укажет пакет как linux-hwe-6.11-tools-6.11.0-17:amd, но если вы передадите это имя в sudo apt-get download, он скажет, что не может найти пакет (плюс глоб и регулярное выражение не сработают).
Итак, какой элемент имени(-ей) пакета в журнале нужно передать в apt-get download, чтобы он загрузил его в собственное хранилище?

.

Ответ или решение

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

Теоретическая часть (Theory)

Когда система обновляется с помощью apt, информация о пакетах, которые загружаются и устанавливаются, сохраняется в журнале /var/log/apt/history.log. Формат записи журнала может выглядеть следующим образом:

Start-Date: 2023-10-10  10:55:55
Commandline: apt-get upgrade
Upgrade: package1:amd64 (1.0-1, 1.0-2), package2:amd64 (2.3-1, 2.3-2)

Здесь происходит обновление package1 и package2. Однако, имена пакетов в журнале могут содержать архитектуру (например, :amd64) и версии. Эти дополнительные детали не используются непосредственно при загрузке пакета через apt-get download.

Практическая часть (Example)

Например, если журнал показывает обновление linux-hwe-6.11-tools-6.11.0-17:amd64, команда sudo apt-get download требует только базовое имя пакета без архитектуры и версии. В данном примере, это будет linux-hwe-6.11-tools.

Пример команды для загрузки:

sudo apt-get download linux-hwe-6.11-tools

Чтобы автоматизировать этот процесс, можно написать скрипт, который:

  1. Читает журнал /var/log/apt/history.log.
  2. Извлекает базовые имена пакетов, игнорируя архитектуру и версию (например, с помощью регулярных выражений).
  3. Загружает эти пакеты с помощью apt-get download.

Применение (Application)

Для реализации вышеописанной теории можно создать скрипт на языке Bash:

#!/bin/bash

# Локация журнала
LOG_FILE="/var/log/apt/history.log"

# Извлечение названий пакетов
PACKAGES=$(grep 'Upgrade' $LOG_FILE | sed -E 's/Upgrade: (([a-zA-Z0-9.-]+):[a-z0-9]+ \([^)]+\))/\1/g' | sed 's/:amd64//g')

# Уникальные имена пакетов
PACKAGES=$(echo "$PACKAGES" | tr ',' '\n' | awk '{print $1}' | sort | uniq)

# Путь для сохранения скачанных пакетов
DOWNLOAD_DIR="./packages"

# Создаем директорию для сохранения пакетов
mkdir -p $DOWNLOAD_DIR
cd $DOWNLOAD_DIR

# Загрузка каждого пакета
for PACKAGE in $PACKAGES; do
  echo "Downloading $PACKAGE..."
  sudo apt-get download $PACKAGE
done

echo "All packages downloaded to $DOWNLOAD_DIR"

Заключение

Скрипт автоматизирует процесс извлечения и загрузки пакетов, обновленных в процессе apt upgrade. Это позволяет собрать все необходимые пакеты для последующей передачи на изолированную систему. Применяя данный подход, вы максимально упрощаете процесс пакета передачи или обновления программного обеспечения в условиях, где нет возможности использовать интернет-соединение.

Оцените материал
Добавить комментарий

Капча загружается...