Мої п'ять копійок щодо RPM

Я вирішив вставити свої п'ять копійок щодо RPM - Менеджера Пакетів від Red Hat. Причина написання цієї статті проста - мені сподобалася програма deb-orphan для Дебіан і я вирішив написати подібну програму для дистрибутивів побудованих на RPM. Ця стаття підсумовує мій корисний досвід з цього питання.

Монетки

Копійка

Назву пакету, якому належить файл на диску. можна взнати командою rpm -qf ФАЙЛ:

(lvm@lisa:lvm)$ rpm -qf /etc/passwd
setup-2.5.12-1

Друга копійка

Інформацію про пакет можна отримати командою rpm -qi ПАКЕТ:

(lvm@lisa:lvm)$ rpm -qi setup           
Name          : setup                               Relocations: (not relocateable)
Version   : 2.5.12                                   Vendor: Red Hat, Inc.
Release   : 1                                     Build Date: ср, 03-кві-2002 20:15:15 +0300
Install date: ср, 02-жов-2002 15:33:05 +0300       Build Host: stripples.devel.redhat.com
Group        : System Environment/Base       Source RPM: setup-2.5.12-1.src.rpm
Size          : 34340                                    License: public domain
Packager     : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Summary   : A set of system configuration and setup files.
Description :
The setup package contains a set of important system configuration and
setup files, such as passwd, group, and profile.

Монета в дві копійки

Інформацію про пакет, в яки входить файл, можна взнати командою: rpm -qi `rpm -qf ФАЙЛ`:

(lvm@lisa:lvm)$ rpm -qi `rpm -qf /etc/passwd`
Name          : setup                               Relocations: (not relocateable)
Version   : 2.5.12                                   Vendor: Red Hat, Inc.
Release   : 1                                     Build Date: ср, 03-кві-2002 20:15:15 +0300
Install date: ср, 02-жов-2002 15:33:05 +0300       Build Host: stripples.devel.redhat.com
Group        : System Environment/Base       Source RPM: setup-2.5.12-1.src.rpm
Size          : 34340                                    License: public domain
Packager     : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Summary   : A set of system configuration and setup files.
Description :
The setup package contains a set of important system configuration and
setup files, such as passwd, group, and profile.

Цю команду можна записати у простенькому командному файлі, щоб не набирати її щоразу:

#!/bin/sh
rpm -qi `rpm -qf $@`

збережіть цей текст у файлі з назвою rpm-qfi у каталозі /usr/local/bin та надайте йому права на виконання. Тепер цією командою можна просто скористатися:

(lvm@lisa:lvm)$ rpm-qfi /etc/ntp.conf
Name          : ntp                               Relocations: (not relocateable)
Version   : 4.1.1                                     Vendor: Red Hat, Inc.
Release   : 1                                     Build Date: пн, 08-кві-2002 13:31:06
 +0300
Install date: пн, 18-лис-2002 18:48:17 +0200       Build Host: stripples.devel.re
dhat.com
Group        : System Environment/Daemons    Source RPM: ntp-4.1.1-1.src.rpm
Size          : 2077318                               License: distributable
Packager     : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
URL         : http://www.cis.udel.edu/~ntp
Summary   : Synchronizes system time using the Network Time Protocol (NTP).
Description :
The Network Time Protocol (NTP) is used to synchronize a computer's
time with another reference time source. The ntp package contains
utilities and daemons that will synchronize your computer's time to
Coordinated Universal Time (UTC) via the NTP protocol and NTP servers.
The ntp package includes ntpdate (a program for retrieving the date
and time from remote machines via a network) and ntpd (a daemon which
continuously adjusts system time).

Install the ntp package if you need tools for keeping your system's
time synchronized via the NTP protocol.

Третя копійка

А що якщо нам потрібно взнати не всю інформацію, а лише якесь певне поле, таке як, наприклад, дата побудови чи інсталяції пакета? Нам на допомогу прийде ключик --query-format (або скорочено - --qf). Він дозволяє вказати, які саме поля з інформацією нас цікавлять і як їх виводити, наприклад команда %COMMAND_BEGIN% rpm -q --qf '%{name}: %{summary}\n' ПАКЕТ %COMMAND_END% виведе назву пакета та його короткий опис.

(lvm@lisa:lvm)$ rpm -q --qf '%{name}: %{summary}\n' mm
mm: A shared memory library.

Напишемо невеликий скриптик, який виводитиме назви пакетів разом з їх короткими описами:

#!/bin/sh

if [ "foo$1" = "foo-h" ]
then
  echo "Usage:
  $0 -h
  $0 PACKAGE [PACKAGE...]
  echo PACKAGE [PACKAGE...] | $0

"
  exit 0
fi

if [ "foo$1" = "foo" ]
then
  xargs -l 200 rpm -q --qf '%{name}: %{summary}\n'
else
  rpm -q --qf '%{name}: %{summary}\n' $@
fi

і збережемо його під назвою rpm-summary в каталозі /usr/local/bin.

Четверта копійка

Часто, коли не вистачає місця на диску, хочеться взнати, які саме пакети займають найбільше місця, щоб їх видалити. тому ми напишемо невелику програмульку, яка сортуватиме пакети за їх розміром (в порядку зростання розміру):

#!/bin/sh

if [ "foo$1" = "foo-h" ]
then
  echo "Usage:
  $0 -h
  $0 PACKAGE [PACKAGE...]
  echo PACKAGE [PACKAGE...] | $0

"
  exit 0
fi

if [ "foo$1" = "foo" ]
then
  xargs -l200 rpm -q -qf '%{size}:%{name}\n'
else
  rpm -q -qf '%{size}:%{name}\n' $@
fi | sort -n | cut -d ':' -f 2

збережемо цю програму під назвою rpm-sort-by-size в каталозі /usr/local/bin/.

П'ята копійка

Тепер напишемо програму, яка видаватиме всі пакети, які не вимагаються для роботи іншими пакетами.

#!/bin/sh
rpm -qa|xargs -l200 rpm -q --whatrequires|fgrep 'no package requires'|cut -b 21-|xargs -l200 rpm -q --qf '%{name}\n'

і збережемо її під назвою rpm-orphan у каталозі /usr/local/bin/.

Шкода, але параметр --whatrequires видає неточний результат, так як він перевіряє лише явні залежності, які були вказані у spec-файлах rpm-ок. Автоматичні залежності від бібліотек він не відслідковує, на жаль.

П'ятак

Тепер ми маємо декілька утиліт, якими можемо скористатися для:

  • виводу всіх крайніх (orphan) пакетів, які не вимагаються для роботи інших пакетів (пакети для розробників, прикладні програми, бібліотеки, які не використовуються):

     (lvm@lisa:bin)$ rpm-orphan
     doxygen
     slocate
     gnome-media
     hwinfo
     ...
    
  • з сортуванням їх за розміром у порядку спадання:

     (lvm@lisa:bin)$ rpm-orphan|rpm-sort-by-size|tac
    
     WyabdcRealPeopleTTS
     j2sdk
     kernel-source
     IBMJava2-SDK
     kernel-smp
     pinball
     ...
    
  • та з коротким описом навпроти кожного пакету:

     (lvm@lisa:bin)$ rpm-orphan|rpm-sort-by-size|tac|rpm-summary
     WyabdcRealPeopleTTS: Wyabdc RealPeople TTS
     j2sdk: Java(TM) 2 Software Development Kit, Standard Edition
     kernel-source: The source code for the Linux kernel.
     IBMJava2-SDK: IBM╝ Developer Kit for Linux╝, Java[tm] 2 Technology Edition, Version 1.3
     kernel-smp: The Linux kernel compiled for SMP machines.
     pinball: Emilia Pinball is free OpenGL pinball game.
    

    та повидаляти ті, які нам вже не потрібні, командою rpm -e ПАКЕТ:

     (root@lisa:root)# rpm -e pinball
    

Ось і усе, що я хотів написати.

Автор

-- VolodymyrLisivka - 08-чер-2003

Коментарі


Не зрозумів що таке "Х-ова RPM утиліта" і чому вона "жаж".

Я, як правило, користуюся лише консольними утилітами - менше шансів що вони заглючать при оновлені системи. Але якщо дуже хочеться, то можна скористатися synaptic - цілком нормальний гуй.

-- MarianRachynskyi - 30-лип-2004


Дуже юзфульно - круто. Особливо цікаво, оскільки Х-ова RPM утиліта хоча б в РХ9 просто жаж!

-- IhorRudenko - 29-лип-2004


Під консоль робив. :) Я збільшив шрифт, так що воно має бути читабельніше.

-- VolodymyrLisivka - 08-лип-2003


Цікаво, але на чорному фоні майже нічого не видко. Чи це так задумано?

-- guest - 08-лип-2003