Использованы материалы: http://mydebianblog.blogspot.com/2007/07/cd-dvd.html
Нужен репозиторий для локалки? или для нарезки на двд?
Это просто.
Устанавливаем необходимый софт:
$ sudo apt-get install debmirror
$ sudo apt-get install debpartial
(http://mirror.neolabs.kz/ubuntu/pool/universe/d/debpartial/debpartial_0+20030508-0.1_all.deb)
Так же нам потребуется Ruby, но теперь он у стягивается вместе с debpartial
Подготовим директорию, куда будем складывать файлы:
$ mkdir ubuntu
Создадим скрипт mirror.sh для запуска пакета debmirror и скачивания набора пакетов, в которых нуждаемся:
$ sudo nano mirror.sh
В нём сохраняем следущее:
#!/bin/bash -x
/usr/bin/debmirror --nosource -m --passive --host=archive.ubuntulinux.org \
--root=ubuntu --method=ftp --progress \
--dist=karmic,karmic-security,karmic-updates,karmic-backports \
--ignore-release-gpg --section=main,restricted,multiverse,universe \
--arch=i386 /home/YorUserName/ubuntu/
где
-nosource - игнорировать исходники, только bin
-m - проверять контрольные суммы md5
--passive - закачка в пассивном режиме (этого требуют некоторые прокси)
--host=archive.ubuntulinux.org - откуда качаем
--root=ubuntu - каталог на сервере, будем качать все, что в него вложено
--method=ftp - метод закачки, варианты: ftp|hftp|http|rsync (если Вы качаете через M$ ISA, то, боюсь, что Вам подойдет только http. Где-то здесь на форуме есть мой пост о том, как с этим зверем бороться - самому немало нервов попортил.
rsync подойдет для последующих обновлений репозитория, только тогда опцию root надо будет записать так: --root=:ubuntu
--dist=karmic,karmic-security,karmic-updates,karmic-backports - наборы пакетов по их назначению (как они лежат на сервере в каталоге ubuntu)
--ignore-release-gpg - не обращать внимания на gpg-ключи (если мы доверяем серверу)
--section=main,restricted,multiverse,universe - секции наборов пакетов
--arch=i386,amd64 - архитектура нашего компа (можно ограничиться чем-то одним)
ubuntu/ - каталог, куда мы все это сложим (мне почему-то пришлось прописать полный путь!)
ПРИМЕЧАНИЕ. для работы через прокси (подобного Squid) может понадобиться опция:
--proxy=http://user:pass@url:port/
Делаем этот скрипт исполняемым:
$ chmod +x mirror.sh
Запускаем его:
$ sudo ./mirror.sh
После отработки скрипта появилась ~27 Gb в каталоге ~/ubuntu
в котором будут каталоги .temp dists pool и project
Первый и последний - это каталоги, служебные для debmirror а в dists и pool будут размещены индексы пакетов и сами пакеты - соответственно.
Если вам не нужны болванки с репозиторием,тогда можно просто добавить примерно такую строку в sources.list
deb file:///
/полный/путь/к/папке/где/лежит/скачанный/репозиторий/
karmic main restricted multiverse universe
Если вы хотите что бы репозиторий был доступен по http,то установите apache
,далее:
$ cd /var/www/
$ sudo ln /полный/путь/к/папке/где/лежит/скачанный/репозиторий/ -s
Теперь наш репозиторий доступен по адресу(для примера) http://192.168.0.1/ubuntu/
Соответственно строка в sources.list будет выглядеть так:
deb http://192.168.0.1/ubuntu/ karmic main ...
Приступим к созданию DVD.
Создадим директорию:
$ mkdir ubuntu-dvd
Теперь напишем скрипт для debpartial,который создаст описание пакетов для каждого диска
$ sudo nano partial.sh
#!/bin/bash -x
debpartial --nosource --dirprefix=ubuntu \
--section=main,restricted,multiverse,universe \
--dist=karmic,karmic-security,karmic-updates,karmic-backports \
--arch=i386 \
--size=DVD ubuntu/ ubuntu-dvd/
В скрипте естественно указываем те секции ,который указывали при работе с debmirror.
где:
--nosource - если мы не скачивали исходники
--dirprefix=ubuntu - с этого слова будут начинаться названия всех каталогов, которые будут создаваться внутри каталога ubuntu-dvd
--section=main,restricted,multiverse,universe и
--dist=edgy,edgy-security,edgy-updates,edgy-backports наборы пакетов
--arch=i386,amd64 - архитектура процессора
--size=DVD - размер 4,2-гига DVD, но могут быть и варианты:
FD - 2HD 1.44M Floppy Disk - не думаю, что кто-либо воспользуется
CF8 - 8M Compact Flash
CF16 - 16M Compact Flash
CF32 - 32M Compact Flash
CF64 - 64M Compact Flash
MO128 - 128M MO
MO230 - 230M MO
MO640 - 640M MO
CD74 - 74min (650M) CD - это по умолчанию, если size не задавать
CD80 - 80min (700M) CD
MO1.3G - 1.3G MO
DVD-RAM - (2.6G) DVD-RAM
DVD - Single Layer (4.7G) DVD-ROM - то, что доктор прописал!
ubuntu/ и ubuntu-dvd/ - откуда брать и куда складывать
Делаем етот скрипт исполнимым:
$ chmod +x partial.sh
Запускаем его:
$ sudo ./partial.sh
Этот скрипт создаст в каталоге ubuntu-dvd каталоги вида ubuntuX,
где X - номер от 0 до ...
Karmic уместился на 7 Dvd(0-6)
Внутри этих каталогов оказались каталоги dists с индексами (списками) пакетов, которые должны поместиться на соответствующих DVD
Теперь надо в соответствии с этими индексами разложить сами deb-пакеты в каталоге pool
Для этого создадим скрипт:
$ nano debcopy
в него записываем следущее:
#!/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
Этот скрипт предназначен для ruby а не shell, поэтому делать его исполнимым необходимости нет.
Используется он так:
$ sudo ruby debcopy ubuntu/ ubuntu-dvd/ubuntu0
$ sudo ruby debcopy ubuntu/ ubuntu-dvd/ubuntu1
...
$ sudo ruby debcopy ubuntu/ ubuntu-dvd/ubuntu6
Теперь создадим идентификаторы дисков, чтобы наш apt или aptitude или synaptic их не путали:
Для первого диска в каталоге ~/ubuntu-dvd/ubuntu0 создадим каталог
Код:
$ sudo mkdir ubuntu-dvd/ubuntu0/.disk
Внутри делаем файл info,куда заносим идентифицирующую информацию
Например, Disk1
В каталогах ubuntu-dvd/ubuntu1 ... ubuntu-dvd/ubuntu5
все точно так-же, только номер Disk меняйте.
Вот теперь настала пора сделать ISO-образы:
$ sudo mkisofs -f -J -r -V EdgyEft-0 -o ubuntu-dvd-0.iso ubuntu-dvd/ubuntu0
$ sudo mkisofs -f -J -r -V EdgyEft-1 -o ubuntu-dvd-1.iso ubuntu-dvd/ubuntu1
...
$ sudo mkisofs -f -J -r -V EdgyEft-5 -o ubuntu-dvd-5.iso ubuntu-dvd/ubuntu6
Всё. Образы готовы. Записываем на болванки и скармилваем апту. :)
Срез репозитория Ubuntu 9.10 на 7 DVD дисках можно скачать тут:
http://torrents.ru/forum/viewtopic.php?t=2393825