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_path, mirror_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 |
Отлично! Думается, +1 тема на следующий GlobalJam. 🙂
Да, просто интересно, в /etc/update-manager/meta-release можно писать адреса типа file:///?