Установка программ (mc)
Добавлено: 02 мар 2010, 08:44
На примере установки файлового менеджера (mc) посмотрим как устанавливать программы на FreeBSD.
Поставить программу можно разными способами:
1) собрать из исходников
2) собрать из портов
3) поставить из пакета
4) перенести с соседнего компьютера
Первые два способа подразумевают установку программ из исходных кодов, вторые два способа подразумевают перенос уже собраных бинарных файлов.
Самый правильный - первый способ, но он же и самый трудоемкий. Правильный, потому что вы поставите только ту программу, которую хотите, и ничего лишнего, а трудоемкий, потому что прийдется все ошибки решать в ручном режиме и если вы не знаете си, не умеете читать исходиники, или вообще не умеете внимательно читать, да еще и по английски - это не ваша стезя
Второй способ подразумевает что кто-то за вас уже отловил все ошибки, и сделал сценарий, по которуму будет происходить сборка. Установка происходит легко и просто, но вместе с вашей нужной программой вам в систему будет установлено еще куча для вас ненужных программ. делается это для того, что бы у вас гарантировано все стало и заработало - такая, так сказать, плата за вашу лень )
Если же у вас уже есть собраная каким нить из первых способов программа, и вам надо перенести её на другой сервер - вы можете подготовить пакет - грубо говоря посмотреть куда и что стало, и упаковать это все архиватором, а потом на другой машине развернуть, так, что бы оно стало в те же места, где и на первой - это третий способ.
Ну и если вы не умете делать предыдущее - то четвертый способ для вас - вы просто переносите бинарник, запускаете, он матерится, вы даете ему то, на что он матерится и так до тех пор пока не запустится
Ну а рассматривать начнем как всегда с самого простого - то есть с установки с пакетов. Первое, что нам обычно нужно - это файловый менеджер - давайте его и поставим. Итак
собрать, установить, очистить - команды можно вводить по отдельности, а можно вот так сразу. порты - это сценарии сборки - в макфайле уже прописано что и где лежит в нашей системе, если его нет - то прописано в каком порте оно есть - этот порт поставится автоматом. Итак, наша команда делится на три команды - это
make - на этом этапе будут проверены зависимости, скачаны исходники и собраны бинарники
make install - собраные бинарники будут рассованы по системе в нужные каталоги
make clean - будут удалены все временные каталоги, где происходила сборка, и до второго этапа лежали собраные на первом этапе бинарники и распакованые исходники
По мимо этого есть еще и другие команды - наиболее часные
make config - если первый раз что-то не то выбрали, можно переконфигурировать сценарий и пересобрать потом заново
Переодические эти смежные порты чего-то спрашивают - и мы им отвечаем, исходя из тех или иных соображений
И вот у нас все собралось - как видим, акромя самого файлового менеджера мы получили куча программ, которые, может быть, нужны для его работе, а может и не нужны даже совсем, но зато мы получили и сам файловый менеджер. пробуем его запустить... хотя нет, рано - система еще не вкурсе что у нас там где установилось, и нате перечитать переменные окружения, иначе прийдется задавать полный путь до бинарника. Итого - перечитываем и запускаем
Вот мы и поставили программу самым простым способом установки для FreeBSD
Теперь давайте поговорим про третий вариант. На ftp.freebsd.org есть уже собранные пакеты для фри. грубо говоря когда мы ставили фрю с диска - мы какраз и занимались установкой пакетов... можно скачать нужный пакет оттуда - это будет быстрей, чем сборка у себя на сервере, но тут мы поговорим не про это - тут хотелось бы рассмотреть весьма прибледженный к жизни вариант - а именно - у нас есть один сервер, который мы обновили, а рядом стоит такой же сервер, и пересобирать там все заново очень лениво - давайте попробуем решить эту проблему. В качестве обновления второго сервера был выбран третий метод установки программ. Но прежде чем их установить - надо их как-то найти в системе. Итак, делаем на первом, уже обновленном сервере
сам же скрипт сбора программ в пакеты выглядит так
Теперь запускаем скрипт и ждем пока он отработает. началось это примерно так
а закончилось вот так
После этого у меня в каталоге /usr/ports/packages образовалась структура со всеми установленными у меня программами. теперь мы можем упаковать этот каталог и перекинуть его на второй сервер, и там развернуть и установить командой pkg_add.
Поставить программу можно разными способами:
1) собрать из исходников
2) собрать из портов
3) поставить из пакета
4) перенести с соседнего компьютера
Первые два способа подразумевают установку программ из исходных кодов, вторые два способа подразумевают перенос уже собраных бинарных файлов.
Самый правильный - первый способ, но он же и самый трудоемкий. Правильный, потому что вы поставите только ту программу, которую хотите, и ничего лишнего, а трудоемкий, потому что прийдется все ошибки решать в ручном режиме и если вы не знаете си, не умеете читать исходиники, или вообще не умеете внимательно читать, да еще и по английски - это не ваша стезя
Второй способ подразумевает что кто-то за вас уже отловил все ошибки, и сделал сценарий, по которуму будет происходить сборка. Установка происходит легко и просто, но вместе с вашей нужной программой вам в систему будет установлено еще куча для вас ненужных программ. делается это для того, что бы у вас гарантировано все стало и заработало - такая, так сказать, плата за вашу лень )
Если же у вас уже есть собраная каким нить из первых способов программа, и вам надо перенести её на другой сервер - вы можете подготовить пакет - грубо говоря посмотреть куда и что стало, и упаковать это все архиватором, а потом на другой машине развернуть, так, что бы оно стало в те же места, где и на первой - это третий способ.
Ну и если вы не умете делать предыдущее - то четвертый способ для вас - вы просто переносите бинарник, запускаете, он матерится, вы даете ему то, на что он матерится и так до тех пор пока не запустится
Ну а рассматривать начнем как всегда с самого простого - то есть с установки с пакетов. Первое, что нам обычно нужно - это файловый менеджер - давайте его и поставим. Итак
Код: Выделить всё
cd /usr/ports/misc/mc
make install clean
make - на этом этапе будут проверены зависимости, скачаны исходники и собраны бинарники
make install - собраные бинарники будут рассованы по системе в нужные каталоги
make clean - будут удалены все временные каталоги, где происходила сборка, и до второго этапа лежали собраные на первом этапе бинарники и распакованые исходники
По мимо этого есть еще и другие команды - наиболее часные
make config - если первый раз что-то не то выбрали, можно переконфигурировать сценарий и пересобрать потом заново
Переодические эти смежные порты чего-то спрашивают - и мы им отвечаем, исходя из тех или иных соображений
Код: Выделить всё
┌────────────────────────────────────────────────────────────────────┐
│ Options for mc 4.7.0.2_1 │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ [X] SLANG Build with SLang library │ │
│ │ [X] ICONV Build with iconv recoding │ │
│ │ [X] NLS Build with NLS support │ │
│ │ [X] EDIT Build with internal editor │ │
│ │ [ ] X11 Build with X11 library │ │
│ │ [X] SUBSHELL Build with subshell support │ │
│ │ [X] SAMBA Build with Samba support │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
├─└────────────────────────────────────────────────────────────────┘─┤
│ [ OK ] Cancel │
└────────────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────────┐
│ Options for libslang2 2.2.2 │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ [X] PCRE Include pcre support │ │
│ │ [X] PNG Include png support │ │
│ │ [X] ICONV Include iconv support │ │
│ │ [ ] ONIG Include Oniguruma support │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
├─└────────────────────────────────────────────────────────────────┘─┤
│ [ OK ] Cancel │
└────────────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────────┐
│ Options for glib 2.22.4 │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ [ ] COLLATION_FIX fix string collation │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
├─└────────────────────────────────────────────────────────────────┘─┤
│ [ OK ] Cancel │
└────────────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────────┐
│ Options for gamin 0.1.10_3 │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ [ ] GAM_POLLER Use gamin's poller instead of kqueue's │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
├─└────────────────────────────────────────────────────────────────┘─┤
│ [ OK ] Cancel │
└────────────────────────────────────────────────────────────────────┘
Код: Выделить всё
rehash
mc
Теперь давайте поговорим про третий вариант. На ftp.freebsd.org есть уже собранные пакеты для фри. грубо говоря когда мы ставили фрю с диска - мы какраз и занимались установкой пакетов... можно скачать нужный пакет оттуда - это будет быстрей, чем сборка у себя на сервере, но тут мы поговорим не про это - тут хотелось бы рассмотреть весьма прибледженный к жизни вариант - а именно - у нас есть один сервер, который мы обновили, а рядом стоит такой же сервер, и пересобирать там все заново очень лениво - давайте попробуем решить эту проблему. В качестве обновления второго сервера был выбран третий метод установки программ. Но прежде чем их установить - надо их как-то найти в системе. Итак, делаем на первом, уже обновленном сервере
Код: Выделить всё
mkdir /usr/ports/packages
touch /usr/ports/paket.sh
chmod +x /usr/ports/paket.sh
Код: Выделить всё
#!/bin/sh
#
# Create all packages with sym-links for FreeBSD 5.x+
#
# Version: 1.2.2
# Copyright (c) 2006 Alexey Tsvetnov, vorakl@fbsd.kiev.ua
#
# All error in /var/log/<script_name>.err
#
# Path to packages directory
packagespath="/usr/ports/packages"
# Command for get package's version
pkgvercmd="/usr/sbin/pkg_version -v"
#pkgvercmd="/usr/local/sbin/portversion -v"<---># more faster than pkg_version
#-------------------------------------------------------------------------------
err="\033[0;40;31mError\033[0m"
ok="\033[1;40;33mOk\033[0m"
checkPackagesPath ()
{
[ -d $packagespath ] || { /usr/bin/printf " *** $err: $packagespath doesn't exist.\n";.
<------><------><------> /bin/echo " *** Error: $packagespath doesn't exist." > /var/log/`basename $0`.log;.
<------><------><------> exit 1; }
[ -d $packagespath/All ] || { /bin/mkdir $packagespath/All || exit 1; }
[ -d $packagespath/Latest ] || { /bin/mkdir $packagespath/Latest || exit 1; }
return 0
}
checkPkgAll ()
{
[ -f $packagespath/All/$fullname.tbz ] && return 0
return 1
}
checkPkgLatest ()
{
[ -L $packagespath/Latest/$shortname.tbz ] && [ -r $packagespath/Latest/$shortname.tbz ] && return 0
return 1
}
checkPkgCat ()
{
[ -L $packagespath/$subdir/$fullname.tbz ] && [ -r $packagespath/$subdir/$fullname.tbz ] && return 0
return 1
}
createPkgAll ()
{
/usr/sbin/pkg_create -jb $fullname $packagespath/All/$fullname.tbz && return 0
return 1
}
createPkgLatest ()
{
/bin/rm -f $packagespath/Latest/$shortname.tbz
cd $packagespath/Latest && /bin/ln -s ../All/$fullname.tbz $shortname.tbz && return 0
return 1
}
createPkgCat ()
{
if [ -d $packagespath/$subdir ]; then
<------>/bin/rm -f $packagespath/$subdir/$fullname.tbz
else
<------>/bin/mkdir -p $packagespath/$subdir
fi
cd $packagespath/$subdir && /bin/ln -s ../All/$fullname.tbz $fullname.tbz && return 0
return 1
}
getPkgFullVersion ()
{
echo -n "Geting full version package list..."
pkglist=`$pkgvercmd | /usr/bin/awk '{print $1}'`
/usr/bin/printf "$ok\n"
}
work ()
{
for fullname in $pkglist; do
/bin/echo "Check $fullname"
shortname=`/bin/echo $fullname | /usr/bin/sed 's/\-[^-]*$//'`
subdir=`/usr/sbin/pkg_info -o $fullname | /usr/bin/sed -e '1,3d' -e '$d' | /usr/bin/awk -F/ '{print $1}'`
if ! checkPkgAll; then
<------>/bin/echo -n " ==> Create package..."
<------>if createPkgAll; then /usr/bin/printf "$ok\n"
<------> else /usr/bin/printf "$err\n"
<------>fi
<------>/bin/echo -n " ==> Create Latest sym-link..."
<------>if createPkgLatest; then /usr/bin/printf "$ok\n"
<------> else /usr/bin/printf "$err\n"
<------>fi
<------>/bin/echo -n " ==> Create Category sym-link..."
<------>if createPkgCat; then /usr/bin/printf "$ok\n"
<------> else /usr/bin/printf "$err\n"
<------>fi
<------>continue
fi
if ! checkPkgLatest; then..
<------>/bin/echo -n " ==> Create Latest sym-link..."
<------>if createPkgLatest; then /usr/bin/printf "$ok\n"
<------> else /usr/bin/printf "$err\n"
<------>fi
fi
if ! checkPkgCat; then..
<------>/bin/echo -n " ==> Create Category sym-link..."
<------>if createPkgCat; then /usr/bin/printf "$ok\n"
<------> else /usr/bin/printf "$err\n"
<------>fi
fi
done
}
main ()
{
exec 2>/var/log/`basename $0`.log
checkPackagesPath
getPkgFullVersion
work
exec 2>&-
}
main
exit 0
Код: Выделить всё
unix# /usr/ports/paket.sh
Geting full version package list...Ok
Check OpenSP-1.5.2_1
==> Create package...Ok
==> Create Latest sym-link...Ok
==> Create Category sym-link...Ok
Код: Выделить всё
Check zh-ttfm-0.9.5_3
==> Create package...Ok
==> Create Latest sym-link...Ok
==> Create Category sym-link...Ok
unix#