Это старая версия документа.
Содержание
— 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 и обновить список доступных пакетов.