Отправляет email-рассылки с помощью сервиса Sendsay

KirovLUG: пользователи Linux в Вятке

За 2003-09-19

Чтиво: установка сервера часть 010

Лично я замучался в прошлый раз искать пакетики по дикам. Надо это дело
хоть как-нибудь автоматизировать. Как? Есть идея купить CD-changer на 3
диска ;) - шутка. Ладно, диски мы будем вставлять как обычно руками,
зато производить поиск по этим дискам мы будем зараенее, сохранив
информацию о rpm-пакетах в локальной базе данных. Что, сложно? Нифига -
используем нектороые возможности bash и напишем скриптики. Писать их
будем в mcedit.

$ cd ~/
$ mkdir scripts
$ cd scripts/
$ mcedit rpmcrdb

Скрипт первый:
begin rpmcrdb #!/bin/bash

DBPATH=/var/cache/rpmdb
DBFILES=files.db
DBDEPS=deps.db

if [ ! -d $DBPATH ]; then
mkdir $DBPATH
fi

VOLUME_NAME=$2

create () {
# Текущая директория
curdir=`pwd`
# Список всех rpm пакетов во вложенных каталогах
echo Создание списка файлов
echo -n [
for onep in `find -name *.rpm -print`; do
# Полный путь к файлу относительно тек. директории
# без "." в начале
namefp=`echo "$onep" | awk '{print substr($0,2,length($0)-1)}'`
# Имя rpm-файла без пути
namep=`echo "$onep" | awk 'BEGIN {FS = "/"} {print $NF}'`
# Список предоставляемых файлов
rpm -qlp $onep | \
awk -v begstr=$VOLUME_NAME";"$curdir$namefp";"$namep ' \
BEGIN {FS = "/"} { \
print begstr";"$NF}' >> $DBPATH/$DBFILES
# Список зависимостей
rpm -qRp $onep | \
awk -v pack=$namep '{ \
while (gsub(/ $/,"")!=0); \
v=$0; f=v; t=0; \
if (index(v,"/")!=0) { \
f=split(v,ar,"/"); f=ar[f]} \
else if (index(v,"(")!=0) { \
f=substr(v,1,index(v,"(")-1); \
if (index(v,"=")!=0) t=1} \
else if (index(v," ")!=0) { \
f=substr(v,1,index(v," ")-1); t=1} \
else if (index(v,".")==0) t=1; \
print pack";"$0";"t";"f}' >> $DBPATH/$DBDEPS
echo -n .
done
echo ]
}

clean () {
rm -f $DBPATH/$DBFILES
rm -f $DBPATH/$DBDEPS
rmdir $DBPATH
}

case "$1" in
create)
create
;;
clean)
clean
;;
*)
echo "Usage: $0 {create NAME_DISTRIBUTION|clean}"
esac
end rpmcrdb Этот скрипт создает базу данных, пусть его имеет право запускать и
изменять только root, тогда:
$ sudo chown root:root rpmcrdb
$ sudo chmod 754 rpmcrdb
$ ls -l
Здорово.

Создаем второй скриптик:
$ mcedit rpmf

begin rpmf #!/bin/bash

DBPATH=/var/cache/rpmdb
DBFILES=files.db
DBDEPS=deps.db

FINDFLAG=""

findpack () {
listpack=`grep '^[A-Za-z0-9\_]*;[\.A-Za-z0-9/\-]*;[\.A-Za-z0-9/\-]*'$WHATFIND$DBPATH/$DBFILES
| \
awk 'BEGIN {FS = ";"} {print $1":"$3}'`
t=""
for onepack in $listpack; do
if [ "$t" != "$onepack" ]; then
forprint=`echo $onepack | \
sed 's/'$WHATFIND'/\\\\33[32;1;40m'$WHATFIND'\\\\33[0m/g' |
\
sed 's/:/\\\\33[24G/'`
echo -e $forprint
t=$onepack
fi
done
}

findfile () {
listpack=`grep '^[A-Za-z0-9\_]*;[\.A-Za-z0-9/\-]*;[\.A-Za-z0-9/\-]*;'$WHATFIND$FINDFLAG
$DBPATH/$DBFILES | \
awk 'BEGIN {FS = ";"} {print $1":"$3":"$4}'`
t=""
for onepack in $listpack; do
if [ "$t" != "$onepack" ]; then
forprint=`echo $onepack | \
sed 's/'$WHATFIND'/\\\\33[32;1;40m'$WHATFIND'\\\\33[0m/g' |
\
sed 's/:/\\\\33[21G/' | \
sed 's/:/\\\\33[60G/'`
echo -e $forprint
t=$onepack
fi
done
}

WHATFIND=$2
case "$1" in
p)
findpack
;;
f)
findfile
;;
fn)
FINDFLAG="$"
findfile
;;
*)
echo "Usage $0 {p|f|fn} {NAME_PACKET|NAME_FILE}"
esac
end rpmf Этот скрипт осуществляет поиск по базе данных, его запускать могут все,
а изменять только root:
$ sudo chown root:root rpmcrdb
$ sudo chmod 754 rpmcrdb
$ ls -l

Скопируем эти скрипты в /usr/local/bin (этот путь прописан в переменной
PATH всех пользователей) и создадим базу данных.
$ su
$ cp rpm* /usr/local/bin/
$ ls -l /usr/local/bin/
Вставляем первый дистрибутивный диск и монтируем его:
$ mount /mnt/cdrom
$ cd /mnt/cdrom/ASPLinux/
запускаем скрипт создания базы данных
$ rpmcrdb create ASPLinux9_CD1
После того, как процесс закончился - аналогичное проделываем со вторым
и третьим дисками:
$ cd ../../
$ eject
$ mount /mnt/cdrom
$ cd ./cdrom/ASPLinux/
$ rpmcrdb create ASPLinux9_CD2
$ cd ../../ && eject
$ mount /mnt/cdrom && cd ./cdrom/ASPLinux/ && rpmcrdb create ASPLinux9_CD3
$ cd ../../ && eject
$ exit
Все. База данных создана.

Теперь попробуем воспользоваться ее содержимым. Найдем все пакеты,
каторые в своем имени содержат "bis":
$ rpmf p bis
ASPLinux9_CD1 libvorbis-1.0-7.i386.rpm
ASPLinux9_CD1 vorbis-tools-1.0-3.i386.rpm
ASPLinux9_CD3 bison-1.35-6.i386.rpm
ASPLinux9_CD3 libvorbis-devel-1.0-7.i386.rpm
ASPLinux9_CD3 bison-1.35-6.src.rpm
Здесь показано, что "libvorbis-1.0-7.i386.rpm" находится на первом CD,
a "bison-1.35-6.i386.rpm" - на третьем.

Теперь найдем все пакеты, которые предоставляют файл, в имя которого
входит "yacc":
$ rpmf f yacc
ASPLinux9_CD1 a2ps-4.13b-28.i386.rpm yacc.ssh
ASPLinux9_CD1 vim-common-6.1-29asp.i386.rpm yacc.vim
ASPLinux9_CD2 kdelibs-devel-3.1.1-1.1asp.i386.rpm yacc_8cc-source.html
ASPLinux9_CD2 kdelibs-devel-3.1.1-1.1asp.i386.rpm yacc_8cc_8h-source.html
ASPLinux9_CD2 kdelibs-devel-3.1.1-1.1asp.i386.rpm yacc_8h-source.html
ASPLinux9_CD3 automake15-1.5-6.noarch.rpm yacc.am
ASPLinux9_CD3 automake-1.6.3-5.noarch.rpm yacc.am
ASPLinux9_CD3 byacc-1.9-25.i386.rpm yacc
ASPLinux9_CD3 byacc-1.9-25.i386.rpm yacc.1.gz
ASPLinux9_CD3 fpc-1.0.6-1asp.i386.rpm yacclib.o
ASPLinux9_CD3 fpc-1.0.6-1asp.i386.rpm yacclib.ppu
ASPLinux9_CD3 ruby-docs-1.6.8-5.i386.rpm yacc.html
ASPLinux9_CD3 byacc-1.9-25.src.rpm yacc-1.9-fbsd.tar.gz
И последнее, найдем все пакеты, которые предоставляют файл, в имя
которого целиком совпадает с "curses.h":
$ rpmf fn curses.h
ASPLinux9_CD3 ncurses-devel-5.3-4.i386.rpm curses.h
Надеюсь, с выводом все на экран все понятно. Теперь, можно смело
монтировать именно те CD, на котором находится нужный пакет.

C уважением, Kolotov Alexandr (aka mr. Эбола)
отвечать: myscri***@e*****.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

   Kolotov Alexandr 2003-09-19 14:21:57 (#2829)

Чтиво: установка сервера часть 009

По поводу стандартного ядра ASPLinux, его исходников и их апгрейда до
текущей версии. ИМХО, тем способом, который мы рассматривали в прошлом
выпуске, ничего не получится. Ибо ихнее ядро отличается от
оригинального ядра той же версии, взятого с kernel.org. Команда
ASPLinux (как и многие производители дистрибутивов) накладывают
множество различных заплаток, которые влияют (надеюсь, в лучшую
сторону) на безопасность, работу с апаратным обеспечением и т.д.
Поэтому если вы хотите получить обновленное ядро от создателя
дистрибутива, то ищите обновления на его сайте или ftp-серверах.
Например, на текущий момент на сайте ASPLinux, доступно обновленное
ядро для диистрибутива ASPLinux 9, правда оно все-равно версии 2.4.20,
зато в нем исправлены некоторые ошибки и релиз его 2.4.20-20.9.

Вчера скачал обновления для bash и xinetd - теперь хочу обновить эти
пакеты: копирую их на сервер с помощью psftp.exe. Они теперь будут в
каталоге /home/koal/files
$ su
$ ls -l /home/koal/files
-rw-rw-r-- 1 koal koal 3077368 Сен 19 10:01 bash-2.05b-20.1.src.rpm
-rw-rw-r-- 1 koal koal 322258 Сен 19 10:02 xinetd-2.3.11-1.9.0.src.rpm

Перейдем в каталог для пересборки rpm-пакетов. Каталог
/usr/src/asplinux и все его вложенные кталоги создаются пакетом
rpm-build, который должен быть обязательно установлен если вы
собираетесь пересобирать rpm-пакеты из исходинков.
$ cd /usr/src/asplinux
$ cp /home/koal/files/xinetd-2.3.11-1.9.0.src.rpm ./
$ cp /home/koal/files/bash-2.05b-20.1.src.rpm ./
Что ж, начинаем пересобирать пакет:
$ rpmbuild -rebuild bash-2.05b-20.1.src.rpm
Система некоторе время выводит на экран информацию о процессе
пересборки. Ага, все, оснановилась: "Неверный код возврата из
/var/tmp/rpm-tmp.5708 (%build)". Нифига не получилось. В чем проблема?
Поднимаемся чуть выше и видим:
+ make
yacc -d ./parse.y
make: yacc: Команда не найдена
make: *** [y.tab.c] Ошибка 127
ошибка: Неверный код возврата из /var/tmp/rpm-tmp.5708 (%build)
Что ж, замечательно. Ошибка! Опять классическая ситуация - похоже, не
установлен пакет, который содержал бы команду "yacc". Попробуем найти
этот пакет.
Вставляем в cdrom первый диск с дистрибутивом и монтируем его:
$ mount /mnt/cdrom
$ cd /mnt/cdrom
$ ls -1 (здесь уже не l (long), а цифра 1 - в один столбец)
$ cd ASPLinux/RPMS/
Обработаем все файлы, которые предоставляют все rpm-пакеты в текущем
каталоге и выведем на экран только те файлы, которые в своем полном
пути имеют сочетание "yacc" (вот одно, из-за чего мне Линукс нравиться)
$ ls -1 *.rpm | xargs rpm -qpl | grep yacc
Ничего подобного на "/bin/yacc" не похоже, зато мы видим строчку
"/var/cache/yum/mastersite/headers/byacc-0-1.9-25.i386.hdr" - будем
иметь в виду название "byacc-0-1.9-25", скорее всего именно этот пакет
соджержит нужный файл ("/cache/yum" это кэш пакетного менеджера yum, он
содержит имена всех пакетов, к которым yum может иметm доступ - я yum
пользуюсь только в том случае, когда есть возможность репозиторий
rpm-пакетов с CD-дисков переписать на один носитель, потому что yum
пока не приспособлен работать с томами одного репозитория).
Отмонтируем диск и проведем подобную операцию со вторым диском:
$ cd ../../../
$ eject
$ mount /mnt/cdrom
$ cd cdrom/ASPLinux/RPMS
$ ls -1 *.rpm | xargs rpm -qpl | grep yacc
Опять пусто - третий диск:
$ cd ../../../
$ eject
$ mount /mnt/cdrom
$ cd cdrom/ASPLinux/RPMS
$ ls -1 *.rpm | xargs rpm -qpl | grep yacc
Ну вот нашли - выясняем есть ли здесь пакет "byacc":
$ ls -1 | grep byacc
Есть. Точно он содержит дааную программу?
$ rpm -qpl byacc-1.9-25.i386.rpm | grep yacc
Ну да, конечно. Повезло. Бывает хуже. OK. Устанавливаем его:
$ rpm -ihv byacc-1.9-25.i386.rpm
Все, встал.

Возращаемся к пересборке:
$ cd /usr/src/asplinux
$ rpmbuild --rebuild bash-2.05b-20.1.src.rpm
Опять ошибка!
+ gzip -9nf ./usr/share/info/bash.info
gzip: ./usr/share/info/bash.info: No such file or directory
ошибка: Неверный код возврата из /var/tmp/rpm-tmp.41839 (%install)
Здесь уже не смешно. Нет файла "bash.info". Похоже разарботчики забыли
положить его в дистрибутив или что-то другое (может кто мне это
объяснит)? Что ж попытаемся решить и эту проблему. Для этого будем
править spec-файл - это файл последовательности действий для
rpm-сборщика. Так как пакет у нас уже распокавался, то spec-файл от
него лежит /usr/src/asplinux/SPECS - заходим туда:
$ cd SPECS
Вызываем для редактирования "bash.spec"
$ mcedit bash.spec
<F7>(Поиск строки)"bash.info"<ENTER> -> должны попасть на строку вида
"gzip -9nf .%(_infodir)/bash.info" -><F8>(Удалить строку) ->
<F7><ENTER> -> должны попасть на строку вида "%(_infodir)/bash.info*"
-><F8>(Удалить строку)<F7>Нет нифига<F2>(Запись)<F10>Выход

Что ж пробуем теперь пересобрать, но сейчас, так как мы хотим
воспользоваться измененным SPECом, мы должны использовать другие опции:
$ rpmbuild -bb --clean --rmsource --rmspec bash.spec
Все. Теперь скомпилировалось. Если поднимемся чуть выше, то увидим
Записан: /usr/src/asplinux/RPMS/i386/bash-2.05b-20.1.i386.rpm
Записан: /usr/src/asplinux/RPMS/i386/bash-doc-2.05b-20.1.i386.rpm
Запомним это.

Теперь попробуем пересобрать xinetd:
$ cd ../
$ rpmbuild --rebuild xinetd-2.3.11-1.9.0.src.rpm
Ошибка - не найдена программа "libtoolize". Ищем по известному
алгоритму. Программа находится в пакете libtool-1.4.3-5, к счастью, на
оставленном нами в CD-драйве диске. Устанавливаем. Снова пересобираем.
Ура. Готово.
Записан: /usr/src/asplinux/RPMS/i386/xinetd-2.3.11-1.9.0.i386.rpm
Удаляем ненужные нам больше src.rpm пакеты:
$ rm -f *.src.rpm
Заходим в каталог ./RPMS/i386/
$ cd RPMS/i386/
Смотрим, какие версии установлены на текущий момент:
$ rpm -q bash xinetd
Обновляем установленные пакеты, всеми теми пакетами, какие сейчас
находятся в текущем каталоге:
$ rpm -Uhv *.rpm
Проверяем, какие версии стали теперь:
$ rpm -q bash xinetd
Все. Задача выполнена.

Перенесем полученные бинарники в паку /home/koal/files/, но
предварительно изменим права и владельца:
$ chown koal:koal *.rpm
$ chmod 664 *.rpm
$ mv *.rpm /home/koal/files/

Каково впечатление?

C уважением, Kolotov Alexandr (aka mr. Эбола)
отвечать: myscri***@e*****.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

   Kolotov Alexandr 2003-09-19 12:27:35 (#2797)

Ссылки

Поделюсь своими ссылками, которые я просматриваю при поиске новой
Linux-документации и информации о событиях в OpenSource-сообществе:

ASPLinux 9 Обновления http://www.asplinux.ru/ru/support/errata/
ASPLinux Community http://community.asplinux.ru/
atmsk.ru http://www.atmsk.ru/
gazette.linux.ru.net Новости http://gazette.linux.ru.net/news.html
L i n u x S h o p . R u unix4all http://linuxshop.ru/unix4all/
Linux RuNEt - Новости http://linux.ru.net/index.php?module=news
LINUX.ORG.RU http://www.linux.org.ru/
Linux.ру о пингвинах на русском http://www.linux.ru/news/
LinuxBegin.ru http://linuxshop.ru/linuxbegin/
LinuxDoc.ru http://linuxdoc.ru/
LinuxFocus.org http://www.linuxfocus.org/Russian/
Linuxnews.ru http://www.linuxnews.ru/
LinuxRSP.Ru http://www.linuxrsp.ru/
Mozilla.ru http://mozilla.ru/weekly/#news
News - UINC http://www.uinc.ru/news/index.shtml
OpenNet - Каталог тематических статей http://www.opennet.ru/filebase.shtml
OpenNet Project - search http://www.opennet.ru/cgi-bin/opennet/dir_search.cgi?mask=.*&last_day=0&type=0&system=0&dir=1&lines=20
ЛинуксЦентр http://www.linuxcenter.ru/
Мой Компьютер Weekly Статьи не Windows http://www.mycomp.com.ua/articles.php?rubr=soft&subrubr=non-windows

Новости linux.perm.ru http://linux.perm.ru/
СОФТЕРРА - LINUXОИД http://www.softerra.ru/freeos/

C уважением, Kolotov Alexandr (aka mr. Эбола)
отвечать: myscri***@e*****.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

   Kolotov Alexandr 2003-09-19 11:00:42 (#2779)