суббота, 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:

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

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

17 комментариев:

  1. Слушай, ты прежде чем писать, сам бы все проверил, может ключ какой к wget указать надо, -с может быть или чего еще. Вот это картина!!! Запустил сново, ушел, прихожу, смотрю те же пакеты вроде качает, заглядываю в папочку, и о ужас - все качается заново. Статья хорошая, но ох как подвел ты парень. А все потому, что блог завел, а специалистом не являешься. И еще комменты потрешь наверняка.

    ОтветитьУдалить
  2. Ну конечно же я удаляю комментарии содержащие нецензурную лексику.

    Мой скрипт под названием getdebrepo делает только одно: формирует список ссылок. wget - это замечательная программа для скачивания файлов, но к ее написаню я, к сожалению, не причастен. По вашим словам Вы отступили от приведенной мною инструкции (перезагрузили компьютер). В этом случае, как и любой разумный человек, Вы должны представлять, что делаете, или предворительно спросить.
    Я нигде не отмечал, что процесс можно перервать и потом начать заново с того же места (хотя это действительно возможно в случае использования опции -c для wget).

    К вопросу о проверке. Я пользовался этим методом 3 раза, копировал строки указанные в начале в терминал, ну и дальше как написано ...

    ОтветитьУдалить
  3. Действительно нечего было предъявлять претензии к автору! Скрипт отличный, как раз то что было нужно, пользовался, пользуюсь и буду пользоваться и не только я!

    ОтветитьУдалить
  4. For Win:
    1. install cygwin with wget
    2. run script "http://dik123.googlepages.com/getdebrepo"
    3. wget -c -x -i part0

    ОтветитьУдалить
  5. Господа, я в замешательстве. Последний комментарий For Win, это для использования в Windows? И это команды для командной строки?
    Айген Ротфусс.

    ОтветитьУдалить
  6. да! для винды есть эмулятор линукса: cygwin

    ОтветитьУдалить
  7. Анонимный18 мая 2010 г., 13:41

    а как потом подключить все что скачалось в качестве репозитория в синаптик?

    ОтветитьУдалить
  8. если через синаптик то через "источники приложения" или как то так (gnoma по близости нету) вся магия заключается в том, что бы в качестве url репозитария указать путь до католога не забывая вместо "ftp://" или "http://" указать "file:///" (именно 3 слеша! первые два это к префиксу протокола, а третий это "корень")

    Если без мыши то просто в /etc/apt/sources.list прописать

    deb file:///home/user/repo/archive.ubuntu.com/ubuntu/ lucid main universe restricted multiverse

    а все остальное закоментировать (зависит от настроек, возможно там перечислены нужные Вам репозитарии).

    Где: /home/user/repo/archive.ubuntu.com/ubuntu/ - путь до локального репозитария (эта директория должна содержать катологи dist и pool)

    Не забыв после изменения выполнить:
    sudo apt-get update

    ОтветитьУдалить
  9. Анонимный18 мая 2010 г., 17:33

    все тогда просто супер спасибо огромное за такую программу!
    вопрос такой еще возник: а как узнать объем скачиваемых файлов. находящихся в репозитории? получается самого репозитория

    ОтветитьУдалить
  10. Lucid 30.8 гигабай (то что качает команда указанная в самом верху)

    Подсчитывал вот такой командой:
    s=0; for i in `zgrep ^Size: Packages.gz | cut -d' ' -f2`; do s=$(($s + $i)); done; echo $s

    Ее нужно выполнять в директории с индекным файлом т.е в
    dists/lucid/{main,universe,multiverse,restriucted}/binary-i386

    ОтветитьУдалить
  11. Анонимный18 мая 2010 г., 18:37

    ага... остался последний вопрос на засыпку...
    а как мне порезать все что скачается и заболванить, чтобы потом прийдя на компьютер на котором нет интернета ввести команду sudo apt-cdrom add добавить их как репы? или как нибудь по другому но чтобы именно с дисков

    ОтветитьУдалить
  12. http://ubuntuforums.org/showthread.php?t=352460
    Тут очень подробно все расписано. Если с английским не очень, то описанием можно принебречь (хоть и не желательно), из приведенных комманд в принципе понятно что происходит.

    Если пользоваться моим скриптом то 3-й шаг можно пропустить, а можно наоборот воспользоватся "класическим" методом описанным по ссылке если ничего из секции блого-поста 'Этот "велосипед" преследует ряд задач:' не нужно.

    ОтветитьУдалить
  13. Анонимный18 мая 2010 г., 20:53

    ага, спасибо как скачается воспользуюсь статьей, с английским нормально, так что не думаю что должны быть проблемы
    знаете Ваша программа очень полезной оказалась, если бы Вы написали интерфейс графический еще для тех кто не понимает как в консоли работать то думаю что круг тех кто использует программу расширился бы
    Огромное спасибо за статью и программ у еще раз, удачи

    ОтветитьУдалить
  14. А мне почему-то не удалось подключить локальный репозиторий, скачанный таким способом.
    При обновлении источников в синаптике выдаёт сообщение "Не удалось получить file:/media/Transcend/Repo/ubuntu/dists/lusid/main/binary-i386/Packages.gz Файл не найден
    Не удалось получить file:/media/Transcend/Repo/ubuntu/dists/lusid/restricted/binary-i386/Packages.gz Файл не найден

    Некоторые индексные файлы не скачались, они были проигнорированы или вместо них были использованы старые версии", хотя эти файлы лежат на местах. В sources.list прописано как надо. Как быть?

    ОтветитьУдалить
  15. deb file:///media/Transcend/Repo/ubuntu/ lusid main universe restricted multiverse

    три слеша после 'file:'
    первые два это постфикс протокола третий корень файловой системы

    кстати уже вышел maverick :)

    ОтветитьУдалить
  16. В sources.list так и прописано.
    Я знаю, но в нашей сети пока только lusid.

    ОтветитьУдалить
  17. файл dists/lusid/main/binary-i386/Packages.gz скачиваеться самим getdebrepo ...

    В Вашей папке /media/Transcend/Repo/ubuntu долно быть два каталога dists и pool.
    В pool лежат собственно пакеты а в dists индексы.
    Если папки dists у Вас там нет то запустите строки в самом начале поста до:

    #Собственно скачиваем пакеты
    wget -x -i part0

    тогда скрипт как раз скачает только индексы и Вы перенесете их в /media/Transcend/Repo/ubuntu/.

    P.S. я обновил пост для maverick (я к тому что если у вас lucid и Вы будете копировать строки обратите внимание)

    ОтветитьУдалить