вторник, 18 марта 2008 г.

Создание DVD-образов репозиториев Убунту

Пер. с англ., источник - http://www.howtoforge.com/dvd_images_of_ubuntu_repositories

1. Предварительные замечания

Это руководство было написано под вдохновением статей, которые я прочитал на http://cargol.net/%7Eramon/ubuntu-dvd-en. Также огромная благодарность Рамону Ацедо (Ramon Acedo) (реально первый, кто создал это HOWTO).
Статьи не доступны сейчас несколько недель. Я сохранил страницу для чтения в оффлайне. Итак...
Я нашел эту тему полезной. Я надеюсь, что она будет тоже полезна для вас.

2. Вступление


Это HOWTO предлагает простой способ создания DVD-образов http- или ftp- репозиториев Debian или Ubuntu.
Ubuntu по умолчанию не предлагает способа создания DVD, для чего нужно скачать пакеты с репозиториев main, universe, multiverse и/или restricted. С помощью содержащейся в этом HOWTO информации вы можете сделать это сами.
Наличие репозиториев Ubuntu или Debian на DVD может быть полезно тем пользователям, которые не имеют прямого доступа к Интернету, но которые, в свою очередь, могут получить доступ в некотором другом месте, чтобы скачать репозиторий и записать его на DVD.

3. Создание локального зеркала

Вы должны установить пакет debmirror:

sudo apt-get install debmirror

Теперь скачаем репозитории Ubuntu в локальную директорию. В примере ниже мы получаем срезы main, universe и multiverse репозитория для архитектуры i386.

debmirror --nosource -m --passive --host=archive.ubuntulinux.org --root=ubuntu/ --method=ftp --progress --dist=dapper --section=main,multiverse,universe --arch=i386 ubuntu/ --ignore-release-gpg

Вы можете изменить опции ниже в соответствии с вашими предпочтениями:

  • --host - URL репозитория.
  • --dist - версия дистрибутива вашей ОС (dapper, edgy, sarge, ...).
  • --section - срез, зеркало которого вы хотите создать локально.
  • --arch - архитектура вашего компьютера.

4. Разделение архива на каталоги размера DVD-носителя.

Репозитории, которые мы получили, слишком большие (около 30 Gb) для того, чтобы записать их на DVD, поэтому мы должны разделить их на отдельные части.
Утилита debpartial сделает это для нас.

sudo apt-get install debpartial

Создаем каталог, где будут размещаться отдельные части репозиториев.

mkdir ubuntu-dvd

И создаем дескрипторы пакетов для каждой отдельной части.

debpartial --nosource --dirprefix=ubuntu --section=main,universe,multiverse --dist=dapper --size=DVD ubuntu/ ubuntu-dvd/

Теперь мы должны поместить пакеты в каталоги, которые только что были созданы debpartial. Скрипт debcopy, который также поставляется с пакетом debpartial, сделает это. Этому скрипту необходим пакет ruby.

sudo apt-get install ruby

Если все ОК...

ruby debcopy ubuntu/ ubuntu-dvd/ubuntu0
ruby debcopy ubuntu/ ubuntu-dvd/ubuntu1
ruby debcopy ubuntu/ ubuntu-dvd/ubuntu2

Теперь каждый каталог (ubuntu0, ubuntu1 and ubuntu2) помещается на один DVD.

5. Создание ISO-образов.

Чтобы получить каталоги ubuntu0, ubuntu1, ubuntu2 в виде ISO-образов, готовых к прожигу на DVD, мы можем использовать команду mkisofs:

mkisofs -f -J -r -o ubuntu-dvd-0.iso ubuntu-dvd/ubuntu0
mkisofs -f -J -r -o ubuntu-dvd-1.iso ubuntu-dvd/ubuntu1
mkisofs -f -J -r -o ubuntu-dvd-2.iso ubuntu-dvd/ubuntu2

Теперь вы можете прожечь ISO-образы или примонтировать их. Добавьте их в файл /etc/apt/sources.list командой:

sudo apt-cdrom add

Теперь мы можем проверить новые репозитории...

sudo apt-get update
sudo apt-get upgrade

...и, если я объяснил вам все правильно, вы получите обновленную систему.

6. О скрипте 'debcopy'

Я слышал о некоторых, кто не может найти скрипт debcopy, упомянутый выше. В этом случае, создайте новый файл с именем debcopy в любом желанном месте:

gedit /your_path_to/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, &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

1 комментарий:

Анонимный комментирует...

Благодарю!