Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Создаем локальный репозитарий Ubuntu  (Прочитано 90381 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 7ghost

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
У меня сложилась вот такая парадоксальная ситуация:
- жесткое ограничение на трафик на работе (причем я же его и считаю  :-[ ) и
- мегабитный анлим дома
поэтому уже достаточно давно встала задача сделать дома зеркало,
перенести его на что-нибудь транспортабельное и использовать на нескольких компьютерах на работе.
Но вот дело как-то не заладилось...
Поэтому, когда 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-шрифты...
« Последнее редактирование: 18 Ноябрь 2009, 22:37:40 от Agafonov »

Оффлайн doctor

  • Активист
  • *
  • Сообщений: 736
  • не навреди...
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #1 : 10 Ноябрь 2006, 23:48:49 »

Установим пакет для скачивания файлов и создания локального зеркала Ubuntu:

$ sudo ap-get debmirror

поправь, ибо полезный faq

$ sudo apt-get debmirror
а в остальном все правильно...

З.Ы. отличнас работа, молодец... вот сюда запость, если возможно, конечно https://ubuntu.ru/Wiki/ShareUbuntuCD ;)

« Последнее редактирование: 10 Ноябрь 2006, 23:51:57 от doctor »

Оффлайн Crew

  • Старожил
  • *
  • Сообщений: 1384
  • xneur 0.20.0
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #2 : 12 Ноябрь 2006, 01:35:53 »
Молодец!

Вот только не сказано, что делать тем, кто не в деревню собрался, а локальный репозиторий открывать по сети.
Для стого надо что бы в неизмененном виде на одном из дисков был архив с dists, папкой полученой после
$ sudo ./mirror

Тогда остается (примеры для Dapper, для Edgy тупо меняем dapper на edgy, 6.06 на 6.10 везде):
1. Скопировать содержимое всех дисков в некторую директорию, напимер, /home/andrew/Change/ubuntu/repository6.06/
2. Развернуть архив с dists (обычно располагается на последнем диске) и полученую папку копировать туда же, куда и содержимое дисков.
3. Сделать доступ через ftp или http. У меня папка /ubuntu (см. п.1) замаплена так, что бы адрес ее был ftp://ubuntu.himki.net/PUB/ubuntu/repository6.06/
4. Прописать на удаленных машинах строки репозиториев (в самом верху)
deb ftp://ubuntu.himki.net/PUB/ubuntu/repository6.06 dapper main restricted universe multiverse #Locale FTP repository for Dapper Drake
deb ftp://ubuntu.himki.net/PUB/ubuntu/repository6.06 dapper-security main restricted universe multiverse #Locale FTP repository Security for Dapper Drake
deb ftp://ubuntu.himki.net/PUB/ubuntu/repository6.06 dapper-updates main restricted universe multiverse #Locale FTP repository Updates for Dapper Drake
deb ftp://ubuntu.himki.net/PUB/ubuntu/repository6.06 dapper-backports main restricted universe multiverse #Locale FTP repository Backports for Dapper Drake

Разницы между ftp и http здесь принципиальной нет, нормально работает в обоих вариантах.
5. Обновлять локальные репозитории (по желанию). Обновления более чем на 1 Гб в месяц у меня еще не получались. Обновлять той же командой, что и закачивалось.
debmirror --nosource -m --passive --host=archive.ubuntulinux.org \
--root=ubuntu --method=ftp --progress \
--dist=dapper,dapper-security,dapper-updates,dapper-backports \
--ignore-release-gpg --section=main,restricted,multiverse,universe \
--arch=i386,amd64 /home/andrew/Change/ubuntu/repository6.06/

Обращаю внимание, последний параметр - зто абсолютный путь к месту расположениярепозиториев.
Время обновления около получаса или чуть больше. Жестко грузит дисковую подсистему.

Все.

Однако, было бы не плохо в первый пост добавить напоминание о необходимости класть на диски архив с неизмененным dists.
« Последнее редактирование: 22 Март 2007, 17:30:47 от andrewcrew »
PPA cо стабильными сборками xneur: ppa:andrew-crew-kuznetsov/xneur-stable
PPA c "ночными" сборками xneur: ppa:andrew-crew-kuznetsov/xneur-unstable

Оффлайн timon_crazy

  • Активист
  • *
  • Сообщений: 382
  • U/X/K/buntu 7.10
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #3 : 13 Ноябрь 2006, 07:41:47 »
есть ли вариант скриптов без руби?

Оффлайн 7ghost

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #4 : 13 Ноябрь 2006, 10:55:01 »
Руби стал как зависимость при установке debpartial
« Последнее редактирование: 28 Март 2007, 00:15:33 от 7ghost »

Оффлайн DYm00n

  • Участник
  • *
  • Сообщений: 191
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #5 : 13 Ноябрь 2006, 21:32:59 »
А выот например есть у меня уже скаченные репы, а вышли новые обновления, можно как нибудь их только скачать, а не все заново перекачивать?

Оффлайн 7ghost

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #6 : 13 Ноябрь 2006, 23:06:57 »
debmirror заново не качает - проверяет, что нового, то и добавит.
« Последнее редактирование: 28 Март 2007, 00:16:00 от 7ghost »

Оффлайн DYm00n

  • Участник
  • *
  • Сообщений: 191
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #7 : 13 Ноябрь 2006, 23:09:02 »
А как именно его не качать? Т.е. как это сделать?

Оффлайн doctor

  • Активист
  • *
  • Сообщений: 736
  • не навреди...
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #8 : 13 Ноябрь 2006, 23:41:50 »
А как именно его не качать? Т.е. как это сделать?

мде...а поднять глаза?....несколькими постами выше:

5. Обновлсть локальные репозитории (по желанию). Обновления более чем на 1 Гб в месяц у меня еще не получались. Обновлсть той же командой, что и закачивалось.

Оффлайн 7ghost

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #9 : 14 Ноябрь 2006, 21:47:51 »
А как именно его не качать? Т.е. как это сделать?

Отвечаю:
Цитировать
Создадим скрипт 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/

Вот и все.
« Последнее редактирование: 28 Март 2007, 00:19:31 от 7ghost »

Оффлайн timon_crazy

  • Активист
  • *
  • Сообщений: 382
  • U/X/K/buntu 7.10
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #10 : 15 Ноябрь 2006, 07:28:00 »
А как именно его не качать? Т.е. как это сделать?

Отвечаю:
Цитировать
Создадим скрипт 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/

Вот и все.
а правильно понимаю что для данного средства разрешается использовать своий список репозитариев (зеркало официального)
и также можно на дапере сделать зеркало еджи?

Оффлайн xfn

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #11 : 01 Декабрь 2006, 15:39:50 »
Спасибо за такой замеч.труд, то, что искал.
Но возник несколько иной вопрос: безлимитка у меня на Виндовс (машинка не мос), следовательно, как скачать бинарники с main, updates  и т.д. и организовать локальный репозиторий на Убунте?

Оффлайн 7ghost

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #12 : 04 Декабрь 2006, 15:38:59 »
возник несколько иной вопрос: безлимитка у меня на Виндовс (машинка не моя), следовательно, как скачать бинарники с main, updates  и т.д. и организовать локальный репозиторий на Убунте?
Боюсь, что никак...
« Последнее редактирование: 28 Март 2007, 00:17:03 от 7ghost »

Оффлайн doctor

  • Активист
  • *
  • Сообщений: 736
  • не навреди...
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #13 : 04 Декабрь 2006, 17:16:48 »
зеркало из венды никак...единственное что можно это целиком скачать packages.ubuntu.com... есть же проги для скачки сайтов...вот только это имхо нерационально

Оффлайн Trident

  • Dmitry V. Lysoff
  • Активист
  • *
  • Сообщений: 907
  • Негодяй и мерзавец
    • Просмотр профиля
Re: Создаем локальный репозитарий Ubuntu 6.10 Edgy Eft
« Ответ #14 : 04 Декабрь 2006, 17:48:21 »
А разве нельзя в машину с вендой запихать свой винт, затем livecd, примонтировать винт куда надо...?
Добро пожаловать в систему Посейдон. Пожалуйста, представьтесь.

 

Страница сгенерирована за 0.061 секунд. Запросов: 22.