技術者になりたい何か

技術者になりたい何かの覚書的な何かです

Linuxのパッケージ管理その1(概要的ななにか

パッケージ管理は前提となる知識がある程度必要なので、まずは前提的な何か。

気が向いて暇があるときに続きのパッケージ系コマンドのあれやこれやを書いていこうかと思う。

Linuxにおけるパッケージ

Linux上でのパッケージ(つまりソフトウェア)は基本的にリポジトリ経由でインストールする。
リポジトリとはネットワーク上にあるソフトウェアの倉庫のようなもの。
WindowsでいうexeファイルをDLしてインストール、というのは基本的手法ではない。
デストリビューションによってパッケージ管理方法は違う。

Debian系とRedhat

Linuxのデストリビューションのうち、大きいものとしてDebian系とRedhat系が有り、
それぞれパッケージ管理の方法が大きく異なる。
(厳密にはemergeでパッケージいちいちコンパイルしながらインストールするGentooや、
Pacmanとかいう独自の管理システム使うArchや、
rpmも使えるんだけどrpm派生(?)のzypperとかいうコマンドでパッケージ管理するOpen Suseとかあるけど、
マイナーなので基本的にシカトしてよい。
使う時になったら覚えよう。)

Debian系はapt,dpkgを基本とする。(Debian,Ubuntu,Linux Mint,Knoppix等)
Redhat系はyum,rpmを基本とする。(CentOS,RedHatLinux,Fedra等)

因みに日本での商用サーバーはCentOSが多い。(世界ではUbuntuDebian系)が多くなってるって話聞いたけどどうなんだろう?)

リポジトリとは

ネットワーク上にあるファイルサーバー。
ここにaptやyumで取ってこれるrpmパッケージやdebパッケージがおいてある。
Debianの場合
http://ftp.jp.debian.org/debian/
↑jessie main contrib non-freeのリポジトリ

のぞいてみるとわかるようになんのそっけもないファイルサーバー。
http://ftp.jp.debian.org/debian/pool/main/a/apache2/
のようにたどると、apache2のdebパッケージが置いてあるのがわかる。

これを登録しておくとaptやyumはこれらを参照して
パッケージのインストール、アンインストール、更新などをしてくれるというもの。

ちなみに非公式(ライセンスの都合上公式に入れられない)とか、
開発中のプロジェクトで最新を常に置いてあるリポジトリとかもあり、
適宜必要なものを追加したりすることによって自分の必要な環境を整えやすくなったりする。

aptとdpkg

Debian系で使う基本のパッケージ管理コマンド。
乱暴に超基本を言うならば、
aptはネットワーク上のリポジトリ参照してパッケージの色々操作を行うもの(AndroidでいうGoogle playiPhoneでいうitunesに近い)
これに対しdpkgはローカルに保存したdebパッケージをインストールするときなどに使う。(WindowsでいうexeとかmsiをDLしてインストールするに近い)

yumrpm

RedHat系で使う基本のパッケージ管理コマンド。
上記にならって乱暴に超基本を言うならば、
yumはネットワーク上のリポジトリ参照してパッケージの色々操作を行うもの
これに対しrpmはローカルに保存したrpmパッケージをインストールするときなどに使う。

運用に関して

基本的にはapt,yumといったリポジトリを参照する管理コマンドで出来る限りやった方がいい。
理由はいくつかあるが、
・更新、依存関係の解決、インストール・アンインストールが簡単。
・依存関係で必要なものを自動で入れてくれる。
・デストリビューションに最適化された状態でビルドされたものが用意されている(ことが多い)
・すでに十分にテストされたものが用意されている(ことが多い)
・セキュリティパッチとかちゃんと降りてくる(ことが多い)
というのが主な理由。

対し、dpkg,rpmによって野良deb、野良rpmを入れる際には、
・依存関係上ライブラリのバージョン違いなどでトラブル事が多い。
・依存関係上必要なものがリポジトリにない場合、自分で探してまた入れなければならない。
・古かったり、ちゃんとメンテされていないことがある。
脆弱性などが有った場合、自分で新しいパッケージDLしてきて入れなければならない(場合によってはビルドして入れることになる)

ただし、リポジトリにないマイナーパッケージや、特定のバージョンのものを使いたいときなどにはこちらを使用した方が良いことも有る。

ソースファイルに関して

Linuxのパッケージはtarで配布されている事も多い。
リポジトリになく、deb,rpmパッケージも見つからない時は、このソースを落として
自前でビルドしてインストール、ということもまれにしばしばある。
しかし自前ビルドしたものに関しては、上記のようなパッケージ管理コマンドによる管理からは外れるため、
全ての事を自分でやらなくてはならない。
(アンインストール時に関連ファイルを全て手動削除することになる、など)
たまにアンインストールスクリプトが付属している親切なパッケージもあるが、
依存関係崩れた時に直すのが非常に面倒なので、避けられるものなら避けた方が良く、
避けられない場合にはトラブル対応の準備と心構えをしてから実施すべきである。

以上の事から、あるパッケージを使用したい(インストールしたい)時には
リポジトリの使用
deb,rpm パッケージから手動インストール
自前ビルド

の優先順位で動くのが安全かつ楽である(一部例外有)

alienに関して

本来互換性のないdebパッケージとrpmパッケージを相互に変換するコマンド。
これを使うと「これ使いたいんだけどrpmパッケージしか配布してないじゃん。俺Ubuntu使ってるんですけど!!」
というようなときに、該当パッケージをdebに変換してdpkgでインストールとかできる、
だが、変換したパッケージはインストール時にエラーを吐くことも少なくない。
過信は禁物。(個人的にはalienのトラブル率を考えると自前ビルドの方がまだマシのように思う)

使用方法

rpmdebに変換

$ alien --to-deb tree-1.5.3-2.el6.x86_64.rpm

 

debrpmに変換

$ alien --to-rpm tree_1.5.3-2_amd64.deb

 

商用サーバの場合は近い道やら大人の事情やらで色々と制約があったりする。
例えばyum updateで一括updateすると、現在提供中のあのサービスやこのサービスが一旦止まっちゃう可能性があるため、
yum downloaderとか、普通にwgetとかでupdateしたいパッケージだけrpmパッケージを落としてきて、
rpm コマンドで入れたりすることも多々ある。めんどくさいね!!

自分用サーバとかなら基本的にyumとかaptで一括update,upgradeして、必要ならそのサービス再起動、とかした方がいいと思う。
気楽でいいよね!!

 

Linuxでのファイル・ディレクトリの圧縮とか解凍とか

ファイルの圧縮解凍

Linuxにおけるファイル圧縮の種類

gzip 良く使われる。拡張子は.gz。解凍コマンドgunzip or gzip -d。
・bzip2 gzipより圧縮効率は高いが時間がかかる。拡張子は.bz2。解凍コマンドbunzip or bzip2 -d。
・xz bzip2よりさらに圧縮効率が高く、時間がかかる。拡張子は.xz。解凍コマンドunxz or xz -d

ファイル圧縮それぞれの使い方

gzip

オプション
-d 圧縮ファイルを展開する
-c 標準出力へ出力する
-r ディレクトリ内のファイルを全て圧縮する(ディレクトリ自体を圧縮するわけではない)

実行例

$ ls
test01 test02 test03
$ gzip -r .
$ ls
test01.gz test02.gz test03.gz

圧縮前のファイルを残したいときは、-cで標準出力に出力したものをリダイレクトで保存する。

$ ls
test01 test02 test03
$ gzip -c test01 > test01.gz
$ ls
test01 test01.gz test02 test03

・bzip2

オプション
-d 圧縮ファイルを展開
-c 圧縮ファイルを標準出力に展開

実行例

$ ls
test01 test01.gz test02 test03
$ bzip2 test02
$ ls
test01 test01.gz test02.bz2 test03
$ bzip2 -c test03 > test03.bz
$ ls
test01 test01.gz test02.bz2 test03 test03.bz

・xz

オプション
-d 圧縮ファイルを展開
-k 圧縮・解凍後に元ファイルを削除しない
-l 圧縮ファイル内のファイルを一覧表示する

$ ls
test01 test02 test03
$ xz -k test01
$ ls
test01 test01.xz test02 test03
$ xz -l test01.xz
xz: --list is not implemented yet.

-l の使い方がよく分からなかった。

アーカイブの作成・展開

tar.gzとかtar.bzとか。
複数ファイルをまとめたアーカイブ(書庫)を作成⇒アーカイブを圧縮・展開する。
とはいえ感覚的にはディレクトリを圧縮・展開するようなものと思っておけばよい?
ちなみにソースファイルなどはtar.gz形式で配布されている事も多く、この圧縮されたファイルをtarball、tar玉と呼んだりもする。

オプション
-c アーカイブを作成する
-x アーカイブからファイルを取り出す
-t アーカイブの内容を確認
-f アーカイブファイル名を指定
-z gzipによる圧縮展開
-j bzip2による圧縮展開
-J 7zipによる圧縮展開
-v 詳細表示

など。
ちなみにtarコマンドはオプション指定時に-を省略できる数少ないコマンドの一つでもある。

よく使うパターン

$ tar cfz hoge.tar.gz hoge/

hoge/をアーカイブ作成、ファイル名hoge.tar.gz、gzipで圧縮

$ tar xvzf hoge.tar.gz

 

hoge.tar.gzを詳細表示しながら展開

$ ls
tartest test01 test01.xz test02 test03
$ tar cfz tartest.tar.gz tartest/
$ ls
tartest tartest.tar.gz test01 test01.xz test02 test03
$ mv tartest tartestbac
$ ls
tartest.tar.gz tartestbac test01 test01.xz test02 test03
$ tar xvzf tartest.tar.gz
tartest/
tartest/test1
tartest/test3
tartest/test2
$ ls
tartest tartest.tar.gz tartestbac test01 test01.xz test02 test03

どんな時に使うの?

ソースコード配布するときとか。Windowsでいう「zipでくれ」っていう感じ。
(ちなみにLinuxでもzipは扱えるが、標準で入ってないデストリビューションとかもある)

・ログファイル圧縮するときとか
ログローテ後のログファイルがgzになってることよくあるあれですね。
そのまま放置しとくとログ量が大変なことになるので、ある程度の期間なり容量によって圧縮するように
cronとかで設定しておく。
さらに圧縮後数ヶ月とかで別の場所に移動するとか(logtape)、削除するとかするのが通常。

圧縮後のログはそのままじゃ見れないのでzcatとか使って見る。
展開しようと思えば展開できるけど、展開するときは作業ディレクトリでやろう。(/var/log配下でやったりすると後がめんどい)

# zcat mail.log.1.gz | grep "検索ワード"

# zgrep '検索ワード' messages.1.gz

 

mail.log.1.gzとかmessages.1.gz がgz形式で圧縮されたログファイルになる。

 

rbenvとruby-buildでさいしんのruby環境を

rbenvとは

rubyのバージョン管理ツール。

複数バージョンのrubyを使いたいとき、リポジトリにないバージョンを使いたい時などに重宝する。

 

rbenvのインストール

Debianの場合実はリポジトリにある。

$ sudo apt-get install rbenv

 
ruby-buildのインストール。


ruby-buildは任意のバージョンのrubyをDLしてきてインスコしてくれるツール。
gitでもってきて.rbenv/plugin以下に配置

$ mkdir -p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
~/.rbenv/plugins $ git clone git://github.com/sstephenson/ruby-build.git
Cloning into 'ruby-build'...
remote: Reusing existing pack: 3312, done.
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 3318 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3318/3318), 560.20 KiB | 430.00 KiB/s, done.
Resolving deltas: 100% (1569/1569), done.
Checking connectivity... done.

 
bssh_profilesにパス追記。

$ emacs .bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

 
つかいかた

 

$ rbenv help
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/sstephenson/rbenv#readme

 

install --listでインストール可能なrubyのバージョンを確認。

$ rbenv install --list
Available versions:
  1.8.5-p113
  1.8.5-p114
 
  ~~省略~~

  2.2.3
  2.3.0
  2.3.1
  ~~省略~~


インストール。これは2.4.0。

$ rbenv install 2.4.0

 
システムデフォルトのrubyのバージョンを2.4.0に。

$ rbenv global 2.4.0

 
今いるディレクトリで使用するruby のバージョンを2.4.0に

$ rbenv local 2.4.0

 

versionsでrbenv経由で入れてるrubyのバージョン一覧表示

 

$ rbenv versions
  system
  2.1.7
  2.2.3
  2.3.0
  2.3.1
* 2.4.0 (set by /home/tmin/.rbenv/version)

 

rehashで環境再設定?新しくruby入れたときとか設定変えたときとかにやる

$ rbenv rehash

けどぶっちゃけこれが何をやっているのかよくわからない・・・

バージョン確認。

$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

 


mikutterを動かす。


mikutterが置いてあるディレクトリに移動してbundleで依存ライブラリ関係を入れる。

~/mikutter$ bundle update
rbenv: bundle: command not found

 
あれ?bundleが入ってないらしい

~/mikutter$ gem install bundler
Fetching: bundler-1.14.3.gem (100%)
Bundler and RubyGems.org are free for anyone to use, but maintaining them costs more than $25,000 USD every month. Help us cover those costs so that we can keep the gem ecosystem free for everyone: https://ruby.to/support-bundler
Successfully installed bundler-1.14.3
Parsing documentation for bundler-1.14.3
Installing ri documentation for bundler-1.14.3
Done installing documentation for bundler after 14 seconds
1 gem installed

 


おk。改めて

~/mikutter$ bundle install --path vender/bundle
Fetching gem metadata from https://rubygems.org/.............
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies...
Installing rake 10.5.0
Installing public_suffix 2.0.5
Installing pkg-config 1.1.7
Installing safe_yaml 1.0.4
Installing delayer 0.0.2
Installing locale 2.1.2
Installing text 1.3.1
Installing hashdiff 0.3.2
Installing httpclient 2.8.3
Installing instance_storage 1.0.0
Installing json_pure 1.8.6
Installing memoist 0.15.0
Installing metaclass 0.0.4
Installing mini_portile2 2.1.0
Installing moneta 0.8.1
Installing oauth 0.5.1
Installing power_assert 1.0.1
Installing ruby-hmac 0.4.0
Installing ruby-prof 0.16.2 with native extensions
Installing totoridipjp 0.1.0
Installing unf_ext 0.0.7.2 with native extensions
(中略

nstalling gdk_pixbuf2 3.1.1
Installing gtk2 3.1.1 with native extensions
Bundle complete! 22 Gemfile dependencies, 43 gems now installed.
Bundled gems are installed into ./vender/bundle.

 問題なければBundle complete!まで出るはず。

Errorが出たときは何かしらのライブラリパッケージが足りない時が多い。

libなんちゃらとか、libなんちゃらdevってパッケージ入れると解決したりしなかったり。

 

$ ruby mikutter.rb

 


で動けばおk。


redmineとか動かすときにリポジトリ配布のrubyのバージョンが合わないときとかに使うと幸せになれる。
あと、いくつかのrailsプロジェクトとか動かしたいときに、rbenv localで各ディレクトリで使うrubyのバージョンを指定しとくと使い分けられたりします。

Sponsored Link