У меня сложилась вот такая парадоксальная ситуация:
- жесткое ограничение на трафик на работе (причем я же его и считаю

) и
- мегабитный анлим дома
поэтому уже достаточно давно встала задача сделать дома зеркало,
перенести его на что-нибудь транспортабельное и использовать на нескольких компьютерах на работе.
Но вот дело как-то не заладилось...
Поэтому, когда
andrewcrew предложил:
Требуются репозитории Edgy для создания локального репозитория для Edgy. (Во как завернул!)
У кого жирный анлим, помогите.
Закачивать такой строкой
/usr/bin/debmirror --nosource -m --passive --host=archive.ubuntulinux.org --root=ubuntu --method=ftp --progress --dist=edgy,edgy-security,edgy-updates,edgy-backports --ignore-release-gpg --section=main,restricted,multiverse,universe --arch=i386,amd64 /path/to/repositories/
Дело долгое, объем не меньше 20Гб получится. Но может есть богатыри в Москве?
- то я и подумал, а почему бы не заняться? И вот чего из стого получилось:
Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft.
Для удобства разместим его на DVD/CD дисках.Подготовим директорий, куда будем складывать файлы:
$ mkdir ubuntu
Установим пакет для скачивания файлов и создания локального зеркала Ubuntu:
$ sudo apt-get install debmirror
Создадим скрипт mirror.sh для запуска стого пакета и скачивания дистрибутивов и наборов пакетов, в которых нуждаемся:
#!/bin/bash -x
/usr/bin/debmirror --nosource -m --passive --host=archive.ubuntulinux.org \
--root=ubuntu --method=ftp --progress \
--dist=edgy,edgy-security,edgy-updates,edgy-backports \
--ignore-release-gpg --section=main,restricted,multiverse,universe \
--arch=i386,amd64 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=edgy,edgy-security,edgy-updates,edgy-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
И спокойно идем ложиться спать... В зимнюю спячку.
На третьи сутки у меня скрипт отработал.
Все это время он грузил мой мегабитный анлим на 120%
(без шуток - проверено iptraf!) и после себя оставил 23 гига в каталоге ~/ubuntu
в котором будут каталоги
.temp dists pool и
projectПервый и последний - это каталоги, служебные для
debmirror а в
dists и
pool будут размещены индексы пакетов и сами пакеты - соответственно.
(для любопытных сообщу по секрету, что
.temp - это временный
dists, а
project - хранит файл с именем моего компа и временем последней закачки).
Теперь все это богатство надо распихать на что-то, удобное для переноски и установки даже на компьютеры без подключения к сети.
Например на DVD-диски.
Счастливые обладатели USB-HDD остальное могут не читать.Готовим каталог, в который разложим скачанные файлы по размеру DVD:
$ mkdir ubuntu-dvd
Ставим пакет debpartial:
$ sudo apt-get install debpartial
Пишем скрипт partial.sh:
#!/bin/bash -x
debpartial --nosource --dirprefix=ubuntu \
--section=main,restricted,multiverse,universe \
--dist=edgy,edgy-security,edgy-updates,edgy-backports \
--arch=i386,amd64 \
--size=DVD ubuntu/ ubuntu-dvd/
Пояснения к опциям для любопытных:
--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 до ...
Мои 23 гига легли в 6 каталогов - от 0 до 5
Внутри этих каталогов оказались каталоги
dists с индексами (списками) пакетов, которые должны поместиться на соответствующих DVD
Теперь надо в соответствии с этими индексами разложить сами deb-пакеты в каталоге
poolДля этой работы пишем/
копируем скрипт
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/ubuntu5
Выполняется он до-о-о-лго. Ведь надо перекопировать более 20 гигов!
Для ускорения работы можно сами файлы не копировать, а только создать на них линки:
$ sudo ruby debcopy -l ubuntu/ ubuntu-dvd/ubuntu0
$ sudo ruby debcopy -l ubuntu/ ubuntu-dvd/ubuntu1
...
$ sudo ruby debcopy -l ubuntu/ ubuntu-dvd/ubuntu5
Теперь создадим идентификаторы дисков, чтобы наш
apt или
aptitude или
synaptic их не путали:
Для первого диска в каталоге
~/ubuntu-dvd/ubuntu0 создадим каталог
$ sudo mkdir ubuntu-dvd/ubuntu0/.disk
а в нем файл info со следующим содержанием:
Ubuntu 6.10 "Edgy Eft" Repo-DVD-1 (20061110)Можно написать что-нибудь свое. Я же захотел написать
- название дистрибутива:
Ubuntu 6.10 "Edgy Eft"- имя и номер диска:
Repo-DVD-1- дату создания диска:
(20061110)В каталогах
ubuntu-dvd/ubuntu1 ...
ubuntu-dvd/ubuntu5все точно так-же, только номер у Repo-DVD- все время прибавляем от 2 до 6
(это у меня...)
Вот теперь настала пора сделать 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/ubuntu5
Если Вы экономили время и создавали ссылки на deb-пакеты, то Вас вежливо предупредят, что сим-линки не всегда корректно записываются.
Поэтому вопрос, что лучше - копировать пакеты, или создать на них ссылки - решайте сами.
Вот и получилось у меня пять образов по 4,2 гига и один - на 197 мегов.
Можно ехать зимовать в деревню...
За идею и помощь в подготовке этой статье огромный респект участнику стого
форума "
andrewcrew" и "
Ramon Acedo" - его статью см. по ссылке:
http://cargol.net/~ramon/ubuntu-dvd-en , а также "
man mkisofs"

Без них я бы до стого не "дошел"
Вот еще бы кто придумал, как в эти же репозитории позапихивать медиа-кодеки, драйвер nVidia и ttf-шрифты...