15 окт. 2014 г.

Не было у бабки забот — купила бабка порося


Почитавши всякие статьи про то, как добры молодцы лихо варганят чуть ли не системы искуственного интеллекта на базе Raspberry Pi я подумал: а чем я хуже всех этих гиков? Да ничем! И тут же купил себе это чудо техники. Штука интересная и непонятная. Вокруг одни разъемы и ни одной кнопки. Но не об этом речь.
Как всем известно (раз мне известно, значит все уже давно в курсе ;)) эта самая Raspberry Pi("малина пи" по-нашему) работает на базе Linux. Этих дистрибутивов для этой самой малины около 5 штук (а если быть точнее целых 6!). Один из них Raspbian (Debian по-нашему). Так вот моя малина работает на этом Raspbian.
Подбираемся к сути проблемы. Задумался я обновить систему. Ну а чего? Linux же. Да к тому же с apt'ом на борту. Чего бы не обновить? Ну и запустил это добро обновляться. Но может луна была не в той фазе или вдруг все в мире тоже решили обновить свой Raspbian вместе со мной. В общем процесс затянулся. В среднем скорость составляла чуть больше одного байта в час. И сказал я: "Ша! У меня будет свое зеркало этого самого Raspbian с блэкджэком и ..."



Понеслась!


Потратив пару часов на изучение проблемы в этих ваших интернетах я нашел наиболее простое решение. Проще не нашлось.
Итак нам понадобятся следующие ингридиенты:
  1. apt-mirror
  2. apache2
Ставим:
sudo apt-get install apt-mirror apache2
Переходим к настройке.

Лучше день потерять, потом за пять минут долететь!


Все настройки для нашего зеркала хранятся в файле /etc/apt/mirror.list
sudo gedit /etc/apt/mirror.list
Файл логически можно разделить на 3 части:
  1. Настройка инфраструктуры (расположение папок и поведение apt-mirror)
    ############# config ##################
    #
    # set base_path    /var/spool/apt-mirror
    #
    # set mirror_path  $base_path/mirror
    # set skel_path    $base_path/skel
    # set var_path     $base_path/var
    # set cleanscript $var_path/clean.sh
    # set defaultarch  <running host architecture>
    # set postmirror_script $var_path/postmirror.sh
    # set run_postmirror 0
    set nthreads     20
    set _tilde 0
    #
    ############# end config ##############
    Здесь нас интересуют следующие параметры:
    • base_path - базовый путь относительно которого будут хранится наши зеркала, логи и некоторые временные файлы. Этот параметр в принципе можно не трогать если путь по-умолчанию вполне устраивает. Тут важно уточнить что репозитории - штуки объемные. И располагать их надо там, где достаточно места для них. Репозитории для Raspbian у меня заняли около 60 гигабайт.
    • nthreads - количество потоков для закачки репозиториев. По-умолчанию их 20. Много это или мало каждый может решить самостоятельно. У кого слабый роутер, собранный из бутерброда с колбасой и лейкопластыря, тому лучше этот параметр сократить до 1-2 (лично я так и сделал, но несколько по другой причине ;)). Тому, кто вместо лейкопластыря использовал синюю изоленту беспокоиться не стоит.
    • limit_rate - очень важный параметр (на мой взгляд). Его нет в файле настроек. Но он учитывается при работе apt-mirror. Данным параметром ограничивается скорость скачивания каждого потока. По-умолчанию этот параметр равен 100M (100 мегабит). В совокупности с пердыдущим параметром apt-mirror спокойно нагрузит (теоретически) канал в (nthreads * limit_rate = 20 * 100М = 2000М) 2 гигабита. Я себе такое позволить не могу, поэтому в моем случае я поставил ограничение в 1M на поток.
    • _autoclean - автоочистка зеркал после скачивания. Так же отсутствует в файле с настройками. По-умолчанию равен 0 (т.е. отключен) и об очистке зеркал стоит беспокоиться самому пользователю. Я ленивый пользователь. Я выставил этот параметр в 1. Пущай apt-mirror сам все чистит.
    • _tilde - за что отвечает этот параметр для меня осталось загадкой. Не будем его трогать.
    Собственно после всех манипуляций с этой секцией она должна выглядеть примерно так:
    ############# config ##################
    #
    set base_path    /mnt/storage/mirrors
    #
    # set mirror_path  $base_path/mirror
    # set skel_path    $base_path/skel
    # set var_path     $base_path/var
    # set cleanscript $var_path/clean.sh
    # set defaultarch  
    # set postmirror_script $var_path/postmirror.sh
    # set run_postmirror 0
    set nthreads     1
    set _tilde 0
    set _autoclean 1
    set limit_rate 1M
    #
    ############# end config ##############
  2. Ссылки на репозиотрии, которые необходимо перенести к себе в зеркала
    deb http://archive.ubuntu.com/ubuntu trusty main restricted universe multiverse
    deb http://archive.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
    deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse
    deb http://archive.ubuntu.com/ubuntu trusty-proposed main restricted universe multiverse
    deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse

    Здесь все просто. В этой секции лежат ссылки на репозитории, для которых мы и делаем зеркала. Все эти ссылки можно взять из /etc/apt/sources.list ну и не забыть заглянуть в /etc/apt/sources.list.d. Одно уточнение: репозитории будут скачаны под ту архитектуру, которая указана в параметре defaultarch из первой секции настроек. По-умолчанию будет браться ваша текущая архитектура. Что же делать если надо и i386, и amd64, и чёрта лысого на палке? С чёртом все очень сложно, а с остальными архитектурами все просто - указываем их [эти архитектуры] непосредственно в самой ссылке на репозиторий
    deb-i386 http://archive.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
    deb-amd64 http://archive.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
    Так как я создаю зеркала для Raspberry Pi то моя секция со ссылками выглядит так:
    deb-armhf http://mirrordirector.raspbian.org/raspbian wheezy main contrib non-free rpi
    deb-armhf http://archive.raspberrypi.org/debian wheezy main
    deb-armel http://archive.raspberrypi.org/debian wheezy main
    deb-armhf http://repository.wolfram.com/raspbian stable non-free
  3. Очистка зеркал
    clean http://archive.ubuntu.com/ubuntu
    Тут все еще проще чем в предыдущей секции. Здесь необходимо указать те зеркала, которые надо будет очищать (автоматически или вручную). В моем случае 3 зеркала:
    clean http://mirrordirector.raspbian.org/raspbian
    clean http://archive.raspberrypi.org/debian
    clean http://repository.wolfram.com/raspbian

Сохраняем файл. Запускаем процесс создания зеркал:
sudo apt-mirror
Тут тоже важно уточнить, что этот процесс довольно длительный (зависит от количества создаваемых зеркал, скорости канала и расположения звезд). Надо запастись терпением. Однако, если вдруг в самый разгар создания зеркал вы передумали или вспомнили, что забыли добавить очень-важный-параметр в файл настроек (или решили, что компьютер тоже человек и нуждается в отдыхе) - можно не дожидаться завершения процесса. Смело жмите Ctrl-C, исправляйте, что требуется и запускайте процесс дальше. apt-mirror достаточно умный и скачивать то, что уже было скачано не будет.

Индейцы!


Как все уже догадались приступаем к настройке apache2. Сначала проверим - а работает ли он вообще. Открываем браузер и идем по адресу http://localhost. Увидели It Works! значит все в порядке. Не увидели? Для начала убедитесь, что вы не спите и глаза открыты. Ну а потом стоит проверить очень много различных вариантов почему этот индеец все-таки работать не захотел. К сожалению это выходит за пределы данной статьи и моего опыта.
Ежели все работает то идем дальше.
После установки apache2 в системе создается папка /var/www куда этот самый apache2 смотрит. По-умолчанию, конечно, он смотрит чуть глубже - в /var/www/html, но нас это мало волнует. Мы ему сами скажем куда смотреть (если что).
Для начала создадим ссылку на наши зеркала:
sudo ln -s /mnt/storage/mirrors /var/www/mirrors
Теперь скажем нашему индейцу, что все запросы, приходящие на адрес /mirrors он должен перенаправлять на /var/www/mirrors а не /var/www/html/mirrors (именно здесь он будет искать наши зеркала без наших указаний)

Открываем файл настроек сайта по-умолчанию:
sudo gedit /etc/apache2/sites-enabled/000-default.conf
И вставляем строчку
Alias /mirrors /var/www/mirrors
В результате это должно выглядеть примерно так:
<Virtualhost *:80>
 ServerAdmin webmaster@localhost
 DocumentRoot /var/www/html
 Alias /mirrors /var/www/mirrors

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Вертись колесо!


Ну и как же не сделать так, чтобы все само работало? Очень просто! Всего лишь надо добавить выполнение apt-mirror в cron. Открываем файл планировщика задач
sudo gedit /etc/crontab
и к существующим там задачам добавляем свою
0 1 * * * root /usr/bin/apt-mirror > /mnt/storage/mirrors/cron.log
Теперь синхронизация наших зеркал будет происходить каждую ночь в 01:00. Результаты последнего срабатывания этой задачи можно будет посмотреть в /mnt/storage/mirrors/cron.log

P.S.

Если вдруг кто не знает как свой apt натравить на вновь созданные зеркала. Открываем все те файлы (/etc/apt/sources.list и из /etc/apt/sources.list.d) из которых мы набрали ссылки для наших зеркал и вставляем в них адрес своих зеркал. Например:
  • Было:
    deb http://archive.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
  • Стало:
    deb http://192.168.1.100/mirrors/archive.ubuntu.com/ubuntu trusty-security main restricted universe multiverse

Не получилось сделать у себя так же? Не переживайте! Вспомните волшебное заклинание: "Да и хрен с ним!" и все будет хорошо!

1 комментарий :

Blog27999 комментирует...

According to Stanford Medical, It is really the ONLY reason this country's women live 10 years longer and weigh an average of 42 lbs less than we do.

(Just so you know, it has totally NOTHING to do with genetics or some secret diet and really, EVERYTHING related to "how" they eat.)

BTW, What I said is "HOW", and not "what"...

Click this link to determine if this little test can help you find out your real weight loss potential