Содержание

— Malamut 2010/12/21 15:38
Краткое описание руководства
Репозиторий — это хранилище пакетов с программным обеспечением. Подробности о репозиториях можно прочитать в соответствующей статье.
Таким хранилищем может быть FTP или HTTP сервер, специально сформированный CD/DVD-диск, директория на жёстком диске или флешке. Данная статья описывает различные способы создания локального/сетевого зеркала репозиториев.
- По возможности тут будут собраны все основные способы зеркалирования, создания и распространения репозиториев.
Получение репозиториев
- описание.
Способ №1. При помощи debmirror
Способ №2. При помощи ubuntu-repository.exe
Многих также интересует вопрос «Какой размер репозитория ubuntu» и «как удалить старые версии пакетов репозитория ubuntu»?
0.Требования к запуску программы. Практически такие же как и у автора программы.
- Windows 2000, Windows XP, Windows Server 2003 - Нужен .Net Framework 2.0
- Windows Vista, Windows 7 - Ничего не нужно.
- Ubuntu 10.10 - Нужен пакет Mono. Запускать можно через консоль «mono ubuntu-repository.exe».
1.Как узнать размер скачиваемого репозитория? Моя программа позволяет в интерактивной форме узнать размеры репозитория и отдельных его частей.
- Выбираете нужные дистрибутивы(первая колонка).
- Выбираете компоненты распространения (вторая колонка).
- Выбираете архитектуру процессора (третья колонка)
Повторяете операцию (а,б,в) для каждого релиза, который вам нужен (на момент публикации этого сообщения актуальной была Oneiric). Жмёте «Анализ». Прога изучает все вкладки и по каждой выдаёт суммарный размер репозитория. И в конце выдаёт размер всего-всего, что вы выбрали вообще. Программа не создаёт никаких временных файлов в процессе «Анализа», поэтому считается полностью Portable. (можно даже с CD запускать)
2. Как скачать Ubuntu репозиторий? Данная программа может скачать ubuntu репозиторий с опциональным выбором его частей.
- Выбираете нужные дистрибутивы(первая колонка).
- Выбираете компоненты распространения (вторая колонка).
- Выбираете архитектуру процессора (третья колонка)
г)Повторяете операцию (а,б,в) для каждого релиза, который вам нужен (Dapper в репозитории Ubuntu.com более не хранится). Жмёте кнопку скачивания. Программа скачивает пакеты связанные связанные с выбранными настройками. Внимание! Возможность скачивания находится на стадии beta и при слабом Интернет соединении может падать программа.
3. Как удалить устаревшие пакеты из скачанного репозитория? Такой вопрос часто возникает когда вы несколько раз обновили репозиторий с помощью другой программы, но она забыла удалить устаревшие пакеты. А по причине огромного размера репозитория сделать это вручную очень-очень долго.
- Нажать кнопку «Обзор» и выбрать корневую папку репозитория. (в ней должны быть папки «dists» и «pool»)
- Нажать кнопку «Удалить старые пакеты». Дождаться окончания сканирования пакетов в репозитории (окно может зависнуть, потому что ещё не успел распаралелить процессы), и дождаться окончания сканирования пакетов в папке «pool» (Процесс ещё более долгий… :( )
- Откроется окошко о результатах предварительного сканирования. Согласившись с вопросом о начале Удаления, ждём окончания работы программы.
Совет: Если в pool'e файлов меньше, чем официально должно быть, значит репозиторий не полный. Если наоборот - много больше, то либо репозиторий перегружен старыми версиями, либо стоит подумать, жать ли кнопку «Да». Потому что вся эта разница будет наверняка удалена. Для пытливых умов скажу алгоритм работы. Потому что возможно функция удаления старых пакетов Вас не устроит и удалит что-то лишнее из репозитория. Итак:
- Создаётся список всех файлов в папке pool.
- Находятся все Packages.gz в файле Release в корне репозитория и из каждого архива вынимаются все ссылки на файлы.
- Потом для каждого файла из первого списка ищется соответствие во втором списке. Если находится, то файл не трогается. Если не находится, то файл физически удаляется.
Данная функция программы тоже полностью Portable.
BugFixes:
-Исправлена ошибка при удалении старых пакетов (удалялся один пакет)
+При удалении старых пакетов пустые папки теперь удаляются
Скачать последнюю версию http://mozgoed-mgoy.narod.ru/ubuntu-repository/ubuntu-repository.zip
Создание "доверенного" репозитория
- Описание, зачем это нужно.
Распространение репозитория
- описание.
Прокси репозитория
http доступ к репозиторию
Репозиторий на CD/DVD
APTonCD
см. APTonCD
Вручную через debmirror
Описана последовательность действий для lucid (10.04) в других версиях некоторые шаги могут не понадобиться или наоборот - потребоваться что-то ещё.
1. Скачиваем зеркало с сайта: (в созданый для этого каталог, ессно)
debmirror --nosource -m --passive --host=mirror.yandex.ru/ --root=ubuntu --method=http --progress --dist=lucid,lucid-security,lucid-updates,lucid-backports --ignore-release-gpg --section=main,restricted,multiverse,universe --arch=i386,amd64 ubuntu/
Если надо сырцы убираем ключ —nosource.
Если не надо amd64 убираем соответственно ,amd64
2. В lucid нет debpartial, скачиваем его отсюда http://packages.ubuntu.com/dapper/all/debpartial/download
или через консоль
wget 'http://fr.archive.ubuntu.com/ubuntu/pool/universe/d/debpartial/debpartial_0+20030508-0.1_all.deb'
3. Если создать каталоги дисков прямо сейчас, то пакеты на дисках будут расположены как попало. Чтобы этого избежать, отсортируем пакеты по популярности с помощью статистики сайта http://popcon.ubuntu.com:
wget --output-document - http://popcon.ubuntu.com/all-popcon-results.txt.gz | zcat | ruby -ne '/(\S+)\s+(\d+)\s+\d+\s+(\d+)/ =~ $_; puts "#{$2.to_i+$3.to_i} #{$1}"' | sort -nr | cut -d' ' -f2 | grep -v Package | grep -v '^$' > ~/ubuntu_packages_popularity.txt
После этого в домашнем каталоге появится файл ~/ubuntu_packages_popularity.txt, в котором содержится список пакетов, отсортированный по убыванию популярности. На следующем шаге мы подсунем его debpartial. Таким образом, все самые необходимые пакеты окажутся на первых двух-трех DVD.
4. Готовим каталоги дисков:
debpartial --nosource --dirprefix=ubuntu --section=main,restricted,multiverse,universe --dist=lucid,lucid-security,lucid-updates,lucid-backports --arch=i386 --size=DVD ubuntu/ ubuntu-dvd/
Соответственно, если нужен amd64 то замените слово i386 на него. Если на предыдущем шаге вы создали список популярности пакетов, то нужно указать debpartial обрабатывать пакеты по порядку в соответствии с ним - добавьте опцию –include-from=имя файла
debpartial --include-from=ubuntu_packages_popularity.txt --nosource --dirprefix=ubuntu --section=main,restricted,multiverse,universe --dist=lucid,lucid-security,lucid-updates,lucid-backports --arch=i386 --size=DVD ubuntu/ ubuntu-dvd/
5. Создаём скрипт ruby для копирования пакетов по дискам.
Любым текстовым редактором. Вот его содержимое, которое необходимо туда скопировать:
#!/usr/bin/ruby # # debcopy - Debian Packages/Sources partial copy tool # # Usage: debcopy [-l] <source> <dest> # # where <source> is a top directory of a debian archive, # and <dest> is a top directory of a new debian partial archive. # # debcopy searches all Packages.gz and Sources.gz under <dest>/dists # and copies all files listed in the Packages.gz and Sources.gz # files into <dest> from <source>. -l creates symbolic links # instead of copying files. # # Copyright (C) 2002 Masato Taruishi <taru@debian.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License with # the Debian GNU/Linux distribution in file /usr/share/common-licenses/GPL; # if not, write to the Free Software Foundation, Inc., 59 Temple Place, # Suite 330, Boston, MA 02111-1307 USA # require 'getoptlong' require 'zlib' require 'ftools' $link = false def usage $stderr.puts "Usage: #{__FILE__} [-l] <source> <dest>" exit 1 end def each (file, &block) fin = Zlib::GzipReader.open(file) fin.each do |line| yield line end fin.close end def each_file (file, &block) each(file) do |line| if /Filename: (.*)/ =~ line yield $1 end end end def each_sourcefile (file, &block) dir = nil each(file) do |line| case line when /^Directory: (.*)$/ dir = $1 when /^ \S+ \d+ (\S+)$/ yield dir + "/" + $1 end end end def calc_relpath (source, dest) pwd = Dir::pwd Dir::chdir source source = Dir::pwd Dir::chdir pwd Dir::chdir dest dest = Dir::pwd Dir::chdir pwd src_ary = source.split("/") src_ary.shift dest_ary = dest.split("/") dest_ary.shift return dest if src_ary[0] != dest_ary[0] src_ary.clone.each_index do |i| break if src_ary[0] != dest_ary[0] src_ary.shift dest_ary.shift end src_ary.size.times do |i| dest_ary.unshift("..") end dest_ary.join("/") end def do_copy(path) if $link pwd=calc_relpath(File.dirname($dest_dir + "/" + path), $source_dir) File.symlink(pwd + "/" + path, $dest_dir + "/" + path) else File.copy($source_dir + "/" + path, $dest_dir + "/" + path) end end def copy(path) s=$source_dir + "/" + path d=$dest_dir + "/" + path if FileTest.exist?(d) $stats["ignore"] += 1 return end if FileTest.exist?(s) File.mkpath(File.dirname(d)) do_copy(path) $stats["copy"] += 1 else $stats["notfound"] += 1 $stderr.puts s + " not found." end end opts = GetoptLong.new(["--symlink", "-l", GetoptLong::NO_ARGUMENT], ["--help", "-h", GetoptLong::NO_ARGUMENT]) opts.each do |opt,arg| case opt when "--symlink" $link = true when "--help" usage end end usage if ARGV.size != 2 $source_dir = ARGV.shift $dest_dir = ARGV.shift if $link $source_dir = Dir::pwd + "/" + $source_dir unless $source_dir =~ /\A\// $dest_dir = Dir::pwd + "/" + $dest_dir unless $dest_dir =~ /\A\// end $stats = {} $stats["ignore"] = 0 $stats["copy"] = 0 $stats["notfound"] = 0 open("|find #{$dest_dir}/dists -name Packages.gz") do |o| o.each_line do |file| file.chomp! print "Processing #{file}... " $stdout.flush each_file(file) do |path| copy(path) end puts "done" end end open("|find #{$dest_dir}/dists -name Sources.gz") do |o| o.each_line do |file| file.chomp! print "Processing #{file}... " $stdout.flush each_sourcefile(file.chomp) do |path| copy(path) end puts "done" end end puts "Number of Copied Files: " + $stats["copy"].to_s puts "Number of Ignored Files: " + $stats["ignore"].to_s puts "Number of Non-existence File: " + $stats["notfound"].to_s
Я не нашёл, как делать спойлеры в этой вики, сверните кто-нибудь этот код под спойлер, плиз!
6. Распихиваем пакеты по дискам вышесозданным скриптом:
$ sudo ruby debcopy ubuntu/ ubuntu-dvd/ubuntu0 $ sudo ruby debcopy ubuntu/ ubuntu-dvd/ubuntu1
И так далее. Зависит от того, сколько у вас создалось каталогов-дисков в ls ubuntu-dvd/
7. Создаём идентификаторы дисков чтобы apt(synaptic) не ругался:
mkdir ubuntu-dvd/ubuntu0/.disk mkdir ubuntu-dvd/ubuntu1/.disk mkdir ubuntu-dvd/ubuntu2/.disk mkdir ubuntu-dvd/ubuntu3/.disk mkdir ubuntu-dvd/ubuntu4/.disk mkdir ubuntu-dvd/ubuntu5/.disk mkdir ubuntu-dvd/ubuntu6/.disk mkdir ubuntu-dvd/ubuntu7/.disk mkdir ubuntu-dvd/ubuntu8/.disk mkdir ubuntu-dvd/ubuntu9/.disk
В этих каталогах надо создать файл info со следующим содержанием:
Ubuntu 10.04 "Lucid Lynx" Repo-DVD-1 (20100707)
Можно написать что-нибудь свое. Номер DVD-X соответственно менять.
8. И наконец последний шаг. Закатываем пакеты в образы:
mkisofs -f -J -r -V "Ubuntu 10.04 1/8" -o ubuntu-10.04-$(date -I)-complete-i386-dvd1.iso ubuntu-dvd/ubuntu0 mkisofs -f -J -r -V "Ubuntu 10.04 2/8" -o ubuntu-10.04-$(date -I)-complete-i386-dvd2.iso ubuntu-dvd/ubuntu1 mkisofs -f -J -r -V "Ubuntu 10.04 3/8" -o ubuntu-10.04-$(date -I)-complete-i386-dvd3.iso ubuntu-dvd/ubuntu2 mkisofs -f -J -r -V "Ubuntu 10.04 4/8" -o ubuntu-10.04-$(date -I)-complete-i386-dvd4.iso ubuntu-dvd/ubuntu3 mkisofs -f -J -r -V "Ubuntu 10.04 5/8" -o ubuntu-10.04-$(date -I)-complete-i386-dvd5.iso ubuntu-dvd/ubuntu4 mkisofs -f -J -r -V "Ubuntu 10.04 6/8" -o ubuntu-10.04-$(date -I)-complete-i386-dvd6.iso ubuntu-dvd/ubuntu5 mkisofs -f -J -r -V "Ubuntu 10.04 7/8" -o ubuntu-10.04-$(date -I)-complete-i386-dvd7.iso ubuntu-dvd/ubuntu6 mkisofs -f -J -r -V "Ubuntu 10.04 8/8" -o ubuntu-10.04-$(date -I)-complete-i386-dvd8.iso ubuntu-dvd/ubuntu7
Примечания&рекомендации.
Чтобы потом не запутаться надо где-то отметить дату копирования зеркала и архитектуру.
Не забывайте изменять цифры дисков в процессе создания образов и копирования.
Для автоматизации выдрать всё используемое из истории команд bash и вписать в один файл-скрипт.
Если что-то из ваших скриптов не запускается не забывайте про chmod +x filename
При нехватке места на диске можно немного сэкономить место, используя симлинки вместо копирования. Однако они могут некорректно прочитаться. Таким вот образом:
sudo ruby debcopy -l ubuntu/ ubuntu-dvd/ubuntu0
вместо
sudo ruby debcopy ubuntu/ ubuntu-dvd/ubuntu0
Внимательно смотрим на выхлоп раби скрипта. В идеале должно быть что-то подобное:
Processing ubuntu-dvd/ubuntu0/dists/lucid-updates/universe/binary-i386/Packages.gz... done Number of Copied Files: 4426 Number of Ignored Files: 38 Number of **Non-existence File: 0**''
Т.е. все файлы у нас скопировались нормально.
Если же вывалилось сообщение о недостающих файлах - не страшно. Их можно скачать вручную, с указанного вами зеркала, при помощи браузера или wget'a, не повторяя загрузку всего зеркала. Но не забывайте про время! Если вы скачали их, например через неделю, то зеркало за это время могло измениться и появилась другая версия пакета.
Долгой жизни и процветания. — darkshvein 08.08.2010 12:14
FIXME - тут старая статья - пока не измененная
Если нужно создать локальный репозиторий, то делаем следующее.
Устанавливаем пакет dpkg-dev
(содержит нужную нам утилиту dpkg-scanpackages)
sudo apt-get install dpkg-dev
Создаём директорию, в которой будут храниться deb-пакеты. Например
mkdir ~/Packages
Копируем туда все свои пакеты и пакеты из кэша (их там может не быть, но в любом случае, лишним не будет)
cp /var/cache/apt/archives/*.deb ~/Packages
Переходим в нашу новую директорию с пакетами и собираем файл Packages.gz (хранит список пакетов и информацию о них, необходим для работы пакетных менеджеров с репозиторием)
cd ~/Packages dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
Теперь можно скопировать директорию Packages на любой носитель, например флешку (если это нужно)
Далее надо указать системе этот репозиторий.
Добавляем путь к репозиторию в файл sources.list
. Открываем файл любимым редактором, например, gedit'ом
sudo gedit /etc/apt/sources.list
И в любое место добавляем нужную строку. В общем виде путь выглядит так: deb file:/путь/к/пакетам ./
. Примеры:
# в нашем случае путь примерно такой: deb file:/home/vasya/Packages ./ # ещё может быть такой deb file:/mnt/E/Доки/Ubuntu/Packages_8.10 ./ # а если репозиторий на флешке... deb file:/media/KINGSTON/archives ./
Также репозиторий можно добавить с помощью Synaptic: Система - Администрирование - Источники приложений - ПО сторонних производителей - Добавить.
Обновляем список доступных пакетов
sudo apt-get update
Всё, репозиторий создан и подключён.
Если изменилось содержимое директории с пакетами, то нужно пересобрать файл Packages.gz и обновить список доступных пакетов.