от Дядо Мец(4-07-2004)

рейтинг (31)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

КАКВО ТРЯБВА ДА ЗНАЕМ ЗА RPM


Както повечето от вас знаят - Red Hat, Fedora Core, Mandrake, SuSE и много други дистрибуции използват RPM (RPM Package Manager) за управление на пакети.

Различните инструменти за update на системата в тези дистрибуции (yum, up2date, apt) също използват rpm библиотеките (rpmlib) за достъп до rpm базата данни на дадената
дистрибуция.

Що е то RPM пакет?
RPM пакета е файл, който съдържа в компресиран вид всички файлове (изпълними, конфигурационни, документация), които включва дадена програма. Освен това съдържа кратко описание на програмата, и информация за зависимостите спрямо дуги програми или библиотеки. RPM пакетите улесняват инсталирането, де-инсталирането и проследяването на програмите, с които работим на нашия компютър.

Именуване на RPM пакетите. Името на един RPM пакет се образува от името на програмата, която съдържа, версията на програмата, поредно издание (компилация), хардуеърна архитектура за която е компилирана програмата и завършва с разширение .rpm
По-големия номер след името на пакета означава по-нова версия на програмата.
Например rpm-4.3.1-0.3.i386.rpm се разшифрова като:
Име: rpm
Версия: 4.3.1
Издание: 0.3
PC Архитектура: i386

Да видим как се работи с RPM пакети. Съществуват много графични инструменти за работа с RPM пакети (gnorpm, Kpackage, synaptic), но всички те са frontend към конзолната програма за управление на пакети (rpm), затова ще се спра именно на нея.

ЗАБЕЛЕЖКА: За инсталиране, де-инсталиране, надграждане на RPМ пакети трябва да имате администраторски права (root).

1. Инсталиране и надграждане (upgrade) на RPM пакет.

За да инсталирате даден RPM пакет напишете в конзолата следната команда:

# rpm -i /path/to/package_name.rpm

като /path/to/ заместете с пътя до RPM пакета (например /home/chochko/), a package_name.rpm със действителното име на RPM пакета.

Параметъра -i означава install (инсталирай). Можем да добавим и други параметри към командата rpm.

# rpm -ivh /path/to/package_name.rpm

-v (verbose) ще направи програмата по "многословна" когато извежда обратна информация за това какво изпълнява в момента, а -h добавя изписването на хеш отметки (#) под формата на индикатор за прогреса. Вместо -h може да използвате --percent така индикатора за прогреса ще бъде под формата на процент изпълнена задача.

Надграждането (upgrade) на RPM пакет се прави с командата:

# rpm -Uvh /path/to/package_name.rpm

като параметъра -U (upgrade) първо ще де-инсталира старата версия на програмата, след което ще инсталира новата. Новия пакет ще бъде инсталиран, дори да няма инсталирана стара версия. Затова горната команда освен за надграждане, може да се използва и за инсталиране на нов пакет.

Да си представим, че сме надградили дадена програма до по-нова версия, но същата не е съвместима с други инсталирани програми. Как да върнем старата версия на програмата?

# rpm -Uvh --oldversion /path/to/package_name-old-version.rpm

Параметъра --oldversion означава, че версията на програмата, която инсталираме е по-стара от текущо инсталираната. Т.е. ще направим downgrade. Новата версия ще бъде де-инсталирана, след което ще се инсталира старата версия на програмата.

Параметъра -F (freshen) e подобен на параметъра -U, с тази разлика, че командата:

# rpm -Fvh /path/to/package_name.rpm

ще извърши надграждане до по-нова версия, само ако има инсталирана стара такава. Ако съответната програма не е инсталирана, то няма да се инсталира и новата версия.

2. Де-инсталиране на RPM пакет.

За да де-инсталираме даден пакет от нашата система трябва да изпълним командата:

# rpm -е package_name

Параметъра -е (erase) указва на rpm да де-инсталира (изтрие) даден rpm пакет. Забележете, че с параметъра -е на rpm се подава само името на дадения пакет без версията и архитектурата му. Ако подадете пълното име на RPM пакета ще получите съобщение за грешка, че пакета не е инсталиран.

Нека да обърнем внимание на параметъра --test. Изпълението на командата:

# rpm -e --test package_name

ще направи симулация на де-инсталиране на даден пакет без фактически да го де-инсталира. Това е полезно за откриване на зависимости между пакетите и проверка на коректното изпълнение на дадената функция.

Да речем, че искаме да де-инсталираме някой пакет, но същевременно да си направим резервно копие на този пакет (например, защото сме изтрили оригиналното).

# rpm -e --repackage package_name

Параметъра --repackage ще създаде резервно копие на де-инсталирания пакет, обикновено в директория /var/spool/repackage

Да обърнем внимание на зависимостите между пакетите. Нека изпълним:

# rpm -e --test make (Правим симулация на де-инсталирането на make)

Получаваме следното съобщение за грешка

# rpm -e --test make
error: Failed dependencies:
make is needed by (installed) stunnel-4.05-1
make is needed by (installed) mod_ssl-2.0.49-4
make is needed by (installed) kdevelop-3.0.3-1
make is needed by (installed) ypserv-2.12.1-2
make is needed by (installed) openldap-servers-2.1.29-1
make is needed by (installed) efax-0.9-21
make is needed by (installed) nss_db-2.2-25.1
make is needed by (installed) policy-sources-1.11.3-3
make is needed by (installed) policy-strict-sources-1.11.3-3
make >= 3.78 is needed by (installed) kernel-sourcecode-2.6.6-1.427
/usr/bin/make is needed by (installed) redhat-lsb-1.3-1

Виждаме, че има пакети, които зависят от make и rpm няма да ни позволи да го де-инсталираме. За да открием кои пакети зависят от конкретен rpm пакет изпълняваме

$ rpm -q --whatrequires package_name

Например:
# rpm -q --whatrequires make
stunnel-4.05-1
mod_ssl-2.0.49-4
kdevelop-3.0.3-1
ypserv-2.12.1-2
openldap-servers-2.1.29-1
efax-0.9-21
nss_db-2.2-25.1
policy-sources-1.11.3-3
policy-strict-sources-1.11.3-3
kernel-sourcecode-2.6.6-1.427

В този случай, за да де-инсталираме даден пакет, трябва първо да де-инсталираме всички пакети които зависят от него. Съответно, ако от тези пакети зависят други пакети, трябва да деинсталираме първо тях... и т.н. Получава се нещо като омагьосан кръг.

За да си улесните живота използвайте yum или apt които следят за зависимостите между пакетите и ще ви предложат пълен списък на пакетите които ще бъдат де-инсталирани, ако решите да де-инсталирате даден пакет.

ВНИМАНИЕ: Параметрите --nodeps и --force ще ви позволят да деинсталирате даден пакет без оглед на евентуалните зависимости и възможните грешки. Това е изключително опасно за вашата система, затова се въздържайте от употребата им. ПОСЛЕДИЦИТЕ МОЖЕ ДА СА НЕПОПРАВИМИ!

3. Извеждане на информация за RPM пакети.

Да предположим, че имаме инсталиран RPM пакет, но не знаем нищо за него. Как да открием какво представлява, за какво служи, какво съдържа? Тука ни идва на помощ параметъра -q (query) запитване.

Информация за версията, изданието на пакета:

$ rpm -q make
make-3.80-3

Пълна информация за даден RPM пакет:
$ rpm -qi make
Name : make Relocations: /usr
Version : 3.80 Vendor: Red Hat, Inc.
Release : 3 Build Date: Tue 17 Feb 2004 11:03:27 AM EET
Install Date: Wed 19 May 2004 06:30:25 PM EEST Build Host: tweety.devel.redhat.com
Group : Development/Tools Source RPM: make-3.80-3.src.rpm
Size : 754691 License: GPL
Signature : DSA/SHA1, Fri 07 May 2004 01:56:18 AM EEST, Key ID b44269d04f2a6fd2
Packager : Red Hat, Inc. " target="_blank">http://bugzilla.redhat.com/bugzilla>
Summary : A GNU tool which simplifies the build process for users.
Description :
A GNU tool for controlling the generation of executables and other
non-source files of a program from the program's source files. Make
allows users to build and install packages without any significant
knowledge about the details of the build process. The details about
how the program should be built are provided for make in the program's
makefile.

The GNU make tool should be installed on your system because it is
commonly used to simplify the process of installing programs.

Както виждате командата rpm -qi package_name извежда пълна информация за името, версията, датата на инсталиране, размера и т.н. на дадения пакет плюс кратко описание. В случая параметъра i не е същия, който се използва за инсталиране на пакет, а означава (information) информация.

Обърнете внимание на параметъра -а (all) всички. Командата

$ rpm -qa

ще изшише на екрана имената на всички инсталирани пакети във вашата система. Списъкът е доста дълъг. Но как да проверим дали имаме инсталиран да речем mysql? Тука ни идва на помощ програмата grep, която търси текстови низове по зададен
шаблон.

$ rpm -qa | grep -i mysql
mysql-jdbc-3.0.8-2
qt-MySQL-3.3.2-2
mysql-server-3.23.58-9
mysql-devel-3.23.58-9
freeradius-mysql-0.9.3-4
libdbi-dbd-mysql-0.6.5-8.1
mysql-3.23.58-9
perl-DBD-MySQL-2.9003-4
mysql-jdbc-tomcat-3.0.8-2
php-mysql-4.3.6-5
MySQL-python-0.9.2-3.1
mod_auth_mysql-20030510-4.1
mysql-bench-3.23.58-9

Искаме да видим списък на всички файлове, които е инсталирал даден rpm пакет? Използваме параметъра -l (list) покажи списък

$ rpm -ql less
/etc/profile.d/less.csh
/etc/profile.d/less.sh
/usr/bin/less
/usr/bin/lessecho
/usr/bin/lesskey
/usr/bin/lesspipe.sh
/usr/share/man/man1/less.1.gz
/usr/share/man/man1/lesskey.1.gz

Добре, а обратно - как да разберем даден файл към кой пакет принадлежи? Параметъра е -f (file) файл.

$ rpm -qf /usr/bin/ncftpput
ncftp-3.1.7-2

Добре, но всичко това ни дава информация за вече инсталирани пакети. Можем ли да изведем същата информация за неинсталиран пакет? Разбира се, с помощта на параметъра -p (package) пакет

rpm -qpi /usr/src/redhat/RPMS/i386/bcv-2.2-2.i386.rpm
Name : bcv Relocations: /usr
Version : 2.2 Vendor: (none)
Release : 2 Build Date: Sun 06 Jun 2004 12:05:09 PM EEST
Install Date: (not installed) Build Host: some.hostname.com
Group : Utilities Source RPM: bcv-2.2-2.src.rpm
Size : 7080 License: GPL
Signature : (none)
Packager : Gregoire Barbier barbier@sycomore.fr>
URL : http://www.gbarbier.org/
Summary : a command-line numeric bases converter
Description :
Converts number to/from decimal, hex, bin, octal and ascii on the
command line.
Useful for debuging and so on.

Обърнете внимание, че за неинсталиран пакет, на rpm се подава пълния път към местонахождението и пълното име на пакета, за който правим запитване.

$ rpm -qpl /usr/src/redhat/RPMS/i386/bcv-2.2-2.i386.rpm
/usr/bin/bcv
/usr/man/man1/bcv.1.gz

4. Проследяване на зависимостите.

Много често когато искаме да инсталираме даден RPM пакет получаваме съобщение за грешка, че не са изпълнени определени зависимости за да се инсталира пакета. Т.е. нашия пакет зависи от други пакети за да работи коректно. Как да проверим тези зависимости? Параметърът -R (requires - изисква) на rpm ни идва на помощ.

$ rpm -qpR /usr/src/redhat/RPMS/i386/centericq-4.10.0-1.i386.rpm
/bin/sh
/usr/bin/perl
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.3)
libc.so.6(GLIBC_2.3.4)
libcom_err.so.2
libcrypto.so.4
libcurl.so.2
libdl.so.2
libgcc_s.so.1
libgcc_s.so.1(GCC_3.0)
libgssapi_krb5.so.2
libjpeg.so.62
libk5crypto.so.3
libkrb5.so.3
libm.so.6
libm.so.6(GLIBC_2.0)
libncurses.so.5
libnsl.so.1
libresolv.so.2
libssl.so.4
libstdc++.so.5
libstdc++.so.5(CXXABI_1.2)
libstdc++.so.5(GLIBCPP_3.2)
libz.so.1
ncurses >= 4.2
openssl
perl(Time::Local)
rpmlib(CompressedFileNames) rpmlib(PayloadFilesHavePrefix)
Както виждате дълъг списък от зависимости! /bin/sh; perl; сума ти библиотеки...; ncurses; openssl; perl модули... За да функционира нормално centericq (конзолен ICQ клиент) е необходимо да имаме инсталирани всички тези програми и библиотеки. За начинаещия потребител на Linux е меко казано невъзможно да се оправи със всичките тези зависимости. Тук ни идват на помощ yum, up2date, apt - програми за управление на пакетите, които използват RPM (при RPM базираните дистрибуции), но следят и за зависимостите между пакетите, като ви предлагат да инсталират необходимото вместо вас.

Но това е предмет на отделна статия... За сега ще се придържаме към възможностите
na RPM.

Нека да проверим зависимостите на вече инсталиран пакет:

$ rpm -qR kernel
rpmlib(VersionedDependencies) fileutils
module-init-tools
initscripts >= 5.83
mkinitrd >= 3.5.5
/bin/sh
rpmlib(PayloadFilesHavePrefix) rpmlib(CompressedFileNames)
Виждате от колко неща зависи ядрото на вашата Операционна Система.

5. Инсталация на пакети директно от Internet.

За да инсталирате RPM пакет, не е необходимо същия да се намира на локалната ви файлова система. Напълно е възможно инсталирането през интернет. Да видим как става това:

# rpm -Uvh ftp://user:pass@ftpserver/directory/package.rpm

Горната команда ще изтегли и инсталира RPM пакет със име package.rpm от FTP сървър, наречен ftpserver, като user и pass са съответно вашето потребителско име и парола за този сървър.

За достъп до FTP сървъри, позволяващи анонимен достъп е достатъчно:

# rpm -Uvh ftp://ftpserver/directory/package.rpm

Естествено, всички комбинации от параметри, описани по-горе са възможни и чрез отдалечен достъп:

# rpm -qpl --ftpproxy proxyserver --ftpport port ftp://ftpserver/dir/remote-package.rpm

С тази команда правим запитване за файловете, които се съсдържат в пакета remote-package.rpm на FTP сървър ftpserver в директория dir, със активен порт port (--ftpport port) и прокси сървър на заявката proxyserver...

Сложно ли ви се вижда... Да сложно е, но за сметка на това - функционално. Някой ще попита: А не може ли да си изтеглим RPM пакета и тогава работим с него?
Естествено, че може! Даже е по-лесно ;) Но това е същността на Linux - всяко нещо може да се направи по много различни начини. Истинския хакер обича предизвикателствата :) И сложните команди от конзола.
Ето и вариант на горната команда, но през WEB сървър:

# rpm -qpR --httpproxy proxyserver --httpport port http://webserver/dir/remote-package.rpm

Супер, а? 'Айде накарайте някой от вашите опоненти да инсталира WIN програма по този начин ;)

6. НЕкои съображения.

Не бързайте да инсталирате с $ rpm -ivh Припомнете си параметъра --test и не забравяйте да го използвате при инсталация или надграждане на критични пакети: например kernel.

# rpm -ivh --test new-kernel.rpm

Може да ви спести много неприятности: липса на дисково пространство, проблеми със зависимости и т.н. Ако няма съобщения за грешка - опитайте да накарате rpm да се "разбъбри", използвайки параметъра -v (а защо не и -vv)

---

Често допускана грешка при надграждане на съществуваща система:

# rpm -Uvh /path/to/*.rpm

Тази команда ще надгради всички пакети, които се намират в директория /path/to/ Често обаче можем да срещнем различни версии на един и същ пакет - например

glibc-2.3.2-101.4.i386.rpm
glibc-2.3.2-101.4.i686.rpm

На пръв поглед - едно и също, но на практика... i386 ще проработи на 686 arhitektura, но няма да е оптимизирано за това, но пък i686 - НЯМА да се понесе с 386 архитектурата

Затова, подреждайте си RPM пакетите, сваляйте само тези, които са за вашата архитектура, не задавайте wildcards като параметър на командата rpm...!
И не забравяйте параметъра --test !!!

---

Ако искате да надградите ядрото на вашата система - уверете се, че RPM пакета е за вашата дистрибуция. Проверете архитектурата на пакета...

# rpm -q --qf "Kernel arch type is: %{ARCH}\nKernel name is: %{VERSION}\n" kernel

Например smp във името на пакета означава, че ядрото е за многопроцесорни системи, i386, i586, i686, athlon, a64 са означенията за съответната архитектура, bigmem ще рече, че ядрото е компилирано с поддръжка на повече от 4 GB RAM...

A най-добре си компилирайте ядрото от изходния код.

---

Създаване на резервно копие при надграждане на пакет:
Досетихте ли се?

# rpm -Uvh --repackage new-package.rpm

7. SRPM - Source RPM или пакети с изходен код.

Всички сте виждали пакети с име packаgе-X.X-X.src.rpm
какво предствлява този пакет? Това е RPM пакет, съдържащ изходния код на дадена програма. Е, какво да ги правим тези пакети? Ами прекомпилираме ги с помощта на rpm.

# rpmbuild --rebuld /path/to/package_name.src.rpm

при успешна компилация готовия пакет ще бъде записан в директория /usr/src/redhat/arch (или /usr/src/mandrake/arch) където arch е вашата архитектура (i386, i586, i686) след което може да го инсталирате по описаните вече начини.

А можем ли да инсталираме такъв пакет? Естествено! При инсталация на SRPM същия ще се инсталира както следва (пътищата са дадени за Red Hat съвместима ситема):

/usr/src/redhat/SOURCES -- изходния код на пакета
/usr/src/redhat/SPECS -- специалния package.scpec файл, който съдържа инструкции за компилиране
и пакетиране на готовия пакет.

Как да компилираме вече инсталиран SRPM?
Използваме параметъра -b (build) на rpm. (В по-новите версии на програмата командата е rpmbuild)

# rpmbuild -ba /usr/src/redhat/SPECS/package.spec

От build all. Ще компилира изходния код и ще запише готовия пакет в
/usr/src/redhat/RPMS/arch/package-X.X-X.arch.rpm
както и SRPM в
/usr/src/redhat/SRPMS/package-X.X-X.src.rpm

# rpmbuild -bb /usr/src/redhat/SPECS/package.spec

От build binary. Компилира изпълнима версия на програмата (двоичен код) и записва готовия RPМ пакет в /usr/src/redhat/RPMS/arch/package-X.X-X.arch.rpm Като arch е архитектурата за която е компилиран пакета (i386. i586, i686 и т.н.)

8. Проверка на checksum и подпис на RPM пакет.

Всеки RPM пакет може да бъде подписан с GPG публичен ключ, и има MD5 хеш, който служи за удостоверяване валидността на пакета. GPG подписа може да бъде проверен само, ако разполагаме с публичния GPG ключ на автора на пакета. Как да добавим GPG ключ? Използваме параметъра --import.

# rpm --import /usr/share/rhn/GPG-KEY

Проверка на инсталираните GPG публични ключове:

# rpm -qa gpg-pubkey*

Информация за конкретен GPG публичен ключ:

# rpm -qi gpg-pubkey-db42a60e

Като db42a60e е индикатива на конкретния ключ.

Публичните GPG ключове магат да се де-инсталират (изтриват) не по-различно от RPM пакети:

# rpm -e gpg-pubkey-db42a60e

И накрая за проверка на консистентността на пакета използвайте параметъра -К

# rpm -vvK /usr/src/redhat/RPMS/i386/checkinstall-1.5.3-3.dag.i386.rpm
D: Expected size: 50061 = lead(96)+sigs(180)+pad(4)+data(49781)
D: Actual size: 50061
/usr/src/redhat/RPMS/i386/checkinstall-1.5.3-3.dag.i386.rpm:
Header SHA1 digest: OK (78d4fc3d05c0091da70e379283f1d3c58e4e5f50)
MD5 digest: OK (8226145156b91dce683ac73429d56416)

9. Променливи на средата на rpm.

При всяка дистрибуция е различно. Все пак rpm ни дава възможност да разберем каква неговата конфигурация:

$ rpm --showrc

Списъка е много дълъг. То не са променливи, макро дефиниции, локализации... Не се бойте - няма да ви трябва! И въпреки всичко е много полезно дори и за най-начинаещия потребител. Помните ли параметъра --repackage? Да? Обаче не можете да намерите къде rpm записва копията на деинсталираните пакети?

# rpm --showrc | grep repackage
-14: _repackage_all_erasures 0
-14: _repackage_dir /var/spool/repackage
-14: _repackage_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
-14: _repackage_root %{nil}

Видяхте ли? Cool, a?

10. RPM се скапа! Какво да правим?!

Програмата rpm си изгражда собствена база данни за инсталираните пакети и при изпълнението на дадена команда се допитва до нея, вместо да чете целия твърд диск и проверява какво е инсталирано и къде. Е никой не е безгрешен - rpm също. От време на време се случва базата данни да се повреди и тогава rpm командада "увисва" или "гърми". Спокойно - нищо не е загубено! Сега ще възстановим базата данни на rpm:

rm -f /var/lib/rpm/__* ; rpm -vv --rebuilddb

Внимание: Може да отнеме доста време! Всичко зависи от количеството инсталирани RPM-и, както и от бързодействието на вашата машина.

11. Други "гъдели".

Искало ли ви се е да си направите списък кога, какво сте инсталирали? Е, rpm отново идва на помощ:

$ rpm -qa --last

ще ви даде списък на всички инсталирани RPM пакети подредени по дата на инсталиране, като най-пресните са най-отгоре. Сортиране в обратен ред? ОК:

$ rpm -qa --last | tac

Сортиране на инсталираните пакети подредени по размер? Нали не си мислите, че е невъзможно?

rpm -qa --queryformat '%10{size} %{name}-%{version}\n' | sort -n

От най-малкия към най-големия?

rpm -qa --queryformat '%10{size} %{name}-%{version}\n' | sort -rn


*****

Е стига толкова за rpm, че ще ви се види прекалено сложен ;) Надявам се това четиво да е било поне малко полезно за начинаещите в Linux.

И дано поне един от вас да е оценил по многообразието на тази операциона система. Нека все пак не забравяме - rpm е само едната страна на нещата. Има и други мениджъри на пакети: deb - в Debian; tgz - Slackware (хмммм... много хляб има да изяде) и др.

СПЕЦИАЛНИ БЛАГОДАРНОСТИ:
Създателите на RPM (Red Had Inc) и в частност:
Marc Ewing marc@redhat.com>
Jeff Johnson jbj@redhat.com>
Erik Troan ewt@redhat.com>
Автора на "All You Have to Know about RPM" - Alexandre de Abreu,
Ramon Gutierrez и Sandy Pond за готините идеи;
Linus Torvalds - да обяснявам ли защо?
...и всички разработчици и потребители на Linux.


<< КАКДА Компилираме KDE & QT | VPN на базата на OpenSwan, OpenSSL, L2TPD >>