4.3. Устранение некоторых проблем во FreeBSD


В этом разделе затронуты некоторые из наиболее часто задаваемых вопросов о Коллекции портов и описаны основные методы устранения проблем, а также рассказано, что делать, если порт не работает.

4.3.1. Некоторые Вопросы и Ответы
Q: Я думал, здесь будут обсуждаться модемы??!
Q: Я думал, что для установки дополнительных программ вы посоветуете использовать пакаджи?
Q: Если так, то зачем тогда возиться с портами?
Q: Что такое патч?
Q: Что это за tar-файлы?
Q: А контрольная сумма?
Q: Я делал все, что здесь сказано, при компиляции портов с компакт-диска и все прекрасно работало до тех пор, пока я не попытался установить порт программы kermit.
Q: Я это сделал, но, когда я попытался поместить этот файл в каталог /usr/ports/distfiles, то получил сообщение об ошибке, сообщающее об отсутствии прав доступа.
Q: Система портов работает, только когда все находится в каталоге /usr/ports? Администратор нашей системы сказал, что я должен держать все свои файлы в /u/people/guests/wurzburger, но тогда ничего не работает.
Q: У меня нет компакт-диска с FreeBSD, но я хочу скопировать все tar-файлы вручную на мою систему, чтобы при установке порта не ждать каждый раз, когда же он скачается. Есть ли способ получить все эти файлы сразу?
Q: Я знаю, что, скорее всего, быстрее получится скачивать tar-файлы с одного из ближайших зеркальных серверов FreeBSD. Есть ли способ указать, что порты нужно сгружать оттуда, а не с серверов, указанных в качестве MASTER_SITES?
Q: Я хочу знать, какие файлы нужно будет скачать при выполнении команды make до того, как они начнут скачиваться.
Q: Есть ли способ предотвратить компиляцию порта? Я хочу немножко покопаться в исходных текстах до того, как буду устанавливать порт, однако несколько поднадоедает каждый раз следить и нажимать в нужный момент control-C.
Q: Я пытаюсь создать собственный порт и хочу отключить компиляцию до тех пор, пока не увижу, что мои патчи работают нормально. Есть ли команда типа make extract, но работающая для патчей?
Q: Я слышал, что некоторые параметры работы компилятора могут приводить к ошибкам. Это правда? Как я могу быть уверенным, что порт компилируется с правильными параметрами?
Q: Портов так много, что трудно найти именно тот, который мне нужен. Есть ли где-нибудь список всех имеющихся портов?
Q: Я начал устанавливать порт foo, однако система неожиданно остановила компиляцию и стала компилировать порт bar. Что, собственно, произошло?
Q: Я установил программу grizzle из портов и оказалось, что это бесполезная трата дискового пространства. Я хочу удалить ее, но не знаю, где находятся все файлы этой программы. Что посоветуете?
Q: Минуточку, вы же должны знать номер версии для использования в этой команде. Вы всерьез полагаете, что я должен их все помнить??
Q: Если говорить о дисковом пространстве, то каталог с портами, похоже, занимает ужасно много места. Можно ли удалять отсюда что-нибудь?
Q: Я попробовал сделать так, но все равно все эти архивы или как там вы их называете, остались в каталоге distfiles. Могу ли я удалить и их тоже?
Q: Мне нравится иметь все больше и больше программ для того, чтобы поиграться с ними. Есть ли способ установить все порты за раз?
Q: OK, я попробовал сделать это, но подумал, что этот процесс займет очень много времени, так что пошел спать, оставив все работать. Когда же я посмотрел утром на компьютер, то было откомпилировано только три с половиной порта. Что-то было сделано не так?
Q: Я вовсе не хочу провести весь день, пялясь в монитор. Есть идеи получше?
Q: На моей работе используется программа frobble, которая есть в вашей Коллекции портов, однако мы ее несколько исправили, чтобы получить то, что нужно. Есть ли способ создания наших собственных пакаджей для их распространения по нашим сайтам?
Q: Эта система портов - весьма хитрая штука. Я не могу понять, как вы это делаете. В чем секрет?
Q: Я думал, здесь будут обсуждаться модемы??!

A: А, вы, наверное, имеете в виду последовательные порты на задней панели вашего компьютера. Здесь мы используем слово "порт" в смысле результата "портирования" (переноса) программы с одной версии UNIX на другую.

Q: Я думал, что для установки дополнительных программ вы посоветуете использовать пакаджи?

A: Да, обычно это самый легкий и быстрый способ сделать это.

Q: Если так, то зачем тогда возиться с портами?

A: На это есть несколько причин:

Условия лицензирования некоторых пакетов программного обеспечения запрещают распространение в виде двоичного кода. Они должны распространяться в виде исходного кода.

Некоторые не доверяют дистрибутивам в виде двоичного кода. В конце концов, исходный код вы можете (теоретически) прочесть сами и найти причины появления возможных проблем.

Если у вас есть свои собственные патчи, то вам нужен исходный код для того, чтобы их применить.

У Вас может быть своё мнение по поводу того, как именно должна быть скомпилирована программа, и это мнение может отличаться от мнения того человека, который создавал пакадж--некоторые очень строго придерживаются определённых настроек параметров оптимизации, а также того, строить ли отладочные версии, а затем убирать отладочную информацию командой strip или нет, и так далее.

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

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

Некоторым нравится иметь всегда под рукой исходный код, так что они могут его читать, если им станет скучно, хакать его, заимствовать оттуда что-либо (конечно, если это позволяет лицензионное соглашение), и так далее.

Если у вас нет исходных текстов, то это не программы! ;-)

Q: Что такое патч?

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

Q: Что это за tar-файлы?

A: Это файлы, оканчивающиеся на .tar или, как вариант, на .tar.gz, .tar.Z, .tar.bz2 и даже .tgz.

В основном такие файлы представляют собой дерево каталогов, которое было заархивировано в один файл (.tar) и (может быть) подвергнуто сжатию (.gz). Такая методика первоначально использовалась для архивов на лентах Tape ARchives (откуда, собственно, и пошло слово tar), и она широко используется для распространения исходного кода программ в Интернет.

Вы можете просмотреть, какие файлы находятся в этих архивах, или даже самостоятельно извлечь их с помощью стандартной для UNIX программы tar, включенной в стандартную поставку системы FreeBSD, как здесь:

% tar tvzf foobar.tar.gz
% tar xzvf foobar.tar.gz
% tar tvf foobar.tar
% tar xvf foobar.tar

Q: А контрольная сумма?

A: Это число, получаемое в результате сложения содержимого того файла, который вы хотите проконтролировать. Если меняется хоть один символ, контрольные суммы перестают совпадать, так что простое их сравнение поможет выявить изменение.

Q: Я делал все, что здесь сказано, при компиляции портов с компакт-диска и все прекрасно работало до тех пор, пока я не попытался установить порт программы kermit.

# make install
>> cku190.tar.gz doesn't seem to exist on this system.
>> Attempting to fetch from ftp://kermit.columbia.edu/kermit/archives/.

Почему он не может быть найден? У меня не тот компакт-диск?

A: Как уже было сказано в главе о компиляции портов с компакт-диска, некоторые порты не могут быть помещены на CDROM из-за их лицензионных ограничений. Kermit является примером такого приложения. Его условия лицензирования не позволяют нам поместить его tar-файл на компакт-диск, так что вам придется скачать его вручную--извините!

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

Q: Я это сделал, но, когда я попытался поместить этот файл в каталог /usr/ports/distfiles, то получил сообщение об ошибке, сообщающее об отсутствии прав доступа.

A: При работе система портов ищет tar-файл в каталоге /usr/ports/distfiles, однако вы не сможете скопировать туда ничего, потому что это на самом деле это символическая ссылка на компакт-диск, который доступен только для чтения. Вы можете заставить систему выполнять поиск в другом месте, сделав следующее:

# make DISTDIR=/where/you/put/it install


Q: Система портов работает, только когда все находится в каталоге /usr/ports? Администратор нашей системы сказал, что я должен держать все свои файлы в /u/people/guests/wurzburger, но тогда ничего не работает.

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

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

будет строить порт в каталоге /u/people/guests/wurzburger/ports, а устанавливать все в /usr/local.

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

будет строить порт в каталоге /usr/ports и устанавливать в /u/people/guests/wurzburger/local.

И, наконец,

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

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

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

Q: У меня нет компакт-диска с FreeBSD, но я хочу скопировать все tar-файлы вручную на мою систему, чтобы при установке порта не ждать каждый раз, когда же он скачается. Есть ли способ получить все эти файлы сразу?

A: Чтобы скачать все tar-файлы для Коллекции портов, сделайте вот что:

# cd /usr/ports
# make fetch

Чтобы скачать все tar-файлы для какого-то одного каталога из дерева портов, выполните следующее:

# cd /usr/ports/directory
# make fetch

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

Q: Я знаю, что, скорее всего, быстрее получится скачивать tar-файлы с одного из ближайших зеркальных серверов FreeBSD. Есть ли способ указать, что порты нужно сгружать оттуда, а не с серверов, указанных в качестве MASTER_SITES?

A: Да. Если вы, например, знаете, что ftp.FreeBSD.org гораздо ближе к вам, чем сайты, перечисленные в строке MASTER_SITES, то сделайте так:

# cd /usr/ports/directory
# make MASTER_SITE_OVERRIDE=
ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch

Q: Я хочу знать, какие файлы нужно будет скачать при выполнении команды make до того, как они начнут скачиваться.

A: Команда make fetch-list выдаст список файлов, которые нужны для построения порта.

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

A: При выполнении команды make extract процесс построения остановится после того, как будет сгружен и распакован исходный код порта.

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

A: Ага, make patch - это то, что вы ищете. Также вам может оказаться полезным параметр PATCH_DEBUG. И кстати, благодарим вас за ваши усилия!

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

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

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

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

Параметры компиляции по умолчанию во FreeBSD достаточно консервативны, так что если Вы их не меняли, то и проблем возникнуть не должно.

Q: Портов так много, что трудно найти именно тот, который мне нужен. Есть ли где-нибудь список всех имеющихся портов?

A: Взгляните на файл INDEX в каталоге /usr/ports. Если вы хотите выполнить поиск в коллекции портов по ключевому слову, вы это тоже осуществимо. Например, вы можете найти порты, связанные с языком программирования LISP, с помощью команды:

% cd /usr/ports
% make search key=lisp

Q: Я начал устанавливать порт foo, однако система неожиданно остановила компиляцию и стала компилировать порт bar. Что, собственно, произошло?

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

Q: Я установил программу grizzle из портов и оказалось, что это бесполезная трата дискового пространства. Я хочу удалить ее, но не знаю, где находятся все файлы этой программы. Что посоветуете?

A: Нет проблем, просто сделайте следующее:

# pkg_delete grizzle-6.5

Альтернативным способом является:

# cd /usr/ports/somewhere/grizzle
# make deinstall

Q: Минуточку, вы же должны знать номер версии для использования в этой команде. Вы всерьез полагаете, что я должен их все помнить??

A: Вовсе нет, вы можете выяснить это с помощью:

# 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.

Q: Если говорить о дисковом пространстве, то каталог с портами, похоже, занимает ужасно много места. Можно ли удалять отсюда что-нибудь?

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

# cd /usr/ports
# make clean

в результате чего будет сделан проход по всем подкаталогам и произойдет удаление всего, кроме скелетов каждого порта.

Q: Я попробовал сделать так, но все равно все эти архивы или как там вы их называете, остались в каталоге distfiles. Могу ли я удалить и их тоже?

A: Да, если вы уверены, что с ними покончено, то их тоже можно удалить. Их можно удалить вручную, или командой make distclean.

Q: Мне нравится иметь все больше и больше программ для того, чтобы поиграться с ними. Есть ли способ установить все порты за раз?

A: Просто сделайте вот так:

# cd /usr/ports
# make install

Будьте внимательны, потому что некоторые порты могут устанавливать файлы с уже имеющимися именами. Если Вы устанавливаете два работающих с графикой приложения, и оба они устанавливают файл /usr/local/bin/plot, то у вас однозначно возникнут проблемы.

Q: OK, я попробовал сделать это, но подумал, что этот процесс займет очень много времени, так что пошел спать, оставив все работать. Когда же я посмотрел утром на компьютер, то было откомпилировано только три с половиной порта. Что-то было сделано не так?

A: Нет, проблема в том, что некоторые порты задают вам вопросы, на которые мы не можем ответить за вас (например, "Хотите ли вы печатать на листы формата A4 или US letter?"), но на эти вопросы кто-то должен ответить.

Q: Я вовсе не хочу провести весь день, пялясь в монитор. Есть идеи получше?

A: OK, перед тем, как идти в кроватку/на работу/парк отдыха, сделайте вот что:

# cd /usr/ports
# make -DBATCH install

При этом будут установлены все порты, которым не нужно взаимодействовать с пользователем. Затем, когда вы вернетесь, сделайте:

# cd /usr/ports
# make -DIS_INTERACTIVE install

чтобы завершить работу.

Q: На моей работе используется программа frobble, которая есть в вашей Коллекции портов, однако мы ее несколько исправили, чтобы получить то, что нужно. Есть ли способ создания наших собственных пакаджей для их распространения по нашим сайтам?

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

# cd /usr/ports/somewhere/frobble
# make extract
# cd work/frobble-2.8
[Apply your patches]
# cd ../..
# make package

Q: Эта система портов - весьма хитрая штука. Я не могу понять, как вы это делаете. В чем секрет?

A: Здесь нет никакого секрета, просто взгляните на файлы bsd.port.mk и bsd.port.subdir.mk в каталоге с make-файлами.

(Читателям, испытывающим дурноту при чтении скриптов, советуем не переходить по этой ссылке...)

4.3.2. Помогите! Этот порт не работает!
Если вы встретили порт, который у вас не работает, есть несколько вещей, которые вы можете сделать, а именно:

Исправьте его! Раздел "о создании портов" должен вам помочь.

Надавите--только по электронной почте! Сначала пошлите письмо человеку, сопровождающему порт. Наберите команду make maintainer или прочтите Makefile, чтобы найти его адрес. Не забудьте указать имя и версию порта (скопировав строчку $FreeBSD: из файла Makefile) и включите в письмо весь вывод, предшествующий возникновению ошибки. Если вы не получили ответа от этого человека, то можете воспользоваться командой send-pr для посылки сообщения об ошибке.

Забудьте об этом. Это самый простой путь--лишь весьма незначительное число портов можно отнести к разряду "жизненно необходимых". Также имеется большая вероятность того, что все проблемы будут исправлены в следующей версии при обновлении порта.

Сгрузите пакадж с ближайшего к вам сервера. "Основная" коллекция пакаджей находится на сервере ftp.FreeBSD.org в каталоге с пакаджами, но первым делом проверьте местное зеркало! Это, скорее всего, будет работать, и сделать это, кроме того, будет гораздо быстрее, чем пытаться компилировать порты из исходного кода. Воспользуйтесь программой pkg_add(1) для установки пакаджа в вашей системе.

Обновлено: 12.03.2015