AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

WSL2(Ubuntu) 環境に rbenv 経由で ruby を入れる

自宅の開発環境、そういえば一回全部吹き飛ばしたんだっけ……となっており、色々思い出しながら作業していた。

何も考えずに 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 installDevelopment 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

前置きが長くなったけど、 RHELDevelopment Tools 相当として Ubuntu でも Build Essentials というパッケージ郡があるので、そちらを利用する。

qiita.com

❯ 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

RHELyum/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 系のライブラリでうまくいかない人の記事を見つけた。

qiita.com

今回はインストールできたので zlib1g-dev ヨシとしたい。

Build Essentials やりなおし2

けどこれ libyaml とか libffi も同梱されないようになったしそのあたりフォローしないといけなさそうだし、 「extconf 系ではないけど後から困るな~」と思って色々しらべたところ、以下の記事を見つけた。

qiita.com

不足しているパッケージを一度にインストールするコマンドがある(動作確認無)

なるほど? と思って github 確認したら ruby-build のリポジトリだし答え書いてあるじゃんこれ。

github.com

❯ 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.1exec ${SHELL} -L
❯ ruby -v
ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]

シェル再起動して無事認識された。 めでたしめでたし。

蛇足

Docker なりでコンテナ使いなよ

雑に ruby を使いたい時があり、システムワイドに入れたいのだ。 けどディストリ公式のパッケージは中途半端で入れたくない、という矛盾。

rbenv を利用せずにインストール

やっている人はいるもんですね。

blog.tmtms.net

実際 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 が出たのでそちらにアップデートしましょう。 とはいえアップグレードするか新規インストールするかで、それぞれアップグレード・環境移行で別の難易度があるので、場合に応じて色々試しましょう。

qiita.com

www.tech-law-pyscho.info

今回は面倒なので 22 LTS のままにしました。