Это старая версия документа.
Содержание
Необходимо вынести различные способы создания зеркала (debmirror, apt-mirror, apt-move etc) каждый в свою статью, здесь же оставить только общие сведения по созданию зеркал (подключение их к компьютерам, разбивка на CD диски и т.д.) со ссылками на сопутствующие статьи. Пример для apt-mirror:
— Malamut 2010/12/21 15:38
Краткое описание руководства
Репозиторий — это хранилище пакетов с программным обеспечением. Подробности о репозиториях можно прочитать в соответствующей статье.
Таким хранилищем может быть FTP или HTTP сервер, специально сформированный CD/DVD-диск, директория на жёстком диске или флешке. Данная статья описывает различные способы создания локального/сетевого зеркала репозиториев.
- По возможности тут будут собраны все основные способы зеркалирования, создания и распространения репозиториев.
Получение репозиториев
- описание.
Способ №1. При помощи debmirror
Создание "доверенного" репозитория
- Описание, зачем это нужно.
Распространение репозитория
- описание.
http доступ к репозиторию
Репозиторий на 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
Я не нашёл, как делать спойлеры в этой вики, сверните кто-нибудь этот код под спойлер, плиз!
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
Примечания&рекомендации.
Чтобы потом не запутаться надо где-то отметить дату копирования зеркала и архитектуру.
Не забывайте изменять цифры дисков в процессе создания образов и копирования.
Для автоматизации выдрать всё используемое из истории команд 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 и обновить список доступных пакетов.