Четверг
02.05.2024, 19:42
| RSS
Главная Каталог статей
Меню сайта

Категории раздела
Мои статьи [1383]

Мини-чат

Наш опрос
Оцените мой сайт
Всего ответов: 45

Статистика

Rambler's Top100Рейтинг@Mail.ru

Главная » Статьи » Мои статьи

Создаем локальный репозитарий Ubuntu
Рассмотрено создание локального репозитория 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 - не думаю, что кто-либо воспользуется 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

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 мегов.
Можно ехать зимовать в деревню...
Источник http://forum.ubuntu.ru/index.php?topic=5201.0
http://10.2.47.100/linux/index.php?sub=articles&act=showart&id=472


Источник: http://forum.ubuntu.ru/index.php?topic=5201.0
Категория: Мои статьи | Добавил: tol (08.01.2009)
Просмотров: 1467 | Рейтинг: 4.0/1 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа

Поиск

Друзья сайта

  • Администрация

    Andry


    Tol


    Copyright MyCorp © 2024
    Хостинг от uCoz