Почему использование памяти службой libvirtd разное при запросе командами systemctl и top?#
Симптом#
В выходных данных команд systemctl и systemd-cgtop показано, что сервис libvirtd занимает более 1,5 ГБ памяти, а в выводе команды top — что он занимает около 70 МБ.
Возможная причина#
Отображаемая память для сервисов (включая systemctl и systemd-cgtop), управляемых systemd, может быть получена из memory.usage_in_bytes в Cgroup. Команда top запрашивает сведения о памяти в каталоге /proc. Результаты запроса отличаются из-за использования другого статистического метода.
Как правило, память, используемая сервисными процессами, бывает следующих типов.
- anon_rss: анонимные страницы в адресных пространствах пользовательского режима, например память, выделяемая вызовом malloc или функции mmap с флагом MAP_ANONYMOUS. Когда системной памяти недостаточно, ядро может выделять подкачку для памяти этого типа.
- file_rss: страницы отображения в адресных пространствах пользовательского режима, включая файл отображения (например, mmap указанного файла) и tmpfs отображения (например, разделяемая память IPC). Когда системной памяти недостаточно, ядро может высвобождать эти страницы. Перед высвобождением может потребоваться синхронизировать данные между ядром и файлом отображения.
- file_cache: файловый кэш (страница в страничном кэше дискового файла), который генерируется при чтении или записи файла. Когда системной памяти недостаточно, ядро может высвобождать эти страницы. Перед высвобождением может потребоваться синхронизировать данные между ядром и файлом отображения.
- Страницы буфера: принадлежат страничному кэшу, например создаваемому при чтении файлов блочного устройства.
Память anon_rss и file_rss относится к резидентному набору (RSS) процессов, а file_cache и страницы буфера — к страничному кэшу. Вкратце:
RSS в выводе команды top = anon_rss + file_rss; разделяемая память (SHR) = file_rss
memory.usage_in_bytes в Cgroup = кэш + RSS + подкачка
В заключение отметим, что определение использования памяти, получаемого командой systemd, отличается от определения использования, получаемого top. Поэтому отличаются и результаты запросов.
Ошибка при настройке тома RAID 0, если stripsize имеет значение 4#
Симптом#
Когда для параметра stripsize установлено значение 4 при настройке тома RAID 0, возникает ошибка.
Возможная причина#
Таблицу страниц размером 64 КБ можно включить только в сценарии, когда для stripsize задано значение 64.
Решение#
Изменять файл конфигурации не требуется. При запуске в Скейлер команды lvcreate установите для stripsize значение 64, поскольку минимальный поддерживаемый размер страйпа — 64 КБ.
Сбой компиляции MariaDB с использованием rpmbuild#
Симптом#
При входе в систему в роли пользователя root и компиляции исходного кода MariaDB с помощью команды rpmbuild компиляция завершается сбоем и отображаются следующие сведения:
+ echo 'mysql can'\''t run test as root'
mysql can't run test as root
+ exit 1
Возможная причина#
MariaDB не позволяет пользователю root выполнять тестовые случаи. Однако при компиляции тестовые случаи выполняются автоматически. В результате процесс компиляции блокируется.
Решение#
Используйте текстовый редактор, например vi, и измените значение переменной runtest в файле mariadb.spec.
Перед изменением:
%global runtest 1
После изменения:
%global runtest 0
Это изменение отключает функцию выполнения тестовых случаев в ходе компиляции, что никак не повлияет на компиляцию и содержимое пакета RPM после ее завершения.
Сбой запуска сервиса SNTP с использованием конфигурации по умолчанию#
Симптом#
Сервис SNTP не запускается с конфигурацией по умолчанию.
Возможная причина#
В конфигурацию по умолчанию не добавлено доменное имя NTP-сервера.
Решение#
Отредактируйте файл /etc/sysconfig/sntp и добавьте доменное имя сервера NTP в Китае: 0.generic.pool.ntp.org.
Сбой установки из-за конфликта файлов или пакетов ПО либо отсутствия пакета ПО#
Симптом#
При установке пакета программного обеспечения возникает конфликт пакетов ПО, конфликт файлов или отсутствие каких-то пакетов ПО. В результате обновление прерывается, а установка завершается сбоем. Сведения об ошибке в связи с конфликтом пакетов ПО или файлов либо с отсутствием пакетов ПО выглядят, как показано ниже.
Пример сведений об ошибке из-за конфликта между пакетами ПО libev-libevent-devel-4.24-11.oe1.aarch64 и libevent-devel-2.1.11-2.oe1.aarch64:
package libev-libevent-devel-4.24-11.oe1.aarch64 conflicts with libevent-devel provided by libevent-devel-2.1.11-2.oe1.aarch64
- cannot install the best candidate for the job
- conflicting requests
Пример сведений об ошибке из-за конфликта файлов /usr/bin/containerd:
Error: Transaction test error:
file /usr/bin/containerd from install of containerd-1.2.0-101.oe1.aarch64 conflicts with file from package docker-engine-18.09.0-100.aarch64
file /usr/bin/containerd-shim from install of containerd-1.2.0-101.oe1.aarch64 conflicts with file from package docker-engine-18.09.0-100.aarch64
Пример сообщения об ошибке, указывающего на отсутствие пакета ПО blivet-data:
Error:
Problem: cannot install both blivet-data-1:3.1.1-6.oe1.noarch and blivet-data-1:3.1.1-5.noarch
- package python2-blivet-1:3.1.1-5.noarch requires blivet-data = 1:3.1.1-5, but none of the providers can be installed
- cannot install the best update candidate for package blivet-data-1:3.1.1-5.noarch
- problem with installed package python2-blivet-1:3.1.1-5.noarch(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
Возможная причина#
- Некоторые пакеты программного обеспечения, предоставляемые Скейлер, имеют разные имена, но одинаковые функции. Из-за этого такие пакеты не могут быть установлены одновременно.
- Некоторые пакеты программного обеспечения, предоставляемые Скейлер, имеют разные имена, но одинаковые функции. Из-за этого файлы после установки одинаковые, что приводит к конфликту файлов.
- Перед обновлением у некоторых пакетов ПО были другие зависимые от них пакеты. После обновления пакетов зависящие от них пакеты могут не устанавливаться по причине отсутствия нужных пакетов.
Решение#
Если возникает конфликт пакетов ПО, выполните следующие действия (для примера используется конфликт пакетов из раздела “Симптом”).
-
Согласно сообщению об ошибке, отображаемому во время установки, с устанавливаемым пакетом ПО libev-libevent-devel-4.24-11.oe1.aarch64 конфликтует пакет libevent-devel-2.1.11-2.oe1.aarch64.
-
Чтобы удалить пакет ПО, конфликтующий с устанавливаемым пакетом, выполните команду dnf remove.
# dnf remove libevent-devel-2.1.11-2.oe1.aarch64
-
Повторите установку.
Если возникает конфликт файлов, выполните следующие действия (для примера используется конфликт файлов из раздела “Симптом”).
-
Согласно сообщению об ошибке, отображаемому во время установки, пакеты ПО, вызывающие конфликт файлов, имеют имена containerd-1.2.0-101.oe1.aarch64 и docker-engine-18.09.0-100.aarch64.
-
Запишите имена пакетов ПО, устанавливать которые не требуется. Ниже для примера используется docker-engine-18.09.0-100.aarch64.
-
Чтобы удалить пакеты ПО, установка которых не требуется, выполните команду dnf remove.
# dnf remove docker-engine-18.09.0-100.aarch64
-
Повторите установку.
При отсутствии необходимого пакета ПО выполните следующие действия (для примера взят отсутствующий пакет из раздела “Симптом”).
-
Определите имя пакета ПО, который необходимо обновить (blivet-data-1:3.1.1-5.noarch), и имя зависимого пакета (python2-blivet-1:3.1.1-5.noarch) на основе сведений об ошибке, отображаемых во время обновления.
-
Выполните команду dnf remove, чтобы удалить пакет ПО, зависящий от обновляемого пакета, либо добавьте при обновлении параметр –allowerasing.
-
Чтобы удалить пакет ПО, зависящий от пакета blivet-data-1:3.1.1-5.noarch, выполните следующую команду dnf remove.
# dnf remove python2-blivet-1:3.1.1-5.noarch
-
При обновлении пакета ПО добавьте параметр –allowerasing.
# yum update blivet-data-1:3.1.1-5.noarch -y --allowerasing
-
-
Выполните обновление еще раз.
Установка конфликтующих экземпляров#
-
Возникает конфликт файлов.
Файл python3-edk2-devel.noarch конфликтует с файлом build.noarch из-за повторяющихся имен файлов.
# yum install python3-edk2-devel.noarch build.noarch ... Error: Transaction test error: file /usr/bin/build conflicts between attempted installs of python3-edk2-devel-202002-3.oe1.noarch and build-20191114-324.4.oe1.noarch
Сбой перехода на более раннюю версию libiscsi#
Симптом#
Невозможно перейти с libiscsi-1.19.4 или более поздней версии на libiscsi-1.19.3 или более раннюю версию.
Error:
Problem: problem with installed package libiscsi-utils-1.19.0-4.oe1.x86_64
- package libiscsi-utils-1.19.0-4.oe1.x86_64 requires libiscsi(x86-64) = 1.19.0-4.oe1, but none of the providers can be installed
- cannot install both libiscsi-1.19.0-3.oe1.x86_64 and libiscsi-1.19.0-4.oe1.x86_64
- cannot install both libiscsi-1.19.0-4.oe1.x86_64 and libiscsi-1.19.0-3.oe1.x86_64
- conflicting requests
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
Возможная причина#
В libiscsi-1.19.3 и более ранних версиях двоичные файлы с именами iscsi-xxx входят в основной пакет libiscsi. Однако эти двоичные файлы вводят некорректную зависимость CUnit. Для решения этой проблемы в libiscsi-1.19.4 эти файлы выделены в подпакет libiscsi-utils. Основной пакет имеет слабую зависимость от подпакета. Вы можете интегрировать или удалить подпакет при создании образа в зависимости от требований продукта. Если подпакет не интегрирован или удален, это никак не затрагивает функции основного пакета libiscsi. Если осуществляется переход с libiscsi-1.19.4 или более поздней версии на libiscsi-1.19.3 или более раннюю версию и в системе установлен подпакет libiscsi-utils, то, поскольку libiscsi-1.19.3 и более ранние версии не содержат libiscsi-utils, перейти на более раннюю версию libiscsi-utils не удастся. Из-за того, что libiscsi-utils имеет зависимость от основного пакета libiscsi до перехода на более раннюю версию, возникает проблема с зависимостью и переход на более раннюю версию libiscsi завершается сбоем.
Решение#
Удалите подпакет libiscsi-utils, выполнив следующую команду, и лишь затем перейдите на более раннюю версию:
yum remove libiscsi-utils
Сбой перехода на более раннюю версию xfsprogs#
Симптом#
Не удается перевести xfsprogs-5.6.0-2 или более позднюю версию на xfsprogs-5.6.0-1 или более раннюю.
Error:
Problem: problem with installed package xfsprogs-xfs_scrub-5.6.0-2.oe1.x86_64
- package xfsprogs-xfs_scrub-5.6.0-2.oe1.x86_64 requires xfsprogs = 5.6.0-2.oe1, but none of the providers can be installed
- cannot install both xfsprogs-5.6.0-1.oe1.x86_64 and xfsprogs-5.6.0-2.oe1.x86_64
- cannot install both xfsprogs-5.6.0-2.oe1.x86_64 and xfsprogs-5.6.0-1.oe1.x86_64
- conflicting requests
Возможная причина#
В версии xfsprogs-5.6.0-2, чтобы устранить нецелесообразные зависимости основного пакета xfsprogs и отделить от него экспериментальные команды, команды xfs_scrub*
были выделены в подпакет xfsprogs-xfs_scrub. Основной пакет xfsprogs имеет слабую зависимость от подпакета xfsprogs-xfs_scrub. Вы можете интегрировать или удалить подпакет при создании образа в зависимости от требований продукта. Если подпакет не интегрирован или удален, это никак не затрагивает функции основного пакета xfsprogs.
Если осуществляется переход с xfsprogs-5.6.0-2 или более поздней версии на xfsprogs-5.6.0-1 или более раннюю версию и в системе установлен подпакетxfsprogs-xfs_scrub, то, поскольку xfsprogs-5.6.0-1 и более ранние версии не содержат xfsprogs-xfs_scrub, перейти на более раннюю версию xfsprogs-xfs_scrub не удастся. Из-за того, что xfsprogs-xfs_scrub имеет зависимость от основного пакета xfsprogs до перехода на более раннюю версию, возникает проблема с зависимостью и переход на более раннюю версию libiscsi завершается сбоем.
Решение#
Удалите подпакет xfsprogs-xfs_scrub, выполнив следующую команду, и лишь затем перейдите на более раннюю версию:
yum remove xfsprogs-xfs_scrub
CPython/Lib обнаруживает уязвимость CVE-2019-9674: ZIP-бомба#
Симптом#
Lib/zipfile.py в Python 3.7.2 и более ранних версиях позволяет удаленным злоумышленникам создавать DoS-запросы с использованием ZIP-бомб, вызывая высокое потребление ресурсов.
Возможная причина#
Удаленные злоумышленники используют ZIP-бомбы с целью вызова отказов в обслуживании (DoS), затрагивающих целевые системные сервисы или даже приводящих к сбою системы. ZIP-бомба — это ZIP-файл с высокой степенью сжатия размером от нескольких до десятков мегабайт. Однако при его распаковке генерируется большой объем данных, что приводит к высокому потреблению ресурсов.
Решение#
Добавьте сведения из предупреждения в zipfile по адресу https://github.com/python/cpython/blob/3.7/Doc/library/zipfile.rst .
Атака ReDoS из-за ненадлежащего использования регулярных выражений glibc#
Симптом#
Интерфейс regcomp/regexec в glibc используется для программирования, а регулярные выражения glibc, такие как grep/sed, используются в командах оболочки. Ненадлежащие регулярные выражения или входные данные используются для ReDoS-атак (CVE-2019-9192/CVE-2018-28796). Типичный шаблон регулярных выражений представляет собой сочетание обратной ссылки “\1” со звездочкой “*” (отсутствие или множество соответствий), знак плюс “+” (одно или несколько соответствий) или “{m,n}” (минимальное соответствие m, максимальное соответствие n) либо сочетание сверхдлинных символьных строк с регулярными выражениями. Ниже приведен пример.
# echo D | grep -E "$(printf '(\0|)(\\1\\1)*')"Segmentation fault (core dumped)
# grep -E "$(printf '(|)(\\1\\1)*')"
Segmentation fault (core dumped)
# echo A | sed '/\(\)\(\1\1\)*/p'
Segmentation fault (core dumped)
# time python -c 'print "a"*40000' | grep -E "a{1,32767}"
Segmentation fault (core dumped)
# time python -c 'print "a"*40900' | grep -E "(a)\\1"
Segmentation fault (core dumped)
Возможная причина#
В процессе, использующем регулярное выражение, создается дамп ядра. Регулярное выражение glibc реализуется с использованием гибридного алгоритма недетерминированного/детерминированного конечного автомата (NFA/DFA). Внутренний принцип заключается в использовании жадного алгоритма в рекурсивном запросе для сопоставления как можно большего количества символьных строк. При обработке рекурсивного регулярного выражения жадный алгоритм вызывает ReDoS-атаку.
Решение#
-
Для уменьшения поверхности атаки необходим строгий контроль прав.
-
Убедитесь, что регулярное выражение корректное. Не вводите недопустимые регулярные выражения и не используйте регулярные выражения (ссылки или звездочки) в сочетании со сверхдлинными символьными строками, чтобы не вызвать бесконечную рекурсию.
# ()(\1\1)* # "a"*400000
-
Когда пользовательская программа обнаруживает в процессе исключение, она может перезапустить процесс для восстановления сервисов и повышения надежности работы.
Сообщение об ошибке при установке или удалении gdbm-devel в ходе установки или удаления httpd-devel и apr-util-devel#
Симптом#
- При установке или удалении gdbm-devel-1.18.1-1 сообщается об ошибке.
- После устранения ошибки gdbm и gdbm-devel обновляются до версии 1.18.1-2. Однако при установке httpd-devel и apr-util-devel (зависящих от gdbm-devel) версия gdbm-devel по умолчанию сохраняется как 1.18.1-1. В результате ошибка не исчезает.
Возможная причина#
-
Пакет gdbm-devel-1.18.1-1 не содержит пакета справки, который предоставляет
info
. В результате внедрить пакет справки при независимой установке gdbm-devel невозможно и отображается следующее предупреждение:install-info: No such file or directory for /usr/share/info/gdbm.info.gz
-
По умолчанию в системе установлен основной пакет gdbm-1.18.1-1, но не установлен пакет gdbm-devel. Пакеты программного обеспечения, зависящие от gdbm-devel, по-прежнему соответствуют версии основного пакета gdbm и устанавливают gdbm-devel-1.18.1-1. В результате ошибка не исчезает.
Решение#
- Установите gdbm-1.18.1-2 для обновления gdbm. Ошибка будет исправлена.
- Обновите gdbm, а затем установите gdbm-devel, чтобы обеспечить зависимость от gdbm более поздней версии. Ошибка будет исправлена.
Сообщение об ошибке rpmdb при выполнении команды yum или dnf после перезагрузки системы#
Симптом#
- После перезагрузки системы при выполнении связанной с RPM команды
yum
илиdnf
появляется следующее сообщение об ошибке:
error: db5 error(-30973) from dbenv->open: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 - (-30973)
error: cannot open Packages database in /var/lib/rpm
Error: Error: rpmdb open failed
Возможная причина#
- Во время установки или обновления выполняются операции чтения и записи в файле /var/lib/rpm/__db.00*. В случае непредвиденного прерывания, например принудительного отключения питания, переполнения диска или выполнения команды
kill -9
, файл _db будет поврежден. При выполнении командыdnf
илиyum
появится сообщение об ошибке.
Решение#
Шаг 1. Выполните команду kill -9
, чтобы завершить все запущенные команды, связанные с RPM.
Шаг 2. Удалите все файлы /var/lib/rpm/__db.00*.
Шаг 3. Выполните команду rpmdb --rebuilddb
, чтобы перестроить базу данных RPM.
Сбой выполнения rpmrebuild -d /home/test filesystem
для повторной сборки пакета filesystem#
Симптом#
Не удается выполнить команду rpmrebuild --comment-missing=y --keep-perm -b -d /home/test filesystem-3.16-3.oe1.aarch64
для повторной сборки пакета filesystem. Отображается следующая информация:
/usr/lib/rpmrebuild/rpmrebuild.sh:Error:(RpmBuild) Package 'filesystem-3.16-3.oe1.aarch64' build failed.
/usr/lib/rpmrebuild/rpmrebuild.sh:Error: RpmBuild
Возможная причина#
Программный пакет создает каталог на этапе %pretrans -p и изменяет каталог на этапе %ghost. Если вы создадите в этом каталоге файл или другой каталог и используете rpmrebuild
для сборки пакета, то созданный файл или каталог будет включен в пакет.
Первопричина симптома заключается в том, что filesystem создает каталог /proc на этапе %pretrans и изменяет каталог на этапе %ghost, но при работе системы создаются некоторые небольшие процессы. В результате rpmrebuild
не может включить эти процессы в пакет, поскольку они не являются файлами или каталогами, и не может выполнить повторную сборку пакета.
Решение#
Не используйте rpmrebuild
для повторной сборки пакета filesystem.