Вопрос или проблема
Я хочу иметь возможность получить копию всех пакетов, обновленных в ‘Апгрейде’, в собственное хранилище, чтобы я мог передать его в систему без доступа к интернету (да, никакого 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
Чтобы автоматизировать этот процесс, можно написать скрипт, который:
- Читает журнал
/var/log/apt/history.log
. - Извлекает базовые имена пакетов, игнорируя архитектуру и версию (например, с помощью регулярных выражений).
- Загружает эти пакеты с помощью
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
. Это позволяет собрать все необходимые пакеты для последующей передачи на изолированную систему. Применяя данный подход, вы максимально упрощаете процесс пакета передачи или обновления программного обеспечения в условиях, где нет возможности использовать интернет-соединение.