Вопрос или проблема
Я могу сказать, что прошел через все результаты Google по этому поводу, но ничего не работает. Версия GNU libc очень старая:
ldd (GNU libc) 2.17
.
Попытки установить версии до nodesource 8.x
все установки завершаются неудачей из-за старой GNU libc:
Ошибка: Пакет: 2:nodejs-19.9.0-1nodesource.x86_64 (nodesource)
Требует: libm.so.6(GLIBC_2.27)(64bit)
Ошибка: Пакет: 2:nodejs-19.9.0-1nodesource.x86_64 (nodesource)
Требует: libc.so.6(GLIBC_2.28)(64bit)
Что мне делать? Поможет ли, если я попробую собрать node из исходников с помощью gcc-c++
? Судя по требованиям, у меня есть сомнения, что это сработает, потому что CentOS 7 также имеет очень старую версию gcc, которая больше не поддерживается, или я не прав?
Есть ли какие-либо подсказки?
Мне удалось заставить это работать:
- Клонирование из Github – V19.9.0
- Установка C++ 11
- Настройка правильных переменных
export
дляconfigure
- Компиляция и установка.
- Вот теперь установленные версии:
root@server:/usr/local/src/node => npm version { npm: '9.6.3', node: '19.9.0', acorn: '8.8.2', ada: '1.0.4', ares: '1.19.0', brotli: '1.0.9', cldr: '42.0', icu: '72.1', llhttp: '8.1.0', modules: '111', napi: '8', nghttp2: '1.52.0', nghttp3: '0.7.0', ngtcp2: '0.8.1', openssl: '3.0.8+quic', simdutf: '3.2.3', tz: '2023c', undici: '5.21.0', unicode: '15.0', uv: '1.44.2', uvwasi: '0.0.16', v8: '10.8.168.25-node.16', zlib: '1.2.13' } root@server:~ => cat /etc/centos-release CentOS Linux release 7.9.2009 (Core) root@server:~ => ldd --version ldd (GNU libc) 2.17 Copyright (C) 2012 Free Software Foundation, Inc. Это свободное программное обеспечение; смотрите источник для условий копирования. Нет гарантии; даже для ТОВАРНОГО КАЧЕСТВА или ГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. Написано Роландом МакГратом и Ульрихом Дреппером.
Как запустить node v20.x на CentOS 7.9?
Этот подход схож с https://stackoverflow.com/questions/72921215/getting-glibc-2-28-not-found/77247394#77247394 и https://serverfault.com/questions/894625/safely-upgrade-glibc-on-centos-7/894689#894689, но для CentOS@^7
.
Берем текущую LTS версию node@^22
, которая требует [email protected]
, так как node@^18
в качестве примера:
- Установите предварительно собранный
[email protected]
изcentos-release-scl
:
yum install centos-release-scl
yum install devtoolset-8-{gcc,make}
- Введите подсистему с помощью
[email protected]
scl enable devtoolset-8 # войти в scl-подсистему
which gcc # /opt/rh/devtoolset-8/root/usr/bin/gcc
gcc --version # gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)
- Скачайте исходники
[email protected]
:
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.xz
tar xvf glibc-2.28.tar.xz
- Соберите
[email protected]
:
cd glibc-2.28
mkdir build
cd build
../configure --prefix=/opt/glibc-2.28
time make -j"$(nproc)"
make install
exit # выйти из scl-подсистемы
- Скачайте исходники
[email protected]
для сборки его[email protected]
, так какnode@22
требует версионированный символ сGLIBCX_3.4.22
:
- https://stackoverflow.com/questions/48360886/nodejs-circleci-glibcxx-3-4-21-not-found
- https://stackoverflow.com/questions/56164795/error-with-npm-sqlite3-library-after-upgrading-to-node-12-glibcxx-3-4-21-not
- https://stackoverflow.com/questions/38167639/glibcx-3-4-21-not-found
- https://github.com/nodesource/distributions/issues/1774
- https://stackoverflow.com/questions/58424974/anaconda-importerror-usr-lib64-libstdc-so-6-version-glibcxx-3-4-21-not-fo
И согласно https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html в https://stackoverflow.com/questions/44773296/libstdc-so-6-version-glibcxx-3-4-20-not-found/49363515#49363515, первая версия, экспортирующая символы версии GLIBCX_3.4.22
, находится между [email protected]
и [email protected]
, поэтому мы решаем собрать последнюю [email protected]
из 6.x серии
wget https://ftp.gnu.org/gnu/gcc/gcc-6.5.0/gcc-6.5.0.tar.xz
tar xvf gcc-6.5.0.tar.xz
scl enable devtoolset-8 # войти в scl-подсистему
cd gcc-6.5.0
mkdir build
cd build
- Возможно, скомпилировать только
libstdc++.so.6
без сборки всегоGCC
: Как скомпилировать libstdc++ с конкретным параметром компилятора?
../libstdc++-v3/configure --prefix=/opt/libstdc++-6.0.22 --disable-multilib
time make -j"$(nproc)"
Но созданный артефакт не экспортирует символ _ZSt11__once_call
, который импортирует Node
, это можно проверить с помощью
strings src/.libs/libstdc++.so.6.0.22 | grep _ZSt11__once_call
что ничего не выводит: https://stackoverflow.com/questions/72405588/using-clang-with-built-libstdc-produces-undefined-symbol-zst15-once-callable
- Так что нам все равно придется собрать полный
GCC
collection:
cd ..
rm -rf build
./contrib/download_prerequisites
mkdir build
cd build
../configure --prefix=/opt/gcc-6.5.0 --disable-multilib
- В зависимости от производительности вашего оборудования, это может занять часы и много ГиБ дискового пространства: https://gcc.gnu.org/install/build.html
time make -j"$(nproc)"
cd x86_64-pc-linux-gnu/libstdc++-v3 # только установить libstdc++.so
make install
exit # выйти из scl-подсистемы
-
Если вы спешите и доверяете какому-то случайно загруженному бинарному файлу, извлеките путь
gcc63-c++-6.3.0-1.el7.x86_64.cpio\.\usr\local\gcc63\lib64\libstdc++.so.6.0.22
изgcc63-c++-6.3.0-1.el7.x86_64.rpm
, который был загружен https://stackoverflow.com/questions/47175706/how-to-install-gcc-4-9-2-on-rhel-7-4/47189915#47189915 и сохраните его под/opt/glibc-2.28/lib/libstdc++.so.6.0.22
.
На Windows вы можете использоватьNanaZip
для распаковки*.rpm
и*.cpio
файлов. -
Создайте символическую ссылку на собранный
libstdc++.so.6.0.22
в/opt/glibc-2.28/lib
, если вы не хотите определять переменную оболочкиLD_LIBRARY_PATH=/opt/gcc-6.5.0/lib64 node
для каждого запускаnode
:
ln -s /opt/gcc-6.5.0/lib64/libstdc++.so.6.0.22 /opt/glibc-2.28/lib/libstdc++.so.6
- Скачайте бинарный файл
patchelf
для модификации исполняемого файлаnode
:
wget https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-x86_64.tar.gz
tar xzvf patchelf-0.18.0-x86_64.tar.gz
- Скачайте сам
node
:
wget https://nodejs.org/download/release/v22.12.0/node-v22.12.0-linux-x64.tar.xz
tar xvf node-v22.12.0-linux-x64.tar.xz
cd node-v22.12.0-linux-x64/bin
- Модифицируйте
node
:
~/patchelf/bin/patchelf --set-interpreter /opt/glibc-2.28/lib/ld-linux-x86-64.so.2 node # требуется
~/patchelf/bin/patchelf --set-rpath /opt/glibc-2.28/lib:/usr/lib64 node # необязательно, аналогично 9.
- Наслаждайтесь:
./node
console.log(1);
process.exit(2);
echo $?
Скрипт запуска:
# https://gist.github.com/mohanpedala/1e2ff5661761d3abd0385e8223e16425
# https://mywiki.wooledge.org/BashFAQ/105
set -euxo pipefail
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.xz
tar xvf glibc-2.28.tar.xz
yum install centos-release-scl
yum install devtoolset-8-{gcc,make}
scl enable devtoolset-8
cd glibc-2.28
mkdir build
cd build
../configure --prefix=/opt/glibc-2.28
make -j"$(nproc)"
make install
exit
wget https://ftp.gnu.org/gnu/gcc/gcc-6.5.0/gcc-6.5.0.tar.xz
tar xvf gcc-6.5.0.tar.xz
scl enable devtoolset-8
cd gcc-6.5.0
./contrib/download_prerequisites
mkdir build
cd build
../configure --prefix=/opt/gcc-6.5.0 --disable-multilib
# в зависимости от производительности вашего оборудования, это может занять часы и много ГиБ дискового пространства
time make -j"$(nproc)"
make install
exit
ln -s /opt/gcc-6.5.0/lib64/libstdc++.so.6.0.22 /opt/glibc-2.28/lib/libstdc++.so.6
wget https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-x86_64.tar.gz
tar xzvf patchelf-0.18.0-x86_64.tar.gz
wget https://nodejs.org/download/release/v22.12.0/node-v22.12.0-linux-x64.tar.xz
tar xvf node-v22.12.0-linux-x64.tar.xz
cd node-v22.12.0-linux-x64/bin
# https://serverfault.com/questions/894625/safely-upgrade-glibc-on-centos-7/894689#894689
~/patchelf/bin/patchelf --set-interpreter /opt/glibc-2.28/lib/ld-linux-x86-64.so.2 node
~/patchelf/bin/patchelf --set-rpath /opt/glibc-2.28/lib:/usr/lib64 node
./node
Ответ или решение
Установка npm на CentOS 7: Пошаговая инструкция
Установка npm на CentOS 7 может представлять собой задачу, особенно когда речь идет о старых версиях GNU libc. Если вы столкнулись с ошибками, указывающими на необходимость более новой версии libc, предлагаемое решение включает несколько этапов, которые помогут вам успешно установить Node.js и npm.
1. Установка необходимых инструментов
Перед началом установки вам необходимо установить инструменты для сборки, включая gcc
и make
. В CentOS 7 мы можем использовать Software Collections (SCL) для установки более новых версий компилятора.
sudo yum install centos-release-scl
sudo yum install devtoolset-8-gcc devtoolset-8-gcc-c++
Включите devtoolset
в текущую оболочку:
scl enable devtoolset-8 bash
2. Загрузка и установка glibc
Поскольку ваша версия libc 2.17 слишком стара, мы можем скачать и установить более новую версию.
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.xz
tar xvf glibc-2.28.tar.xz
cd glibc-2.28
mkdir build
cd build
../configure --prefix=/opt/glibc-2.28
make -j"$(nproc)"
sudo make install
3. Сборка и установка GCC
Чтобы поддерживать новые требования символов, таких как GLIBCXX_3.4.22
, потребуется установить более новую версию GCC.
wget https://ftp.gnu.org/gnu/gcc/gcc-6.5.0/gcc-6.5.0.tar.xz
tar xvf gcc-6.5.0.tar.xz
cd gcc-6.5.0
./contrib/download_prerequisites
mkdir build
cd build
../configure --prefix=/opt/gcc-6.5.0 --disable-multilib
time make -j"$(nproc)"
sudo make install
4. Установка libstdc++
После установки GCC символы, необходимые для работы современных библиотек, будут доступны. Теперь создадим символическую ссылку для libstdc++.so.6
.
ln -s /opt/gcc-6.5.0/lib64/libstdc++.so.6.0.22 /opt/glibc-2.28/lib/libstdc++.so.6
5. Загрузка и установка Node.js
Мы можем использовать заранее собранные бинарные файлы, чтобы упростить процесс. Сначала скачайте их:
wget https://nodejs.org/dist/v22.12.0/node-v22.12.0-linux-x64.tar.xz
tar xf node-v22.12.0-linux-x64.tar.xz
cd node-v22.12.0-linux-x64
6. Патчинг бинарного файла Node.js
Чтобы Node.js работал с нашей новой версией glibc
, используем patchelf
, чтобы указать на новый интерпретатор.
Сначала скачайте patchelf
:
wget https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-x86_64.tar.gz
tar xzvf patchelf-0.18.0-x86_64.tar.gz
Теперь патчим бинарный файл Node.js:
~/patchelf/bin/patchelf --set-interpreter /opt/glibc-2.28/lib/ld-linux-x86-64.so.2 node
~/patchelf/bin/patchelf --set-rpath /opt/glibc-2.28/lib:/usr/lib64 node
7. Проверка установки
Теперь запускаем Node.js и проверяем версию npm:
./bin/node -v
./bin/npm -v
Заключение
Вы успешно установили npm на CentOS 7, несмотря на ограничения, наложенные устаревшими библиотеками. Если вы последовали всем шагам, вы получите современную версию Node.js и npm, готовую к использованию. Если возникли проблемы или дополнительные вопросы, не стесняйтесь обращаться в сообщества или форумы, такие как Stack Overflow или Unix Stack Exchange, где вы сможете получить поддержку от сообщества.