Linuxだと主語がでかかった。主にパッケージインストールについて。
リポジトリ一覧を表示
$ yum repolist
epelの7系のリポジトリを追加する
$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
phpのためにremiの7系もいえる
$ sudo yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
ずっと知りたかった!依存関係でこれ足りねえよってライブラリ名出されても、何インストールしていいかわからん問題。 https://www.geek.sc/archives/620
$ yum whatprovides [ライブラリ名]
-
検索するときはワイルドカードがつかえる。
libraw_r.so.19
がだめっていわれたときに、バージョン付きで検索してもだめよ。 -
パッケージ名ってどこまで正式かわからん問題もある。
hoge-2.4
ってあったらhoge
がパッケージ名なんだろうか。 バージョンが異なるパッケージとかもあった場合、バージョンなしでやると最新、バージョン付きでやればバージョン指定とか?
$ yum list installed
sudo yum-config-manager --enable epel
sudo yum-config-manager --enable remi
当初、/etc/yum.repos.dにおいてあるディレクトリを直接削除した。そうすると、パッケージマネージャ上では残ったままになる。 ↓を行うことでちゃんと消えるのでdirを直接消すのはやめよう
// testを使うとdry-run
rpm -e --test リポジトリ名
さまざまなリポジトリ https://qiita.com/bezeklik/items/9766003c19f9664602fe
// amzn2-coreのパッケージが優先されてしまうのでdisableにする
sudo yum install --enablerepo=remi,remi-php56 php --disablerepo=amzn2-core
エラー: パッケージ: php-cli-5.6.40-19.el7.remi.x86_64 (remi-php56)
要求: libtinfo.so.5()(64bit)
エラー: パッケージ: php-cli-5.6.40-19.el7.remi.x86_64 (remi-php56)
要求: libncurses.so.5()(64bit)
// ncurses-compat-libsを導入すると上記で必要とているlibが入る
$ sudo yum install ncurses-compat-libs
AmazonLinux2環境でphpをインストールしたときに毎回迷うのでメモ。
- 古くはソースコードから自分でmakeして、実行ファイルを所定の場所に置くなりしてた。
- とあるソースコードが別のソースコードに依存するのであれば、makeしてエラーになって気づいて、もってきてーの繰り返しが必要だった。
- パッケージシステムができたことで、ほしいパッケージ名を叩くだけで、依存関係を管理しながらインストールができるようになった。
ありがとうパッケージシステム。
- パッケージ管理システムには、Debian系とRedHat系で採用されるRPM系がある。
- RedHat系(CentOSとかも)はyum, Debian系はapt-get
- AmazonLinuxはRPM系なので、ここではRPM系の話を書く。
※ラズパイとかはDebian系だったね!Dockerの軽量LinuxであるAlpineもapk
みたいな別の管理システムがあったね!
パッケージはrpm
っていう拡張子でまとめられている。
試しに適当にPHPのrpm
をAmazonLinuxがデフォルトで提供するamzn-core
リポジトリから取ってくる。
yum
については後述。
$ cd ~
$ mkdir pkg
// installって書いてあるけど、rpm形式のパッケージをとってくるだけ
$ sudo yum install php --downloadonly --downloaddir=.
php-5.4.16-46.amzn2.0.2.x86_64.rpm
ちょっと怪しいけど、パッケージにはこんな規則で名前がついてるっぽい。
php: パッケージ名称
5.4.16: バージョン番号
46.amzn2.0.2: リリース番号
x86_64: アーキテクチャ
中身を覗いてみる。 https://www.atmarkit.co.jp/flinux/rensai/linuxtips/522rpmcpio.html
$ mkdir php && cd php
$ rpm2cpio ../php-5.4.16-46.amzn2.0.2.x86_64.rpm | cpio -id
すると、ソースコードではなく、実行ファイルと設定ファイルが入ってることが確認できる。 ソースコードじゃないのでビルドする必要もなくお手軽なんだね。
$ tree
.
├── etc
│ └── httpd
│ ├── conf.d
│ │ └── php.conf
│ └── conf.modules.d
│ └── 10-php.conf
├── usr
│ ├── lib64
│ │ └── httpd
│ │ └── modules
│ │ └── libphp5.so
│ └── share
│ └── httpd
│ └── icons
│ └── php.gif
└── var
└── lib
└── php
└── session
上記のように面倒なことをしなくても、rpm -qlp
をするとパッケージの中身が確認できる。
$ rpm -qlp php-5.4.16-46.amzn2.0.2.x86_64.rpm
/etc/httpd/conf.d/php.conf
/etc/httpd/conf.modules.d/10-php.conf
/usr/lib64/httpd/modules/libphp5.so
/usr/share/httpd/icons/php.gif
/var/lib/php/session
ソースコードからビルドしないってなった場合、この実行ファイルってどの環境がサポートされてるのかが気になった。 AmazonLinux2が提供するパッケージなのでAmazonLinux2は当然なんだけど、これをCentOSとかに持ってたらどうなるのかが気になる。
特に外部リポジトリを追加する場合、AmazonLinux2で動作するパッケージが含まれるリポジトリってどうやって判断するのだろう。
外部リポジトリのepel
とかのリンクをみるとCentOS
もRHEL
もまとめられてるから、互換性があるのかな。
https://fedoraproject.org/wiki/EPEL
→ そもそもCentOS
ってRHEL
の互換性があることを目指したフリーのディストリビューション。
だから、CentOS
とRHEL
は互換性があると思ってよさそう。
AmazonLinux2は、RHEL
ベースっぽいので、CentOS
、RHEL
、AmazonLinux2
間の互換性はありそう。
https://qiita.com/akira345/items/2a09c4d06d2e3415bc8d
AWSの公式記事にもepel
の追加方法が書いてあって、追加するリポジトリはRHEL7と同じことから、この認識であってそうな気がする。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/
冒頭に触れたDebian系とかは、そもそもパッケージ管理の仕組みが違うからepelとかもないのかしら?
パッケージはrpm
でまとめられているんだけど、このrpmはwgetとかで個別にダウンロードしたり、ftpクライアントとかで上げたりといろんな取得方法がある。
なんだけど、手軽に追加したり、消したりするのためにyum
を使うのが普通。
yum
を使うと、登録しているリポジトリからパッケージ名を検索して、rpm
を取ってきて、インストールまでしてくれる。
ようやく本題。
公式チュートリアルを見よう。 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html
さらっとみると、 Amazon Linux Extras
リポジトリを追加して、yumではない独自のコマンドでインストールできるみたい。
�PHPを提供しているリポジトリを追加しよう。remi
っていうリポジトリがいろんなバージョンを提供してくれている。
リポジトリを追加する前に、せっかくなので今存在しているリポジトリをみてみよう。 いろいろ触っちゃった後なので、初期構築時からかわってるかもしれないけど、以下のようなリポジトリがあることがわかる。
$ yum repolist
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
リポジトリー ID リポジトリー名 状態
!amzn2-core/2/x86_64 Amazon Linux 2 core repository 19,545
amzn2extra-docker/2/x86_64 Amazon Extras repo for docker
若干怪しいのだけど、remiをインストールした際にepelも追加してね!ってメッセージが出た気がするので、epelも追加するよ。
気になる人は、�先にremiだけインストールしてみてね。
$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
この後に、remiとかはデフォルトで有効になってないとのことなので、リポジトリを有効にしてあげます。
$ sudo yum-config-manager --enable epel
$ sudo yum-config-manager --enable remi
リポジトリが増えていることが確認できました!
$ yum repolist
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
250 packages excluded due to repository priority protections
リポジトリー ID リポジトリー名 状態
!amzn2-core/2/x86_64 Amazon Linux 2 core repository 19,545
amzn2extra-docker/2/x86_64 Amazon Extras repo for docker 24
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 13,054+192
remi Remi's RPM repository for Enterprise Linux 7 - x86_64 6,092+55
remi-safe Safe Remi's RPM repository for Enterprise Linux 7 - x86_64 3,791+3
次に、だいぶ古いPHPの5系を入れていこうと思います。
まずは、現在の状態でどのバージョンのphpがインストールされるか確認してみる。
$ sudo yum info php
名前 : php
アーキテクチャー : x86_64
バージョン : 5.4.16
リリース : 46.amzn2.0.2
容量 : 1.4 M
リポジトリー : amzn2-core/2/x86_64
remi
ではなく、amzn2-core
のリポジトリからになってることがわかる。
yum
のコンフィグファイルを設定することで、どのリポジトリを優先するの�か変更できるのですが、コマンドラインのオプションでも変更できるので以下のようにamzn2-core
を無効にしてみる。
$ sudo yum info php --disablerepo=amzn2-core
名前 : php
アーキテクチャー : x86_64
バージョン : 5.4.45
リリース : 18.el7.remi
容量 : 2.8 M
remi
の情報を参照してることがわかる!
続いて、狙ったバージョンのPHPをインストールできるように以下のようにしてみる。
$ sudo yum info php --enablerepo=remi-php56 --disablerepo=amzn2-core
名前 : php
アーキテクチャー : x86_64
バージョン : 5.6.40
リリース : 20.el7.remi
remi-php56
リポジトリは、phpの特定のバージョンが入ってるリポジトリとのこと。
https://blog.remirepo.net/pages/English-FAQ#scl
ちなみに、remi-php56
リポジトリではなく、remi
リポジトリでphp56
のパッケージ名でもインストールできる。
これの違いは上記FAQにも書いてある通り、remi-phpxx
は1環境にひとつのPHPを導入する前提のものっぽくて、インストールされる実行ファイルもphp
で実行できる。システムのデフォルトのPHPとして実行する感じ。
一方、php56
の方でインストールされるファイルはphp56
になり、デフォルトのPHPとは別でインストールすることができる。
複数バージョンのPHPを導入したいんであれば、こっちを使うのがいいんだね。
$ sudo yum info php56 --disablerepo=amzn2-core
名前 : php56
アーキテクチャー : x86_64
バージョン : 3.0
リリース : 1.el7.remi
容量 : 4.0 k
リポジトリー : remi
祝日判定ライブラリを使いたくって。 https://knqyf263.hatenablog.com/entry/2018/01/07/110503
sudo rpm -ivh https://github.com/knqyf263/holiday_jp-go/releases/download/v0.0.1/holiday_jp-go_0.0.1_linux_amd64.rpm
ついでに中身を見る。
https://www.atmarkit.co.jp/flinux/rensai/linuxtips/522rpmcpio.html
rpm形式からcpio形式なるものに変換する必要があるみたい。
$ wget https://github.com/knqyf263/holiday_jp-go/releases/download/v0.0.1/holiday_jp-go_0.0.1_linux_amd64.rpm
$ mkdir work && cd work
$ rpm2cpio ../holiday_jp-go_0.0.1_linux_amd64.rpm |cpio -id
pythonで書かれてるコードだけどバイナリが置かれてる。 pythonってコンパイルできるんだ。知らなかった。
$ tree
.
└── usr
└── local
└── bin
└── holiday_jp-go
https://www.d-wood.com/blog/2014/06/26_6412.html
// hogexxxx→fugaxxxxにする
$ for f in `ls`; do mv $f ${f/hoge/fuga} ; done
ls
した結果でfor分を回す。loopの中で、mv ファイル名 置換後のファイル名にしてる。
後半の${f/search/replace}は調べてない
xargs
に慣れてるならこっちがいいかも。
find src -path "*/public/.htaccess" |xargs -p -I% mv % %.bk
-I
でxagrsから渡されるコマンドをひとつずつにして、mvにわたす際の引数の位置を指定できる。
-p
コマンドは、実行するコマンドを確認しながらできるのでいいかんじ。
ログインシェルを持たない場合
sudo su -s /bin/bash jenkins