Ключевые слова:debian, dvd, repostory, packet, deb, dpkg, apt, (найти похожие документы)
From: Михаил Конник <http://mydebianblog.blogspot.com>
Date: Sun, 16 Feb 2008 17:02:14 +0000 (UTC)
Subject: Создание CD или DVD образов из репозиториев Debian
Оригинал: http://mydebianblog.blogspot.com/2007/07/cd-dvd.html
Задача: где-то далеко, за высокими горами, лежат репозитории пакетов,
которые хочется использовать локально и записать на диски.
Решение: для этого потребуется установить несколько пакетов, достать
скрипт на ruby и освободить побольше места на винчестере.
1. Введение
Пакеты по лицензионным или прочим соображениям делятся в репозитории
на секции: например, главная (main) и несвободная (non-free). Пакеты
несвободной секции в официальный репозиторий не входят по лицензионным
соображениям - но это не значит, что их нельзя скачать.
Простое скачивание результата не даст - нужно разбить большой
репозиторий на DVD-образы, чтобы пользоваться ими потом.
Для решения задачи нам потребуется несколько программ, которые в
официальный свободный репозиторий гарантированно входят.
2. Создание локального зеркала
Нужно установить пакет debmirror:
aptitude install debmirror
После этого можно будет качать репозиторий к себе на винчестер с
возможностью автоматической докачки (если не сможете вытянуть его за
один заход). Выходим в консольку и даём команду:
debmirror debian --nosource --host=backports.org --root=debian
--method=http --progress --dist=etch-backports
--section=main,contrib,non-free --arch=i386 --ignore-release-gpg
Теперь что всё это значит и как всем этим пользоваться.
Полужирное выделение - это важные параметры, которые нужно будет
менять, красным - это, собственно, значения параметров, которые
меняем. Для пояснения ситуации лучше запустить броузер и скормить ему
ссылку, которая стоит в --host, после чего станет ясно:
* --host - это адрес репозитория (без слеша на конце, здесь это
backports.org)
* --root - это тот каталог, от которого начнётся зеркалирование
пакетов. Короче - это каталог, который виден сразу после захода на
адрес, указанный в --host и его же указываем сразу после команды
debmirror.
* --method - обычно это http
* --dist - название версии дистрибутива, который нас интересует
(например sarge, etch, lenny...). Это следующий по уровню каталог,
после --host далее --root, далее каталог dist и каталог в нём
будет --dist
* --section - название секции, которая нам нужна (например non-free,
если не одна - разделитель запятая без пробелов, типа
non-free,main)
* --arch - архитектура.
Здесь, насколько смог, пояснил на примере реального зеркала,
полужирным выделены важные каталоги, красным - нужные нам параметры и
что вместо них подставлять.
http://backports.org/
[DIR] debian/ это --root=
[TXT] README.mirrors.html 08-Jun-2007 07:41 10K
[TXT] README.mirrors.txt 08-Jun-2007 07:41 7.6K
[ ] archive.key 20-Apr-2006 08:32 1.9K
[DIR] dists/ 10-Apr-2007 12:24 -
[DIR] etch-backports/ это --dist= 08-Jun-2007 07:38 -
[ ] Release.gpg 08-Jun-2007 07:38 189
[DIR] contrib/ это --section= 10-Apr-2007 12:24 -
[DIR] main/ это --section= 10-Apr-2007 12:24 -
[DIR] non-free/ это --section= 10-Apr-2007 12:24
[DIR] sarge-backports/ 08-Jun-2007 07:38 -
[DIR] doc/ 02-Sep-2005 19:14 -
[DIR] indices/ 08-Jun-2007 07:38 -
[ ] ls-lR.gz 08-Jun-2007 07:38 386K
[ ] ls-lR.patch.gz 08-Jun-2007 07:38 15K
[TXT] new.html 08-Jun-2007 09:50 3.4K
[DIR] pool/ 16-Jan-2006 11:35 -
[DIR] project/ 15-Dec-2005 22:12 -
[TXT] removals.txt 07-May-2007 21:59 40K
[TXT] robots.txt 19-Apr-2005 21:03 26
[TXT] style.css 07-May-2005 15:11 1.7K
[DIR] tools/
После этого запустится программа и, если нам повезёт, начнут
копироваться пакеты и складываться в локальные каталоги. Поползут
строки типа:
Getting:
pool/main/l/linux-2.6.16/linux-image-2.6.16-2-686-smp_2.6.16-18~bpo.1_i386.deb... ok
Getting:
pool/main/l/linux-2.6.16/linux-image-2.6.16-2-686_2.6.16-18~bpo.1_i386.deb... ok
Getting:
pool/main/l/linux-2.6.16/linux-image-2.6.16-2-k7-smp_2.6.16-18~bpo.1_i386.deb... ok
Это копируются пакеты. Всё отлично, переходим дальше.
3. Разделяем пакеты в каталоги размера DVD-образа
Каталог с репозиторием больше, чем можно записать на болванку -
следовательно, распределяем по каталогам, суммарный объём файлов
которых не превышает CD / DVD диск. Нужно установить пакет debpartial:
aptitude install debpartial
Далее делаем каталог для записи на DVD (например, etch-backports-dvd):
mkdir etch-backports-dvd
и создаём с помощью debpartial описание пакетов в каждом диске:
debpartial --nosource --dirprefix=backports-etch
--section=main,non-free --dist=etch-backports --size=DVD
backports-etch backports-etch-dvd
Для других архитектур, например для amd64, нужно указать явно
архитектуру:
debpartial --nosource --arch=amd64 --section=non-free --dist=etch
--size=DVD non-free non-free-dvd/
И снова несколько пояснений. Указываем те секции, которые указали при
скачивании командой debmirror, название дистрибутива из --dist, размер
(CD или DVD). Потом сначала пишем откуда создавать описания, а потом
куда (в каталог, который будем нарезать на болванку). После этого
поползут строчки вида:
Reading dists/etch-backports/main/binary-i386/Packages.gz... done
Reading dists/etch-backports/non-free/binary-i386/Packages.gz...
done
backports-etch0: 260 packages. Size: 1014633860 [
openoffice.org-l10n-de, ... ]
/usr/bin/debpartial:230: warning: Insecure world writable dir
/usr/local/matlab7 in PATH, mode 040777
Writing Packages.gz of backports-etch0 for
(etch-backports,main,i386)... 252.
Writing Packages.gz of backports-etch0 for
(etch-backports,non-free,i386)... 8.
А когда всё успокоится, в каталоге (в этом примере) etch-backports-dvd
появятся подкаталоги с номерами, начиная с 0, в которых скопированы
описания пакетов. В моём примере создался один каталог, так как
пакетов немного:
backports-etch0
Теперь нам потребуется язык ruby, который скорее всего уже установлен,
но тем не менее:
aptitude install ruby
После этого создаём файл скрипта под названием debcopy и записываем в
него следующее (оригинал кода здесь):
#!/usr/bin/ruby
#
# debcopy - Debian Packages/Sources partial copy tool
#
# Usage: debcopy [-l]
#
# where is a top directory of a debian archive,
# and is a top directory of a new debian partial archive.
#
# debcopy searches all Packages.gz and Sources.gz under /dists
# and copies all files listed in the Packages.gz and Sources.gz
# files into from . -l creates symbolic links
# instead of copying files.
#
# Copyright (C) 2002 Masato Taruishi
#
# 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] "
exit 1
end
def each (file, █)
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, █)
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
Даём ему права на исполнение и пишем:
ruby debcopy backports-etch/ backports-etch-dvd/backports-etch0/
Начнётся процесс копирования, который может отнять много времени.
Терпеливо ждём, потягивая кофе / чай / коньяк (нужное подчеркнуть).
Закончится это всё примерно следующим:
Processing
backports-etch-dvd/backports-etch0//dists/etch-backports/main/binary-i386/Packages.gz... done
Processing
backports-etch-dvd/backports-etch0//dists/etch-backports/non-free/binary-i386/Packages.gz... done
/usr/bin/myscript/debcopy:144: warning: Insecure world writable dir
/usr/local/matlab7 in PATH, mode 040777
Number of Copied Files: 260
Number of Ignored Files: 0
Number of Non-existence File: 0
Повторяем это для всех директорий с номерами (backports-etch0/
backports-etch1/ ... backports-etchN/), получаем копию репозитория,
нарезанного на каталоги подходящего размера.
4. Создаём ISO-образы и пропаливаем на болванки
Если хочется пользоваться репозиторием на болванках на других машинах,
нужно нарезать репозиторий на диски. Тут всё просто: создаём
ISO-образ:
mkisofs -f -J -r -o backports-etch0.iso
backports-etch-dvd/backports-etch0
Не забываем повторить эту команду для всех директорий с номерами
(backports-etch0/ backports-etch1/ ... backports-etchN/), получаем
ISO-образы и пропаливаем их на диски своей любимой программой прожига.
Ссылки
Собственно, пост является переводом и расширением этой
замечательной статьи. Решение, может, и не лучшее, но мне оно нравится
тем, что работает :-) Так же очень толковое руководство тут.