Обновление Ubuntu между релизами при помощи локального зеркала.

Ubuntu использует для обновления между релизами специальную утилиту update-manager, которая живёт независимо от apt и имеет свои настройки. Из-за этого, Ubuntu не может обновиться с локальных зеркал (в частности созданных apt-mirror), даже если на них есть нужные пакеты.

Настройки update-manager живут в /etc/update-manager/. Файл release-upgrades содержит всего один параметр, который отвечает за то, до каких релизов предлагать обновляться.
Другой файл, meta-release, содержит в себе адреса, на которых искать инструкции к обновлению. Его мы запомним, он нам понадобится для обновления.

Кому не интересна техническая сторона дела, можете пропускать до раздела создаём зеркало.

Техническое отступление.

По умолчанию, содержание /etc/update-manager/meta-release следующее

# default location for the meta-release file
[METARELEASE]
URI = http://changelogs.ubuntu.com/meta-release
URI_LTS = http://changelogs.ubuntu.com/meta-release-lts
URI_UNSTABLE_POSTFIX = -development
URI_PROPOSED_POSTFIX = -proposed

Для обновления нужен файл meta-release с сервера, для обновления только между LTS релизами нужен meta-release-lts. Файлы meta-release-development и *-proposed, нужны девелоперам, но лишними всё равно не будут.
Следует иметь в виду, что файлы meta-release на сервере совершенно иные, чем их локальный собрат и ничего общего у них нет. В файлах на сервере хранится информация о релизах и адреса файлов необходимых для обновления в таком вот виде:

Dist: maverick
Name: Maverick Meerkat
Version: 10.10
Date: Sun, 10 Oct 2010 10:10:10 UTC
Supported: 1
Description: This is the 10.10 release
Release-File: http://archive.ubuntu.com/ubuntu/dists/maverick/Release
ReleaseNotes: http://archive.ubuntu.com/ubuntu/dists/maverick-updates/main/dist-upgrader-all/current/ReleaseAnnouncement
ReleaseNotesHtml: http://archive.ubuntu.com/ubuntu/dists/maverick-updates/main/dist-upgrader-all/current/ReleaseAnnouncement
UpgradeTool: http://archive.ubuntu.com/ubuntu/dists/maverick-updates/main/dist-upgrader-all/current/maverick.tar.gz
UpgradeToolSignature: http://archive.ubuntu.com/ubuntu/dists/maverick-updates/main/dist-upgrader-all/current/maverick.tar.gz.gpg

Здесь записаны данные дистрибутива, включая дату выпуска, наличие поддержки, различные имена и описание. Плюс здесь указаны файлы, необходимые для обновления — файл Release, описание ReleaseAnnouncement, архив с инструкциями *.tar.gz и подпись этого архива *.tar.gz.gpg для верности.

Соответственно, для того, чтобы научить наше зеркало обновлять Ubuntu между релизами, нам нужно скачать все файлы meta-release с сервера, а так же все файлы указанные в полях этих meta-release и разместить их в своём зеркале. Затем не забыть ещё отредактировать записи в тех самых скачанных meta-release, чтобы они указывали на наш сервер.

Поскольку нужные нам файлы не являются .deb и вообще имеют слабое отношение к непосредственно репозиторию, утилиты для автоматического создания зеркал их не качают. В добавок, этим самые утилиты удаляют лишние файлы из зеркала (оно понятно, зачем им хранить то, чего нет на исходном сервере?), так что лучше наши файлы сохранить в каком-то другом месте, чтобы не перекачивать каждый раз.

Создаём зеркало.

Плоха та работа, которая не может быть автоматизирована.

#!/bin/bash
 
if [ "$1" == "--help" ]; then
 echo "Usage: `basename $0` release.list"
 exit 1
elif [ -r "$1" ]; then
 source "$1";
fi
 
base_path="${base_path:=/var/spool/release-mirror}"
mirror_path="${mirror_path:=$base_path/mirror}"
var_path="${var_path:=$base_path/var}"
dists="${dists:=`lsb_release -cs`}"
release_server="${release_server:=http://localhost/ubuntu}"
mirror_server="${mirror_server:=http://localhost/ubuntu-releases}"
 
mkdir -p "$mirror_path"
mkdir -p "$var_path"
cd "$mirror_path" || { echo "Can not cd to base_path $base_path"; exit 1; }
 
for i in "" -development -lts -proposed; do
 wget http://changelogs.ubuntu.com/meta-release$i -O meta-release$i.orig
done
 
dists=`echo $dists | sed "s,\ ,\|,g;"`
for i in "" -development -lts -proposed; do
 gawk -vinput="$dists" -vRS="" '$0~input{print $0; print "";}' meta-release$i.orig > meta-release$i.selected
done
 
grep -h "\(ReleaseNotes\)\|\(UpgradeTool\)" meta-release.selected meta-release-development.selected meta-release-proposed.selected meta-release-development.selected | sort | uniq | sed s/".*: //" > "$var_path"/release-url.0
 
echo "Downloading release files, type \"tail -r $var_path/release-log.0\" to see progress"
wget --mirror --no-host-directories --output-file="$var_path"/release-log.0 --input-file="$var_path"/release-url.0
 
for i in "" -development -lts -proposed; do
 sed "s,\(Release-File: \)\(http:\/\/[a-z0-9.]*\/ubuntu\/\),\1$mirror_server\/,; s,\(\(\(ReleaseNotes\)\|\(UpgradeTool\)\).*: \)\(http:\/\/[a-z0-9.]*\/ubuntu\/\),\1$release_server\/ubuntu\/," meta-release$i.selected > meta-release$i
done
 
echo "Cleaning up temporary files."
rm -v meta-release*.{orig,selected}
echo "All done"
exit 0;

Этому скрипту ещё нужен конфигурационный файл вида:

mirror_server=http://192.168.0.250/mirror/ubuntu
release_server=http://192.168.0.254/mirror/ubuntu-releases
base_path=/var/spool/release-mirror
mirror_path=/var/spool/release-mirror/mirror
var_path=/var/spool/release-mirror/var
dists="lucid maverick"

Коротко о параметрах:

mirror-server — адрес, на котором расположено ваше зеркало пакетов, нужен для указания пути к файлу Release.
release_server — адрес, на котором будет расположено зеркало релизов (которое скрипт и создаст). Может (и должно, в общем то, хотябы путь на сервере) отличаться от mirror_sever.
base_pathmirror_path, var_path — пути,  куда будут сохранятся файлы. mirror и var зависят от base_path, так что можно указывать либо первый, либо два последних. В mirror будет само зекрало, в var вспомогательные файлы.
dists — список дистрибутивов, через пробел, до которых хотим обновлятся. Или вам нужны все, даже те, что уже не поддерживаются?

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

Обновление с полученного зеркала.

Когда у вас уже есть само зеркало дистрибутива, файлы в meta-release и иже с ними, можно обновляться.

Для этого надо поменять на обновляемых машинах, в файле /etc/update-manager/meta-release адрес сервера на ваше зеркало релизов, а в /etc/apt/sources.list должен остаться путь до вашего зеркала пакетов.

Например, зеркало пакетов может быть доступно как http://192.168.0.250/mirror/ubuntu, а зеркало релизов как http://192.168.0.254/mirror/ubuntu-release, тогда файл /etc/update-manager/meta-release будет выглядеть так:

[METARELEASE]
URI = http://192.168.0.254/mirror/ubuntu-release/meta-release
URI_LTS = http://192.168.0.254/mirror/ubuntu-release/meta-release-lts
URI_UNSTABLE_POSTFIX = -development
URI_PROPOSED_POSTFIX = -proposed

Можно обновляться:

sudo update-manager -c

Обновление Ubuntu между релизами при помощи локального зеркала.: 1 комментарий

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