Skip to content

Instantly share code, notes, and snippets.

@Ryomasao
Last active June 10, 2021 06:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ryomasao/c59417972ed9bc4c4ec8c91afde00266 to your computer and use it in GitHub Desktop.
Save Ryomasao/c59417972ed9bc4c4ec8c91afde00266 to your computer and use it in GitHub Desktop.
忘れがちな自分のためのLinux環境系メモ

忘れがちな自分のLinux環境設定メモ

Linuxだと主語がでかかった。主にパッケージインストールについて。

yum

リポジトリ一覧を表示

$ 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でインストール済みのパッケージを表示する

$ 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

php5.6を入れる(最小限)

// 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

yumでPHPをインストールするメモ

AmazonLinux2環境でphpをインストールしたときに毎回迷うのでメモ。

基本的なこと

  • 古くはソースコードから自分でmakeして、実行ファイルを所定の場所に置くなりしてた。
  • とあるソースコードが別のソースコードに依存するのであれば、makeしてエラーになって気づいて、もってきてーの繰り返しが必要だった。
  • パッケージシステムができたことで、ほしいパッケージ名を叩くだけで、依存関係を管理しながらインストールができるようになった。

ありがとうパッケージシステム。

  • パッケージ管理システムには、Debian系とRedHat系で採用されるRPM系がある。
  • RedHat系(CentOSとかも)はyum, Debian系はapt-get
  • AmazonLinuxはRPM系なので、ここではRPM系の話を書く。
    ※ラズパイとかはDebian系だったね!Dockerの軽量LinuxであるAlpineもapkみたいな別の管理システムがあったね!

RPM系の話

パッケージは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とかのリンクをみるとCentOSRHELもまとめられてるから、互換性があるのかな。 https://fedoraproject.org/wiki/EPEL

→ そもそもCentOSってRHELの互換性があることを目指したフリーのディストリビューション。 だから、CentOSRHELは互換性があると思ってよさそう。
AmazonLinux2は、RHELベースっぽいので、CentOSRHELAmazonLinux2間の互換性はありそう。 https://qiita.com/akira345/items/2a09c4d06d2e3415bc8d

AWSの公式記事にもepelの追加方法が書いてあって、追加するリポジトリはRHEL7と同じことから、この認識であってそうな気がする。 https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/

冒頭に触れたDebian系とかは、そもそもパッケージ管理の仕組みが違うからepelとかもないのかしら?

yum

パッケージはrpmでまとめられているんだけど、このrpmはwgetとかで個別にダウンロードしたり、ftpクライアントとかで上げたりといろんな取得方法がある。

なんだけど、手軽に追加したり、消したりするのためにyumを使うのが普通。 yumを使うと、登録しているリポジトリからパッケージ名を検索して、rpmを取ってきて、インストールまでしてくれる。

AmazonLinux2にPHPをインストールする

ようやく本題。

AmazonLinxu2が公式が提供するPHPを使う

公式チュートリアルを見よう。 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html

さらっとみると、 Amazon Linux Extrasリポジトリを追加して、yumではない独自のコマンドでインストールできるみたい。

特定バージョンのPHPをインストールする。

�PHPを提供しているリポジトリを追加しよう。remiっていうリポジトリがいろんなバージョンを提供してくれている。

https://rpms.remirepo.net/

リポジトリを追加する前に、せっかくなので今存在しているリポジトリをみてみよう。 いろいろ触っちゃった後なので、初期構築時からかわってるかもしれないけど、以下のようなリポジトリがあることがわかる。

$ 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

rpmパッケージの中身を確認する

祝日判定ライブラリを使いたくって。 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment