自宅の開発環境、そういえば一回全部吹き飛ばしたんだっけ……となっており、色々思い出しながら作業していた。
何も考えずに anyenv をインストールして rbenv install 3.3.1
❯ less -R /tmp/ruby-build.20240525232550.129739.log ... crypto/comp/c_zlib.c:36:11: fatal error: zlib.h: No such file or directory 36 | # include <zlib.h> | ^~~~~~~~ compilation terminated. make[1]: *** [Makefile:14361: crypto/comp/libcrypto-lib-c_zlib.o] Error 1 make[1]: *** Waiting for unfinished jobs.... make[1]: Leaving directory '/tmp/ruby-build.20240525232550.129739.2OhtSI/openssl-3.1.5' make: *** [Makefile:3251: build_sw] Error 2 external command failed with status 2
あー zlib、そういうレベルで何もインストールしてなかったかー……となっている。
蛇足なんだけど
エンジニア人生で影響をおおいに受けた人が PCI DSS 環境メンテナンスマン出身で、「コンパイル必要なミドルウェア用意するなら、使うライブラリをちゃんと把握して自分でハンドリングしたりパッチ適用できるようにしろ」と教えられたことがあった。 いわゆる 20 代の若年エンジニアに多く見られがち (要出典) な、「コンフィグはどんな小さい値でもデフォルトから変更して最適化する」みたいな厨二病みたいな時期をコレで過ごしたので、いまだに思考が過敏なトコあるけど、最近ようやく dnf install
Development Tools`` を許せるようになってきた。
とはいえ開発環境までで、リモートにデプロイする時は「どのようなライブラリ・パッケージが必要か最低限の依存関係は提供せよ」と他の人にも聞くので、だいたい「huh?」みたいな顔される。 なぜならその状況だと「俺の環境では動いた」を脱していないから。
というわけで昨今の Docker でコンテナを管理して、なおかつそのコンテナ自体も開発元がオフィシャルで用意してくれる (だいたい必須パッケージだけの最小構成にしてくれている) というのは楽ですね、というマジで蛇足以外の何者でもないヤツ。
ちなみに RHEL で育って来た人間なので、 RHEL で minimal インストールする時には、おおむね以下のパッケージをインストールしておくとスムーズに解決する、という知見はあります。
sudo yum -y install openssl*.x86_64 zlib*.x86_64 readline*.x86_64 ncurses*.x86_64 libxml*.x86_64 libxslt*.x86_64 libtool*.x86_64 pcre pcre-devel.x86_64 freetype*.x86_64 libaio*.x86_64 sysstat wget bind-utils ntpdate make gcc gcc-c++ lynx screen logwatch openssh.x86_64 openssh-clients.x86_64 openssh-server.x86_64 openssh-askpass.x86_64 numactl*.x86_64 bzip2*.x86_64 nfs-util*.x86_64 yum-cron autofs*.x86_64 bc autoconf libpng.x86_64 libpng-devel.x86_64 libjpeg-turbo.x86_64 libjpeg-turbo-devel.x86_64 libffi.x86_64 libffi-devel.x86_64 unzip libyaml.x86_64 libyaml-devel.x86_64 httpd.x86_64 httpd-devel.x86_64 apr.x86_64 apr-devel.x86_64 apr-util.x86_64 apr-util-devel.x86_64 libcurl.x86_64 libcurl-devel.x86_64
yum
を使っている通り、 RHEL7 あたりまでの想定なので、 RHEL8, RHLE9 あたりでも通ると思うけど、OpenSSL 1.1 -> 3 への移行とか、 httpd (passenger) 固定想定なので、そのあたりは Nginx+Puma とか Ruby 3.1 以降を使うなら都度読み替える必要があります。 あと git とか入ってないので、本当に Ruby のソースコードを ZIP ダウンロードしてきて ./configure --prefix=/usr/local; make; sudo make install
するだけしか考えていない。
まあこれ今回は Ubuntu なので意味ないんですけどねガハハ!
Build Essentials
前置きが長くなったけど、 RHEL の Development Tools 相当として Ubuntu でも Build Essentials というパッケージ郡があるので、そちらを利用する。
❯ sudo apt install build-essential [sudo] password for donbulinux: Reading package lists... Done Building dependency tree... Done Reading state information... Done build-essential is already the newest version (12.9ubuntu3). build-essential set to manually installed. You might want to run 'apt --fix-broken install' to correct these. The following packages have unmet dependencies: nvidia-dkms-535 : Depends: nvidia-kernel-common-535 (<= 535.171.04-1) but it is not going to be installed Depends: nvidia-kernel-common-535 (>= 535.171.04) but it is not going to be installed nvidia-driver-535 : Depends: nvidia-kernel-common-535 (<= 535.171.04-1) but it is not going to be installed Depends: nvidia-kernel-common-535 (>= 535.171.04) but it is not going to be installed Recommends: libnvidia-compute-535:i386 (= 535.171.04-0ubuntu0.22.04.1) Recommends: libnvidia-decode-535:i386 (= 535.171.04-0ubuntu0.22.04.1) Recommends: libnvidia-encode-535:i386 (= 535.171.04-0ubuntu0.22.04.1) Recommends: libnvidia-fbc1-535:i386 (= 535.171.04-0ubuntu0.22.04.1) Recommends: libnvidia-gl-535:i386 (= 535.171.04-0ubuntu0.22.04.1) nvidia-kernel-common-530 : Depends: nvidia-kernel-common-535 but it is not going to be installed E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
うん?
CUDA 扱う系のパッケージ
そういや StableDiffusion 試して見たくて入れた気がする……? ということで環境が壊れている、ということっぽいのでサジェストの通り修正してみましょう。
❯ sudo apt --fix-broken install ... The following additional packages will be installed: nvidia-firmware-555-555.42.02 nvidia-kernel-common-530 nvidia-kernel-common-555 The following packages will be REMOVED: cuda cuda-12-1 cuda-demo-suite-12-1 cuda-drivers cuda-drivers-530 cuda-runtime-12-1 nvidia-dkms-530 nvidia-dkms-535 nvidia-driver-530 nvidia-driver-535 The following NEW packages will be installed: nvidia-firmware-555-555.42.02 nvidia-kernel-common-555 The following packages will be upgraded: nvidia-kernel-common-530 1 upgraded, 2 newly installed, 10 to remove and 170 not upgraded. 30 not fully installed or removed. Need to get 36.6 MB of archives. After this operation, 46.0 MB of additional disk space will be used. Do you want to continue? [Y/n] y
RHEL の yum/dnf は出力が冗長と感じる事あるけど、ある程度整形された Result 出てくるのあれ重要だったんだなあ、という気持ちになっている。 とはいえこれで修正されたっぽい? ので Build Essentilas に戻る。
Build Essentials やりなおし1
❯ sudo apt install build-essential ... 0 upgraded, 0 newly installed, 0 to remove and 170 not upgraded.
あれ? 入ってたの?
apt info libz-dev
zip.h が足りないので libz をインストールしたい、というトコで Build Essentilas をインストールしたが、 RHEL では zlib ・ Ubuntu では libz で体がイマイチ慣れていない。 とりあえず入ったか確認する。
❯ apt info libz N: Unable to locate package libz N: Unable to locate package libz E: No packages found ❯ apt info libz-dev Package: libz-dev State: not a real package (virtual) N: Can't select candidate version from package libz-dev as it has no candidate N: Can't select versions from package 'libz-dev' as it is purely virtual N: No packages found
ああん?
❯ sudo apt install libz-dev ... The following NEW packages will be installed: zlib1g-dev 0 upgraded, 1 newly installed, 0 to remove and 170 not upgraded. ...
ヴェッちょっとちょっと、存在するか確認したかったのに fetch すると勝手にインストールされの!?
しかもよく見るとパッケージ名が zlib1g-dev とかいう全然知らない名前だった……。
❯ apt info zlib1g-dev Package: zlib1g-dev Version: 1:1.2.11.dfsg-2ubuntu9.2 Priority: optional Section: libdevel Source: zlib Origin: Ubuntu Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Original-Maintainer: Mark Brown <broonie@debian.org> Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 606 kB Provides: libz-dev Depends: zlib1g (= 1:1.2.11.dfsg-2ubuntu9.2), libc6-dev | libc-dev Conflicts: zlib1-dev Homepage: http://zlib.net/ Task: ubuntustudio-publishing Download-Size: 164 kB APT-Manual-Installed: yes APT-Sources: http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages Description: compression library - development zlib is a library implementing the deflate compression method found in gzip and PKZIP. This package includes the development support files. N: There is 1 additional record. Please use the '-a' switch to see it
見てるとちゃんと存在しているので多分これで良い? 調べたところ、 zip 系のライブラリでうまくいかない人の記事を見つけた。
今回はインストールできたので zlib1g-dev ヨシとしたい。
Build Essentials やりなおし2
けどこれ libyaml とか libffi も同梱されないようになったしそのあたりフォローしないといけなさそうだし、 「extconf 系ではないけど後から困るな~」と思って色々しらべたところ、以下の記事を見つけた。
不足しているパッケージを一度にインストールするコマンドがある(動作確認無)
なるほど? と思って github 確認したら ruby-build のリポジトリだし答え書いてあるじゃんこれ。
❯ sudo apt install git curl libssl-dev libreadline-dev zlib1g-dev autoconf bison build-essential libyaml-dev libreadline-dev libncurses5-dev libffi-dev libgdbm-dev ... The following additional packages will be installed: automake autotools-dev libncurses-dev libssl3 m4 Suggested packages: autoconf-archive gnu-standards autoconf-doc libtool gettext bison-doc git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn ncurses-doc readline-doc libssl-doc libyaml-doc m4-doc The following NEW packages will be installed: autoconf automake autotools-dev bison libffi-dev libgdbm-dev libncurses-dev libncurses5-dev libreadline-dev libssl-dev libyaml-dev m4 The following packages will be upgraded: git libssl3 2 upgraded, 12 newly installed, 0 to remove and 168 not upgraded. Need to get 8221 kB/10.1 MB of archives. ...
大丈夫そうなのでコレでインストールした、改めて rbenv 経由で ruby インストールしてみましょう!
色々寄り道しまくって rbenv install 3.3.1
いざ鎌倉!
❯ rbenv install 3.3.1 ==> Downloading ruby-3.3.1.tar.gz... -> curl -q -fL -o ruby-3.3.1.tar.gz https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.1.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 21.0M 100 21.0M 0 0 20.1M 0 0:00:01 0:00:01 --:--:-- 20.1M ==> Installing ruby-3.3.1... -> ./configure "--prefix=$HOME/.anyenv/envs/rbenv/versions/3.3.1" --enable-shared --with-ext=openssl,psych,+ -> make -j 20 -> make install ==> Installed ruby-3.3.1 to /home/donbulinux/.anyenv/envs/rbenv/versions/3.3.1 NOTE: to activate this Ruby version as the new default, run: rbenv global 3.3.1
無事インストールできましたね、しかし configure オプションこんな感じなのかぁ~、と久しぶりに学びがあった。
このあとはサジェスト通り rbenv global
しておく。
❯ rbenv global 3.3.1 ❯ exec ${SHELL} -L ❯ ruby -v ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]
シェル再起動して無事認識された。 めでたしめでたし。
蛇足
Docker なりでコンテナ使いなよ
雑に ruby を使いたい時があり、システムワイドに入れたいのだ。 けどディストリ公式のパッケージは中途半端で入れたくない、という矛盾。
rbenv を利用せずにインストール
やっている人はいるもんですね。
実際 rbenv が偉いのは、コマンドを通してバージョン選択すれば configure などやってくれるのと、 Ruby バージョンごとに異なる OpenSSL 依存パッケージの解決をやってくれるトコなので。
そこを手動でやれば rbenv の層がなくてもインストール可能、というのは道理ですね。
apt の * 指定
しかし Ubuntu って apt で *
みたいにしても一致しないのか。 意外と面倒だな……。
❯ apt info zlib* zsh: no matches found: zlib*
Ubuntu 24 にする
❯ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
24 LTS が出たのでそちらにアップデートしましょう。 とはいえアップグレードするか新規インストールするかで、それぞれアップグレード・環境移行で別の難易度があるので、場合に応じて色々試しましょう。
今回は面倒なので 22 LTS のままにしました。