Рассмотрено создание локального репозитория Ubuntu на примере версии 6.10 Edgy Eft.
==========================================================
Для удобства разместим его на DVD/CD дисках.
Подготовим директорий, куда будем складывать файлы:
Код:
$ mkdir ubuntu
Установим пакет для скачивания файлов и создания локального зеркала Ubuntu:
Код:
$ sudo apt-get install debmirror
Создадим скрипт mirror.sh для запуска стого пакета и скачивания дистрибутивов и наборов пакетов, в которых нуждаемся:
Код:
Пояснения к опциям для любопытных:
--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:
Код:
Пояснения к опциям для любопытных:
--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 - не думаю, что кто-либо воспользуется Wink
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]
#
# 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
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
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, поэтому делать его исполнимым необходимости нет.
Используется он так:
Код:
Выполняется он до-о-о-лго. Ведь надо перекопировать более 20 гигов!
Для ускорения работы можно сами файлы не копировать, а только создать на них линки:
Код:
Теперь создадим идентификаторы дисков, чтобы наш 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
(это у меня...)
Если Вы экономили время и создавали ссылки на deb-пакеты, то Вас
вежливо предупредят, что сим-линки не всегда корректно записываются.
Поэтому вопрос, что лучше - копировать пакеты, или создать на них ссылки - решайте сами.
Вот и получилось у меня пять образов по 4,2 гига и один - на 197 мегов.
Можно ехать зимовать в деревню... Источник http://forum.ubuntu.ru/index.php?topic=5201.0 http://10.2.47.100/linux/index.php?sub=articles&act=showart&id=472