LPIC 勉強記録 第6章 ソフトウェア管理

#第6章 ソフトウェア管理
複数のアプリケーションからよく使用される機能を関数として実装し、複数の関数を種類ごとにファイルにまとめたものが`ライブラリ`
`静的ライブラリ`を使用するには、`静的リンク`という方法が取られる
人間が書いたプログラムコード(`ソースファイル`)を、機械が読める形式に変換(`コンパイル`)すると実行ファイルが生成されるが、その際に、使用している`静的ライブラリ`の内容が実行ファイル内に埋め込まれる

共有ライブラリを使用するには、`動的リンク`もしくは`動的ロード`という方法が取られる
静的コードと同様にプログラムコードをコンパイルするが、ライブラリの内容が取り込まれるのではなく、実行時にライブラリがメモリに読み込まれる

| 種類 | 命名規則 | シンボリック先 |
|:----------|:---------|:---------|
|real name|lib◯◯◯.so.(メジャー番号).(マイナー番号)|ファイル本体|
|soname|lib◯◯◯.so.(メジャー番号)|libprt.so.1.0|
|linker name|lib◯◯◯.so|libprt.so.1|

`ldコマンド`を実行すると、`real name`ファイル名を持つファイルが作成される
作成した共有ライブラリは、ライブラリディレクトリにコピーする
`ldconfigコマンド`を実行し、必要なリンクの作成およびライブラリのキャッシュを行う
これにより、`soname`を持つシンボリックリンクファイルが作成される
`ldconfigコマンド`は、実行されると、`/etc/ld.so.conf`に記載された場所を参照し、シンボリックリンクファイルの作成、および`/etc/ld.so.cache`へのキャッシュの書き込みを行う
デフォルトでは、`/lib`や`/usr/lib`を参照するため、これらのディレクトリにライブラリを配置した場合は問題ない

あるライブラリを一時的に利用する場合などに、`LD_LIBRARY_PATH環境変数`を使用することができる
`/lib、/usr/lib、/usr/local/lib`へ書き込み権限のないユーザが使用する場合や、検証目的で特定のライブラリを使用したい場合など、`LD_LIBRARY_PATH環境変数`にライブラリの保存ディレクトリ名を指定することができる
共有ライブラリを読み込むリンカ/ローダである`ld-linux.so`は、`LD_LIBRARY_PATH` → `/etc/ld.so.cache` → `/lib`、`/usr/lib`の順番で目的のライブラリを検索する

`lddコマンド`は、共有ライブラリへの依存関係を表示する
引数のファイル名には、コマンド名を指定する
カレントディレクトリにある場合はコマンド名だけでよく、それ以外は絶対パスか相対パスで指定する

パッケージ管理システムを利用することで、ソフトウェアの導入(インストール)や削除(アンインストール)を比較的簡単に行うことができる

| コマンド | RedHat系 | Ubuntu/Debian系 |
|:----------|:---------|:---------|
|パッケージ形式|rpm形式|deb形式|
|パッケージ管理コマンド|rpmコマンド|dpkgコマンド|
|リポジトリを利用したパッケージ管理コマンド|yum(dnf)コマンド|apt-cacheコマンド、apt-getコマンド|

パッケージ管理システムでは、ソフトウェアを`パッケージ`というファイル単位で管理している
`パッケージ`は実行形式に変換したバイナリの他、ライブラリや設定ファイル、マニュアルなどを1つにまとめたもの
パッケージを管理する上で必要となる依存情報も含まれている

`rpmコマンド`

| 主なオプション | 説明 |
|:----------|:---------|
|-q(--query)|指定したパッケージがインストールされていれば、バージョンを表示|
|-a(--all)|インストール済みのrpmパッケージ情報を一覧で表示|
|-i(--info)|指定したパッケージの詳細情報を表示|
|-f(--file)|指定したファイルを含むrpmパッケージを表示|
|-c(--configfiles)|指定したパッケージ内の設定ファイルのみを表示|
|-l(--list)|指定したパッケージに含まれるすべてのファイルを表示|
|-R(--requires)|指定したパッケージが依存しているrpmパッケージ名を表示|
|-p(--package)|インストールされたrpmパッケージではなく、指定したrpmパッケージファイルの情報を表示|

| 主なオプション | 説明 |
|:----------|:---------|
|-i(--install)|パッケージをインストールする(アップデートは行わない)|
|-U(--upgrade)|パッケージをアップグレードする。インストール済みのパッケージが存在しない場合、新規にインストールを行う|
|-F(--freshen)|パッケージをアップグレードする。インストール済みのパッケージが存在しない場合、何も行わない|
|-v(--verbose)|詳細な情報を表示する|
|-h(--hash)|進行状況を#記号で表示する|

| 主なオプション | 説明 |
|:----------|:---------|
|-e(--erase)|パッケージを削除する|
|なし(--nodeps)|依存関係を無視して、パッケージを削除する|

`rpm2cpioコマンド`を使用すると、rpmファイルを`cpioアーカイブ形式`に変換し、標準出力に出力する

`yumコマンド`
`パッケージグループ`とは、システムツールや特定のアプリケーションなど、共通の目的でサービス提供するパッケージの集合
パッケージグループを一覧表示するには、`yum grouplist`と指定する
特定のグループに含まれているパッケージを一覧表示するには、`yum group info パッケージグループ名`、グループ名を指定してパッケージのインストールを行うには、`yum groupinstall パッケージグループ名`とする

`yum`はrpmパッケージを管理するユーティリティ
パッケージの依存関係を自動的に解決してインストール、削除、アップデートを行うユーティリティ
`yumコマンド`は、インターネット上のリポジトリ(パッケージを保管・管理している場所)と通信し、簡単にrpmパッケージのインストールや最新情報の入手が可能

| 主なサブコマンド | 説明 |
|:----------|:---------|
|list installed|インストール済みのrpmパッケージを表示|
|list updates|インストール済みのrpmパッケージで更新可能なものを表示|
|check-update|同上|

| 主なサブコマンド | 説明 |
|:----------|:---------|
|install|指定したrpmパッケージをインストールする。自動的に依存関係も解決する|
|update|インストール済みのrpmパッケージで更新可能なものをすべてアップデートする。なお、個別のrpmパッケージを指定して更新することも可能|

インストール済みのrpmパッケージを`yumコマンド`で削除する場合は、`remove`もしくは`erase`サブコマンドを使用する
このとき、依存関係を検証し、不要となるパッケージがある場合は、一緒に削除する

| ファイル | 説明 |
|:----------|:---------|
|/etc/yum.conf|基本設定ファイル|
|/etc/yum.repos.d ディレクトリ以下に保存されたファイル|リポジトリの設定ファイル|

`nameフィールド`はリポジトリを表す名前
`mirrorlist`には、`baseurl`を含むリポジトリサーバの一覧が記載されたファイルのURLが指定されている
`baseurl`には、`centos.org`のリポジトリのURLが指定されている

個別にrpmファイルをダウンロードする場合、`yumdownloaderコマンド`を使用する
一般ユーザ権限でも使用可能であり、`yumdownloader パッケージ名`と実行する

`zypper`は、`Libzyppライブラリ`を利用したコマンドラインによるパッケージ管理ツール
パッケージのインストール、更新、削除、およびリポジトリの管理が可能

| コマンド | 説明 |
|:----------|:---------|
|install パッケージ名|パッケージのインストール|
|remove パッケージ名|パッケージの削除|
|info パッケージ名|パッケージの情報を調べる|

`Debian系ディストリビューション`で採用されているパッケージ管理システムでは、`debパッケージ`の管理を行う
管理者は、パッケージファイルを選択し、`dpkgコマンド`を使用してインストールやアップデート、アンインストールを行う

| 主なオプション | 説明 |
|:----------|:---------|
|-l(--list)|インストール済みの全debパッケージの情報を表示。特定のパッケージ情報のみ表示する場合は、-lオプションの後にパッケージ名を指定|
|-L(--listfiles)|指定したパッケージに含まれるすべてのファイルを表示|
|-S(--search)|インストール済みのパッケージから指定されたファイルを検索|
|-C(--audit)|インストールが完了していないパッケージを検索|
|-r(--remove)|パッケージは削除するが、設定ファイルは残したままとする|
|-P(--purge)|設定ファイルも含め、完全にパッケージを削除する|
|-i(--install)|パッケージをインストールする|

`dselectコマンド`は、パッケージ管理用ユーザインタフェースを起動する
メインメニューから利用可能パッケージのバージョンリストの更新や、インストール済み・利用可能パッケージの状況表示などを行うことができる

`dpkg-reconfigureコマンド`は、指定したインストール済みのパッケージに対し、設定内容を変更することが可能

`Debian GNU/Linux`において、debパッケージをより効率良く管理するためのツールとして、`APT`がある
使用する主なコマンドとして、`apt-cacheコマンド`、`apt-getコマンド`があり、パッケージの依存関係を自動的に解決する
`apt-cacheコマンド`は、debパッケージ情報の検索、表示に使用する

`apt-getコマンド`は、debパッケージのインストール、アップグレード、アンインストールに使用する
`/etc/apt/sources.list`に記述された入手リストに従い、パッケージをインストールしている
必要に応じて、このファイルにURLを追加することができる

| 主なサブコマンド | 説明 |
|:----------|:---------|
|install|依存関係をチェックし、パッケージをインストールする|
|upgrade|アップグレード可能なdebパッケージをすべて更新する。現在インストール中のパッケージの削除は行わない|
|update|パッケージデータベースを更新する|
|dest-upgrade|古いパッケージの削除も含め、現在インストールされている全パッケージを更新する|

`仮想化`とは、ハードウェア、サーバ、ストレージ、ネットワークなどのコンピュータシステムを構成するリソースを、元の構成から独立させて、分割あるいは統合する形で仮想的に構成する技術
`仮想マシン(VM)`：ハイパーバイザーによる仮想化で稼働する仮想環境
`コンテナ(LXC)`：Linux Containers。コンテナ型仮想化の1つ

`ハイパーバイザー`は、その上で仮想マシンを稼働させるソフトウェア

| タイプ | 説明 |
|:----------|:---------|
|ベアメタル型|ハイパーバイザーが直接ハードウェア上で動作し、すべてのOSはそのハイパーバイザー上で動作する方式。Xenはこの方式|
|ホスト型|ハードウェア上でOS(ホストOS)が動作し、その上でハイパーバイザーが動作する方式。VMwarePlayerやVirtualBoxはこの方式|

`ホストOS`：物理環境にインストールされたOS
`ゲストOS`：仮想環境上に用意された仮想マシンにインストールされたOS

ある装置やソフトウェアを模倣した動作を行うことを、`エミュレーション`と呼ぶ
エミュレーションを行う装置やソフトウェアを`エミュレータ`と呼ぶ

| タイプ | 説明 |
|:----------|:---------|
|完全仮想化(Full Virtualization)|ハードウェアの完全なエミュレーションを行う。ハードウェア上で動作するOSを変更することなく、そのまま実行可能|
|準仮想化(Para Virtualization)|ハードウェアとほぼ同等のエミュレーションを行うが、完全なエミュレーションではない。実行時間短縮のため、ハードウェアのエミュレーションに変更を加えたインタフェースを提供する。準仮想化が提供するインタフェースに対応して、OSに変更を加える必要がある|

`コンテナ型仮想化`では、ホストOSと同じカーネルを共有し、OS内で隔離されたコンテナと呼ばれる区画に独自のアドレス空間、ルートディレクトリからなる独自のストレージ領域、独自のネットワークアドレスを持つ
ホスト型あるいはハイパーバイザー型による仮想マシンに比べて、サイズが小さく、カーネルの起動/停止や余分なサービスの起動/停止がなく、コンテナの起動/停止が速いのが特徴

`仮想マシン(VM)`のクローンは単純な複製となるため、個々のVMとして稼働する場合は、変更すべき項目がある
・ ホスト名
・ IPアドレス：DHCPを使用している場合は、設定不要
・ マシンID：`/etc/machine-id`で確認可能
・ sshホストキー

VMにOSをインストールする際は、公式サイトやミラーサイトで提供されている`ISOファイル`を使用する

#おわりに
第6章もこれでおわり！！
次は長丁場になりそうな第7章！！！