FreeBSD как обновить порты

FreeBSD как обновить порты

Обновление портов FreeBSD, программа Portsnap

Собственно, что такое порт в контексте FreeBSD. Порт в операционной системе FreeBSD, это папка с минимальным набором файлов, скелетом, необходимым для нахождения и скачивания на локальную машину исходных текстов программного обеспечения, его конфигурирования, компиляции и наконец установки уже готовой программы в соответствующие каталоги. Все эти манипуляции выполняются утилитой make с использованием конфигурационных файлов порта.

Файлы порта представляют из себя сценарии, записанные в обычные текстовые файлы. Порт как правило состоит из нескольких файлов: distinfo Makefile pkg-plist pkg-descr distinfo — Содержит имена файлов для скачивания и их контрольные суммы для проверки подлинности. pkg-descr — Краткое описание программы, информация о разработчике, официальный сайт и т.д.. pkg-plist — Это список файлов, которые будут собраны в процессе установки программы, с директориями назначения. Файл используется для регистрации приложения в базе данных пакетов ( /var/db/pkg ). Makefile — Основной файл сценария. Содержит массу различных опций и переменных, описывающих информацию о версии, разработчике, зависимостях данного приложения от других пакетов и библиотек, опции конфигурирования. Кроме тога, во многих портах можно обнаружить поддиректорию files, в ней как правило лежат различные патчи и дополнения. Деревом портов FreeBSD называется древовидная структура в которой размещаются все порты. Дерево портов располагается по адресу /usr/ports, в директории ports, в свою очередь располагаются поддиректории, относящиеся к определенному классу программного обеспечения, например:

  • /usr/ports/archivers — софт для работы с архивами
  • /usr/ports/databases — софт для работы с базами данных
  • /usr/ports/lang — различные языки программирования

и так далее.

Программа Portsnap, для обновления портом, операционной системы FreeBSD

Обновить дерево портов FreeBSD можно несколькими способами. Один из них, на мой взгляд самый удобный, использовать штатную утилиту обновления портов – Portsnap. Как было сказано выше, данная утилита является штатной, для операционной системы FreeBSD, поэтому присутствует в системе по-умолчанию, во всяком случае в версии 7.1, если ничего не путаю, то в старых версиях, например 5.4, нужно было ее, персонально, из портов ставить. Программа Portsnap, не работает напрямую с основным деревом портов /usr/ports, она использует рабочий каталог, по-умолчанию /var/db/portsnap, туда скачивается сжатая копия ( snapshot ) дерева портов, а оттуда уже обновляется основное дерево портов. Конфигурационный файл живет по адресу /etc/portsnap.conf, в принципе его можно не трогать, но если вдруг надумаете, например, поменять адрес сервера, откуда программы будет качать исходники или расположение рабочей директории, там все довольно хорошо откомментировано. Программа Portsnap, имеет несколько служебных команд для выполнения различных действий:

  • Команда fetch — Скачивает снимок ( snapshot ), основного дерева портов с указанного в конфигурации сервера. Используется только для интерактивной работы, не через cron
  • Команда cron — Используется для запуска из планировщика заданий cron.
  • Команда extract — Разворачивает дерево портов, данная команда полностью удаляет существующее дерево портов, включая все внесенные в него изменения, как правило выполняется в первый раз и в случае, если нужно получить, чистое дерево портов или при использовании с опцией path( cм. ниже )
  • Команда update — Служит для, непосредственно, обновления, основного дерева портов.
  • path — Это дополнительная опция, используется с командой extract, для обновления конкретного порта, или нескольких портов.

Итак, если это первый запуск portnap, делаем: vds-admin /root# portsnap fetch Looking up portsnap.FreeBSD.org mirrors… 3 mirrors found. Fetching snapshot tag from portsnap2.FreeBSD.org… done. Fetching snapshot metadata… done. Updating from Mon Jun 1 17:22:35 UTC 2009 to Sun Jun 28 08:01:56 UTC 2009. Fetching 3 metadata patches.. done. Applying metadata patches… done. Fetching 3 metadata files… done. Fetching 2058 patches…..10….20….30….40….50….60….70….80… done. Applying patches… done. Fetching 2094 new ports or files… done. Я недавно обновлял порты, поэтому сейчас это заняло минуту, если обновление дерева портов делается впервые или давненько не делалось, естественно процесс будет куда более долгим. Пугаться этого не стОит, ничего не застряло и не зависло. Теперь можно распаковать дерево: vds-admin /# portsnap extract /Mk /usr/ports/Templates /usr/ports/Tools /usr/ports/accessibility /usr/ports/arabic —————————— пропущено.. —————————— /usr/ports/x11/yelp/ /usr/ports/x11/zenity/ Building new INDEX files… done. Данная команда разворачивает все дерево целиком, поэтому время выполнения не зависит от того, как давно вы обновлялись. У меня на тестовой, не самой сильной машине, с операционной системой FreeBSD 7.1, ушло порядка 15-ти минут Теперь обновляем: vds-admin /# portsnap update Removing old files and directories… done. Extracting new files: /usr/ports/devel/Makefile /usr/ports/devel/p5-DateTime-Format-SQLite/ /usr/ports/lang/neko/ /usr/ports/security/fakeroot/ /usr/ports/security/tor-devel/ /usr/ports/www/lighttpd/ /usr/ports/www/webcheck/ /usr/ports/www/xpi-noscript/ Building new INDEX files… done. Вот собственно и все, имеем свежее дерево портов. Если обновление система обнаружит что обновление не требуется, будет выдано соответствующее сообщение: vds-admin /# portsnap update Ports tree is already up to date. Повторюсь, первоначально, процедура может быть весьма длительной, но переживать из-за этого особо не стОит.

Использование программы Portsnap из планировщика Cron

Согласитесь, очень удобно периодически обновлять порты, практически не принимая в этом участия. Для этого у программы portsnap, есть специальная команда, cron. Это именно специальная команда, обычный portsnap fetch, из крона работать не будет. Сделано это не случайно, команда portsnap cron, после запуска, до загрузки чего-либо, отсчитывает произвольный интервал времени от 1 до 3600 секунд, это сделано разработчиками, что-бы снизить кол-во одновременно подключающихся пользователей к серверу обновлений, а затем приступает к работе. Настоятельно не рекомендуется прописывать в cron команду update, может получится неприятная ситуация, например, если вы компилируете какую-то программу а cron запустит в этот момент обновление портов. Что-бы избежать вышеописанной ситуации, нужно обновлять только индексный файл, для этого у программы portsnap, есть опция -I. Итак, в конфигурационном файле /etc/crontab, прописываем следующую строку: 0 0 * * 0 root portsnap -I cron update С такой конфигурацией, cron, будет выполнять обновление индекса в 00:00 каждого воскресенья. Не забывайте, что в данном варианте у вас обновляется только индексный файл, а это не есть обновление дерева портов. Для обновления самих портов нужно вручную выполнить команду portsnap update, из командной строки. Делайте это периодически, как того требует ваша политика поддержания системы портов в актуальном состоянии.

Snapshot is corrupt, испортилась база программы portsnap

Fetching 3 metadata files… /usr/sbin/portsnap: cannot open beea5333deea7ef646b497e9cd751ba72e17fd59708f9eed1f8d857bc585ad70.gz: No such file or directory metadata is corrupt. Наличие на экране данного сообщения, зачастую говорит о том, что попортилась база данных, программы portsnap. Ничего страшного в этом тоже нет, всякое случается. Исправить можно следующим образом: vds-admin /# rm -rf /var/db/portsnap vds-admin /# mkdir /var/db/portsnap vds-admin /# portsnap fetch extract Удачного администрирования. Читать еще:

Ниже приведены некоторые полезные приемы, которые пригодятся при обновлении установленных портов.

При установке очередного порта, сборка отвалилась с ошибкой:

configure: error: Package requirements (glib-2.0 >= 2.27.2) were not met:
Requested ‘glib-2.0 >= 2.27.2’ but version of GLib is 2.26.1

Можно перепроверить, какая версия установлена:

# pkg_info | grep glib
glib-2.26.1_1

Пора подумать об обновлении установленных портов.

Обновим коллекцию портов, подробнее об этом написано :

# portsnap fetch update

Для обновления уже установленных портов будем использовать утилиту Portupgrade:

# cd /usr/ports/ports-mgmt/portupgrade
# make install clean

Файл конфигурации Portupgrade — /usr/local/etc/pkgtools.conf.

Например, что бы в нем запретить обновление всех портов, названия которых начинаются с php, в секции HOLD_PKGS укажите:

HOLD_PKGS =

После установки, проверим какие порты нуждаются в обновлении:

# pkg_version -v | grep «need»

Проверить, какие файлы и прочие зависимости обновятся можно командой:

# portupgrade -nr имя_пакета

Перед запуском обновления — очень желательно ознакомиться со файлом /usr/ports/UPDATING, в котором описаны пакеты, нуждающиеся в обновлении и описаны подробности кадого обновления.

Что бы не листать весь список — можно воспользоваться утилитой pkg_updating.

Напрмиер, просмотреть описание списка пакетов, которые установлены и могут быть обновлены:

# pkg_updating | less

Или посмотреть информацию о конкретном пакете:

Обновим порт glib-2.26.1_1:

Для особо важных пакетов — не забывайте на всякий случай сделать копию конфигурационных файлов.

Так же, при обновлении важных пакетов используйте ключ -b — в таком случае Portupgrade создаст резервную копию пакета и сохранит её в каталоге /usr/ports/packages/All/. Для восстановления этого пакета используйте pkg_add.

Так же, прочтите файл /usr/ports/UPDATING — в нем описаны изменения, которые будут внесены в новые версии программ.

Попробуем теперь обновить пакет php52.

С помощью утилиты portversion проверим, нуждается ли он в обновлении:

# portversion |grep php
php52 <

Знак < обозначает, что установленная версия меньше, чем актуальная в портах.

Приступим к обновлению порта. Укажем такие ключи:

-R — обновлять порты, от которых зависит порт
-r — обновлять порты, которые зависят от порта
-b — создать резервную копию порта
-l — записывать события в лог-файл

и запишем процесс в файл phpupdate для анализа в случае каких-либо проблем:

# portupgrade -rRb php52 -l phpupdate

Сразу же выдало ошибку:

This port is deprecated; you may wish to reconsider installing it:

PHP 5.2 series is not supported anymore, migrate now.

It is scheduled to be removed on or after 2012-03-01.

Stop in /usr/ports/lang/php52.
*** Error code 1

Stop in /usr/ports/lang/php52.

Программа Portaudit нашла ошибку в версии php, до которой мы пытаемся обновиться, и запрещает его установку. Как это исправить описано .

Исправляем, и запускаем обновление заново.

Обновление завершено:

1 порт не обновился — php52-mysqli потому что он уже обновлен, второй — phpMyAdmin-3.4.8 требует пакет pecl-pdflib-2.1.8, которого видимо нет.

# pkg_info | grep php
php52-5.2.17_6 PHP Scripting Language

И вывод portversion:

# portversion |grep php
php52 =

где = означает, что текущая версия соответствует последней в портах.

Можно перейти в каталог /usr/ports/packages/All/ и проверить, сделал ли Portupgrade резервные копии:

Ссылки по теме:

Настройка SSH сервера

Перво наперво нужно настроить sshd для удаленного подключения. Если сейчас попробовать подключиться к серверу, то ничего не выйдет. Мы увидим окно приветствия, но залогиниться не получится. Это из-за того, что в системе у нас нет ни одного пользователя, кроме root. А этому пользователю по-умолчанию запрещено подключаться через ssh. Соответственно, у нас два пути, либо разрешить подключаться руту, либо добавить других пользователей. Сделаем и то, и другое. Сначала разрешаем пользователю root подключаться по ssh. Для этого редактируем файл /etc/ssh/sshd_config. Пока у нас голая система, воспользуемся для этого редактором ee. Открываем файл на редактирование:

# ee /etc/ssh/sshd_config

Находим строчку PermitRootLogin, раскомментируем ее и ставим напротив yes. По-умолчанию там стоит no.

Здесь же я рекомендую изменить стандартный порт ssh 22 на что-то более экзотическое. Делается это для того, чтобы роботы, которые постоянно сканируют интернет и пытаются залогиниться на серваки, остались не у дел. На 22 порт постоянно кто-то ломится с несуществующими учетками и подбирает пароли. Все это отражается в логах и может мешать. Сменив порт на нестандартный, мы частично избавляемся от этой проблемы. Ищем строчку со словом Port и меняем значение с 22, например, на 11222.

Сохраняем изменения и выходим из редактора. Теперь нам необходимо перезапустить sshd для принятия изменений. Делаем это командой:

# service sshd restart

Демон sshd перезапустится. Можно пробовать подключаться по ssh, должно получиться зайти под root.

Многие считают небезопасным подключаться удаленно под учетной записью рута. Это вопрос неоднозначный, все зависит от конкретной ситуации. Добавим одного пользователя для удаленного подключения. Воспользуемся командой:

# adduser

Заполняем необходимые данные пользователя. Обязательно в качестве добавочной группы укажите wheel. Если пользователя не добавить в эту группу, то он не сможет зайти потом рутом. После добавления пользователя, подключаемся им по ssh. После логина используем команду:

# su -l

Вводим пароль рута и оказываемся в учетной записи root.

Как подключаться и работать решайте для себя сами.

Установка Midnight Commander

Следующим шагом я всегда устанавливаю MC и делаю редактором по-умолчанию mcedit. Мне так удобно и проще делать дальнейшие настройки сервера. Установить можно как из портов, так и из пакетов. На вопрос, как лучше, однозначного ответа нет, каждый решает для себя сам. Я обычно MC ставлю из пакетов, а все остальное уже из портов. Почему именно так, да потому, что Midnight Commander ставится очень долго из портов, тянет кучу зависимостей, а у нас в настоящий момент порты даже не обновлены. На все про все уйдет минут 15-20. Так что я предпочитаю поставить сразу из пакетов. Делаем это командой:

# pkg install mc

Так как у нас система голая, увидим сообщение:

The package management tool is not yet installed on your system. Do you want to fetch and install it now? :

Соглашаемся. После установки pkg начнется установка MC. Перед этим будет выведен список зависимостей, отмечено, сколько места все это займет. Со всем соглашаемся и начинаем установку. После окончания запускаем файловый менеджер:

# mc

Если у вас вместо прямых линий крякозябры, то закрываем putty и в ее настройках меняем кодировку. Идем в Windows -> Translation и выбираем KOI8-U, сохраняем и заходим снова. Теперь все должно быть в порядке.

Дальше устанавливаем редактор по умолчанию mcedit. Если этого не сделать, то в качестве редактора будет выступать vi. Если вы случайно окажетесь в нем, то не сразу сможете банально выйти из него, я не говорю уже о том, что бы что-то там отредактировать и сохранить. Так что идем в домашнюю директорию пользователя, находим там файл .cshrc, открываем, ищем строку

setenv EDITOR vi

меняем vi на mcedit, сохраняем, закрываем.

Настройка ntp для синхронизации времени

Минимально необходимый инструментарий для настройки мы получили, продолжаем работу. Чтобы время на сервере всегда было актуальным, его надо регулярно синхронизировать. Можно пойти двумя путями. Либо запускать через определенные промежутки времени утилиту ntpdate с ключами, либо настроить и запустить службу ntpd, которая будет постоянно работать и синхронизировать время. Более правильный вариант, использовать службу, но он чуть сложнее в настройке. Чтобы синхронизировать время через ntpdate, достаточно просто ввести команду:

# ntpdate -b europe.pool.ntp.org

и время будет синхронизировано. Можно запускать эту команду через cron с определенной периодичностью. Если у вас уже запущена служба ntpd, то ntpdate не сработает, выдаст ошибку:

the NTP socket is in use, exiting

Настроим в таком случае ntpd. Если она у вас уже запущена, то в файле /etc/rc.conf уже есть строчка

ntpd_enable=»YES»

если ее нет, добавьте.

Дальше отредактируем файл /etc/ntp.conf В качестве серверов синхронизации укажем:

server 0.pool.ntp.org server 1.pool.ntp.org server 2.pool.ntp.org server 3.pool.ntp.org

и добавим две строчки в конец:

driftfile /var/db/ntpd.drift logfile /var/log/ntpd.log

Сохраняем, перезапускаем ntpd командой:

# killall ntpd && ntpd

Теперь наш сервер будет автоматически синхронизировать свое время.

Установка и настройка ipfw

Настройка фаервола сервера это тема отдельной статьи, тут я подробно останавливаться на этом не буду. Мы просто запустим фаервол на нашей freebsd 10, установим скрипт для безопасного редактирования правил. А дальше каждый уже сам по своему желанию сможет безопасно настраивать удаленно фаервол, не боясь потерять доступ к серверу.

Для работы ipfw необходимо либо пересобрать ядро с нужными функциями, любо подгружать модуль во время загрузки. Второй вариант проще и быстрее, воспользуемся им. Добавим в /etc/rc.conf строку:

firewall_enable=»YES»

Если нам не нужен NAT, forward портов, то больше ничего делать не нужно, ipfw подключится во время загрузки сервера. Если мы оставим только эту строку и перезагрузим сервер, то удаленно мы к нему больше не подключимся, фаервол заблокирует все соединения. Чтобы того не произошло, указываем путь к файлу с правилами:

firewall_script=»/usr/local/etc/ipfw/rc.firewall»

Идем в указанную папку и создаем файл следующего содержания:

#!/bin/sh — fwcmd=»/sbin/ipfw» ${fwcmd} -f flush ${fwcmd} -f queue flush ${fwcmd} -f pipe flush ${fwcmd} add allow ip from any to any

Это полностью открытый фаервол, который разрешает все подключения. Делаем файл исполняемым. Перезагружаем сервер. После перезагрузки подключаемся удаленно. Проблем не должно возникнуть, фаервол у нас ничего не блокирует. Убеждаемся в этом, запустив команду:

# ipfw show

В ответ получаем:

00100 115 15052 allow ip from any to any 65535 0 0 deny ip from any to any

На первом месте наше правило, которое все разрешает, на втором, запрещающее. Все пакеты попадают под первое правило. В Freebsd есть замечательный скрипт, с помощью которого можно безопасно настраивать ipfw. Работает он просто. Вы запускаете скрипт, редактируете правила, потом сохраняете их и принимаете изменения. Скрипт после применения правил выводит сообщение о том, что все ли в порядке, записываем правила или нет. Если вы где-то ошиблись и вас отключило от сервера, вы не сможете положительно ответить на вопрос. Скрипт ждет 30 секунд ответа и если его не получает, откатывается на предыдущую версию правил. Вы спокойно подключаетесь и смотрите, где ошиблись.

Копируем себе скрипт:

# cp /usr/share/examples/ipfw/change_rules.sh /usr/local/etc/ipfw_change_rules

и делаем его исполняемым:

# chmod 0700 ipfw_change_rules

Теперь можно экспериментировать. При запуске скрипта будет открываться файл с правилами ipfw. После сохранения файла и выхода из него, скрипт спросит, применить или нет новые правила. Дальше я уже описал его логику.

Обновление портов

Основные настройки сделали. Теперь подготовим нашу систему к установке софта. обновим дерево портов с помощью утилиты portsnap. При первом запуске используем команду:

# portsnap fetch extract

Утилита скачает и распакует порты в папку /usr/ports. Последующее обновление будет производиться командой:

# portsnap fetch update

Добавим ее в cron для регулярного обновления портов раз в сутки. Для этого идем в /var/cron/tabs и создаем там файл root.

# touch /var/cron/tabs/root

Файл должен быть следующего содержания:

SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin 0 3 * * * portsnap cron

Обращаю внимание, что команда в планировщике записана не так, как мы запускали из консоли. Это сделано специально, чтобы не грузить сервера обновлений по крону в одно и то же время. Для обновления через планировщик используется специальная команда porsnap cron, которая делает небольшой случайный разброс по времени для обновления, чтобы все клиенты обновлялись в разное время, а не строго по часам.

На этом наша настройка системы закончена, переходим к следующей части, в которой займемся настройкой непосредственно компонентов web-сервера.

Помогла статья? Есть возможность отблагодарить автора


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *