Установка npm на Centos 7

Вопрос или проблема

Я могу сказать, что прошел через все результаты 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, которая больше не поддерживается, или я не прав?

Есть ли какие-либо подсказки?

Мне удалось заставить это работать:

  1. Клонирование из Github – V19.9.0
  2. Установка C++ 11
  3. Настройка правильных переменных export для configure
  4. Компиляция и установка.
  5. Вот теперь установленные версии:
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 в качестве примера:

  1. Установите предварительно собранный [email protected] из centos-release-scl:
yum install centos-release-scl
yum install devtoolset-8-{gcc,make}
  1. Введите подсистему с помощью [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)
  1. Скачайте исходники [email protected]:
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.xz
tar xvf glibc-2.28.tar.xz
  1. Соберите [email protected]:
cd glibc-2.28
mkdir build
cd build

../configure --prefix=/opt/glibc-2.28
time make -j"$(nproc)"
make install
exit # выйти из scl-подсистемы
  1. Скачайте исходники [email protected] для сборки его [email protected], так как node@22 требует версионированный символ с GLIBCX_3.4.22:

И согласно 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
  1. Возможно, скомпилировать только 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

  1. Так что нам все равно придется собрать полный GCC collection:
cd ..
rm -rf build
./contrib/download_prerequisites

mkdir build
cd build
../configure --prefix=/opt/gcc-6.5.0 --disable-multilib
  1. В зависимости от производительности вашего оборудования, это может занять часы и много ГиБ дискового пространства: 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-подсистемы
  1. Если вы спешите и доверяете какому-то случайно загруженному бинарному файлу, извлеките путь 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 файлов.

  2. Создайте символическую ссылку на собранный 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
  1. Скачайте бинарный файл 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
  1. Скачайте сам 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
  1. Модифицируйте 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.
  1. Наслаждайтесь:
./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, где вы сможете получить поддержку от сообщества.

Оцените материал
Добавить комментарий

Капча загружается...