Создание репозитория Ubuntu
Материал из Xgu.ru
Содержание |
[править] Введение
Структура репозитория Ubuntu в основном аналогична Debian'у, описание на русском языке можно найти здесь [1].
Если вы хотите сделать небольшой репозиторий из тех файлов, которые у вас уже есть — вам сюда [2] (команда dpkg-scanpackages). Если вы хотите "раскидать" файлы по иерархичной структуре pool'а, можно воспользоваться утилитой reprepro [3].
Debian использует «Проталкивающее Зеркалирование», Ubuntu также использует эту технологию [4].
[править] Типы репозиториев
Есть два типа репозиториев [5]:
Полные архивы занимают около 320 Гб и постепенно увеличиваются. Обновляются минимум один раз в 24 часа, но не чаще чем раз в 4 часа.
Релизы Ubuntu занимают около 40 Гб и остаются относительно неизменными в размерах. Обычно обновляются несколько раз в год с проверкой каждые 24 часа.
[править] Список серверов
Свежий список можно взять здесь https://launchpad.net/ubuntu/+archivemirrors
[править] Релизы Ubuntu
| 4.10 | Warty Warthog |
| 5.04 | Hoary Hedgehog |
| 5.10 | Breezy Badger |
| 6.06 LTS | Dapper Drake |
| 6.10 | Edgy Eft |
| 7.04 | Feisty Fawn |
| 7.10 | Gutsy Gibbon |
| 8.04 LTS | Hardy Heron |
| 8.10 | Intrepid Ibex |
| 9.04 | Jaunty Jackalope |
| 9.10 | Karmic Koala |
| 10.04 LTS | Lucid Lynx |
| 10.10 | Maverick Meerkat |
| 11.04 | Natty Narwhal |
| 11.10 | Oneiric Ocelot |
| 12.04 LTS | Precise Pangolin |
| 12.10 | Quantal Quetzal |
| 13.04 | Raring Ringtail |
| 13.10 | Saucy Salamander |
| 14.04 | Trusty Tahr |
Большая часть обновлений репозитория — изменения в тестируемом дистрибутиве (сейчас это 13.10).
[править] Копирование репозитория
Существует несколько способов создания зеркала репозитория. Ниже рассмотрены rsync и debmirror. Несмотря на кажущуюся простоту, зеркалирование rsync'ом менее управляемо, чем debmirror, который ещё и имеет все преимущества rsync'а.
[править] Копирование с помощью rsync
С помощью rsync можно создать полное зеркало репозитория Ubuntu.
Следуя официальным рекомендациям [6], чтобы пользователи имели меньше шансов получить ошибку "file not found", необходимо в начале обновить пакеты, потом информацию о них, и только после этого удалить устаревшие пакеты ("Two Staging mirroring").
Для постоянного применения рекомендуется следующий скрипт:
RSYNCSOURCE=rsync://archive.ubuntu.com/ubuntu
BASEDIR=/path/to/your/mirror/
rsync --recursive --times --links --hard-links \
--stats \
--exclude "Packages*" --exclude "Sources*" \
--exclude "Release*" \
${RSYNCSOURCE} ${BASEDIR}
rsync --recursive --times --links --hard-links \
--stats --delete --delete-after \
--exclude "project/trace/${HOSTNAME}" \
${RSYNCSOURCE} ${BASEDIR}
- При ручном запуске, можно добавить к каждой команде --verbose --progress — это даст более информативный вывод в ходе копирования.
- В случае использования --progress, может пройти много времени перед первым выводом на экран. Это нормально для зеркало такого размера. (задержка настолько большая, что дождаться удалось только при синхронизации отдельных директорий)
- Использование --compress не должно сказаться на процессе копирования файлов, но значительно ускоряет процесс начальной передачи списка файлов при использовании --progress, который занимает много времени.
- Если добавить к каждой команде строку, указанную ниже, то будут скопированы только пакеты для i386, amd64 и исходные коды:
--exclude "*_alpha.deb" --exclude "*_arm.deb" --exclude "*_mips.deb" \ --exclude "*_mipsel.deb" --exclude "*_s390.deb" \ --exclude "*_ia64.deb" --exclude "*_powerpc.deb" --exclude "*_lpia.deb" \ --exclude "*_armel.deb" --exclude "*_sparc.deb" --exclude "*_hppa.deb"
На странице [7] дан скрипт, который перезапускает rsync в случае сбоя, и после завершения копирования высылает письмо со статистикой. Объединим его со скриптом выше ("Two stage rsync"):
Создайте каталог /var/log/mirror, и выставьте соответствующие права на него, чтобы скрипт мог писать в него лог. Не забудьте поменять "/path/to/your/mirror/" и путь к интерпретатору bash в первой строке скрипта (путь в вашей системе можно узнать командой whereis bash).
#!/usr/local/bin/bash
## Script for Ubuntu two stage mirroring. v 1.0. vazhnov@jabber.ru
## Adapted from the "Mirror Synchronization Script Version 1.01 Updated 13 Feb 2007 by Peter Noble"
## About two stage mirroring: http://www.ubuntu.com/getubuntu/mirror/3
## /usr/local/bin/ubuntu-mirror-sync.sh
## Point our log file to somewhere and setup our admin email
log="/var/log/mirror/mirrorsync.log"
adminmail="admin@my.domain"
# Set to 0 if you do not want to receive email
sendemail=0
# Subject is the subject of our email
subject="Ubuntu Mirror Sync Finished"
## Setup the server to mirror
remote="rsync://mirror.yandex.ru/ubuntu/"
## Setup the local directory / Our mirror
local="/path/to/your/mirror"
# Options to all rsync
options_all_rsync=" --timeout=120 --checksum --compress "
# Additional options to debug mode
options_debug_rsync=" --verbose "
## Initialize some other variables
complete="false"
failures=0
stage_one_complete=0
status=1
pid=$$
## Create a lock file containing the process ID's
lockfile="/var/tmp/mirror.lock"
if [ -f $lockfile ]; then
echo "Lock file present. Exiting."
exit
fi
echo $pid > $lockfile
echo `date -j "+%Y-%m-%d_%H-%M-%S"` " - $pid - Started Ubuntu Mirror Sync" >> $log
echo `date -j "+%Y-%m-%d_%H-%M-%S"` " - $pid - from $remote to $local " >> $log
while [[ "$complete" != "true" ]]; do
if [[ $failures -gt 0 ]]; then
## Sleep for 1 minutes for sanity's sake
## The most common reason for a failure at this point
## is that the rsync server is handling too many concurrent connections.
if [[ $1 == "debug" ]]; then
echo `date -j "+%Y-%m-%d_%H-%M-%S"` "sleeping 1 minute"
else
echo `date -j "+%Y-%m-%d_%H-%M-%S"` "sleeping 1 minute" >> $log
fi
sleep 1m
fi
if [[ $stage_one_complete == "0" ]]; then
if [[ $1 == "debug" ]]; then
echo `date -j "+%Y-%m-%d_%H-%M-%S"` " - $pid - Working on attempt number $failures"
echo `date -j "+%Y-%m-%d_%H-%M-%S"` " - $pid - Started FIRST stage Ubuntu mirror sync"
rsync --recursive --times --links --hard-links \
--stats \
--exclude "Packages*" --exclude "Sources*" --exclude "Release*" \
$options_debug_rsync $options_all_rsync $remote $local
status=$?
else
echo `date -j "+%Y-%m-%d_%H-%M-%S"` " - $pid - Started FIRST stage Ubuntu mirror sync" >> $log
rsync --recursive --times --links --hard-links \
--stats \
--exclude "Packages*" --exclude "Sources*" --exclude "Release*" \
$options_all_rsync $remote $local >> $log
status=$?
fi
if [[ $status -ne "0" ]]; then
complete="false"
(( failures += 1 ))
else
stage_one_complete=1
fi
fi
if [[ $stage_one_complete == "1" ]]; then
if [[ $1 == "debug" ]]; then
echo `date -j "+%Y-%m-%d_%H-%M-%S"` " - $pid - Working on attempt number $failures"
echo `date -j "+%Y-%m-%d_%H-%M-%S"` " - $pid - Started SECOND stage Ubuntu mirror sync"
rsync --recursive --times --links --hard-links \
--stats --delete --delete-after \
--exclude "project/trace/${HOSTNAME}" \
$options_debug_rsync $options_all_rsync $remote $local
status=$?
else
echo `date -j "+%Y-%m-%d_%H-%M-%S"` " - $pid - Started SECOND stage Ubuntu mirror sync" >> $log
rsync --recursive --times --links --hard-links \
--stats --delete --delete-after \
--exclude "project/trace/${HOSTNAME}" \
$options_all_rsync $remote $local >> $log
status=$?
fi
if [[ $status -ne "0" ]]; then
complete="false"
(( failures += 1 ))
else
echo `date -j "+%Y-%m-%d_%H-%M-%S"` " - $pid - Finished Ubuntu mirror sync" >> $log
# Send the email
if [[ -x /usr/bin/mail && "$sendemail" -eq "1" ]]; then
mail -s "$subject" "$adminmail" <<OUTMAIL
Summary of Ubuntu Mirror Synchronization
PID: $pid
Failures: $failures
Finish Time: `date`
Sincerely,
$HOSTNAME
OUTMAIL
fi
complete="true"
fi
fi
done
rm $lockfile
exit 0
[править] Копирование с помощью debmirror
Если не нужно поднимать всё зеркало, можно воспользоваться утилитой debmirror, которая позволяет выбрать дистрибутивы, архитектуры и секции. Представляет из себя скрипт, написанный на perl'е.
Debmirror'у можно указать не загружать исходные коды, что сэкономит место. А если не закачивать пакеты для тестируемого дистрибутива, то сильно уменьшится объём изменений в репозитории.
Debmirror может работать через ftp, http, hftp или rsync. В случае, если в качестве метода копирования выбрать rsync, debmirror создаёт ему списки по 300-400 файлов (информацию берёт из индексных файлов), и rsync не тратит время на создание списка файлов, лежащих на удалённой стороне.
Debmirror разбивает работу на три шага:
- Загружает индексные файлы Packages.gz (или .bz2) и Sources.gz (или .bz2);
- Удаляет неизвестные файлы (опция --nocleanup позволяет пропустить этот шаг);
- Сканируются файлы Packages и Sources для построения полного списка файлов, на которые они ссылаются. Также к списку добавляются некоторые другие файлы. После debmirror проверяет наличие каждого файла в локальном зеркале и его соответствие размеру (или опционально md5sum). Недостающие файлы загружаются.
Список секций (--dist=) можно посмотреть на вышестоящем зеркале, в папке "ubuntu/dists/".
Пример для релиза 10,04, архитектуры i386 и amd64 и исходных кодов. Копирование с помощью rsync. Путь "/mirror_ubuntu" поменяйте на нужный:
debmirror --progress --verbose --nocleanup --source \
--md5sums --host=mirror.yandex.ru --root=:ubuntu \
--dist=lucid,lucid-backports,lucid-proposed,lucid-security,lucid-updates \
--section=main,restricted,universe,multiverse \
--method=rsync --arch=i386,amd64 /mirror_ubuntu
[править] Проблема bz2 gz
Патчим debmirror согласно инструкции [8], после чего можно запускать debmirror с опцией --nopkgbz2.
--- debmirror.orig 2009-06-29 11:15:30.000000000 +0200
+++ debmirror 2009-06-29 11:19:44.000000000 +0200
@@ -376,7 +376,7 @@
use LWP::UserAgent;
# Yeah, I use too many global variables in this program.
-our ($debug, $progress, $verbose, $passive, $skippackages, $getcontents);
+our ($debug, $nopkgbz2, $progress, $verbose, $passive, $skippackages, $getcontents);
our ($ua, $proxy);
our (@dists, @sections, @arches, @extra_dirs, @ignores, @excludes, @includes, @skip_installer);
our (@excludes_deb_section, @limit_priority);
@@ -421,6 +421,7 @@
my $help;
GetOptions('debug' => \$debug,
+ 'nopkgbz2' => \$nopkgbz2,
'progress|p' => \$progress,
'verbose|v' => \$verbose,
'source!' => \$do_source,
@@ -839,7 +840,7 @@
# Collect package lists
my $failed = 0;
-foreach my $ext (".bz2", ".gz", "") {
+foreach my $ext ( $nopkgbz2 ? () : ".bz2" , ".gz" , "") {
$failed = 0;
process_dists(\&want_packages, $ext);
[править] Цифровые подписи
Если создавать в Ubuntu копию репозитория Debian, то debmirror будет ругаться на отсутствие ключей.
gpgv: Подпись создана Сбт 30 Янв 2010 04:18:35 YEKT ключом RSA с ID 55BE302B gpgv: Не могу проверить подпись: открытый ключ не найден gpgv: Подпись создана Сбт 30 Янв 2010 04:25:01 YEKT ключом DSA с ID F42584E6 gpgv: Не могу проверить подпись: открытый ключ не найден gpgv: Подпись создана Сбт 30 Янв 2010 04:18:35 YEKT ключом RSA с ID 55BE302B gpgv: Не могу проверить подпись: открытый ключ не найден gpgv: Подпись создана Сбт 30 Янв 2010 04:25:01 YEKT ключом DSA с ID F42584E6 gpgv: Не могу проверить подпись: открытый ключ не найден gpgv: Подпись создана Пнд 03 Май 2010 03:27:09 YEKST ключом RSA с ID 55BE302B gpgv: Не могу проверить подпись: открытый ключ не найден gpgv: Подпись создана Пнд 03 Май 2010 03:27:09 YEKST ключом RSA с ID 55BE302B gpgv: Не могу проверить подпись: открытый ключ не найден gpgv: Подпись создана Пнд 03 Май 2010 03:26:25 YEKST ключом RSA с ID 55BE302B gpgv: Не могу проверить подпись: открытый ключ не найден gpgv: Подпись создана Пнд 03 Май 2010 03:26:25 YEKST ключом RSA с ID 55BE302B gpgv: Не могу проверить подпись: открытый ключ не найден
Ключи нужно добавить. Устанавливаем пакет debian-archive-keyring:
sudo apt-get install debian-archive-keyring
После этого у нас появится GnuPG архив ключей Debian в /usr/share/keyrings/. Импортируем их от имени того же пользователя, от которого будет запущен debmirror (процесс хорошо описан в man debmirror):
gpg --keyring /usr/share/keyrings/debian-archive-keyring.gpg --export \
| gpg --no-default-keyring --keyring trustedkeys.gpg --import
Если же debmirror запущен в той операционной системе, где нет возможности установить GnuPG архив ключей Debian, можно их добавлять вручную по их ID (также описано в man debmirror):
gpg --no-default-keyring --keyring trustedkeys.gpg \
--keyserver keyring.debian.org --recv-keys <key ID>
[править] Cron
Оптимальным является помещение в cron скрипта, регулярно проверяющего содержимое файла http://mirror.yandex.ru/ubuntu/project/trace/mirror.yandex.ru (или того зеркала, с которого вы будете копировать) в котором находится время и дата последней синхронизации. Если содержимое изменилось, то запустить синхронизацию.
[править] Предоставление доступа к репозиторию
Рекомендуется [9] предоставить доступ к репозиторию по http, ftp и rsync.
[править] http
Раздавать можно с помощью Apache, nginx, lighttpd.
[править] Apache2
Минимальная конфигурация Apache2 для выдачи файлов и формирования списков файлов (по мотивам статьи Защищаем Apache 2. Шаг за шагом):
Не забудьте поменять ServerAdmin и DocumentRoot. Необходимо создать каталог /var/log/apache, в который разрешить запись пользователю, из под которого будет запущен сервер Apache.
# =================================================
# Basic settings
# =================================================
Listen 0.0.0.0:80
User apache
Group apache
ServerAdmin admin@your-domain.com
UseCanonicalName Off
ServerSignature Off
HostnameLookups Off
ServerTokens Prod
ServerRoot "/usr/local"
DocumentRoot "/path/to/your/mirror/"
LoadModule authz_host_module libexec/apache22/mod_authz_host.so
LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so
LoadModule log_config_module libexec/apache22/mod_log_config.so
LoadModule mime_module libexec/apache22/mod_mime.so
LoadModule dir_module libexec/apache22/mod_dir.so
# Directory listings
LoadModule autoindex_module libexec/apache22/mod_autoindex.so
LoadModule alias_module libexec/apache22/mod_alias.so
<IfModule mod_dir.c>
DirectoryIndex index.html
</IfModule>
# =================================================
# HTTP and performance settings
# =================================================
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule prefork.c>
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
# =================================================
# Access control
# =================================================
<Directory />
Options FollowSymLinks +Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory "/ubuntu/">
Order allow,deny
Allow from all
</Directory>
# =================================================
# MIME encoding
# =================================================
<IfModule mod_mime.c>
TypesConfig /usr/local/etc/apache22/mime.types
</IfModule>
DefaultType text/plain
<IfModule mod_mime.c>
AddEncoding x-compress .Z
AddEncoding x-gzip .gz .tgz
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-bzip2 .bz2
AddType application/x-tar .tgz
</IfModule>
# =================================================
# Logs
# =================================================
ErrorLog "/var/log/apache/error.log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "/var/log/apache/access.log" combined
</IfModule>
# Fancy directory listings
Include etc/apache22/extra/httpd-autoindex.conf
- /usr/local/etc/apache22/extra/httpd-autoindex.conf
по сравнению с оригинальным файлом, изменена только опция IndexOptions.
#
# IndexOptions: Controls the appearance of server-generated directory
# listings.
# FancyIndexing HTMLTable VersionSort
IndexOptions VersionSort FoldersFirst NameWidth=70 Charset=UTF-8
# We include the /icons/ alias for FancyIndexed directory listings. If
# you do not use FancyIndexing, you may comment this out.
#
Alias /icons/ "/usr/local/www/apache22/icons/"
<Directory "/usr/local/www/apache22/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#
# AddIcon* directives tell the server which icon to show for different
# files or filename extensions. These are only displayed for
# FancyIndexed directories.
#
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
#
# DefaultIcon is which icon to show for files which do not have an icon
# explicitly set.
#
DefaultIcon /icons/unknown.gif
#
# AddDescription allows you to place a short description after a file in
# server-generated indexes. These are only displayed for FancyIndexed
# directories.
# Format: AddDescription "description" filename
#
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
#
# ReadmeName is the name of the README file the server will look for by
# default, and append to directory listings.
#
# HeaderName is the name of a file which should be prepended to
# directory indexes.
ReadmeName README.html
HeaderName HEADER.html
#
# IndexIgnore is a set of filenames which directory indexing should ignore
# and not include in the listing. Shell-style wildcarding is permitted.
#
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
[править] lighttpd
Конфигурационный файл для FreeBSD, но должно работать и в других системах, нужно только убрать опцию server.event-handler.
/usr/local/etc/lighttpd.conf
server.modules = (
"mod_access",
"mod_accesslog" )
server.document-root = "/path/to/your/mirror/"
server.errorlog = "/var/log/lighttpd/error.log"
index-file.names = ( "index.html", "index.htm" )
server.event-handler = "freebsd-kqueue" # needed on OS X
mimetype.assign = (
".pdf" => "application/pdf",
".sig" => "application/pgp-signature",
".spl" => "application/futuresplash",
".class" => "application/octet-stream",
".ps" => "application/postscript",
".torrent" => "application/x-bittorrent",
".dvi" => "application/x-dvi",
".gz" => "application/x-gzip",
".pac" => "application/x-ns-proxy-autoconfig",
".swf" => "application/x-shockwave-flash",
".tar.gz" => "application/x-tgz",
".tgz" => "application/x-tgz",
".tar" => "application/x-tar",
".zip" => "application/zip",
".mp3" => "audio/mpeg",
".m3u" => "audio/x-mpegurl",
".wma" => "audio/x-ms-wma",
".wax" => "audio/x-ms-wax",
".ogg" => "application/ogg",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jar" => "application/x-java-archive",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".asc" => "text/plain",
".c" => "text/plain",
".cpp" => "text/plain",
".log" => "text/plain",
".conf" => "text/plain",
".text" => "text/plain",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
".mov" => "video/quicktime",
".qt" => "video/quicktime",
".avi" => "video/x-msvideo",
".asf" => "video/x-ms-asf",
".asx" => "video/x-ms-asf",
".wmv" => "video/x-ms-wmv",
".bz2" => "application/x-bzip",
".tbz" => "application/x-bzip-compressed-tar",
".tar.bz2" => "application/x-bzip-compressed-tar",
# default mime type
"" => "application/octet-stream",
)
server.tag = "lighttpd"
accesslog.filename = "/var/log/lighttpd/access.log"
url.access-deny = ( "~", ".inc" )
$HTTP["url"] =~ "\.pdf$" {
server.range-requests = "disable"
}
server.pid-file = "/var/run/lighttpd.pid"
## virtual directory listings
dir-listing.activate = "enable"
## select encoding for directory listings
dir-listing.encoding = "utf-8"
## change uid to <uid> (default: don't care)
server.username = "www"
## change uid to <uid> (default: don't care)
server.groupname = "www"
[править] nginx
Если репозиторий один, то конфигурацию можно поместить в /etc/nginx/sites-enabled/default:
server {
…
location / {
root /path/to/your/mirror;
autoindex on;
}
location /ubuntu/ {
root /path/to/your/mirror;
autoindex on;
}
…
}
Если же зеркал репозиториев несколько (ru.archive.ubuntu.com, archive.canonical.com, security.ubuntu.com), то лучше создать отдельные конфигурационные файлы, например /etc/nginx/sites-enabled/archive.ubuntu.com.conf:
server {
listen [::]:80;
server_name *.archive.ubuntu.com security.ubuntu.com;
root /path/to/your/mirror/ubuntu;
autoindex on;
location /ubuntu/ {
root /path/to/your/mirror;
}
}
[править] ftp
[править] rsync
[править] DNS
Если у вас своя сеть, в которой есть DNS сервер, можно "схитрить" и назначить на имена «*.archive.ubuntu.com» и "security.ubuntu.com" ip-адрес вашего репозитория. Так как сервер действует только в вашей сети, эти изменения получат только ваши клиенты. При установке дистрибутива будет достаточно указать страну "Россия", чтобы Ubuntu выставила в качестве репозитория "ru.archive.ubuntu.com" который, благодаря "хитрости", будет ссылаться на ip-адрес вашего локального репозитория. Адреса, на которые обращается уже установленная система, можно посмотреть в файле /etc/apt/sources.list.
Можно аналогично изменить зону для "ru.releases.ubuntu.com", если у вас есть копия http://mirror.yandex.ru/ubuntu-releases с ISO-образами дисков.
[править] BIND
В файл конфигурации named.conf прописываем:
zone "archive.ubuntu.com" {
type master;
file "master/all_to_192.168.1.1.master";
allow-update {"none";};
zone "security.ubuntu.com" {
type master;
file "master/all_to_192.168.1.1.master";
allow-update {"none";};
};
Создаём файлы с зонами. Вместо "admin.my.domain." подставьте ваш e-mail, заменив символ "@" на точку. Вместо «192.168.1.1» подставьте ip-адрес вашего сервера с репозиторием. Такой файл, если указать его для любой зоны, будет "возвращать" пользователю ip-адрес «192.168.1.1» на саму зону и любые поддомены.
Файл master/all_to_192.168.1.1.master:
$TTL 86400 ; 1 day
@ IN SOA ns admin.my.domain. (
2009091701 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
3600 ; Minimum TTL
)
A 192.168.1.1
* A 192.168.1.1
применяем настройки командой
rndc reconfig
[править] Рассылки
Для того, чтобы быть в курсе официальных новостей, можно подписаться на рассылку [10].
[править] Статистика
Можно собирать следующую статистику:
- Загрузка канала (upload, download);
- Версии ОС (apt при закачке "подписывается", например: "Ubuntu APT-HTTP/1.3 (0.7.20.2ubuntu6)" — это 9.04)
- Количество уникальных ip-адресов за сутки
[править] Ссылки
[править] Смотри также
- man rsync на русском языке
- mirror.yandex.ru
- debmirror во FreeBSD
- sisyphus-mirror — утилита для создания зеркала репозиториев Sisyphus, бранчей и конкретных дистрибутивов ALT Linux.
- Советы по созданию зеркала нескольких дистрибутивов
- Скачивание репозитория под Windows (программа на .NET)
[править] Официальные рекомендации
- https://wiki.debian.org/DebianRepository/Setup — overview of different tools to create Debian repository and mirror;
- Rsyncmirror (Community Ubuntu Documentation)
- Mirroring Ubuntu
- Two stage rsync mirroring of the Ubuntu archives
- Debmirror (Ubuntu Wiki) — на русском языке, в том числе по настройке cron и apache2.
- Настройка зеркала архивов Debian (рус.)
[править] Неофициальные источники
[править] Лицензия на текст
Текст доступен на условиях лицензии Creative Commons Attribution/Share-Alike