sonyps4.ru

Пакетные менеджеры. Менеджеры пакетов В каком менеджере пакетов лучше с зависимостями

Одна из первых вещей, с которой столкнуться новые пользователи при выборе своего дистрибутива Linux, это существование нескольких дистрибутивов с различными способами управления пакетами.

Управление пакетами очень важно в Linux, если вы знаете как использовать несколько менеджеров пакетов, это еще один аспект, показывающий, что вы уже опытный пользователь. Установка программного обеспечения, обновление, обработка зависимостей, удаление программ это очень важные действия для администрирования операционной системы linux.

Чтобы стать более опытным пользователем в linux нужно понять, каким образом основные дистрибутивы обрабатывают пакеты программного обеспечения. Поэтому тема сегодняшней статьи - обзор пакетных менеджеров linux. Мы рассмотрим только лучшие пакетные менеджеры linux.

Главная цель, предоставить основную информацию об этих пакетных менеджерах, но об их использовании будет сказано только несколько слов.

1. DPKG - система управления пакетами Debian

Dpkg - это базовая система управления пакетами в Debian. Может использоваться для установки, удаления, хранения и получения информации о.deb пакетах.

Это инструмент низкого уровня и есть дополнительные утилиты, которые помогают пользователям устанавливать пакеты из репозиториев, разрешать зависимости и искать пакеты по названию. Это такие программы, как:

APT (Advanced Packaging Tool)

Очень популярный, мощный инструмент командной строки с открытым исходным кодом для управления пакетами, который намного увеличивает возможности dpkg. Эта утилита используется в Debian и его производных, таких как Ubuntu, Linux Mint.

Aptitude Package Manager

Это еще одна популярная утилита командной строки для управления пакетами в Debian. Она работает аналогично Apt, но между ними есть некоторые различия. Первоначально он был разработан для Debian, но сейчас может применяться и в Red Hat дистрибутивах.

Synaptic Package Manager

Synaptic - это графический менеджер пакетов linux, написанный на GTK и использующий apt в качестве бэкенда. Он отлично подходит для пользователей, которые не хотят работать в командной строке. Здесь есть все те же необходимые функции что и в apt.

2. RPM (Red Hat Package Manager)

Это базовый формат и система управления пакетами, созданная в компании Red Hat. Так же как и dpkg, это низкоуровневый инструмент, для которого существует несколько утилит, это такие пакетные менеджеры linux:

YUM (Yellowdog Updater, Modified)

Это популярный менеджер пакетов linux с открытым исходным кодом для командной строки. Он используется для управления пакетами в дистрибутиве Red Hat. Если сравнивать с инструментом apt, то здесь есть все те же функциональные возможности, правда, работает немного медленнее. Написан на Python 2. Немного больше об отличиях формата пакетов можно прочитать в отдельной статье.

DNF – Улучшенный Yum

Это пакетный менеджер linux, используемый в дистрибутиве Fedora начиная с версии 18. Он представляет из себя следующее поколение YUM.

Сначала он был создан только для экспериментов, но начиная с Fedora 22 он используется как пакетный менеджер по умолчанию. Он работает почти также как и YUM, для разрешения зависимостей используется библиотека libsolv и hawkey, но отличие от YUM, написан на Python 3. Здесь можно наблюдать увеличение скорости работы, а также уменьшение потребления памяти.

3. Pacman - менеджер пакетов Arch Linux

Этот менеджер пакетов linux разработан командой программистов для дистрибутива ArchLinux. Сейчас, кроме ArchLinux, он используется в Manjaro и еще нескольких малоизвестных дистрибутивах, основанных на ArchLinux.

Здесь поддерживаются все основные возможности - установка программного обеспечения, автоматическое разрешение зависимостей, обновление, удаление пакетов, а также загрузка пакетов программ для последующей установки.

Программа специально спроектирована для удобной работы с пакетами в Arch Linux. А поскольку это система с режимом выпуска в виде роллинг релизов, то этот пакетный менеджер подходит наилучшим образом. Pacman поддерживает систему в актуальном состоянии синхронизируя списки пакетов из основного сервера. Причем существует только одна версия системы - текущая.

Программа написана на Си, а в качестве пакетов используются файлы формата tar.xz, которые на самом деле являются обычными архивами, внутри которых находятся файлы программы и файл описания установки PKGBUILD.

4. Zypper - пакетный менеджер OpenSUSE

Это пакетный менеджер linux для командной строки в дистрибутиве OpenSUSE и SUSE Linux. Разработан специально для этого дистрибутива и использует библиотеку libzypp, в которой реализованы такие общие возможности, как доступ к репозиторию, установка пакетов, разрешение зависимостей, работа с репозториями и многое другое.

Zypper написан на Си и работает намного быстрее чем Yum. Поддерживает различные форматы репозиториев, а также расширения репозиториев. Поддерживается как обычное обновление, так и обновление патчами, во время которого только накладываются патчи на установленные пакеты для исправления проблем с безопасностью.

5. Portage - пакетный менеджер Gentoo

Этот менеджер пакетов используется в Gentoo, менее популярном, но не менее мощном дистрибутиве. И это один из лучших менеджеров пакетов. Основное преимущество системы Gentoo, это возможность собирать пакеты из исходников во время установки. Это дает очень много полезных вещей, таких как возможность настроить флаги компиляции, включить только нужные функции, а также собрать пакеты именно под свой процессор. Все это поддерживается Portage, базовая функциональность, такая как обновление, удаление пакетов и разрешение зависимостей здесь тоже есть.

Интересной особенностью есть состояния Portage, а также слоты, позволяющие устанавливать несколько версий одной программы или библиотеки в вашей системе. Здесь нет как такового списка пакетов, есть только дерево портов, в котором и содержаться файлы ebuild с инструкциями для сборки всех пакетов. Сохранив дерево можно очень просто откатить систему к предыдущей версии.

Выводы

Как я уже говорил, основная цель статьи - обзор пакетных менеджеров linux, познакомить пользователей с лучшими пакетными менеджерами, а также показать отличия между ними. Конечно, пользователям определенного дистрибутива придется изучать свой менеджер пакетов более детально. Если я упустил важный момент, об одной из программ, напишите в комментариях!

Иногда может возникнуть вопрос: чьих этот файл, откуда вообще взялась эта библиотека ? Удобный менеджер пакетов решает очень многие проблемы ОС. Можно с уверенностью сказать, что если вы подружитесь с МП, то подружитесь и с дистрибутивом как таковым. Причем важно освоить именно набор основных команд, и знать где найти дополнительную информацию.


Далее следует джентльменский набор необходимых для повседневной рутины команд основных Linux дистрибутивов: установить, обновить и удалить пакет, накатить обновления, проверить зависимости, установить принадлежность файла пакету и пр.

Debian и родственные

Популярность и образ дружественного к пользователю Linux дистрибутива сыграли с Ubuntu злую шутку. Некоторым новичкам кажется, что можно на нем делать все, что угодно без помощи командной строки. Это заблуждение и лучше от него поскорее избавиться.


То, что в примерах aptitude не значит, что он правильнее, чем apt-get . Для меня это всего лишь дело привычки.


$ aptitude install package #установить пакет; $ aptitude safe-upgrade package #обновить пакет; $ aptitude update #проверить и установить обновления; $ aptitude remove package #удалить пакет; $ aptitude purge package #удалить пакета с концами, все данные и настройки; $ apt-get dist-upgrade #обновить ОС, killer-feature и оно работает! $ aptitude search package #искать пакет. $ apt-cache depends package #зависимости пакета; $ apt-cache rdepends package #обратные зависимости от пакета.

Некоторые функции доступны с дополнительным МП dpkg .


$ dpkg -l #список установленных программ; $ dpkg -L package #список файлов пакета

Synaptic - это графическая программа, позволяющая управлять пакетами в Ubuntu. Она совмещает в себе все возможности консольной системы управления пакетами apt и удобство графического интерфейса. С помощью Synaptic вы можете устанавливать, удалять, настраивать и обновлять пакеты в вашей системе, просматривать списки доступных и установленных пакетов, управлять репозиториями и обновлять систему до новой версии.

Распространяется ОС в соответствии с принятыми правилами свободного ПО. Различные версии для сервера и для десктопа. Ubuntu обладает эмулятором Windows-приложений, который позволяет не только инсталлировать новые приложения, но производить миграцию настроек из действующей системы. Таким образом, все избранные страницы любимых браузеров, обои рабочего стола, контакты и др. могут без потерь перейти в Ubuntu. Есть утилиты, которые помогут в установке проприетарных кодеков мультимедиа файлов, отыщут и поставят новые драйвера к железу. Каждый релиз Ubuntu поддерживается обновлениями безопасности в течение 18 месяцев. Ubuntu поставляется с самой свежей версией GNOME и с такой подборкой программного обеспечения для серверов и рабочих станций, которая позволяет создать удобное рабочее окружение c помощью всего лишь одного установочного CD. На диске также находится Live-CD и версии некоторых программ под Windows (Mozilla Firefox, Mozilla Thunderbird, Gaim, OpenOffice.org и GIMP), чтобы пользователи перед установкой могли ознакомиться с системой. Диски Ubuntu не только бесплатны, но и могут быть бесплатно доставлены.

Главное меню вверху, панель с несколькими кнопками, роль которых станет ясна чуть позже.

В левой части экрана внизу есть пять кнопок, которые определяют, что будет показываться в списке над ними, так что вы можете выбирать пакеты в списке, группируя их по статусу.

Если вы выберет «Все», вы увидите полный список доступных и установленных пакетов. При нажатии «Установленные» будут показываться лишь установленные пакеты и так далее. Правая часть окна разделена на верхнюю и нижнюю части. В верхней части выводится список пакетов, и при выбора пакета из этого списка в нижней части отображаются сведения о нем и его описание.

Пакеты могут быть сгруппированы по функциональности (текстовые редакторы, документация, почтовые клиенты и т.д.). Для этого используется кнопка «Разделы». После нажатия на нее вы сможете выбирать пакеты из различных секций.

Интерфейс Synaptic немного напоминает Центр приложений: слева находится колонка с категориями пакетов, под ней - переключатель способа сортировки по категориям, а справа находится собственно список пакетов и под ним описание текущего выбранного пакета:


Также на верхней панели есть строка поиска, а кроме неё кнопки, позволяющие совершать некоторые операции.

При нажатии на кнопку «Обновить» будет произведено обновление индексов всех репозиториев (подробней про это я расскажу чуть позже в статье про репозитории), при нажатии на кнопку «Отметить для обновления» собственно будут отмечены для обновления все пакеты, для которых доступны новые версии (об этом тоже чуть позже), ну а кнопка «Применить» нужна для применения всех внесённых изменений.

Собственно, Synaptic в первую очередь предназначен для управления пакетами, и поэтому в этой статье я расскажу только об этом, а изучение различных настроек оставлю на вашу совесть.

Итак, установленные пакеты помечаются зелёными квадратиками, а неустановленные - белыми. Изменить состояние того или иного пакета можно нажав правой кнопкой мыши на его названии в списке и выбрав нужное действие:

операционный программный пакет linux


В отличие от Центра приложений внесённые через Synaptic изменения вступают в силу только после нажатия на кнопку «Применить» на панели инструментов.

Тут можно было бы провести теоретический экскурс в дебри пакетной системы Ubuntu на тему возможных состояний пакетов, но я пожалуй скажу лишь, что удалить пакет можно одним из двух способов: либо просто удалить файлы пакета, либо удалить их вместе со всеми пользовательскими настройками, относящимися к удаляемому пакету. Отличаются эти способы вот чем: многие программы создают в домашних папках пользователей файлы со своими настройками, так вот, при простом удалении эти программы удалятся без пользовательских настроек, а при полном - с ними 3) .

Synaptic, как и остальные инструменты управления пакетами, автоматически следит за разрешением всех зависимостей и ликвидацией различных конфликтов. Мало того, при совершении любых действий Synaptic выдаст вам окно с подробным описанием вносимых изменений.

В качестве примера я попробую удалить один ненужный мне пакет, pptp-linux. Сначала мне нужно его найти, для этого я просто введу его имя в строку быстрого поиска, убедившись, что у меня выбран пункт «Все» в списке категорий:

Мне, пожалуй не хочется, чтоб от пакета оставались какие-нибудь следы, поэтому я выберу полное удаление:

От этого пакета зависят два других, поэтому Synaptic мне выдаёт предупреждение, что удалить их можно только вместе:

Что ж, эта парочка мне тоже не нужна, поэтому не вижу причин не соглашаться. Обратите внимание, как изменилась иконка рядом с именем пакета. И вы ведь ещё помните, что все изменения вступают в силу только после нажатия кнопки «Применить» на главной панели программы?

После нажатия на неё Synaptic выдаст вам всю сводку планируемых действий, и вы сможете проверить, что всё будет сделано именно так, как вы хотите. И только после этого собственно запустить процесс внесения изменений нажатием кнопки «Применить»

Установщики пакетов делают атомарными (одношаговыми) операции с отдельными пакетами: вместо копирования множества файлов и запуска нескольких сценариев пользователь вводит одну команду «установить/удалить пакет». Однако атомарная с точки зрения пользователя операция - добавление в систему одного нового компонента может состоять из нескольких (и даже многих) операций над пакетами. Мефодий уже столкнулся с подобным случаем, изучая на собственном опыте понятие «цепочка зависимостей». Здесь установщики пакетов никак не могут облегчить работу пользователя. Чтобы сделать процедуру установки, удаления и обновления компонента системы атомарной, были разработаны менеджеры пакетов . Менеджер пакетов - это программа, которая вычисляет весь комплекс операций над отдельными пакетами, который нужно произвести для установки/удаления нового компонента (пакета), и сама запускает установщик пакетов сколько нужно раз с нужными параметрами. Кроме того, менеджер пакетов хранит информацию не только о пакетах, уже установленных в системе, но и обо всех, которые доступны для установки с какого-либо носителя или по Сети (подробнее об этом в разделе Package..Доставка).

Менеджер пакетов Программа, выполняющая установку, удаление или обновление любого пакета или группы пакетов, и автомитически выполняющая все необходимые для этого процедуры (доставку пакетов из удалённых репозиториев, вычисление зависимостей и установку требуемых по ним пакетов, удаление замещаемых пакетов и т. п.).

Наиболее известный и популярный менеджер пакетов называется APT (A dvanced P ackage T ool). Первоначально он был разработан в рамках дистрибутива Debian и работал только с установщиком пакетов dpkg, впоследствии для других дистрибутивов была разработана версия, работающая с rpm . В дистрибутиве Мефодия также используется APT.

Чтобы установить пакет, прежде всего нужно узнать о его существовании. Пакетов для каждого дистрибутива Linux доступны тысячи и даже десятки тысяч, ориентироваться в них непросто. APT предоставляет возможность поиска нужного среди доступных пакетов, для этого используется утилита apt-cache . В каждом пакете обязательно содержится краткая аннотация (в одну строку) и небольшое описание содержищихся в пакете ресурсов (не длиннее нескольких абзацев). По команде « apt-cache search подстрока » APT найдёт и выведет список из имён и аннотаций пакетов, где в имени, аннотации или описании нашлась указанная подстрока.

# apt-cache search python | wc 146 1158 8994 # apt-cache search python | grep "programming" python - An interpreted, interactive object-oriented programming language

Пример 9 . Поиск пакетов в APT

Для установки и удаления пакетов предназначена утилита apt-get , а команда установки выглядит совсем просто: « apt-get install имя_пакета », причём не нужно указывать никаких сведений о версии и местонахождении пакета: APT сам найдёт и установит самую последнюю из доступных версий.

# apt-get install python Чтение списков пакетов... Завершено Построение дерева зависимостей... Завершено Следующие дополнительные пакеты будут установлены: libpython libgdbm libgmp python-base python-modules python-modules-bsddb python-modules-compiler python-modules-curses python-modules-email python-modules-encodings python-modules-hotshot python-modules-logging python-modules-xml python-strict Следующие НОВЫЕ пакеты будут установлены: libpython libgdbm libgmp python python-base python-modules python-modules-bsddb python-modules-compiler python-modules-curses python-modules-email python-modules-encodings python-modules-hotshot python-modules-logging python-modules-xml python-strict 0 будет обновлено, 15 новых установлено, 0 пакетов будет удалено и 0 не будет обновлено. Необходимо получить 0B/4466kB архивов. После распаковки потребуется дополнительно 16,9MB дискового пространства. Продолжить? y Получено: 1 cdrom://SomeLinux CD RPM/main libpython 2.3.3-some2 Получено: 2 cdrom://SomeLinux CD RPM/main libgdbm 1.8.3-some3 Получено: 3 cdrom://SomeLinux CD RPM/main libgmp 4.1.2-some3 . . . Получено: 14 cdrom://SomeLinux CD RPM/main python-base 2.3.3-some12 Получено: 15 cdrom://SomeLinux CD RPM/main python 2.3.3-some12 Получено 4466kB за 0s (19,5MB/s). Совершаем изменения... Preparing... ######################################### 1: libpython ######################################### [ 6%] 2: libgdbm ######################################### [ 13%] 3: libgmp ######################################### [ 20%] 4: python-base ######################################### [ 26%] . . . 13: python-modules-logging ######################################### [ 86%] Завершено.

Пример 10 . Установка пакета с помощью APT

Процедуру установки APT выполняет в несколько этапов: сначала он ищет запрошенный пакет в списках доступных, найдя, рассчитывает, какие пакеты следует установить, чтобы удовлетворить его зависимости, после чего получает файлы всех нужных пакетов (в данном случае APT нашёл нужные пакеты на диске CD-ROM), и запускает установщик пакетов последовательно для установки всего необходимого. Аналогично, чтобы удалить пакет, достаточно выполнить команду « apt-get remove имя_пакета ».

Кроме APT, есть ещё несколько менеджеров пакетов. Большинство из них специфичны для определённого дистрибутива, как, например, emerge для Gentoo или yast для SUSE. Их задачи и возможности примерно совпадают с APT.

Контроль целостности

Поскольку менеджер пакетов умеет строить цепочки зависимостей пакетов друг от друга, с его помощью всегда можно определить, все ли зависимости удовлетворены у пакетов, установленных в системе. Система, в которой нет пакетов с неудовлетворёнными зависимостями, называется целостной . Если целостность нарушена, это означает, что часть установленного в системе программного обеспечения попросту неработоспособна или работает некорректно.

Целостность системы может нарушиться в момент каких-то изменений в её составе: при установке, удалении или обновлении части пакетов или всей системы. Если для всех этих операций использовать менеджер пакетов, то целостность системы не должна нарушиться. Хотя иногда даже менеджеру пакетов бывает сложно найти правильное решение, чтобы удовлетворить все зависимости и устранить конфликты.

При наличии менеджера пакетов механизм зависимостей можно обернуть и на пользу человеку. Так, можно создать пакет, в котором есть только зависимости и нет никаких ресурсов - такой пакет называется виртуальным . Это бывает полезно в том случае, когда нужно упростить пользователю установку полной среды для выполнения какой-либо задачи. Необходимые для этого пакеты могут напрямую не зависеть друг от друга, но чтобы установить их все за один шаг, пользователю будет достаточно установить один - виртуальный - пакет. Таким виртуальным пакетом оказался сам пакет python в примере, и ещё один - python-strict:

# rpm -ql python (не содержит файлов) # rpm -ql python-strict (не содержит файлов)

Пример 11 . Виртуальные пакеты не содержат файлов

Именно поэтому apt «получил» 15 пакетов (включая два виртуальных), а «совершил изменения» только для 13-ти.

Доставка

Важная задача, которую не решает установщик пакетов - доставка файла пакета в систему для последующей установки. Архивы пакетов обычно не хранятся в самой системе: они слишком велики (тысячи пакетов) и должны регулярно обновляться (выход обновлений программ, т. е. новых версий пакетов). Поэтому для установки обычно требуется сначала скопировать необходимые файлы с того носителя, где они хранятся (это либо установочные диски дистрибутива, либо хранилища в сети Интернет).

Чтобы APT мог работать с пакетами, они должны содержаться в организованном по специальным правилам хранилище - репозитории . Список доступных APT репозиториев хранится в файле /etc/apt/sources.list , для каждого репозитория указан способ доступа (например, « cdrom: », « ftp: », « file: » и др.) и адрес.

Rpm cdrom:/ RPM contrib main rpm ftp://updates.somelinux.com 2.4/i586 updates

Пример 12 . Файл sources.list

После каждого изменения файла /etc/apt/sources.list нужно обновлять кеш APT, в котором хранятся сведения о доступных пакетах, командой apt-get update . Для того, чтобы добавить в кеш информацию о пакетах, доступных на CD, следует использовать команду « apt-cdrom add », а не редактировать sources.list вручную.

APT позволяет и просто доставить пакет в систему, не устанавливая его. Так, например, всегда происходит с исходными пакетами , которые просто копируются из репозитория в определённый каталог системы по команде « apt-get source имя_пакета ».

Обновление

Программное обеспечение в мире Linux (и не только) постоянно обновляется: исправляются ошибки, расширяются возможности. Разработчики каждого дистрибутива по мере выхода новых версий программ готовят новые версии соответствующих пакетов и делают их доступными в своём репозитории (репозитории, отражающие наиболее современное состояние программного обеспечения, доступны через Интернет). Пользователю имеет смысл не отставать от обновлений программного обеспечения, потому что новые версии программ - это и большая надёжность работы системы, и новые возможности.

Менеджеры пакетов позволяют делать комплексные обновления всей системы. В APT эту процедуру можно выполнить одной командой: « apt-get dist-upgrade ». Эта процедура сначала исследует содержимое всех доступных репозиториев и находит там все пакеты более поздних версий, чем соответствующие пакеты, установленные в системе. После этого вычисляется объём обновления: должна быть удалена связаная область зависящих друг от друга устаревших пакетов и заменена соответствующей областью более новых версий. Сложные ситуации могут возникать в том случае, если изменилось распределение ресурсов по пакетам: пакеты были разделены или объединены - здесь может потребоваться ручное вмешательство пользователя. Тот род обновлений системы, который нужно делать регуляно и обязательно - это обновления, связанные с безопасностью (security updates). Когда в программе обнаруживают и исправляют серьёзные ошибки, угрожающие безопасности всей системы, разработчики дистрибутивов обычно заботятся о том, чтобы соответствующие обновления достигли пользователя. Обычно присутствует отдельный репозиторий с обновлениями, существенными для безопасности.

Цена удобства

Удобство менеджеров пакетов оплачивается тем, что они могут успешно работать только со специальными целостными областями источников (репозиториями пакетов ). Хотя для большинства пользователей это ограничение не так существенно: те дистрибутивы, в которых используются менеджеры пакетов, обычно имеют огромные репозитории пакетов, где можно найти любое мыслимое и немыслимое программное обеспечение. Если же нужной программы всё-таки нет в официальном репозитории дистрибутива, обычно находятся «частные» репозитории, доступные по сети Интернет, включающие не вошедшие в официальный репозиторий пакеты.

Если всё-таки нужный вам пакет нигде не найти собранным именно для вашего дистрибутива, можно установить и сторонний пакет, но это может быть выполнено только при помощи установщика пакетов, менеджер пакетов в этой ситуации будет бесполезен. Можно установить программу и самостоятельно скомпилировав её из исходных кодов, однако здесь стоит иметь в виду следующее.

Автор программы совершенно не обязан учитывать в ней все тонкости всех дистрибутивов, поэтому возможны, с одной стороны, прямые конфликты с файлами в системе (которые никто уже не отследит), а с другой стороны - конфликты и противоречия скрытые (например, программа устанавливается в подкаталог каталога /usr/local , и ожидает, что все остальные программы тоже находятся в этом каталоге). Это значит, что придётся самостоятельно разобраться и с тем, как и с какими параметрами компилировать программу, как устанавливать её в систему, и как избежать при этом конфликтов. А если так, если вы и в самом деле в состоянии правильно собрать и установить в систему нужную вам, а значит и ещё кому-нибудь, программу, которой пока нет в дистрибутиве, то самое правильное - сделать из неё пакет , по крайней мере исходный пакет , а если получится, то и двоичный . Это здорово облегчит жизнь и вам, когда вы будете компилировать и устанавливать эту программу ещё раз (на другом компьютере или обновляя версию самой програмы), и, главное, всему сообществу пользователей вашего дистрибутива!

Наконец, во многие современные дистрибутивы включаются средства, помогающие сборке двоичных пакетов. Такие средства (например, пакет hasher из ALT Linux) позволяют не только скомпилировать программу в «универсальной среде», содержащей лишь заданный набор пакетов, но и автоматически выстраивают зависимости, проверяют правильность установки, отслеживают конфликты. Короче говоря, собрав пакет с помощью такого средства, вы можете серьёзно претендовать на роль сопровождающего этот пакет в дистрибутиве. Напротив, скомпилировав программу втихомолку, с помощью шаманства и ручной работы, вы проявите себя как лентяй и эгоист, которому нет дела до роста и улучшения собственной операционной системы.



Загрузка...