4.6. Некоторые вопросы и ответы

  • В. Я думал здесь обсуждаются модемы??!

    О. Вы должно быть думаете о последовательных портах на обратной стороны вашего компьютера. Мы используем слово `порт' здесь для обозначения результата `переноса' программы с одной версии Unix на другую. (Использование одного и того же слова для обозначения совершенно разных вещей, к сожалению, стало плохой привычкой всех в околокомпьютерном мире.

  • В. Я думал, что предполагается использовать пакеты для инсталяции дополнительных программ?

    О. Совершенно верно, это обычно самый быстрый и простой способ сделать это.

  • В. Так зачем тогда беспокоиться о портах?

    О. Есть несколько причин:-

    1. Лицензионные ограничения некоторых программ разрешают распространять их только в виде исходных текстов, а не исполняемых файлов.
    2. Некоторые люди не доверяют двоичным пакетам. Если у вас есть исходный текст, то вы можете (в теории) просмотреть его на предмет потенциальных проблем самостоятельно.
    3. Если у вас есть свои патчи, вам необходимо применить их к исходникам самостоятельно.
    4. У вас может быть другое мнение о том как эта программа должна быть скомпилирована, чем у того кто сделал пакет - некоторые имеют свою точку зрения на то какая должна быть оптимизация, нужна ли отладочная информация и тому подобное.
    5. Некоторым нравиться иметь исходники под рукой, так что они смогут читать их со скуки, модифицировать, переиспользовать куски кода (конечно с учетом лицензии) и так далее.
    6. И наконец - если у вас нет исходников, то где же собственно софт? ;-)
  • В. Что такое патч?

    О. Патч - это маленький (обычно) файл, в котором описано как изменить одну версию файла до другой. Он содержит текст который, в действительности, состоит из вещей вроде ``удалить строку 23'', ``добавить эти две строки после строки 468'' или ``изменить строку 197 на эту''. Он также известен как ``diff'', поскольку так называется программа, которая их генерирует.

  • В. Что такое tarball?

    О. Это файл с заканчивающийся на .tar.gz (возможно .tar.Z, или даже .tgz)

    По существу, это архив структуры каталогов (.tar), а потом сжатый (.gz). Изначально эта технология использовалась для архивов на лентах (Tape ARchive - отсюда и название `tar'), но сейчас это один из наиболее широко применяемых методов распространения исходных текстов программ по Интернет.

    Вы можете посмотреть какие файлы находятся внутри, или даже разархивировать их самостоятельно, используя стандартную утилиту UNIX - tar. Она поставляется вместе с базовой системой FreeBSD. Например:

     tar tvzf foobar.tar.gz		# Показывает содержимое foobar.tar.gz
     tar xzvf foobar.tar.gz		# Разархивирует файлы в текущий каталог
    
  • В. Что такое контрольная сумма (checksum)?

    О. Это число, являеющееся результатом суммирования всех байт файла который вы проверяете. Если значение какого-нибудь байта поменяется, контрольная сумма поменяется тоже, так что простое сравнение с эталоном позволит определить что файл был изменен. (На практике используется более сложные алгоритмы, чем простое суммирование, для того чтобы замечать такие ``сложные'' изменения файлов, как перестановка байт.

  • В. Я действовал по вашим инструкциям компиляции портов с CDROM и все работало отлично до тех пор пока я не попробовал установить порт kermit :-
     # make install
     >> cku190.tar.gz doesn't seem to exist on this system.
     >> Attempting to fetch from ftp://kermit.columbia.edu/kermit/archives/.
    
    Почему он не существует? У меня бракованный диск?

    О. Условия лицензии для kermit не позволяют нам положить его tarball на CDROM, так что вам придется скачать его самостоятельно. Причина, из-за которой вы получили эти сообщения об ошибках, - это отсутствие подключения к Интернет в тот момент. Как только вы скачаете нужный tarball откуда-нибудь, вы можете повторить попытку сделать порт. (скачивайте его с ближайшего к вам места, так вы сохраните и ваше время и пропускные способности Интернет)

  • В. Я сделал это, но когда я попробовал положить его в /usr/ports/distfiles я получил сообщение об отсутствии прав доступа.

    О. Механизм портов по умолчанию ищет tarball в каталоге /usr/ports/distfiles, но у вас не получится ничего туда добавить, потому что это символьная ссылка на CDROM, запись на который невозможна. Но вы можете изменить место поиска tarball с помощью команды:

     DISTDIR=/where/you/put/it make install
    
  • В. Механизм портов работает только если вы все кладете в /usr/ports? Мой системный администратор сказал, что я должен хранить все только под /u/people/guests/wurzburger, и у меня не получается сделать порт.

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

     PORTSDIR=/u/people/guests/wurzburger/ports make install
    

    Эта команда компилирует порт в /u/people/guests/wurzburger/ports и устанавливает в /usr/local?.

    а следующая команда откомпилирует порт в /usr/ports и установит в /u/people/guests/wurzburger/local:

     
     PREFIX=/u/people/guests/wurzburger/local make install
    

    И наконец

     PORTSDIR=.../ports PREFIX=.../local make install
    

    объединяет оба эффекта (полная команда слишком длинна и не влезает целиком на страницу, но я уверен, что вы уже поняли идею)

    Если вы не хотите набирать такие строки каждый раз при инсталляции порта, то вставьте эти переменные в свое окружение (environment).

  • В. У меня нет FreeBSD CDROM, но я хочу скопировать все нужные tarball к себе заранее, чтобы мне не приходилось долго ждать каждый раз когда я устанавливаю port. Существует ли простой способ скачать их все сразу?

    О. Для того чтобы скачать все tarball для коллекции портов, запустите:

     # cd /usr/ports
     # make fetch
    

    Для того чтобы скачать все tarball для отдельной директории, запустите:

     # cd /usr/ports/directory
     # make fetch
    

    Ну я думаю вы уже догадались как скачать tarball для одного порта.

  • В. Мне кажется что будет быстрее скачать все tarball с одного из соседних зеркал FreeBSD. Существует ли способ указать адресс для скачивания, отличный от тех, которые указаны в MASTER_SITES?

    О. Да. если вы например думаете, что ftp.FreeBSD.ORG намного ближе, чем узлы из списка MASTER_SITES, то используйте следующий пример.

     # cd /usr/ports/directory
     # make MASTER_SITE_OVERRIDE=ftp://ftp.FreeBSD.ORG/pub/FreeBSD/distfiles/ fetch
    
  • В. Я хотел бы узнать какие файлы нужны для компиляции, до того как make будет их скачивать.

    О. 'make fetch-list' покажет вам список файлов необходимых этому порту.

  • В. Есть ли способ предотвратить компиляцию? Я хочу сделать некоторые исправления в исходниках перед тем как компилировать, но меня утомляет идея караулить момент когда нажать control-C.

    О. Использование 'make extract' остановит процесс после скачивания и распаковки исходных текстов.

  • В. Я пытаюсь сделать мой собственный порт и хочу иметь возможность останавливать процесс до компиляции, чтобы посмотреть как работают мои патчи. Есть ли что-нибудь вроде 'make extract', но для патчей?

    О. Да, 'make patch' - это то что вы ищете. И кстати, спасибо за то что вы это делаете!

  • В. Я слышал, что некоторые опции компилятара могут стать причиной ошибок. Это правда? Как мне быть увереным, что я откомпилировал порт с правильными опциями?

    О. Да, в gcc версии 2.6.3 (эта версия поставлялась вместе с FreeBSD 2.1.0 и 2.1.5), опция -O2 могла приводить к коду с ошибками, если не использовать опцию -fno-strength-reduce. (Большинство поротов не использует -O2). У вас должна быть возможность указывать флаги, используя что-нибудь вроде:

     # CFLAGS='-O2 -fno-strength-reduce' make install
    

    или при помощи редактирования /etc/make.conf, но это кажется не всегда срабатывает. наиболее надежный способ - использовать 'make configure', после чего зайти в каталог с исходными текстами и проверить Makefile, но это может быть затруднительно если дерево исходных текстов содержит кучу подкаталогов, в каждом из которых есть свой Makefile.

  • В. Слишком много разных портов - тяжело найти тот, который нужен мне. Есть ли нде-нибудь список всех портов?

    О. Смотрите INDEX в каталоге /usr/ports.

  • В. Я собиралсяустановить 'foo' порт, но система внезапно остановилась и начала компилировать порт 'bar'. Что произошло?

    О. Порт 'foo' требует что-нибудь, что поставляется вместе с 'bar' - рапример, если 'foo' использует графику, то 'bar' может иметь библиотеку с полезными графическими процедурами. Или 'bar' может быть инструментом, который нужен для компиляции порта 'foo'.

  • В. Я установил огромную программу и, мне кажется, это просто бесполезно занятое место на диске. Я хотел бы удалить ее, но не знаю где лежат входящие в этот пакет файлы. Есть идеи?

    О. Нет проблем, просто запустите

     pkg_delete grizzle-6.5
    
  • В. Подождите секундочку, вы должны знать номер версию для того чтобы использовать такую команду. Вы серьезно ожидаете, что я ее помню??

    О. Нет, конечно, вы можете узнать его следующим образом

     pkg_info -a | grep grizzle
    

    Результатом будет что-то вроде:-

     Information for grizzle-6.5:
     grizzle-6.5 - the combined piano tutorial, LOGO interpreter and shoot 'em up arcade game.
    
  • В. К вопросу о месте на диске, каталог портов кажется занимает кучу места. Безопасно ли удалить часть файлов в нем?

    О. Да, если вы уже установили программу и не собираетесь переустанавливать ее снова, то нет никакой необходимости хранить исходники. Самый лучший способ избавиться от них - это:

     # cd /usr/ports
     # make clean
    

    В результате во всех подкаталогах /usr/ports будут удалены все файлы кроме входящих в каркас.

  • В. я сделал это, но в каталоге distfiles все еще сохранились эти tarball или как вы их там называете. Могу я их удалить?

    О. Да, если вы уверены, что они вам больше не нужны.

  • В. Мне нравиться иметь кучу программ. Есть ли возможность установить все порты сразу?

    О. Просто сделайте

     # cd /usr/ports
     # make install
    
  • В. Ok, я сделал это, но, хоть я и думал, что это займет много времени, так что я пошел спать и оставил компьютер работать. С утра я обнаружил, что сделанно только три с половиной порта. Что нибудь не так?

    О. Нет, проблема в том, что некоторые порты начинают задавать вопросы (например - ``Вы используете бумагу формата A4 или Letter?'') и им нужен кто-то кто введет ответ.

  • В. Но мне вовсе не хочется провести целый день уставившись в монитор. Есть идеи получше?

    О. Ok, сделайте это перед тем как идти в кровать/на работу/местный парк :-

     # cd /usr/ports
     # make -DBATCH install
    

    В результате будут установленны все порты которые НЕ требуют участия человека в установке. Потом, когда вы вернетесь, запустите

     # cd /usr/ports
     # make -DIS_INTERACTIVE install
    

    для того чтобы закончить работу.

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

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

     # cd /usr/ports/somewhere/frobble
     # make extract
     # cd work/frobble-2.8
     [Добавьте ваши патчи]
     # cd ../..
     # make package
    
  • В. Эта система довольно хитра. Я жажду разобраться как это работает. в чем секрет?

    О. Никаких секретов. Просто смотрите в файлы bsd.ports.mk и bsd.ports.subdir.mk в каталоге /localhost/usr/share/mk/ с makefiles. (Замечание: Читателям с отвращением к замысловатым shell-скриптам рекомендуем пропустить эту ссылку ...)

Назад | Содержание | Вперед

Обновлено: 13.03.2015