from electron 2 web

インターネットのリソースを無駄遣いして検索におけるUXを下げてごめんなさい

圧倒的文章力のNASAでゴミみたいなチラ裏のようなメモを量産してしまい全ての"Web開発者"にごめんなさい

rpmの解析とかspecファイルとかrpmの移植とかtips

大幅に遅刻しましたがharekazeアドカレ17日目です。

adventar.org

centosrhelのパッケージ形式はrpm(それはそう)

rpmの実態は「インストールスクリプト」+「バイナリ本体」でできている。

この両者が同じものなら論理的には同じ動作をするがなんとハッシュ値rpmを作るときによって変わる

鍵QT:diffっても完全に同じだったのにハッシュ違う心霊現象が起きていたがrpmbuildはビルド時間記録するからそこが変わることがが分かった

ちなみに通常更新日時や属性ではhash値は変わらない(それはそう)

rpm -qiとかでこのパッケージをrpmbuildで生成したビルド日時等が見れる。

じゃあ2つのrpmをどうやって比較するかというとインストールスクリプトとバイナリ本体を回答ディレクトリに分けてそれらのdiffを取る

実はrpmdiffとか他にもたぶんいろんな方法あるんですがこの言葉からどれだけ劣悪な環境で開発させられてるか察してほしい

インストールスクリプトrpm -qp --script XXX.rpmとかで表示できる。

rpm -qp --script A.rpm > A.sh
rpm -qp --script B.rpm > B.sh
diff A.sh B.sh

みたいな感じで。

インストールスクリプトの中身はただのsh。でもpreとかpreunとかpostとかpostunとかのいくつかのセクションに分割されている。

バイナリ本体はrpm2cpio XXX.rpm | cpio -idで解凍できる。解凍するとcurrentdirにフォルダごとのバイナリやconfigファイル等のパッケージに必要なものが出力される。

例えばcurrentdirが/tmp/levena/だったとする。このディレクトリでrpm2cpio httpd2.4.rpm | cpio -idを打つと/tmp/levena/var/www/や/tmp/levena/usr/local/にhttpd.confやmod_jk.so等が出力される。

これを2社間でdiffすればいい。winmergeマジ便利なのでお勧めです。

rpmの移植(rhel6→rhel7に移植するときみたいな)

依存ライブラリで死ぬ場合は上記の方法でバイナリ解凍した後、ldd等でどのバイナリでどの共有ライブラリが必要か割り出していく。どこが死んでいるかわかったらあとはバイナリを差し替えるなりソース書き換えるなりすれば良い。

セグ落ちしたりrhel6→7の仕様で壊れてる場合は知らん。気合で直せ。(辛かった)

rpmのビルド

いまさら聞けないrpmbuildことはじめ - hack in 3 minutes

rpmbuildの方法とかについてはたくさん載ってるんだけどpostとかpreunとかrpm ivvvhの見方とかspecファイル特有のコマンドの解説とかは全然載ってないんだよなぁ・・・

rpmのbuildはrpmbuildで行う。

その時どんなものをrpmパッケージに詰めるのか、インストールスクリプトのソースはどうするのかについて指示するのがspecファイル。

specファイルはインストールスクリプトと同じようにいくつかのセクションから出来ている。
っていうかspecに書いたものがそのままインストールスクリプトになる。

だから調べるようにechoデバッグとか入れて調べることもできる。

specファイルでは特殊なコマンドが使用されることが多いが、たいてい既存のコマンドに動作が似ている。

例えばinstallコマンドはcpと同時にchmodが行える。setupコマンドはtarの解凍っぽい感じ。

ただし見慣れないコマンドなので理解するのにめちゃ時間かかった。
それぞれのsetupコマンドとかオプションも尋常じゃない程多いし。
アではふんだんに意味不明なオプション使いまくってたし。

手元に実行環境無いし書き直す前より内容薄くなってしまった・・・

おまけ

syslogとかの対応で苦しむ未来が見えるので予習しておく

RHEL7/CentOS7 では、御存知の通りsystemdが導入されています。この影響でログ関連も大きく構成が変わっています。 う~ん、辛い!w

外側から飛んできたり内側から生えてきたログはまずjournaldに補足された後rsyslogのimmoduleで選別されて/var/log/messages等に行く。

一応レガシーsyslog使えるっぽい。syslog.confをそのままrhel7で動かしたらimklogとかで死んだけど。

ただログの保存に失敗するときあるらしいし素直に移植したほうがよさそう。

この部分移植するのに結構時間かかりそうだなぁ・・・普通に1週間食われるかも・・・

rh6からrh7の移植

# yum install XXX –downloadonly –downloaddir=.
未インストールのパッケージのrpmをカレントディレクトリにダウンロード
# yumdownloader <package>
インストール済みのパッケージのrpmをカレントディレクトリにダウンロードする
# yum list installed | grep pcre
システムにインストール済みのパッケージを探す(rpmのパッケージ名やバージョンが表示できる)
# rpm –ivh XXX.rpm
rpmファイルをインストールする
# rpm –Uvh XXX.rpm
rpmファイルをアップデートする
# rpm –Uvh XXX.rpm
rpmファイルをアップデートする
# rpm -qpi xxx.rpm
未インストールのrpmファイルの情報を表示
# rpm -ivvvh XXXX.rpm
詳細な出力を有効にしてインストール(デバッグ用)
# rpm --eval %{name}
rpmbuildで使用するspecファイルの値の確認をする
# ldd xxxx.rpm
rpmが依存している共有ライブラリを表示する
# ldd xxxx(バイナリ)
xxxxが依存している共有ライブラリを表示する
# ldconfig
システムに登録した依存関係を更新する。
# rpmbuild -vv -bb ./redhat/SPECS/logstareAL-1.7.0.spec
specファイルとソースコードからrpmを作成する。
# find ./ -exec chmod 500 {} +
現在のディレクトリ以下のパーミッションをr-x------とする
# find ./ -type f  -exec chmod 400 {} +
ファイルのパーミッションのみをr--------とする。
# tar –czvf dst.tar.gz ./
tar.gzに圧縮、解凍
# rpm2cpio XXX.rpm | cpio –id
rpmを解凍する、出力はカレントディレクトリとなる。
# install –m
パーミッションを変更しながらコピー。%{__install}はこのコマンドを実行している。
# wget --no-check-certificate  https://xxxx/hoge.tar.gz
証明書が壊れているサイト(pcre等)からgzをダウンロード
# pcre-config –cflags
Apacheをbuildする時にpcreがちゃんとインストールされているかどうか確認する。
このコマンドの実行結果が返ってきていない場合はbuildに失敗する。その場合はpcreのソースを持ってきてそれを先にビルドしmake installなどをする。
# ./configure --with-apache=/usr/local/logsynthe-www/apache2/
mod_jkのconfigureで使用する。(ls-dev01のapacheビルド方法は通常と違う為、このオプションを付けないとmod_jk configure時に認識できない。)
# find . -type f -name "Makefile" | xargs grep -l "V9\." | grep -v "work" | grep -v "devel_old_pkg" | grep -v "b.+up" | xargs perl -i -pe "s/db2\/V9.\d/db2\/V10.5/g"
db2に関する記述があるmakeファイル内の中でdevel_old_pkgやbackup、work以外のdb2を指定するバージョンをv9.Xからv10.5にする。