Пропустить навигацию.
Главная

Создание "правильного" локального репозитория (не зеркало)

Аватар пользователя Roger

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

Каждому качать по 800 метров обновлений совершенно не хочется. Долгое время я пользовался утилитой APTonCD, которая до поры, до времени меня устраивала. Но есть один нюанс: когда мы создаем репозитарий этой утилитой в iso образ (и/или пишем его на болванку), то после нет возможности добавить один-два пакета в репозитарий без пересоздания всего образа. А если принять во внимание тот факт, что в локальном кеше пакетов (из которого эта утилита и создает образы) они хранятся не вечно и со временем удаляются, то приходится хранить все файлы образов или рискуешь потерять важные пакеты, которые были скачаны сравнительно давно (поскольку их в кеше уже нет). В итоге собирается большое количество образов, в которых пакеты в большинстве своем повторяются. Выход только один. Создать полноценный локальный репозитарий, чем мы и будем заниматься.

Подготовка
Нам понадобится установить лишь один пакет: apt-move. Многие скажут, что и без него можно обойтись и будут правы, но я искал простой способ создать "правильный" репозитарий. Поэтому выполняем:
sudo apt-get install apt-move
Теперь нужно определится с папкой, где будет распологаться наш репозитарий. Я выбрал /home//mirror . Хотя имя не очень удачное, поскольку наш репозитарий не полное зеркало официального репа Ubuntu, а лишь часть его, которая содержит пакеты, хоть раз когда-либо скачанные, но переделывать скрипт мне уже лень. Поэтому пусть будет так:

mkdir ~/mirror
cd ~/mirror

Теперь все готово к тому, чтобы перейти к следующему шагу - настройке.

Настройка
Для начала нам нужно настроить саму утилиту apt-move. Для этого выполним:
gksu gedit /etc/apt-move.conf
Откроется редактор с файлом настроек. Меняем значение переменной LOCALDIR на LOCALDIR=/home/[your_username]/mirror (желательно писать полный абсолютный путь, так надежней). Также меняем PKGCOMP на PKGCOMP=none. Это компрессия. Дело в том, что мной были обнаружены глюки во время использования компрессии apt-move, поэтому мы будем компрессировать все в нашем скрипте без использования этой функции apt-move. Все, сохраняемся и закрываем. Теперь выполним
gedit ~/mirror/create_repo.sh
В этот файл мы будем писать наш будущий скрипт. Начнем:

#!/bin/bash
sudo apt-move get
sudo apt-move move

Не буду подробно комментировать это, скажу лишь, что тут мы проверяем пакеты в локальном кеше и копируем их в локальный реп, придерживаясь официальной структуры папок. (вот зачем нам был нужен пакет apt-move). Далее вписываем:

prefix=/home/<your_username>/mirror
cd $prefix
 
mkdir -p $prefix/pool/main
mkdir -p $prefix/pool/partner
mkdir -p $prefix/pool/non-free
 
mkdir -p $prefix/dists/stable/main/binary-i386
mkdir -p $prefix/dists/stable/partner/binary-i386
mkdir -p $prefix/dists/stable/non-free/binary-i386

Проверяем наличие необоходимых папок. Переменную prefix устанавливаем в соответствии с нашем расположением корня репозитария. Тут нужно сделать оговорку. Возоможно во время работы и обновления вашего репозитария в папке /pool у вас появятся и другие компоненты (здесь только три: main partner non-free), тогда вам нужно будет по аналогии добавить строчки простым копипастом с заменой на соотвествующие имена. Все просто... Идем дальше:

dir=dists/stable/main/binary-i386
apt-ftparchive packages pool/main > $dir/Packages
gzip -9c <$dir/Packages >$dir/Packages.gz
bzip2 -9c <$dir/Packages >$dir/Packages.bz2
apt-ftparchive release $dir > $dir/Release
cat > $dir/Release << EOF
Archive: stable
Suite: stable
Component: main
Origin: APT-Move
Label: APT-Move
Architecture: i386
EOF

Создаем так называемые индексные файлы с описанием всех пакетов, которые входят в данную ветку дистрибутива. (здесь это main) Также создаем файл Release, который сожержит описание данной ветки. В общем итоге создается четыре файла:
Packages
Packages.bz2
Packages.gz
Release
собственно файл Packages и сопровождающий его файл Release. Эту часть кода вам нужно скопипастить столько раз, сколько веток в вашем репозитарии (у меня их три, поэтому я копирую еще два раза и меняю соответствующие имена на non-free и partner). Далее добавляем:

dir=$prefix/dists/stable/
cat > $dir/Release << EOF
Origin: APT-Move
Label: APT-Move
Suite: stable
Codename: unknown
EOF
 
echo Date: `date -u +"%a, %d %b %Y %T UTC"` >> $dir/Release
cat >> $dir/Release << EOF
Architectures: i386
Components: main non-free partner
Description: unknown
EOF
 
apt-ftparchive release $dir >> $dir/Release

Здесь мы создаем файл Release для всего дистрибутива (у нас это stable) в целом, в котором кроме иной информации будет и контрольные суммы всех файлов Packages (и Release) во всех ветках, перечисленных в Components: (как видно у меня их по-прежнему три :) ). Поэтому если у вас будут другие ветки, обязательно отредактируйте эту строчку. Сохраняем скрипт и после выполнения команды

sudo chmod +x ~/mirror/create_repo.sh
можно уже создавать репозитарий и обновлятся из него. Но дело в том, что недоверенные репозитарии имеют меньший приоритет перед доверенными (или их еще называют подписанные). Поэтому мы сделаем нашему репозитарию такой же приоритет, как и официальному. Для этого нам понадобится ключ pgp. Если у вас еще его нет - его можно создать с помощью программы seahorse (Программы-Стандартные-Пароли и ключи шифрования). Можно конечно запустить из консоли программу gpg, но GUI мне как-то ближе. Создаем ключ и теперь нужно экспортировать его для того, чтобы клиенты могли добавить его к доверенным. Для этого выполним

cd ~/mirror
gpg --export <имя_вашего_ключа> > apt.key

Переходим дальше. Снова открываем наш скрипт и дописываем:

apt-ftparchive release $dir >> $dir/Release
zenity --entry \
        --title="Пароль ключа" \
        --text="Введите Ваш пароль:" \
        --entry-text "" \
        --hide-text | gpg -abs --yes --passphrase-fd 0 -o $dir/Release.gpg $dir/Release

Как видно тут используется утилита zenity и gpg. Первая - это обычная "украшалка". Ну не люблю я унылую командную строку на англ. языке :) , поэтому тут вызывается графическое окно с предложением ввести пароль к вашему ключу. Вторая - непосредственно подписывает наш репозитарий и он становится доверенным. Пожалуй все, сохраняем, закрываем. Если вы еще не дали право выполнятся нашему скрипту, то дайте:

sudo chmod +x ~/mirror/create_repo.sh
Правда я на этом еще не остановился. Поскольку мне нужно обновлять репозитарий из интернета на работе, а из репозитария обновлять систему дома, я решил весь локальный реп запаковывать в один файл и дома его распаковывать. Поэтому я дописал следующее:

zenity --question \
	  --title="Архивирование" \
          --text="Создать архив репозитария?"
if [ "$?" = 0 ] ; then
		cd $prefix
		tar czf ../repo_`date +"%d-%m-%Y_%H-%M-%S"`.tar.gz ./
		zenity --info --text="Архивирование завершено!"
        fi

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

Использование
Для того, чтобы подключить наш репозитарий нужно в файл /etc/apt/sources.list его добавить. Выполняем:

gksu gedit /etc/apt/sources.list
и добавляем в начало файла такую строчку

deb file:/home/<your_username>/mirror stable main non-free partner #Локальный репозитарий
Если у вас будут еще ветки кроме main non-free partner вам нужно не забыть их добавить. Кроме того, нужно добавить публичный ключ репозитария, которым мы подписали наш реп. Для этого нужно выполнить

sudo apt-key add apt.key

Все, теперь обновляем список пакетов

sudo apt-get update

P.S. У кого все-равно тянет из инета пакет, который есть в локальном репозитарии, прочтите этот топик http://forum.runtu.org/index.php/topic,5403.msg44916.html#msg44916
P.P.S. Может кто-то поможет с описанием кэширующего прокси-сервера Approx. Было бы неплохо его здесь применить.

Re: Создание "правильного" локального репозитория (не зеркало)

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

Re: Создание "правильного" локального репозитория (не зеркало)

В принципе кроме увеличения размера это ни к чему не приводит. Можете руками удалить старые пакеты.