Управление на пакети

1.       Въведение

2.       Команда dpkg

3.       Команда apt

4.     Команда snap

5.       Обновяване към следваща версия

6.       Изчистване на стари версии на ядрото

За системи преди дистрибуция 16.04+

За дистрибуция 16.04+

7.       Автоматично обновяване на пакети

8.       Конфигуриране на хранилищата

9  Примери

       Инсталиране на Java 

       Инсталиране на Eclipse

       

 

        1.        Въведение

Съвременните Linux базирани операционни системи управляват инсталирането, актуализирането и премахването на софтуер, чрез предварително компилирани пакети (packages), които са архиви включващи всички необходими бинарни файлове, конфигурационни файлове и метаданни за осигуряване на дадена функционалност.  

Системата за управление на пакети в Ubuntu е базирана на системата използвана от Debian GNU/Linux дистрибуциите. Пакетните файлове на Debian са с разширение .deb.

Пакетите се съхраняват се в хранилища (repositories) – колекции от пакети върху различни медии – дискове или онлайн. Инсталацията им е бърза и не изисква компилиране на софтуера. Хранилищата са различни в зависимост от лиценза на софтуера.  Хранилищата са достъпни чрез голямо количество "mirrors" (огледални сървъри), които са разположени на географски принцип.  Ubuntu машината се абонира за най-близкия (с който има най-бърза връзка) mirror. Осъвременяването на пакетиите в тези сървъри се извършва много често, понякога по няколко пъти на ден, особено ако се касае до открити проблеми в сигурността.

Съгласно документацията на Ubuntu:

The four main repositories are:

Инсталационният файл (.iso) включва пакетите от хранилищата Main и Restricted , което позволява инсталирането на операционната система и без интернет връзка. Веднага след инсталцията е необходимо обновяване на пакетите от съответния mirror.

Освен пакетите хранилишата включват и друга информация - индекси, контролни суми, информация за версията, и се съхраняват в дървовидна структура. Хранилищата съхраняват различни версии (releases). Всеки release  има пакети за различни архитектури (amd64, i386, mips, powerpc, s390x, ...) както и  sources и архитектурно независими пакети. Пакетите са разделени в отделни комплекти (suites)- stable, oldstable, testing, unstable.  Повече за формата на хранилищата може да видите тук.

Сложните пакети изискват инсталирани други пакети за да работят – пакетна зависимост(dependencies), която се осигурява автоматично от системата за управление при инсталирането на пакетите. Честото обновяване на пакетите изисква преди всяка инсталация на нов пакет да се извършва обновяване на инсталирираните пакети за осигуряване на коректна пакетна зависимост.

Debian използва съвкупност от софтуерни инструменти за управление на пакети наречени  Advanced Packaging Tool (APT) . Има различни команди, които взаимодейстават с APT и позволяват инсталирането, премахването и управлението на пакетите. Едни от най-поулярните са dpkg, apt-get, apt-cache (вместо последните две от версия 16.04 се предлага по модерната версия  apt).

Недостатък на .deb пакетите, че те са свързвани с библиотеките от  съответния release,  в следствие на което при разработката на нов пакет, ползващ нова библиотека, той обикновено не може да бъде предоставен на потребителите до излизането на съответния release, а разработчика трябва да компилира пакета поотделно за всеки release.

Универсалните пакети (Universal packages) са нова концепция за Linux, като идеята е пакета да включва в себе си всички необходими библиотеки и да може да бъде използван независимо от текущата дистрибуция. По настоящем има три конкуращи се технологии за това - Flatpak, AppImage и Snap пакети.

        2.        Команда dpkg

Командата dpkg (Debian package manager) е средство за управление на пакетите в Debian базирани системи. За разлика от други средства не може да се използва за автоматично сваляне и инсталиране на зависимости на нови пакети. В този раздел са описани някои от  възможностите му за управление на вече инсталирани пакети.

·        За показване на всички инсталирани пакети:

$ dpkg -l

Тъй като списъкът е много голям, изходът от командата обикновено се насочва към команда за филтриране за да се провери дали конкретен пакет е инсталиран например пакета base-files:

$ dpkg -l | egrep base-files

Може да се използва името на пакета, част от него или регулярен израз.

$ dpkg -l | egrep base-f

 

·        За показване файловете инсталирани от даден пакет например пакета base-files:

$dpkg -L base-files 

$ dpkg -L base-files |egrep hos
/etc/host.conf

·        За показване кой пакет е инсталирал даден файл – например файла /etc/host.conf:

$ dpkg -S /etc/host.conf

·

Резюме на възможните опции:

Синтаксис Описание Примери
dpkg -i {.deb package} Install the package dpkg -i zip_2.31-3_i386.deb
dpkg -i {.deb package} Upgrade package if it is installed else install a fresh copy of package dpkg -i zip_2.31-3_i386.deb
dpkg -R {Directory-name} Install all packages recursively from directory dpkg -R /tmp/downloads
dpkg -r {package} Remove/Delete an installed package except configuration files dpkg -r zip
dpkg -P {package} Remove/Delete everything including configuration files dpkg -P apache-perl
dpkg -l List all installed packages, along with package version and short description dpkg -l
dokg -l | less
dpkg -l '*apache*'
dpkg -l | grep -i 'sudo'
dpkg -l {package} List individual installed packages, along with package version and short description dpkg -l apache-perl
dpkg -L {package} Find out files are provided by the installed package i.e. list where files were installed dpkg -L apache-perl
dpkg -L perl
dpkg -c {.Deb package} List files provided (or owned) by the package i.e. List all files inside debian .deb package file, very useful to find where files would be installed dpkg -c dc_1.06-19_i386.deb
dpkg -S {/path/to/file} Find what package owns the file i.e. find out what package does file belong dpkg -S /bin/netstat
dpkg -S /sbin/ippool
dpkg -p {package} Display details about package package group, version, maintainer, Architecture, display depends packages, description etc dpkg -p lsof
dpkg -s {package} | grep Status Find out if Debian package is installed or not (status) dpkg -s lsof | grep Status

За повече информация –

man dpkg

 

        3.        Команда apt

Командата apt е мощно командно средство в Ubuntu, което инсталира, обновява (upgrade) и премахва пакети, актуализира (update) индексите на хранилищата, и дори обновява цялата операционна система. Има редица предимства – може да се използва върху проста терминална връзка и може да се включва в скриптове,  които могат да се стартират автоматично (например с cron scheduling utility).  

Командата може да се използва вместо по-старите команди  apt-get и apt-cache и предоставя по-опростен и интуитивен  интерфейс за най-често използваните в тях опции.

Инсталиране на пакет

$sudo apt install <PackName>

Деинсталиране на пакет

$sudo apt remove  <PackName>

С премахване на конфигурационните файлове

$sudo apt purge <PackName>

Ако са повече от един се разделят с интервал

$sudo apt install <PackName1>  <PackName2>

$sudo apt purge<PackName1>  <PackName2>

За премахване на остарелите пакети

$sudo apt autoremove

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

 

Актуализиране на локалния индекс на пакетите с промените в хранилищата

$sudo apt update

 

Обновяване на пакетите. С времето обновени версии на пакетите, някои от които са свързани със сигурността се появяват в хранилищата. За да бъдат обновени инсталираните пакети след актуализация на локалния индекс:

$sudo apt upgrade

Обновяването на пакетите включва и обновяване на ядрото на операционната система. Може изрично да се поиска проверка и ибновяване на ядрото с:

$sudo apt full-upgrade

Версията на Ubuntu  се проверява с

$lsb_release -a

А версията на ядрото – с:

$ uname -r

Ако възникне проблем с някоя нова версия на ядрото може да се поиска връщане към по-стара версия (downgrade). Как става това подробно може да се види тук.

Списъкът с хранилищата и техните адреси може да бъде променян с

$sudo apt edit-sources

който осигурява редактиране на файла с хранилищата. При първо пускане трябва да бъде избран editor, който ще се използва (може след това да бъде промененен с командата 'sudo select-editor')

Команди apt-get и apt-cache, които се заместват с apt

apt command the command it replaces function of the command
apt install apt-get install Installs a package
apt remove apt-get remove Removes a package
apt purge apt-get purge Removes package with configuration
apt update apt-get update Refreshes repository index
apt upgrade apt-get upgrade Upgrades all upgradable packages
apt autoremove apt-get autoremove Removes unwanted packages
apt full-upgrade apt-get dist-upgrade Upgrades packages with auto-handling of dependencies
apt search apt-cache search Searches for the program
apt show apt-cache show Shows package details

Следните команди  са без аналог в apt-get и apt-cache:

new apt command function of the command
apt list Lists packages with criteria (installed, upgradable etc)
apt edit-sources Edits sources list

Допълнителна информация за командата може да се намери с

$apt help

Забележка:

При актуализиране на ядрото понякога се налага ръчно актуализиране на някои драйвери. Често това се случва с графична карта nvidia, което води до проблеми с графичния интерфейс. В този случай се проверява модела на nvidia graphic card  и се инсталира препоръчвания драйвер:

$ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001C03sv00001043sd000085ABbc03sc00i00
vendor   : NVIDIA Corporation
model    : GP106 [GeForce GTX 1060 6GB]
driver   : nvidia-driver-390 - distro non-free
driver   : nvidia-driver-435 - distro non-free
driver   : nvidia-driver-440 - distro non-free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin

След което се инсталира препоръчания драйвер (в случая nvidia-driver-440 )  чрез:

$ sudo ubuntu-drivers autoinstall

или чрез:

$sudo apt install nvidia-driver-440

Необходимо е рестартиране:

$sudo reboot                 

Проверка кой е инсталираният драйвер може да се извърши с:

$ nvidia-smi

Ако има проблеми при инсталирането на фирмените драйвери на nvidia, те може да се деинсталират, след което да се опита  с новия  драйвер

$  sudo apt purge nvidia-XXX
$sudo apt install xserver-xorg-video-nouveau

След което е необходимо рестартиране на системата

 

4.        Команда  snap 

Snap (известен също катоSnappy) е софтуерно средство за инсталиране и управление на пакети създадено от Canonical (компанията зад Ubuntu). Пакетите се наричат "snaps",  а услугата, която работи с тях "snapd". Тя работи с почти всички "Linux" дистрибуции. 

Snapd представлява REST API демон за управление на  snap пакети. Потребителите могат да го ползват чрез  snap клиент, който е част от същия пакет. Позволява пакетирането на всяка апликация от всеки  Linux станция, сървър, облак  или устройство. В този смисъл  snap изпълнява дейност подобна на apt , но по друг начин.

Инсталиране

В дистрибуцията  Ubuntu 16.04+ Snapd е инсталиран и готов за употреба. За други дистрибуции:

$ sudo apt update
$ sudo apt install snapd

Търсене на на налични snaps пакети по част от името

$ snap find <search_text>

Инсталиране на пакет

$ sudo snap install <package>

Списък на инсталираните snaps  пакети

$ snap list

Обновяване  на инсталираните snaps пакети.  Тези пакети се обновяват автоматично от демона, но могат да бъдат  обновени и ръчно

$ sudo snap refresh <package>

Списък на пакетите  с готови версии за обновяване

$ sudo snap refresh --list

Връщане към предишна версия на обновен пакет:

$ sudo snap revert <package>

Дезинсталиране на инсталиран snaps  пакет:

$  sudo snap remove <package>

Временно дезактивиране и активиране на инсталирани snaps  пакети

$ sudo snap disable <package>
<package> disabled

$ sudo snap enable <package>
<package> enabled

Допълнителна информация може да се намери с

$ man snap

        5.        Обновяване към следваща версия

Има различни начини за обновяване на версията на Ubuntu . Препоръчваният от Ubuntu начин е да се използва do-release-upgrade utility, който е част от update-manager-core пакет, инсталиран по подразбиране. 

$do-release-upgrade

Ако текущата версия на Ubuntu е LTS, то като следваща версия за обновяване по подразбиране е също LTS.  Така например 16.04 може да се обнови по този начин само след появяването на 18.04.01.

Ако се търси обновяване по-рано трябва да се подаде команда за обновяване към  версия в развитие (development):

$do-release-upgrade -d

Обновяване към версия в развитие не се препоръчва за реално работеща система.

 

Забележка: Базираните на Debian системи могат също така да бъдат обновявани с apt dist-upgrade  Тази команда обаче не осигурява промяната в  конфигурационните файлове която понякога се налага между версиите.  

        6.        Изчистване на стари версии на ядрото

За системи преди дистрибуция 16.04+ се извършва за всяко ядро поотделно.

В терминален прозорец се проверява текущото ядро – не го премахвайте:

$uname -r

Проверяват се всички инсталирани ядра в системата:

$dpkg -l | egrep linux-image

Могат да се премахват ядра с по-ниски номера. Оставете поне едно резервно ядро за всеки случай..

$sudo apt purge linux-image-x.x.x-x-generic

Командата премахва не само ядрата, но и свързаните с тях конфигурационни файлове съхраняващи се в съответни пакети linux-headers-*.

 

За дистрибуция 16.04+ процесът е автоматизиран

$sudo apt autoremove

Командата за премахване на остарелите пакети включва и старите ядра – всички версии на linux-headers-* и linux-image-* (За всеки случай се оставя една резервна версия на ядрото).

Внимание! При преминаване на по-висока "major" версия (например от 16.04 към 18.04) командата не премахва останалите от предходната версия ядра и те трябва да се премахнат по отделно за всяко ядро по по-горе описания начин!

Забележка!  Ядрата са маркирани дали са инсталирани автоматично ( могат да се премахват с apt autoremove) или ръчно (могат да се премахват само поотделно, например  с горната процедура).  Кои ядра са инсталирани автоматично може да се провери с :

$apt-mark showauto 'linux-image-.*'

А кои са инсталирани ръчно - с:

$apt-mark showmanual 'linux-image-.*'

Допълнителна информация може да се намери тук.

        7.        Автоматично обновяване на пакети

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

Инсталиране на пакета:

$sudo apt install unattended-upgrades

За конфигуриране на unattended-upgrades  трябва да се редактира файла  /etc/apt/apt.conf.d/50unattended-upgrades  :

Unattended-Upgrade::Allowed-Origins {

        "Ubuntu xenial-security";

//     "Ubuntu xenial-updates";

};

Някои пакети могат да бъдат забранени за обновяване, чрез добавянето им в Package-Blacklist:

Unattended-Upgrade::Package-Blacklist {

//          "vim";

//          "libc6";

//          "libc6-dev";

//          "libc6-i686";

};

За да се позволи автоматичното обновяване трябва да се редактира файла /etc/apt/apt.conf.d/10periodic и да се зададе периода на обновяване:

APT::Periodic::Update-Package-Lists "1";

APT::Periodic::Download-Upgradeable-Packages "1";

APT::Periodic::AutocleanInterval "7";

APT::Periodic::Unattended-Upgrade "1";

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

        8.        Конфигуриране на хранилищата

Конфигурирането на системните хранилища се съхранява във файла /etc/apt/sources.list и в директорията /etc/apt/sources.list.d . Това позволява поддръжката на неограничен брой активни хранилища и разнообразие от съхраняващи ги медии.

Файлът /etc/apt/sources.list  съдържа по една линия за всяко хранилище, като първи се подреждат предпочитаните (за случаите когато една и съща версия на пакет се съдържа в няколко хранилища). Обикновено най бързо-достъпните се нареждат в началото.

Всяка линия започва с тип (например  deb-src) последвана от опции и аргументи. Линиите не могат да се продължават на следващ ред. Празните линии са игнорирани а символът # прави остатъка от линията коментар. Всяка линия може да бъде отменена с този символ.

deb http://bg.archive.ubuntu.com/ubuntu/ xenial main restricted

deb-src http://bg.archive.ubuntu.com/ubuntu/ xenial main restricted

 

deb http://bg.archive.ubuntu.com/ubuntu/ xenial-updates main restricted

deb-src http://bg.archive.ubuntu.com/ubuntu/ xenial-updates main restricted

В допълнение на официално поддържаните пакети от Ubuntu, съществуват допълнителни хранилища поддържани от доброволни общности с хиляди пакети .  Kак се създава ново хранилище може да видите тук.

Две от най-известните хранилища са Universe и Multiverse. Тези хранилища не са официално поддържани от Ubuntu, но понеже са поддържани от общност те обикновено са сигурни и могат да бъдат инсталирани. Хранилището Multiverse често включва пакети чиито лицензи не позволяват разпространяването им с безплатни ОС и могат да са нелегални в някои страни. Тъй като не са официално поддържани от Ubuntu е възможно някои от тях да не получават обновявания свързани със сигурността.

Има и други хранилища, много от които предлагат един единствен пакет. Трябва много внимателно да се подхожда при добавяне на нови хранилища като се проверява за коя версия на операционната система са предназначени и да се търсят отзиви. Включването на неподходящи хранилища може да доведе до нестабилност в работата. За начина на добавяне на нови хранилища може да прочетете тук.

По подразбиране хранилищата са включени със следните линии в /etc/apt/sources.list ( могат да бъдат изключени чрез обръщане в коментар).

 

deb http://archive.ubuntu.com/ubuntu xenial universe multiverse

deb-src http://archive.ubuntu.com/ubuntu xenial universe multiverse

 

deb http://us.archive.ubuntu.com/ubuntu/ xenial universe

deb-src http://us.archive.ubuntu.com/ubuntu/ xenial universe

deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe

deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe

 

deb http://us.archive.ubuntu.com/ubuntu/ xenial multiverse

deb-src http://us.archive.ubuntu.com/ubuntu/ xenial multiverse

deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse

deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse

 

deb http://security.ubuntu.com/ubuntu xenial-security universe

deb-src http://security.ubuntu.com/ubuntu xenial-security universe

deb http://security.ubuntu.com/ubuntu xenial-security multiverse

deb-src http://security.ubuntu.com/ubuntu xenial-security multiverse

 

8.        Примери



Инсталиране на Chrome browser

В хранилищата на ubuntu, има пакет Chromium, който е разработка на Cannonical. За съжаление той не разползага със всички възможности на Google Chrome (Google специално е блокирал някои опции само за собствения пакет). За да бъде инсталиран Google Chrome  е необходимо първо да се свали пакета, след което да се инсталира ръчно.

Необходимо е предварително да се инсталира Wget Utility. 

$ sudo apt update
$ sudo apt upgrade  
$ sudo apt install wget

След което трябва да се свали пакета за инсталация, след което да се инсталира::

$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo dpkg -i google-chrome-stable_current_amd64.deb
$ google-chrome

Ако желаете да се вижда постоянно в лентата отляво - трябва да го добавите във favorites (с десен бутон върхъ иконата) и да го преместите на желаната позиция.

Как можете да деинсталирате / реинсталирате firefox може да видите тук.

Инсталиране на ssh

$sudo apt update
$sudo apt install openssh-server

Проверка на инсталирането:

sudo systemctl status ssh

Ако ufw е активиран е необходимо да се разреши достъпа отвън:

sudo ufw allow ssh

IP адресът на компютъра може да се провери с:

ip a

Инсталиране на Java

$sudo apt update
$sudo apt upgrade
$sudo apt autoremove
$sudo apt install default-jdk 

  

Инсталирана на Eclipse

    Eclipse не предоставя официално хранилище. Той може да бъде инсталиран чрез софтуерния център, но това ще бъде много стара версия.
   Последна версия на Eclipse може да бъде инсталирана със snappy packaging system. За намиране и инсталиране на Eclipse
$sudo snap install --classic eclipse


     След което Eclipse е готов за ползване.