Предистория
Задумался недавно над тем, что будет если моя система вдруг откажется загружаться и мне не хватит ума или времени на то, чтобы восстановить ее. Тогда все прийдется начинать с нуля. А как же те пакеты, которые были верой и правдой скачаны в течении года? А если комп не один, а целая сеть?
Каждому качать по 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: Создание "правильного" локального репозитория (не зеркало)
В принципе кроме увеличения размера это ни к чему не приводит. Можете руками удалить старые пакеты.
Отправить комментарий