Linuxにおけるパッケージ管理システムについて
パッケージ管理システムとは?
実行プログラム、設定ファイル、ドキュメントなどを1つのファイルにまとめたものをパッケージという。アプリのソースファイルを直接入手してコンパイル、インストールするのは、アプリによって手法が異なったり依存関係の確認をユーザー自身が行う必要があり、作業が複雑になりがち。パッケージ管理システムを使用すると、ソフトウェアの導入、インストールされているソフトウェア情報の調査、依存関係の確認や競合の回避などを容易に行うことができる。Debian系で採用されているDebian形式と、Red Hat系で採用されているRPM形式がある。両者には互換性がない。また、ファイルやデータを集積している場所や、それらの情報を管理するデータベースをリポジトリといい、ファイルシステム上のディレクトリやネットワーク上のサーバーに配置されている。APTツールやYUMで、リポジトリからパッケージをインストールできる。
RPM形式
RPMパッケージのファイル名について
例: vash-4.2.46-30.el7.x86_64.rpm
「vash」の箇所がパッケージ名、「4.2.46」の箇所がバージョン番号、「30.el7」の箇所がリリース番号(ディストリビューションを表す。)、「x86_64」の箇所がアーキテクチャ、「rpm」の箇所が拡張子。
関連コマンド
rpmコマンド→ローカルディスクにあるパッケージファイルをインストールしたり、パッケージファイルの詳細を調査したりする。
rpm2cpioコマンド→RPMパッケージをインストールする前に、作業ディレクトリにcpio形式で展開、出力され、中のファイルを確認できるコマンド
yumコマンド→YUMを使った管理コマンドで、インターネット上のリポジトリと通信し、簡単にrpmパッケージのインストールや最新情報の入手ができる。
dnfコマンド→yumコマンドに代わるコマンドで、基本、yumコマンドはdnfコマンドのソフトリンクになっている。
yumdownloaderコマンド→rpmパッケージのインストールは行わず、個別にrpmファイルをダウンロードするコマンド。一般ユーザー権限でも使用可能で、最新のパッケージを使用するのではなく決められたバージョンで構築しなければならない場合に便利。
zipperコマンド→openSUSEの管理ツールのコマンド(パッケージはRPM形式を採用している)
関連ファイル
/etc/yum.conf→yumの全体的な設定ファイル
/etc/yum.repos.dディレクトリ→リポジトリ情報の設定ファイルが配置される。パッケージの入手先を増やしたい場合は、リポジトリ情報の設定ファイルを追加する。設定ファイル内では$releaserverや$basearchなどの変数が使える。
Debian形式
devパッケージのファイル名について
例: tree_1.6.0-1_i386.deb
「tree」の箇所がパッケージ名、「1.6.0」の箇所がバージョン番号、「1」の箇所がリビジョン番号(バージョン番号に基づくUbuntu又はDebianパッケージとしての番号。)、「i386」の箇所がアーキテクチャ、「deb」の箇所が拡張子。
関連コマンド
dpkgコマンド→RPM形式のrpmこまんどにあたる
dpkg-reconfigureコマンド→指定したインストール済のパッケージに対しインストール時と同じように設定を行うことが可能。
apt-getコマンド→リポジトリからのインストール、アップグレード、アンインストールを行う
apt-cacheコマンド→debパッケージ情報の検索、表示を行う。
aptコマンド→apt-getとapt-cacheを合わせたようなコマンドで、最近ではこちらが推奨されている。
関連ファイル
/etc/apt/sources.list→apt-getコマンドで使用する、パッケージを管理しているサイトのURLを記述する。設定し終わったら「apt-get update」を実行し、最新のパッケージ情報を取得(更新)する。
参照文献
Linuxにおけるライブラリについて
ライブラリとは?
複数のアプリからよく使用される機能を関数として実装し、複数の関数を種類ごとにファイルにまとめたもの
これによりコードの記載が楽になるし、処理に変更があった際のメンテナンスも楽になる。
ライブラリの種類(静的ライブラリと共有ライブラリ)
静的ライブラリ→プログラムの作成(コンパイル)時に実行ファイルにリンクされる。メリットとして、①依存関係を気にする必要がないため、ライブラリのバージョンが変わっても気にする必要がない。②直接組み込まれているため、動作が早く、デバッグもしやすい。③直接組み込まれているため、ライブラリの置き換えや改ざんが困難になるため、セキュリティ面で優れている
共有ライブラリ→プログラムの実行時にメモリに取り込まれ(動的リンク)、複数のプログラム間で共有される。各プロセスは独自の仮想メモリ空間を持ち、共有ライブラリは物理メモリ上に一つだけ存在しているが、各プロセスの仮想メモリ間に共有ライブラリがロードされる。「lib~.so~」の形式で名前が付けられている。メリットとして、①ディスクスペースの節約、更新の容易さ、配布とインストールの容易さ②同じ共有ライブラリを使用するプログラムが複数あった場合、ライブラリは一度だけメモリにロードされるので、メモリ使用が効率化される。③プログラムの実行時にロードされるため、異なるバージョンや特定の機能を持つライブラリを実行時に選択できる。そのため実行時の柔軟性が上がる
これらの観点から、静的ライブラリは、特定の環境やセキュリティが重視される場合、又は配布の簡便さが求められる環境で向いている。ただ、実行ファイルのサイズが大きくなる点を考慮する必要がある。共有ライブラリは、大規模なアプリケーション環境や、多くのプログラムが同じライブラリを使用する環境で向いている。ただ、ライブラリがシステム上に存在することを確認する必要があり、バージョンの互換性に注意する必要がある。
ライブラリ関連のファイル
/lib,/usr/lib→通常、共有ライブラリが配置されているディレクトリ
/etc/ld.so.conf→プログラム実行時に、共有ライブラリを検索する際に、/lib,/usr/lib以外のディレクトリも検索したい場合にこのファイルに記述する。/etc/ld.so.conf.d以下に複数の設定ファイルを配置して、/etc/ld.so.confでそれらを読み込んでいる場合もある。
/etc/ld.so.cache→プログラム実行時にld.soリンカ及びローダが実際に参照するバイナリのキャッシュファイル。ldconfigコマンドを使用して、/etc/ld.so.confファイルに基づいて/etc/ld.so.cacheを再構築する。よって、共有ライブラリを変更した際はldconfigコマンドを実行してキャッシュを更新する必要がある。
環境変数LD_LIBRARY_PATH→その他のディレクトリも検索対象に加えたい場合にディレクトリリストを記述する。
ライブラリ関連のコマンド
ldd→実行ファイルが必要とする共有ライブラリを調べる。
ldconfig→/etc/ld.so.confファイルに基づいて/etc/ld.so.cacheを再構築する。
参考文献
Linuxでのログ収集について
Linuxの、カーネルやデーモンのメッセージなど、システムのほとんどのログを記録しているファイルとして/var/log/messagesが有名ですが、
Linuxの主なディストリビューションに標準で実装されているログ収集の仕組みとしては、rsyslogとsystemd journalが代表的です。
rsyslogとは?
Linuxでログを取集するソフトウェアで、syslogメッセージをテキストデータで受け取る。Syslogプロトコルをベースにして、TCPの利用、マルチスレッド対応、セキュリティの強化、各種データベースへの対応などの特徴を兼ね備えている。
systemd jounalとは?
systemdが提供する機能の一つで、システムログをバイナリデータで受け取る。systemdのシステムではsystemd journalのデーモンのsystemd-journaldが行う。ログは不揮発性ストレージ(/var/log/journal/machine-id/.journal)か、揮発性ストレージ(/run/log/journal/machine-id/.journal)に格納する。
systemdでは、揮発性ストレージとして利用される/runはtmpfsがマウントされている。tmpfsはカーネルの内部メモリキャッシュ領域に作成され、時にスワップ領域も使用される。揮発性ストレージか不揮発性ストレージのどちらかに格納するかはjournald.confのパラメータStrageにより指定する。
Syslogプロトコル互換のインターフェース(/dev/log,/run/systemd/journal/syslog)があり、収集したシステムログを他のSyslogデーモンに転送して格納する設定にもできる。
rsyslogの設定
カーネルやサーバーから送られてくるメッセージを/etc/rsyslog.confおよび/etc/rsyslog.dディレクトリ以下のファイルで指定した出力先に出力する。このrsyslog.confのファイルで、/var/log/messagesに何を出力するかも決められます。rsyslog.confの書式の説明については割愛します。
システムログに関するコマンド
journalctlコマンドで、systemd-journaldが収集したログ情報を閲覧できる。オプションの説明については割愛。
また、systemd-catコマンドで、引数に指定したコマンドをsystemd-journalに送ることができる。
また、loggerコマンドで、任意のファシリティとプライオリティを指定してログメッセージをSyslogデーモンに送る事ができる。
ログファイルのローテーション
ログファイルは放置しておくと肥大化するので、ローテーション機能を使って肥大化を防ぐ。ログファイルのローテーション機能はlogrotateユーティリティが提供していて、cronで定期的に実行される。logrotateは、logrotateコマンドや、/etc/logrotate.confファイルで行う。
参考文献
LPICレベル1 スピードマスター問題集
Active Direcotryの概要
※Windows Server 2008以降、ADは代表的なAD DS(Active Directory ドメインサービス)以外にAD FS、AD RMS、AD LDS、AD CSの4つのサービスがあります。この記事は代表的なAD DSについての記事で、分かりやすくADと書いています。
ADで出来る事
ユーザー・アカウント情報の集中管理
ドメインコントローラーで集中管理しているため、管理が容易になるし、グループ化が可能。
ADに対応したサーバー、アプリを使用するとメールサーバーやDBサーバーとドメインのユーザーアカウントを紐づけられるので、さらに管理が容易になるし、ユーザーにとっても覚えなければならないユーザー名やパスワードが減らせる。
ユーザー属性情報の集中管理
ADのユーザーアカウント情報は、ユーザー名やパスワードのほかに氏名、住所、電話番号、所属部署など様々な情報を保持することができるため、企業においてAD情報を住所録として使用できる。このメリットは、特にMicrosoft Exchange Server のようなAD対応メールサーバーと組み合わせた場合に効いてくる。
資源情報の集中管理
共有フォルダや共有プリンタの情報を、場所やキーワードの情報と一緒にADに登録できるため、ユーザーが名前を正確に覚えてない共有資源を探す際にADの検索機能を利用できるため、サーバーを探し回らなくてよくなる。
アプリへの情報提供
LDAP又はADSIを使用することでアプリがADに格納された情報にアクセスできる。これにより、ユーザー情報一元管理とシングルサインオンが実現できる。
情報へのアクセスに対する管理
ADに登録されたユーザーにアクセス権を設定できる
クライアントPCの一元管理
グループポリシーを利用してクライアントPCの設定を集中管理できる。
ADの用語について
フォレスト
ADを構成する要素の中で最も上の階層に属する。1つのフォレストの中に複数のドメインが存在できる。
ドメイン
インターネットにおけるドメインと同じようにピリオドで区切られた複数の単語で構成される<例>syobute.local
ドメインコントローラー
ドメインを管理しているサーバー。目に見える範囲ではドメインコントローラーがドメインの実態になり、ディレクトリ情報を格納していて、ユーザーのログオン認証やディレクトリ検索などの要求を処理する。通常可用性を考えて2台以上用意する。
サブドメイン
親になるドメインの子ドメイン。ドメイン名はピリオドで区切って階層を一つ増やして「<サブドメイン名>.<親ドメイン名>」となる。
OU
ドメイン、サブドメインに作成されるオブジェクト。ただ、グループと異なり、共有資源のアクセス権限設定対象にはできない。
OUは単にオブジェクトを分類する器として使えるだけでなく、次のような使い方ができる。
・グループポリシーの適用単位区分
→OUごとに、ドメイン同様グループポリシー(GPO)を設定できる。OU内のオブジェクトは基本、OUに対するポリシー設定を継承するため、オブジェクトはOU間を移動するたびに移動先のOUのポリシー設定に変化する。
・管理権限の委任
→OUを単位にして、ドメイン管理者以外のユーザーに、ユーザーとグループの管理権限を委譲することができる。そのため、社員の入れ替わりが激しい部署のOUの権限を、部署の担当者に委任するというようなことができる。
・アクセス権設定の単位
AD上のオブジェクトにも、アクセス権を設定できる(オブジェクトの作成や変更、オブジェクトに設定された情報へのアクセス、オブジェクトの検索や表示といった機能に関わる権限などがある)。このアクセス権を設定する単位としてOUを使用できる。オブジェクトに個別にアクセス権を設定するよりもOUにアクセス権を設定したほうが管理が容易になる。
オブジェクト
ユーザーやコンピューターのアカウント、グループ、OUなど、ADに作成される各種情報の総称。
AD上のオブジェクトは、「<ドメイン名>/<オブジェクト名>」という形式で、重複しない完全修飾ドメインを持っている。ただ、管理ツールに表示されるのは、オブジェクトに設定された表示用の名称。
サイト
地域またはIPサブネットなど物理的な境界を表す。作成する最大の理由としては、ドメインコントローラー間での複製の設定。サイト内の場合、既定では15秒に一回ディレクトリ情報を複製する。そのため、地域間の回線にWANを使用していた場合、既定の間隔で複製するとWAN回線を圧迫する可能性がある。
ドメインコントローラーの地域ごとにサイトを作成すると、WAN回線の使用料が少ない夜間などに複製を行うよう設定できる。また、サイト間では既定では180分に一回ディレクトリ複製が行われる。また、サイト間ではディレクトリ情報が圧縮された状態で複製されるため、WAN回線の帯域幅を保護できる。
サイト間の論理的な回線をサイトリンクという。ディレクトリ複製を設定するには、サイトのほかにサイトリンクを作成する必要がある(サイトは場所を定義しているだけのオブジェクトであるため)。ADではサイトやサイトリンクもオブジェクトとして扱われる。
AD DS以外のサービス
Active Directory ライトウェイディレクトリサービス (AD LDS)
Active Directoryに対応しているアプリに対して、アプリ固有の情報を格納する場所を構築できる。AD DSと違い、ディレクトリサービスのみを提供するため、ドメインを構築する必要がない。
Active Directory 証明書サービス (AD CS)
公開鍵基盤(PKI)を構築するために、証明書の作成と管理を行う証明機関を作成するためのサービス。多くのアプリで使用出来る証明書を発行したり管理できる。
Active Directory Rights Managementサービス (AD RMS)
ユーザーの身元を確認し、使用が許可されたユーザーだけが、コピーや印刷などの操作を行えるという仕組みを提供する。使用許可に関する情報はデータに付属するため、機密データを移動した場合でも不正なユーザーが情報を入手できなくなる。
Active Directory フェデレーションサービス(AD FS)
Web シングルサインオン(SSO)とセキュリティ保護されたIDアクセスソリューションを構築できる。
参考文献
Actice Directory 導入と運用の基本 ひとめで分かる Active Directory Windows Server 2022版
OSがしてくれることについて
この記事は天野司様が書いた「Windowsはなぜ動くのか」という書籍をかなり参考にしています(表現方法は自分なりに変えてますが)。めちゃ名著なので、ぜひ購入してください!
OSとは?
「コンピューター全体を制御してユーザーが使いやすくするためのシステム」(Copilotより)
「パソコンのすべての動きを総合的に管理する、制御ソフト」「アプリケーション・ソフトの動作を補助するプログラム」(Windowsはなぜ動くのか 「オペレーティング・システムとはいったいなんですか?」より)
要はハードウェアやソフトウェアの様々な制御を行っている、コンピューターを使用するのに欠かせないソフトウェア(プログラム)ということですね。
OSはどう制御している?(アプリケーションとの関連編)
アプリケーション・ソフトウェア又はOSの内部から呼び出し可能になっている機能を「システムコール」といい、それを呼び出すことでOSの機能を利用できるようになってます。
例えば・・・
powershellで「exit」と打つとpowershellが終了しますが、これは「exit」と打たれた時にpowershellがシステムコールの機能を呼び出してOSに終了させるようお願いしている。
システムコールの機能を使うことでプログラミングが容易になりますね。
システムコールは他にも入出力などのハードウェアの制御や、ソフトウェアの起動など様々な機能を提供します。
ライブラリについて
C言語の「printf」などを標準ライブラリといいますが、(powershellでいうと.NET Frameworkがある)これはシステムコールとは少し違い、プログラムで頻繫に使われる機能を、プログラミングやデバッグを容易にするためにそのまま呼び出せるようにした関数。
プログラムのリンク時に初期設定や終了処理と一緒に結合される。(初期設定や終了処理もライブラリの一種ですが)
OSはどう制御している?(ハードウェアとの関連編)
PCを使用するにあたって、異なる種類のハードウェアでも同一のプログラムが問題なく動作しますが、これを「ハードウェアの違いが吸収される」と表現する。
→これをどう実現するか?
(前提知識)ハードウェアが動く仕組み
プログラムはコンパイルされてCPUが理解できる機械語で実行されるが、CPUがハードウェアを操作する時には特定の命令を実行したり、特定のハードウェア専用に割り当てられたメモリのアドレスにデータを書き込むことで実現される。
この時に、ハードウェアが違えばメモリ番地や書き込むべきデータが異なるという問題がある。
→この際にシステムコールを使う!
例えば、「音を鳴らす」というシステムコールの機能を呼び出せば、違うハードウェアでも同一のプログラムで動く。
ハードウェアの違いが吸収できない場合
先程の説明でシステムコールを利用すればハードウェアの違いを吸収できると記載しましたが、これを利用せずにハードウェアに直接アクセスするプログラムを書いてしまうと、ハードウェアの違いを吸収できない。これを「行儀の悪いプログラム」と呼ぶこともある。
OSはこのようなプログラムが作られることがないよう、多くのハードウェアに対してアクセスできるシステムコールを用意する必要がある。
また、システムコールがないと異なるプログラム間でハードウェアの管理方法を統一しなければならないため複雑化するが、システムコールを使用してOSで一元管理することで簡易さが増し、データの互換性が高められる。
OS上でのプログラムの動作
OSはプログラムの実行制御の機能も備えており、「どのようなプログラムを」「いつ」「どのような時に使うのか」決めることが出来る。
アプリケーションのプログラムは実行していない間HDDなどの不揮発性の記憶装置に置かれているが、実行するにはメモリに呼び出す必要がある。
こうした「記憶装置からの読み出し」「メモリへの読み込み」「実行」「終了後の処理」などはOSが行っている。
また、OSによっては複数のプログラムを一度に管理し、それらを切り替えながら動作できる。この機能を持つOSのことを「マルチタスクOS」と呼ぶ。
参考文献
Windowsはなぜ動くのか
自分用Windows関連のサービス、関数、ルーチン等用語メモ
WindowsAPI関数
ドキュメント化されているWindowsAPIの呼び出し可能なサブルーチン
システムコール
ドキュメント化されてないユーザーモードから呼び出し可能なOSの基本サービス。OSの上で動作するアプリケーション・ソフトや、あるいはOS自体、その内部から呼び出し可能になっている機能の事
サブルーチン
コンピュータプログラムの中で特定の機能や処理をひとまとまりの集合として定義し、他の箇所から呼び出して実行できるようにしたもの。これにより、同じ処理を何度も繰り返し記述する必要がなくなり、コード量の削減や開発効率の向上、記述ミスなどによる誤り(バグ)の減少などが期待できる。
サブルーチン内部の処理に反映させるため、呼び出し側から値を指定できるようになっている場合が多く、この値を引数という。また、処理結果として呼び出し元に値を返すことができる場合があり、この値は「返り値」あるいは「戻り値」という。
返り値を持つサブルーチンは「関数」(function)と呼ぶのが一般的。
ルーチン
カーネルモードから呼び出し可能な、WindowsOSの内部にあるサブルーチン。
サービス
通常のアプリケーションとは異なり、起動直後から動作を開始し、常にバックグラウンドで動いているプロセス。サービスコントロールマネージャーによって開始される。
DLL
バイナリファイルとして相互にリンクされた呼び出し可能なサブルーチン。サブルーチンを利用するアプリケーションによって動的に読み込まれる。拡張子も.dll
メリットとして、複数のアプリケーションで利用する機能を一つのファイルにまとめられるので、ディスク容量を節約できたり、動的にロードできるのでメモリ容量も節約できる。
参考文献
自分用WindowsAPIメモ
Winodws API
WindowsOSのプログラミングインターフェース。32ビットバージョンは64ビットと区別するためWin32 APIと呼ばれることもある。
COM
プログラムの機能を部品化したコンポーネントをアプリケーションから利用できるようにする規約。異なる言語で呼び出せる。
OLE
officeアプリケーション等でドキュメント間の通信やデータ交換を可能にするための機能。COMで利用できる。
Windows ランタイム(Win RT)
Windows8で搭載された新しいAPI。APIの観点で見ると、COMの上位に構築されており、基本的なCOMのインフラストラクチャに様々な拡張機能を利用する。(完全な型のメタデータなど)
.NET Framework
ソフトウェア開発用のフレームワークで、「共通言語ランタイム(CLR)」と「.NET Framework クラスライブラリ(FCL)」の二つで構成される。
共通言語ランタイム(CRL)
実行中のアプリケーションを処理する実行エンジン。COMやDLLとして実装され、WindowsAPIによって提供される様々な機能を使用する。
.NET Framework ライブラリ(FCL)
一般的な機能のための一連のAPIと様々な型を提供する。