Существующий пакетный менеджер в FreeBSD ветки 9 и ниже был предложен Джорданом Хаббардом (Jordan Hubbard) еще в далеком 1994 году. С тех пор многое изменилось, поэтому разработчики FreeBSD, начиная с ветки 10, заменили устаревший пакетный менеджер на новый – PKGNG (package new generation). Для установки бинарных пакетов теперь предлагается использовать удаленные репозитории, например – pkg.FreeBSD.org. Из базовой системы были удалены утилиты pkg_* (такие, как: pkg_install, pkg_add, pkg_create, pkg_delete, pkg_info, pkg_updating и pkg_version).

Теперь при обновлении какого-либо порта вы можете видеть вот такое предупреждающее сообщение:

/! WARNING /!
pkg_install EOL is scheduled for 2014-09-01. Please consider migrating to pkgng
http://blogs.freebsdish.org/portmgr/2014/02/03/time-to-bid-farewell-to-the-old-pkg_-tools/
If you do not want to see this message again set NO_WARNING_PKG_INSTALL_EOL=yes in your make.conf

В котором вам предлагается до сентября 2014 года перейти на новый пакетный менеджер, т.к. поддержка старого прекратится.

Переход на новый пакетный менеджер PKGNG в операционных системах FreeBSD версии 9 и ниже осуществляется следующим образом (все нижеперечисленные процедуры осуществлялись на FreeBSD 9.0-RELEASE). Сперва установим сам порт PKG:

# make -C /usr/ports/ports-mgmt/pkg install clean

По окончанию установки вы можете видеть следующее сообщение:

If you are upgrading from the old package format, first run:
  # pkg2ng

Но перед началом его использования укажите опцию WITH_PKGNG=YES в своем make.conf:

# echo 'WITH_PKGNG=YES' >> /etc/make.conf

Теперь дадим команду pkg2ng, которая осуществить конвертацию существующей базы установленных портов в новую, для использования с pkgng:

# pkg2ng
Converting packages from /var/db/pkg
...
Converting nmap-6.40_2...
Installing nmap-6.40_2... done
...

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

# pkgdb -fu
--->  Updating the pkgdb
[Reading data from pkg(8) ... - 46 packages found - done]

В принципе – переход на использование нового пакетного менеджера завершен. Для обновления установленных портов я использую portupgrade. Теперь при ее запуске можно видеть, что используется pkg:

# portupgrade -van
--->  Session started at: Mon, 24 Mar 2014 10:05:07 +0400
[Reading data from pkg(8) ... - 46 packages found - done]
** None has been installed or upgraded.
--->  Session ended at: Mon, 24 Mar 2014 10:05:24 +0400 (consumed 00:00:16)

Но при попытке обновить базу данных с удаленного репозитария выскочила ошибка:

# pkg update -f
Updating repository catalogue
No valid repository found.

Чтобы явно указать расположение репозитария необходимо выполнить следующее.

Удалить существующий конфигурационный файл для pkg и скопировать его из того, что дан по-умолчанию:

# rm -f /usr/local/etc/pkg.conf
# cp /usr/local/etc/pkg.conf.sample /usr/local/etc/pkg.conf

Создать каталог /usr/local/etc/pkg/repos и разместить в нем конфигурационный файл FreeBSD.conf с указанием расположения удаленного репозитария (обратите внимание на кавычки, они должны быть прямыми "):

 # mkdir -p /usr/local/etc/pkg/repos
 # nano -w /usr/local/etc/pkg/repos/FreeBSD.conf
 FreeBSD: {
 url: “pkg+http://pkg.FreeBSD.org/${ABI}/latest”,
 mirror_type: “srv”,
 enabled: yes
 }

Теперь выполнение обновления базы pkg:

# pkg update -f
Updating repository catalogue
digests.txz                                              100% 1097KB   1.1MB/s   1.1MB/s   00:00
packagesite.txz                                          100% 5087KB   5.0MB/s   5.0MB/s   00:00
Incremental update completed, 23432 packages processed:
0 packages updated, 0 removed and 23432 added.

Использование pkg хорошо документировано. Полный список команд вы получите дав просто pkg:

# pkg
...
Commands supported:
        add            Registers a package and installs it on the system
        annotate       Add, modify or delete tag-value style annotations on packages
...

Получить помощь по отдельно взятой команде можно так:

# pkg help update

На момент написания статьи версия pkgng:

# pkg -v
1.2.7

Однако, вам теперь необходимо изучить применение новых опций, указываемых в вашем make.conf или при сборке портов. Конструкция типа WITH_NAME, WITHOUT_NAME канула в лету. Теперь вместо, например, WITHOUT_X11=YES необходимо указывать WITHOUT=“X11” и т.д. Более подробно тут: http://wiki.freebsd.org/Ports/Options/OptionsNG.

Некоторые полезные команды из нового менеджера пакетов:

# pkg audit -F
# pkg update -f
# pkg check -Bd
# pkg info | grep nmap
nmap-6.40_2                    Port scanning utility for large networks
Перед обновлением можно проверить базу данных портов на ошибки:
# pkgdb  -Fa
и на потерянные зависимости:
# pkgdb  -L
Исправить базу данных портов (автоматически, без дополнительных ответов на вопросы системы) можно использовав ключ -fu:
# pkgdb  -fu

Чтобы Linux выполнил проверку дисков (fsck) при следующей перезагрузке, нужно создать пустой файл forcefsck в корневом каталоге:

cd /
touch forcefsck
reboot

Тот же эффект даст следующая команда:

shutdown -rF now

Для того, чтобы fsck самостоятельно устраняла ошибки без ручного подтверждения запросов, в загрузочных параметрах требуется включить опцию автоматического подтверждения всех запросов.

CentOS, Fedora, RedHat
В конфигурационном файле /etc/sysconfig/autofsck добавляем значение -y переменной AUTOFSCK_OPT:
AUTOFSCK_OPT="$AUTOFSCK_OPT -y"
Debian, Ubuntu
В конфигурационном файле /etc/default/rcS присвоить переменной FSCKFIX значение yes:
FSCKFIX=yes
FreeBSD
В конфигурационном файле /etc/rc.conf присвоить переменной fsck_y_enable значение YES:
fsck_y_enable="YES"

FreeBSD 9

1. Обновления системы и дерева портов

обновляем систему, используя утилиту для бинарного обновления системы — freebsd-update:

freebsd-update fetch && freebsd-update install

скачиваем и обновляем коллекцию портов
portsnap fetch Если вы запускаете Portsnap впервые, извлекаем снэпшот в /usr/ports: portsnap extract По завершении первого запуска Portsnap, как было показано выше, /usr/ports может быть обновлен при помощи:

# portsnap fetch && portsnap update

ОБНОВЛЕНИЕ УСТАНОВЛЕННЫХ ПАКЕТОВ ПРИ ПОМОЩИ PKGNG

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

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

При установке вылезет окошко с запросом выбора базы. Лучше выбрать BDB4.
Далее идет установка, тянет она кстати немало, порядка 10 Mb.
Но вот установка завершилась. Смотрим что утилита умеет, а умеет она многое.
Вот основное:

— a все установленные порты

— F Получить все исходные тексты устанавливаемого пакета, но не устанавливать/обновить.
— r Обновить все порты, от которых зависит устанавливаемый порт.
— R Обновить все порты, которые зависят от устанавливаемого порта.
— v Выводить всю информацию.
— c Выполнить «make config-confitional» перед обновлением каждого порта.
— f Принудительно обновляет порт, если он был переустановлен на другую версию или выполнен downgrade порта.

Лично я обновляю через команду

#portupgrade -rcvf имя_порта 

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

#pkg_version -v | grep "need"
png-1.4.1_1                    < need updating (port has 1.4.3)

Далее просто

portupgrade -rcvf png-1.4.1_1 

И еще, если утилита просит выполнить pkgdb -F — выполните обязательно, она исправляет нарушенные зависимости.

Однако стоит иметь ввиду, что portupgrade — это целый набор утилит:

  • portupgrade – одноименная утилита, средство автоматического обновления установленных программ
  • portinstall – утилита установки новых программ, присутствующих в системе портов FreeBSD
  • portversion – утилита показывающая установленный софт и наличие обновлений для него.
  • portsclean – утилита очистки мусора остающигося после сборки портов
  • portsdb – утилита создающая базу программ, присутствующих в портах FreeBSD
  • ports_glob – предназначена для поиска по базе портов
  • portcvsweb – браузер для CVSWeb
  • pkgdu – утилита, предназначенная для подсчета дискового пространства занятого уcтановленными программами
  • pkgdb – еще одна утилита для управления базой портов
  • pkg_which – предназначен для поиска по базе портов
  • pkg_sort – утилита сортирует порты в соответствии c зависимостями
  • pkg_fetch – утилита для скачки собранных(бинарных) пакетов
  • pkg_deinstall – средство для массового удаления установленного софта

Надеюсь, теперь вы не будете испытывать проблем с обновлением приложений.

 

Сетевая файловая система (Network File System – NFS) служит для обеспечения доступа компьютерам сети к общим каталогам на сервере.

Итак немного теории
NFS по смыслу и по организации работы похожа на разделяемые каталоги (shared folders) в системах Windows, но в этих службах используются совершенно разные протоколы работы и между собой они не совместимы. Однако, существует несколько программных продуктов, которые устанавливают поддержку NFS в системах Windows, поэтому применение NFS в сети с различными операционными системами не представляет проблемы, надо только помнить о необходимости использовать одинаковые версии NFS. В Данный момент используется в основном 3-я версия и внедрятся 4-я.

NFS работает посредством механизма удаленного вызова процедур (RPC – Remote Procedure Call).
Идеология RPC очень проста и привлекательна для программиста. Как обычно работает сетевое приложение? Оно следует некоему протоколу (например, HTTP): формирует пакет с запросом, вызывает системную функцию установления соединения, затем функцию отправки пакета, затем ждет ответного пакета и вызывает функцию закрытия соединения. Это значит, что вся работа с сетью является заботой программиста, который пишет приложение: он должен помнить о вызове функций сетевого API системы, думать о действиях в случае сбоев сети.

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

Для того, чтобы обеспечить прозрачность пересылки данных через сеть, придумана двухступенчатая процедура. На сервере любое приложение, которое хочет предоставлять свой сервис через RPC, регистрируется в программе, которая называется транслятором портов (port mapper). Функция этой программы – устанавливать соответствие между номером процедуры RPC, которую запросил клиент, и номером TCP или UDP порта, на котором приложение сервера ждет запросов. Вообще говоря, RPC может работать не только с TCP или UDP

Приложение, которое регистрируется у транслятора портов, сообщает ему номер программы, номер версии и номера процедур, которые могут обрабатываться данной программой. Эти процедуры будут впоследствии вызываться клиентом по номеру. Кроме этого, приложение сообщает номера портов TCP и UDP, которые будут использоваться для приема запросов на выполнение процедур.

Клиент, желающий вызвать выполнение процедуры на сервер, сначала отправляет запрос транслятору портов на сервер, чтобы узнать, на какой TCP или UDP порт надо отправить запрос. Транслятор портов запускается при старте системы и всегда работает на стандартном порте 111. Получив ответ от него, клиент отправляет запрос на тот порт, который соответствует требуемому приложению. Например, сервер NFS работает на порту 2049.

Процедура монтирования общего каталога через NFS

Прежде чем мы перейдем к описанию настроек сервера и клиентов NFS, следует понять, как осуществляется монтирование удаленных файловых систем в принципе.

Клиент NFS посылает запрос на монтирование удаленному компьютеру, который предоставляет свою файловую систему (обычно – некоторую ее часть) для общего пользователя. При этом говорят, что сервер NFS «экспортирует» тот или иной каталог (подразумевается – с подкаталогами). Запрос от клиента NFS попадает на обработку демону mountd. Тот выдает клиенту NFS специальный ключ. Этот ключ является идентификатором, который однозначно идентифицирует каталог, смонтированный по сети.

По NFS можно смонтировать как целые файловые системы, так и отдельные каталоги. Из соображений безопасности запрещено монтировать каталоги «через раздел». Это означает, что если каталог /var расположен на одном разделе диска, а каталог /var/adm – на другом, то при монтировании каталога /var каталог /var/adm не будет автоматически смонтирован. Если требуется монтировать те подкаталоги экспортируемого каталога, которые расположены в другой файловой системе (на другом разделе), следует экспортировать их отдельно и указывать в /etc/dfs/dfstab еще один разделяемый каталог – тот самый подкаталог с другого раздела.

Ключ, выданный клиенту при монтировании и идентифицирующий сеанс работы с данным удаленным каталогом, сохраняется при перезагрузке NFS-сервера, чтобы после восстановления его работы клиенты, замершие в ожидании, продолжили работу с удаленным сервером как ни в чем ни бывало. При демонтировании и новом монтировании файловой системы через NFS ключ обычно изменяется. На практике перезагрузка NFS-сервера все-таки может привести к сбою в работе клиентского приложения, особенно, если приложение читает или записывает файл в удаленный каталог во время перезагрузки.

После монтирования файловой системы через NFS клиент посылает серверу запросы на передачу и прием файлов, эти запросы обрабатывает демон nfsd.

Демонтирование файловой системы выполняется также, как и демонтирование любой другой файловой системы – командой umount.

Процесс установки соединения

Cilent |                                        |  Server
       |запрос транслятору портов на сервер,    |
mount  |чтобы узнать, на какой TCP или UDP порт |
nfs    |надо отправить запрос для доступа к nfsd|
       | -------------------------------------> | 111 UDP (rpcbind)
       | <------------------------------------- |
       | Запрос к самому приложению (nfsd)      |
       | -------------------------------------> | 2049 TCP или UDP
       | <------------------------------------- | на выбор (NFSD)
       | Запрос порта приложения mountd         |
       | -------------------------------------> | 111 UDP (rpcbind)
       | <------------------------------------- |
       | Запрос на монтирование к mountd        |
       | -------------------------------------> | 12345 (выставлен руками)
       | <------------------------------------- | UDP (mountd)
       | Обмен данных по протоколу NFS          |
       | -------------------------------------> |
       | <------------------------------------- |

Настройка NFS-сервера

Для настройки NFS сервера нам потребуется выполнить настройку как минимум трех приложений: rpcbind, mountd и nfsd.

Переходим непосредственно к настройке
Вся настройка будет рассматриваться на ОС FreeBSD
Настройка NFS-сервера
Для настройки NFS сервера нам потребуется выполнить настройку как минимум трех приложений: rpcbind, mountd и nfsd.
Добавляем их в rc.conf

# NFS
# запуск nfsd
nfs_server_enable="YES"
# флаги для nfsd:
# "-u" - используем тока протокол UDP - причина - это не инет, потери пакетов
# весьма малы, а по ресурсоёмкости UDP выгодней. TCP - весьма `дорогой`
# протокол, требует больше ресурсов
# "-t" - использовать протокол TCP (можно использовать и TCP и UDP одновременно
# - выбор, в конечном итоге, за клиентом)
# "-n 1" - максимальное число одновременно подключенных клиентов
# "-h 11.22.33.44" - работать на одном адресе (интерфейсе). Если не указано -
# работате на всех. Может быть указана неоднократно. У меня на этой машине
# всего один интерфейс (не считая lo0 :)) потому её наличие бессмысленно.
nfs_server_flags="-t -n 1 -h 11.22.33.44"
# демон монтированя - принимает подключения от клиентов. Запускается
# автоматически при опции nfs_server_enable="YES". Ключи:
# "-r" - для обслуживания файлов а не тока каталогов (если я правильно понимаю
# значение - то можно расшарить файл, а не каталог. Может для кого-то и имеет
# смысл...)
# "-l" - регистрация всх запросов на монтирование
# "-n" - для возможности монтированя из-под винды (вернее, никсовую
# шару на форточки)
# "-p" - на каком порту запускать
# "-h" - работать на одном адресе (интерфейсе). Если не указано -
# работате на всех.
mountd_enable="YES"
mountd_flags="-r -p 12345 -h 11.22.33.44"
# удалённый вызов процедур - необходим для фунциклирования NFS
rpcbind_enable="YES"
rpcbind_flags="-h 11.22.33.44"
# "-h" - работать на одном адресе (интерфейсе). Если не указано -
# работате на всех.

Настраиваем файл экспорта (/etc/exports)

# То, что расшариваем по NFS
/etc/PF/www      -alldirs  -maproot=root  11.22.33.55
/usr/ports -maproot=root -network 192.168 -mask 255.255.0.0

В первом случае расшаривание для конкретного ip.
Во втором случае расшаривание каталога /usr/ports для всей частной сети (192.168.0.0/16 — или 192.168.0.0/255.255.0.0), с правами root`a для всех root`ов с удалённых машин. Причём можно было это сделать для любого удалённого пользователя — хоть для nobody 🙂

Теперь, если перезагрузить сервак, все встанет,
либо можно перезапустить службы таким вот скриптом

#!/bin/sh
/etc/rc.d/rpcbind restart
/etc/rc.d/nfsd restart
/etc/rc.d/mountd restart

Для проверки готовности всех служб NFS к работе через rpcbind
используется команда

rpcinfo -p
showmount -ae

можно также посмотреть провесились ли демоны или нет

[root@srv /etc/rc.d]# sockstat | grep nfs
root     nfsd       41300 3  tcp4   *:2049                *:*
root     nfsd       41300 4  tcp6   *:2049                *:*
[root@srv /etc/rc.d]# 

Настройки клиента
На клиентских машинах можно(не обязательно) прописать такие строки в /etc/rc.conf:
# Эта опция в-общем-то и не нужна, всё прекрасно монтируется и без неё,
# но с ней подрубается демон nfsiod, позволяющий проводить чтение-запись
# асинхронно, не дожидаясь окончания предыдущей операции.
nfs_client_enable="YES"
# скока демонов запускать (по одному на примонтированный ресурс)
nfs_client_flags="-n 1"
И пробуем подмонтровать (в хандбуке советуют на клиентах выполнить команду nfsiod -n 4
Теперь примонтируем шару с клиента (в данном случае по TCP и если сразу не получается, монтировать в фоне)

#В FreeBSD8
/sbin/mount_nfs -o tcp -o bg -i 192.168.20.251:/usr/ports /usr/ports
#В FreeBSD7 и ранее
/sbin/mount_nfs -T -b -i 192.168.20.251:/usr/ports /usr/ports

NFS-соединение работает по клиент-серверной схеме. Один компьютер является сервером и предоставляет свои файловые системы другим машинам. Это называется “NFS-экспортирование”, а предоставляемые файловые системы называют “экспортами”. Клиенты могут монтировать экспорты сервера почти точно так же как и локальные файловые системы.

Одним из интересных свойств NFS является отсутствие привязки клиента к текущему состоянию сервера (stateless). Вы можете перезагрузить сервер, при этом клиенты не “отвалятся”. Разумеется они не смогут получить доступ к экспортам сервера когда он отключен, однако как только сервер вернется в строй, вы сможете просто продолжить работу с места вашей остановки.

Ядро должно быть собрано с опцией

options NFSSERVER

Создаем файл экспорта /etc/exports, в котором описываются локальные точки системы, доступные для монтирования клиентами.
Мой файл выглядит так

/var/datas -maproot=root -alldirs 10.15.0.9
/var/data -maproot=root -alldirs 10.15.0.9

в моем файле две точки монтирования(/var/datas и /var/data). В одной строке максимум можно прописать три точки. Если их больше, то описываем их в следующей строке, но не более чем три точки на одну строку в файле.

Права доступа на точки экспорта в нашем случае описаны следующим образом:
— maproot=user
Права данного пользователя используются для удаленного подключения как root. Права включают все группы в которые входит пользователь на локальной машине. Может быть представлен по имени или uid (как в нашем примере).

10.15.0.9 – хост которому разрешено монтирование.

Далее делаем запись в /etc/rc.conf и перегружаем машину

rpcbind_enable=«YES»
nfs_server_enable=«YES»
nfs_server_flags=«-t -n 5 -h 10.15.0.2»
mountd_flags=«-r»
mountd_enable=«yes»

Описание параметров
rpcbind
— l – Turn on libwrap connection logging
— h – биндинг адреса для UDP requests (если не указать – будет слушать на всех доступных)
mountd
— r – Allow mount RPCs requests for regular files to be served
nfsd
— h – биндинг адреса
— t – параметр, указывающий обслуживать только TCP-клиентов (если требуется работать по протоколу UDP, следует указать параметр -u)
— n – количество создаваемых серверов