Это старая версия документа.


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

FIXME

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

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

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

FIXME - описание.

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

FIXME

Репозиторий на CD/DVD

Описана последовательность действий для 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. Готовим каталоги дисков:

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 на него.

4. Создаём скрипт 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

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

5. Распихиваем пакеты по дискам вышесозданным скриптом:

$ sudo ruby debcopy ubuntu/ ubuntu-dvd/ubuntu0
$ sudo ruby debcopy ubuntu/ ubuntu-dvd/ubuntu1

И так далее. Зависит от того, сколько у вас создалось каталогов-дисков в ls ubuntu-dvd/

6. Создаём идентификаторы дисков чтобы 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 соответственно менять.

7. И наконец последний шаг. Закатываем пакеты в образы:

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

Ссылки