суббота, 17 января 2009 г.

Как скачать репозитарий Ubuntu или Debian

Если в кратце, то так:


#Качаем небольшой скрипт getdebrepo
wget http://sites.google.com/site/dik123/getdebrepo -O getdebrepo
#Делаем его исполняемым
chmod +x getdebrepo
#Создаем папку для репозитария
mkdir repository
#Делаем созданную папку текущей
cd repository
#Запускаем скрипт. Для примера, скачивается последний, релиз Ubuntu
../getdebrepo maverick -all binary-i386 http://archive.ubuntu.com/ubuntu/
#Собственно скачиваем пакеты
wget -x -i part0


Копируем эти строки в терминал и идем пить чай, гулять или уезжаем на несколько недель, в зависимости от скорости канала.
Продвинутые дебианщики подумают: "что за getdebrepo, первый раз слышу! debmirror знаю, а это нет". А зря! Неплохая штука, должен сказать, тем более, что сам написал :)

Этот "велосипед" преследует ряд задач:

  1. Скачивать указанные части репозитария.

  2. Независимость от Debian (я писал и тестировал этот скрипт на Gentoo).

  3. Быть намного проще чем debmirror (жертвуя функционалом).

  4. Масштабируемость т.е. распределять закачку репозитария между друзьями и знакомыми.

  5. Показывать информацию о зеркале репозитария.

  6. Позволить людям с Ubuntu, но медленным и/или дорогим интернетом, попросить людей без ubuntu, но с быстрым и дешевым интернетом проявить чудеса убунтизма, не сильно напрягая последних.



И как же этим пользоваться?
Распишу последовательность действий.

  1. Cначало нужно найти зеркало репозитария.
    Список для Debian можно посмотреть здесь http://www.debian.org/mirror/list
    Для Ubuntu здесь https://wiki.ubuntu.com/Mirrors.
    Но лучше уточнить у своего провайдера, нет ли у него зеркала в вашем городе, это будет быстрее и скорее всего значительно дешевле.
    Внимание! все ниже следующие операции рекомендуется выполнять в пустой директории (в принципе не обязательно, но крайне желательно, т.к. могут быть перезаписаны существующие файлы)

  2. Следующим шагом надо выяснить, что доступно на зеркале. Делаем это командой:

    ../getdebrepo -l http://archive.ubuntu.com/ubuntu/

    Вместо http://archive.ubuntu.com/ubuntu/ можно вписать свое зеркало. Если адрес введен правильно (а это должен быть тот же адрес, что помещают в source.list) программы выдаст список имен релизов, доступных на сервере.

  3. Предположим на прошлом шаге было выбрано имя maverick. Теперь нужно определиться для каких архитектур будем брать пакеты, и какие репозитарии нужны. Запускаем команду:

    ../getdebrepo maverick -l -l http://archive.ubuntu.com/ubuntu/

    В ответ будут выданы доступные репозитарии и архитектуры. Дополняем команду выбранными пунктами и запукаем.

    #Подготовить список файлов для скачивания репозитария Ubuntu maverick (10.10) все части
    #репозитария (main, universe, и т.д.) для архитектуры i386
    ../getdebrepo maverick -all binary-i386 http://archive.ubuntu.com/ubuntu/

    -all - как можно догадаться, значит все.

    Или другой пример:

    #Подготовить список файлов для скачивания репозитария Ubuntu maverick (10.10)
    #только части репозитария main и universe для архитектур i386 и ia64
    ../getdebrepo maverick main,universe binary-i386,binary-ia64 http://archive.ubuntu.com/ubuntu/

    Обратите внимание, что ни до ни после запятых нет пробелов, это важно!

  4. В результате работы последней команды будет создан текстовый файл part0, каждая строка которого - ссылка на deb пакет c указанного сервера.

  5. Осталось скачать все перечисленные пакеты. Для этого я использую wget, от части, потому, что это хорошая программа, которой я умею пользоваться, а так же из-за наличия у нее ключа -x, указывающего создавать иерархию папок для ссылки, что в данном случае важно, ведь каждый пакет должен быть помещен в определенную директорию. Конечно можно скачать около 3000 файлов в одну директорию, а потом написать скрипт для раскидывания по нужным местам, но зачем, ведь можно все сделать сразу.
    И так, скачиваем!

    wget -x -i part0



Думаю, что после этого перечисления осталось несколько вопросов.
Зачем 0 после part?
part'ов может быть много.

Где же здесь масштабируемость и распределенное скачивание?
Если вызвать программку с ключем -h (или вообще без ключей) можно заметить, что URL'ов зеркал с репозитариями может быть несколько т.е. можно вызвать программу с такими аргументами:

../getdebrepo maverick -all binary-i386 http://archive.ubuntu.com/ubuntu/ ftp://ftp.iinet.net.au/pub/ubuntu/

Будет создано два файла: part0 и part1, количество ссылок в них будет примерно одинаковое, но размеры пакетов не учитываются. Ссылки в part0 будут указывать на http://archive.ubuntu.com/ubuntu/, а в part1 на ftp://ftp.iinet.net.au/pub/ubuntu/. Если нужно несколько файлов, указывающие на один и тот же сервер, то программе в качестве аргументов достаточно указать сервер несколько раз, вот так:

../getdebrepo maverick -all binary-i386 http://archive.ubuntu.com/ubuntu/ http://archive.ubuntu.com/ubuntu/ http://archive.ubuntu.com/ubuntu/


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

Если возможность скачать репозитарий есть только на MS Windows, то специально для таких случаев wget собрали под эту платформу. Скачать его можно здесь: http://gnuwin32.sourceforge.net/

Известные особенности getdebrepo:

  • Не скачивает исходные коды.

  • Не удаляет уже скаченные файлы.