Вместо использования dpkg -i package_name.deb для установки, можно создать локальный репозиторий для пакетов, принесенных на флешке или другом носителе, а потом использовать synaptic/kynaptic (или apt-get install package_name).
1. Все действия лучше проводить как root
sudo su2.Теперь установите пакет dpkg-dev. Он будет содержать утилиту dpkg-scanpackages, которая нам и нужна.
apt-get install dpkg-dev3.Поместите все.deb пакеты в директорию например, /myrepo (причем не непосредственно в эту директорию, а в поддиректории, расположенные в этой директории)
4. Выполните
cd /myrepo dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz5. Теперь нужно внести новый репозиторий в /etc/apt/sources.list. Вставьте в /etc/apt/sources.list строчку (лучше вставить ближе к началу, т.к. apt-get (synaptic/kynaptic) ставит более высокий приоритет источнику, находящемуся раньше остальных)
deb file:/myrepo ./6. Обновление списка репозиториев
apt-get updateЕсли изменится содержимое директории с пакетами, повторите шаги 1,4.
Предистория
Задумался недавно над тем, что будет если моя система вдруг откажется загружаться и мне не хватит ума или времени на то, чтобы восстановить ее. Тогда все прийдется начинать с нуля. А как же те пакеты, которые были верой и правдой скачаны в течении года? А если комп не один, а целая сеть?
Каждому качать по 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//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/
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: (как видно у меня их по-прежнему три:)). Поэтому если у вас будут другие ветки, обязательно отредактируйте эту строчку. Сохраняем скрипт и после выполнения команды
можно уже создавать репозитарий и обновлятся из него. Но дело в том, что недоверенные репозитарии имеют меньший приоритет перед доверенными (или их еще называют подписанные). Поэтому мы сделаем нашему репозитарию такой же приоритет, как и официальному. Для этого нам понадобится ключ 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/
Если у вас будут еще ветки кроме 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. Было бы неплохо его здесь применить.
Постепенный перевод предприятия на GNU/Linux порождает необходимость соответствующих изменений в инфраструктуре. Сегодня мы решаем проблему глобального обновления клиентских машин путем создания локального репозитория. Процесс изначально документировался как памятка на будущее, потому заранее прошу прощенья за возможные несуразности в тексте. Итак.
Для начала следует определиться, посредством чего лучше сделать это. Интернеты выделяют двух фаворитов rsync
и debmirror
. Выбрал последний, ввиду его большей гибкости.
1. Получение ключей
Для создания зеркала репозитория необходимо получить ключ «Ubuntu Archive Automatic Signing Keygpg --no-default-keyring --keyring trustedkeys.gpg --recv-keys 437D05B5
2. Подготовка пространства
Создаем папку для репозитория:sudo mkdir /path/to/repository
Важно! Потрудитесь проследить за наличием свободного места в указанном пути. Даже две архитектуры i386 и amd64 займут приличное его количество.
3. Получение пакетов
Зеркалирование проходит в три этапа:#Это конфигурация нашего репозитория. В зависимости от параметров, указанных
#здесь, мы получим нужное нам его содержимое.
#Опция cleanup. Включена по умолчанию. После закачки пакетов удаляет ранние
#версии. Для отключения опции необходим параметр --nocleanup
clean=--nocleanup
#Опция source. Закачивает исходные коды пакетов. Если вы не пользуетесь
#исходными кодами для изучения и модификации приложений (что свойственно для
#бинарных дистрибутивов), смело ставьте опцию --no-source
src=--source
#Host. Имя сервера, откуда мы берем пакеты.
servername=mirror.yandex.ru
#Root. Корневая директория на выбранном нами сервере.
rdir=/ubuntu
#Имя релиза Ubuntu. Настройки для 10.04 версии.
release=lucid,lucid-backports,lucid-proposed,lucid-security,lucid-updates
#Секции.
section=main,restricted,universe,multiverse
#Протокол синхронизации. Debmirror поддерживает следующие способы: http,
#hftp, ftp, rsync
sync_protocol=rsync
#Архитектура. Если используются исключительно 32 или 64х битные системы.
#Одну из архитектур можно убрать. Также если используются иные архитектуры,
#их следует добавить.
arch=i386,amd64
#Местоположение репозитория. Указывайте локальную папку, созданную. в п 2.
path=/path/to/repository
Debmirror --progress --verbose $clean $src --md5sums --host=$servername --root=$rdir \
--dist=$release -s=$section --method=$sync_protocol -a=$arch $path
Теперь поместим его в директорию /usr/local/bin
и сделаем исполняемым.
chmod +x repo_update.sh
sudo cp repo_update.sh /usr/local/bin/
Далее запустим получившийся скрипт и дождемся завершения процесса. Процесс достаточно долгий. Время выполнения сильно зависит от ширины вашего интернет-канала.
sudo /usr/local/bin/repo_update.sh
Внимание!
Размер скачиваемого переваливает за десятки гигабайт, а казеный интернет редко бывает безлимитным. Более того, debmirror
чувствителен к стабильности соединения, 120 секунд простоя и все придется начинать сначала.
4. Настройка web-сервера
Дабы не совершать лишних плясок с бубном выберем протокол http , как традиционный метод предоставления доступа к репозиторию. Выбор web-сервера остается за Вами. Из фаворитов ngnix , apache и lighttpd , выбрал последний ввиду отсутствия опыта работы с оным (приятное с полезным, да). Итак.Установка сервера.
Sudo apt-get install lighttpd
Здесь все просто. Если Вы не планируете использовать в качестве www
директории отличную от умолчания, то сервер в настройке не нуждается. Все, что сам нужно сделать, это создать символьную ссылку в директории /var/www
ln -s /path/to/repository /var/www/ubuntu
Проверим доступность репозитория из браузера: http://
5. Настройка клиентов
Здесь мы применим маленькую хитрость. Дабы не вносить изменений в /etc/apt/sources.list (мало ли что случится). Добавим в файл /etc/hosts пару строчек.Примечание. При наличии DNS сервера можно все это прописать в нем, а на сервере репозитория прописать истинные адреса вышеупомянутых имен.
6. Автоматизация
А теперь самое сладкое. Заставим все это крутиться самостоятельно.6.1 Серверная часть
В пункте #3 мы создавали скрипт, при помощи которого получали пакеты. Настроим его автозапуск средствами демона cron .sudo crontab -e
В который добавим заветную строчку:
0 0 * * * /usr/local/bin/repo_update.sh
Теперь ежедневно в 0:00 наш скрипт будет делать за нас всю рутинную работу.
6.2 Клиентская часть
На клиентах создадим скрипт system_upd.sh в директории /usr/local/bin следующего содержания:#!/bin/sh
apt-get -y update && apt-get -y upgrade && apt-get -y clean
Не забудем сделать его исполняемым.
sudo chmod +x /usr/local/bin/system_upd.sh
После чего открываем cron
:
sudo crontab -e
И добавляем строчку:
40 17 * * * /usr/local/bin/system_upd.sh
Теперь каждый день в 17:40 система будет опрашивать наш репозиторий на предмет наличия обновлений и обновляться, если таковые будут найдены.
Внимание!
При работе с crontab
следует не забывать, что после строчек с заданиями обязательно должна быть пустая строка, которая обозначается знаком "#
".
p.s
: Прошу прощения за отсутствие прилагаемых изображений, но в данном случае считаю их наличие просто неуместным.
Недавно наткнулся на утилиту reprepro . Она помогает создавать локальный репозиторий deb-based дистрибутивов. Тут та меня осенило. Я давно собираю пакеты которых нет в официальных архивах потому каждый раз прогибаться по ним и устанавливать стало в падлу и я решил создать раздел с хранящимися там репозиториями таких пакетов. Так что бы при смене системы просто под монтировать его и пользать по надобности. Вещь как мне кажется полезнее чем сохранять кеш из apt-get.
Кратко о reprepro
Необходимо создать директорию для репозитория. У меня выбор падает на /repository
потому для работы нужны права суперпользователя. А в принцепе если права записи на этот каталог будут только у администратора то есть большая вероятность что никто посторонний не сможет навредить вашему "архиву"
# mkdir /repository
переходим туда:
Создаем папку /repository/conf/
для конфигурационных файлов
# mkdir /repository/conf
Создаем файл , добавляя нужные секции (подробнее об этом можно почитать в выводе команды man reprepro
в разделе CONFIG FILES)
# mousepad /repository/conf/distributions
В оригинале текста объяснения автор предоставляет такой пример этого файла
Origin: Debian
Suite: testing
AlsoAcceptFor: unstable experimental
Codename: lenny
Version: 5.0
Architectures: i386 source
Components: main contrib non-free
UDebComponents: main contrib non-free
Description: my local repository
где:
Origin - Имя дистрибутива = Debian
Suite - ветка = testing
AlsoAcceptFor - позволяет "засовывать" в репозиторий тестинга пакеты для других веток = unstable experimental, если опция не указана, то будет ругаться вот так при попытке добавить пакеты из анстэбл/экспериментал веток.
Codename - кодовое имя ветки = lenny
Version - версия ветки = 5.0
Architectures - архитектуры, у меня x86 процессор, соответственно есть i386, также иногда закидываю в репозиторий исходники, поэтому есть source
Components - разделы ветки, куда можно поместить deb-пакеты, а также исходники = main contrib non-free (можно еще насоздавать, сколько угодно)
UDebComponents - разделы ветки, куда можно поместить udeb-пакеты (бывают и такие) = main contrib non-free (лучше, когда совпадают со строкой выше)
Description - краткое словесное описание репозитория = например, my local repository
Если каталог репозиторий не являеться текущим то в строке команды прописывают так называемую BASEDIR опции -b BASEDIR (в моем случае BASEDIR=/repository ).
После создания файла /repository/conf/distributions
инициализацируем репозиторий
# reprepro export
# reprepro createsymlinks
Можно репозиторий заполнять пакетами. Для этого существует множество команд и опций, подробнее о которых можно узнать в man reprepro
Наиболее употребляемые
Добавление deb-пакета в репозиторий.
В общем виде выглядит так:
# reprepro -b BASEDIR -C РАЗДЕЛ includedeb ВЕТКА /путь/до/файла/имя_файла.deb
Как я и описывал раньше это пример добавления пакета не из каталога с репозиторием, а из произвольного каталога. Если вы находитесь в каталоге репозитория то команда выглядит так же но без -b BASEDIR
К примеру, для добавления пакета foo_1.0.deb
, находящегося в папке /home/user/debian
, в раздел main ветки lenny команда будет иметь следующий вид
# reprepro -b /repository -C main includedeb lenny /home/user/debian/foo_1.0.deb
Удаление deb-пакета из репозитория
Для удаления одного deb-пакета из указанной ветки репозитория нужно дать такую команду
# reprepro remove ветка имя_пакета
К примеру, для рассмотренного пакета foo_1.0.deb
, находящегося в ветке lenny
даем такую команду:
# reprepro remove lenny foo
Для использования репозитория нужно добавить его в файл /etc/apt/sources.list
в виде следующей строки (в общем виде):
deb file:///путь_к_папке_репозитория/ ветка разделы
Что для нашего примера будет выглядеть так:
deb file:///repository/ lenny main contrib non-free
Это базовое что я считаю достаточно в моем случае. Статья оригинала находиться