Skip to content

Instantly share code, notes, and snippets.

@gorshkov-leonid
Last active August 19, 2025 11:09
Show Gist options
  • Save gorshkov-leonid/372887b41305a28a3d9dfd49f6004766 to your computer and use it in GitHub Desktop.
Save gorshkov-leonid/372887b41305a28a3d9dfd49f6004766 to your computer and use it in GitHub Desktop.
yum-get-deps-to-local-dir.md
yum install epel-release
yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
yum install --downloadonly --downloaddir=ffmpeg ffmpeg
yum --disableplugin=fastestmirror -y -v localinstall ./ffmpeg/*.rpm

and

rpm  -i --prefix=/some/other/path/ packagename.rpm

and

rpm2cpio google-chrome-stable-110.0.5481.177-1.x86_64.rpm | cpio -idv
@gorshkov-leonid
Copy link
Author

gorshkov-leonid commented Dec 20, 2023

Коллеги, добрый день.

Пишу на русском языке, чтобы ничего не упустить и не исказить. Надеюсь на помощь.

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

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

Но был запасной вариант, уже реализованный - это запускать на сервере google chrome в режиме headless вместо phantomjs. Это вариант сейчас проверен на dev серверах и работает. Единственное что необходимо - это настроенный энвайромент. Нужен установленный google chrome (и для chrome >= v111 нужно еще Nodejs, но про это пока речь не идет).

Мы написали инструкцию по установке в документации

По ней нужно зайти настраничку https://www.google.com/chrome/, скачать последнюю версию (упустили, что для таргетной платформы... нужно проскролиться вниз и кликнуть на "Другие платформы"). В итоге можно скачать rpm и deb.

Опробовали инструкцию на дев серверах, с rpm/yum chrome устанавливался и никаких зависимостей не требовал.
Но в последний момент во время установки на QA сервер выяснилось, что google chrome требует много *.so библиотек, которые на некоторых серверах есть, на некоторых нет. И сразу возник вопрос, как установка будет производиться на production сервере, не откажут ли нам с этим?

Ошибка на была примерно такая:

$ rpm --install --test --verbose google-chrome-stable-110.0.5481.177-1.x86_64.rpm
warning: google-chrome-stable-110.0.5481.177-1.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 7fac5991: NOKEY
error: Failed dependencies:
        libatk-bridge-2.0.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libatspi.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        liberation-fonts is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libgtk-3.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libvulkan.so.1()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libxkbcommon.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libxkbcommon.so.0(V_0.5.0)(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64

Я попробовал на чистом centos7 из докер контейнера, запросилось больше библиотек:

$ rpm -ivh --test google-chrome-stable-110.0.5481.177-1.x86_64.rpm
warning: google-chrome-stable-110.0.5481.177-1.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 7fac5991: NOKEY
error: Failed dependencies:
        libX11.so.6()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libXcomposite.so.1()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libXdamage.so.1()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libXext.so.6()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libXfixes.so.3()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libXrandr.so.2()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libasound.so.2()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libasound.so.2(ALSA_0.9)(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libasound.so.2(ALSA_0.9.0rc4)(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libatk-1.0.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libatk-bridge-2.0.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libatspi.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libcairo.so.2()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libcups.so.2()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libdrm.so.2()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        liberation-fonts is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libgbm.so.1()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libgtk-3.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libpango-1.0.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libvulkan.so.1()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libxcb.so.1()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libxkbcommon.so.0()(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        libxkbcommon.so.0(V_0.5.0)(64bit) is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        wget is needed by google-chrome-stable-110.0.5481.177-1.x86_64
        xdg-utils is needed by google-chrome-stable-110.0.5481.177-1.x86_64

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

Также узнал, что требуются шрифты из дистрибутивов, которые кладутся в /usr/share/fonts/liberation/ и /usr/share/fonts/liberation/dejavu/

В итоге google chrome запустился локально в моем centos запустился.

Вопросы:

  • как можно запрашивать установку google chrome на продакшен сервере, чтобы нам не отказали?
  • нужно ли детализировать официальную инструкцию?
  • эта инструкция должна быть на чьей стороне?

Дополнительно напишу дальше, что и как я делал для выяснения что нужно по минимуму для запуска

Команды для проверки, каких билиотек не хватает:

ldd chrome | grep -oP '.*not found'
rpm -ivh --test google-chrome-stable-110.0.5481.177-1.x86_64.rpm

Команда для выяснения, какие пакеты содержат недостающие билиотеки:

export chromerpm=google-chrome-stable-110.0.5481.177-1.x86_64.rpm
echo $( yum whatprovides $( rpm -ivh --test $chromerpm &> >(grep -o -PPw '.*needed.*' | grep -Po '^.*?(?=[\( ])') ) | grep -Po ".*.el7.*?(?=\.)" | (while read line; do echo ${line#1:}; done) | sort --unique )

Вывод (с закоменчеными дубликатами других версий) такой:

alsa-lib-1.1.8-1.el7
at-spi2-atk-2.26.2-1.el7
at-spi2-core-2.28.0-1.el7
atk-2.28.1-2.el7
cairo-1.15.12-4.el7
cups-libs-1.6.3-51.el7
# gtk3-3.22.30-5.el7
# gtk3-3.22.30-6.el7
gtk3-3.22.30-8.el7_9
# libX11-1.6.7-2.el7
# libX11-1.6.7-3.el7_9
libX11-1.6.7-4.el7_9
libXcomposite-0.4.4-4.1.el7
libXdamage-1.1.4-4.1.el7
libXext-1.3.3-3.el7
libXfixes-5.0.3-1.el7
libXrandr-1.5.1-2.el7
libdrm-2.4.97-2.el7
liberation-fonts-1.07.2-16.el7
libxcb-1.13-1.el7
libxkbcommon-0.7.1-3.el7
# mesa-libgbm-18.3.4-10.el7
mesa-libgbm-18.3.4-12.el7_9
pango-1.42.4-4.el7_7
vulkan-1.1.97.0-1.el7
wget-1.14-18.el7_6.1
xdg-utils-1.1.0-0.17.20120809git.el7

Скачка основного rpm и всех rpm-зависимостей:

wget -P ./local-google-chrome1 https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum --downloadonly --downloaddir=./local-google-chrome1 install ./local-google-chrome1/google-chrome-stable_current_x86_64.rpm

Распаковка всех rpm:

cd ./local-google-chrome1
for f in *.rpm; do rpm2cpio $f | cpio -idv; done;
cd ..

Копирование всех недостающих библиотек(с линками) в одельную папку

mkdir -p ./1/usr/lib64/
mkdir -p ./1/lib64/
mkdir -p ./1/usr/share/fonts/
cp -v ./usr/lib64/libatk-1.0.so.0*            ./1/usr/lib64/
cp -v ./usr/lib64/libatk-bridge-2.0.so.0*     ./1/usr/lib64/
cp -v ./usr/lib64/libcups.so.2*               ./1/usr/lib64/
cp -v ./usr/lib64/libdrm.so.2*                ./1/usr/lib64/
cp -v ./usr/lib64/libatspi.so.0*              ./1/usr/lib64/
cp -v ./usr/lib64/libX11.so.6*                ./1/usr/lib64/
cp -v ./usr/lib64/libXcomposite.so.1*         ./1/usr/lib64/
cp -v ./usr/lib64/libXdamage.so.1*            ./1/usr/lib64/
cp -v ./usr/lib64/libXext.so.6*               ./1/usr/lib64/
cp -v ./usr/lib64/libXfixes.so.3*             ./1/usr/lib64/
cp -v ./usr/lib64/libXrandr.so.2*             ./1/usr/lib64/
cp -v ./usr/lib64/libgbm.so.1*                ./1/usr/lib64/
cp -v ./usr/lib64/libxcb.so.1*                ./1/usr/lib64/
cp -v ./usr/lib64/libxkbcommon.so.0*          ./1/usr/lib64/
cp -v ./usr/lib64/libpango-1.0.so.0*          ./1/usr/lib64/
cp -v ./usr/lib64/libcairo.so.2*              ./1/usr/lib64/
cp -v ./lib64/libasound.so.2*                 ./1/lib64/
cp -v ./usr/lib64/libavahi-common.so.3*       ./1/usr/lib64/
cp -v ./usr/lib64/libavahi-client.so.3*       ./1/usr/lib64/
cp -v ./usr/lib64/libXrender.so.1*            ./1/usr/lib64/
cp -v ./usr/lib64/libwayland-server.so.0*     ./1/usr/lib64/
cp -v ./usr/lib64/libXau.so.6*                ./1/usr/lib64/
cp -v ./usr/lib64/libthai.so.0*               ./1/usr/lib64/
cp -v ./usr/lib64/libfribidi.so.0*            ./1/usr/lib64/
cp -v ./usr/lib64/libpixman-1.so.0*           ./1/usr/lib64/
cp -v ./usr/lib64/libfontconfig.so.1*         ./1/usr/lib64/
cp -v ./usr/lib64/libfreetype.so.6*           ./1/usr/lib64/
cp -v ./usr/lib64/libEGL.so.1*                ./1/usr/lib64/
cp -v ./usr/lib64/libpng15.so.15*             ./1/usr/lib64/
cp -v ./usr/lib64/libxcb-shm.so.0*            ./1/usr/lib64/
cp -v ./usr/lib64/libxcb-render.so.0*         ./1/usr/lib64/
cp -v ./usr/lib64/libGL.so.1*                 ./1/usr/lib64/
cp -v ./usr/lib64/libGLdispatch.so.0*         ./1/usr/lib64/
cp -vR ./usr/share/fonts/*                    ./1/usr/share/fonts/

После заливки этой папки на сервер можно проверить каких библиотек из этого списка там(на сервере) не хватает:

declare -a libs=($(find . -name '*.so*'))

for i in "${libs[@]}"
do
   if [ ! -f "/$i" ]
   then
	  echo "File not found /$i"
   fi
done

Вывод на был такой:

File not found /./usr/lib64/libatspi.so.0
File not found /./usr/lib64/libatk-bridge-2.0.so.0
File not found /./usr/lib64/libxkbcommon.so.0
File not found /./usr/lib64/libatk-bridge-2.0.so.0.0.0
File not found /./usr/lib64/libatspi.so.0.0.1
File not found /./usr/lib64/libxkbcommon.so.0.0.0

@gorshkov-leonid
Copy link
Author

gorshkov-leonid commented Feb 15, 2024

Find out quickly which package provides a certain library with YUM

echo "" >  libs.txt
while read "p"; do
   p="$(echo "$p"|tr -d '\n'|tr -d '\r')"
   # lib name
   export filename=$(yum provides "$p" | grep -oP '(?<=Filename).*' | sed 's/ *: //')
   # package name
   export packagename=$(yum provides "$p" | grep -oP '.*(?= : .*)' | grep -n '' | grep -oP '(?<=1:).*'  | sort --unique)
   echo "$packagename  $filename" >> libs.txt
done < logs1.txt

https://unix.stackexchange.com/questions/57124/remove-newline-from-unix-variable

cat ./logs1.txt | while read -r a; do a="$(echo "$a"|tr -d '\n'|tr -d '\r')"; echo "===$a==="; done

How to find the required dependency software on CentOS?

@gorshkov-leonid
Copy link
Author

rpm -q --whatprovides /usr/local/lib/libiconv.so.2

@gorshkov-leonid
Copy link
Author

gorshkov-leonid commented Mar 6, 2024

export rpms=$(ls | grep '.rpm')
echo "" >  logs.txt
while read "p"; do
   echo "====== $p ======"  >> logs.txt
   rpm -qp --scripts "$p" >> logs.txt
done <<< $rpms

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment