FIXME Необходимо вынести различные способы создания зеркала (debmirror, apt-mirror, apt-move etc) каждый в свою статью, здесь же оставить только общие сведения по созданию зеркал (подключение их к компьютерам, разбивка на CD диски и т.д.) со ссылками на сопутствующие статьи. Пример для apt-mirror:

apt-mirror

Malamut 2010/12/21 15:38

Краткое описание руководства

Репозиторий — это хранилище пакетов с программным обеспечением. Подробности о репозиториях можно прочитать в соответствующей статье.

Таким хранилищем может быть FTP или HTTP сервер, специально сформированный CD/DVD-диск, директория на жёстком диске или флешке. Данная статья описывает различные способы создания локального/сетевого зеркала репозиториев.

Собственный репозиторий нужен для установки программ на компьютеры, не имеющие доступа в интернет. Если доступ в интернет у вас есть, и вы хотите сэкономить время и трафик при установке программ на множество компьютеров, то лучше использовать кэширование (проксирование) репозиториев.

FIXME - По возможности тут будут собраны все основные способы зеркалирования, создания и распространения репозиториев.

Получение репозиториев

FIXME - описание.

Способ №1. При помощи debmirror

Способ №2. При помощи ubuntu-repository.exe

Многих также интересует вопрос «Какой размер репозитория ubuntu» и «как удалить старые версии пакетов репозитория ubuntu»? http://mozgoed-mgoy.narod.ru/ubuntu-repository/screen.jpg

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.Как узнать размер скачиваемого репозитория? Моя программа позволяет в интерактивной форме узнать размеры репозитория и отдельных его частей.

  1. Выбираете нужные дистрибутивы(первая колонка).
  2. Выбираете компоненты распространения (вторая колонка).
  3. Выбираете архитектуру процессора (третья колонка)

Повторяете операцию (а,б,в) для каждого релиза, который вам нужен (на момент публикации этого сообщения актуальной была Oneiric). Жмёте «Анализ». Прога изучает все вкладки и по каждой выдаёт суммарный размер репозитория. И в конце выдаёт размер всего-всего, что вы выбрали вообще. Программа не создаёт никаких временных файлов в процессе «Анализа», поэтому считается полностью Portable. (можно даже с CD запускать)

2. Как скачать Ubuntu репозиторий? Данная программа может скачать ubuntu репозиторий с опциональным выбором его частей.

  1. Выбираете нужные дистрибутивы(первая колонка).
  2. Выбираете компоненты распространения (вторая колонка).
  3. Выбираете архитектуру процессора (третья колонка)

г)Повторяете операцию (а,б,в) для каждого релиза, который вам нужен (Dapper в репозитории Ubuntu.com более не хранится). Жмёте кнопку скачивания. Программа скачивает пакеты связанные связанные с выбранными настройками. Внимание! Возможность скачивания находится на стадии beta и при слабом Интернет соединении может падать программа.

3. Как удалить устаревшие пакеты из скачанного репозитория? Такой вопрос часто возникает когда вы несколько раз обновили репозиторий с помощью другой программы, но она забыла удалить устаревшие пакеты. А по причине огромного размера репозитория сделать это вручную очень-очень долго.

  1. Нажать кнопку «Обзор» и выбрать корневую папку репозитория. (в ней должны быть папки «dists» и «pool»)
  2. Нажать кнопку «Удалить старые пакеты». Дождаться окончания сканирования пакетов в репозитории (окно может зависнуть, потому что ещё не успел распаралелить процессы), и дождаться окончания сканирования пакетов в папке «pool» (Процесс ещё более долгий… :( )
  3. Откроется окошко о результатах предварительного сканирования. Согласившись с вопросом о начале Удаления, ждём окончания работы программы.

Совет: Если в pool'e файлов меньше, чем официально должно быть, значит репозиторий не полный. Если наоборот - много больше, то либо репозиторий перегружен старыми версиями, либо стоит подумать, жать ли кнопку «Да». Потому что вся эта разница будет наверняка удалена. Для пытливых умов скажу алгоритм работы. Потому что возможно функция удаления старых пакетов Вас не устроит и удалит что-то лишнее из репозитория. Итак:

  1. Создаётся список всех файлов в папке pool.
  2. Находятся все Packages.gz в файле Release в корне репозитория и из каждого архива вынимаются все ссылки на файлы.
  3. Потом для каждого файла из первого списка ищется соответствие во втором списке. Если находится, то файл не трогается. Если не находится, то файл физически удаляется.

Данная функция программы тоже полностью Portable.

BugFixes:

-Исправлена ошибка при удалении старых пакетов (удалялся один пакет)

+При удалении старых пакетов пустые папки теперь удаляются

Скачать последнюю версию http://mozgoed-mgoy.narod.ru/ubuntu-repository/ubuntu-repository.zip

Создание "доверенного" репозитория

FIXME - Описание, зачем это нужно.

Распространение репозитория

FIXME - описание.

Прокси репозитория

http доступ к репозиторию

FIXME

Репозиторий на 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
important

Я не нашёл, как делать спойлеры в этой вики, сверните кто-нибудь этот код под спойлер, плиз!

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
tip

Примечания&рекомендации.

Чтобы потом не запутаться надо где-то отметить дату копирования зеркала и архитектуру.

Не забывайте изменять цифры дисков в процессе создания образов и копирования.

Для автоматизации выдрать всё используемое из истории команд bash и вписать в один файл-скрипт.

Если что-то из ваших скриптов не запускается не забывайте про chmod +x filename

При нехватке места на диске можно немного сэкономить место, используя симлинки вместо копирования. Однако они могут некорректно прочитаться. Таким вот образом:

sudo ruby debcopy -l ubuntu/ ubuntu-dvd/ubuntu0

вместо

sudo ruby debcopy ubuntu/ ubuntu-dvd/ubuntu0
important

Внимательно смотрим на выхлоп раби скрипта. В идеале должно быть что-то подобное:

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 и обновить список доступных пакетов.

Ссылки