Linuxの基礎1

目次

1.Linuxディストリビューション
 Linuxの一般ユーザ向けのディストリビューションとしてRedHat系のCentOSとUbuntu/Debian系のUbuntuがあります。カーネル、ライブラリ、シェル、基本コマンドは同じですが、パッケージ管理とデスクトップ環境に違いがあります。
 パッケージ管理の違い

CentOS8.0のデスクトップ環境(GNOME)

CentOS8.0のパッケージグループ一覧
$ yum group list

Ubuntu16.04のデスクトップ環境(GNOME)

Ubuntu16.04のパッケージ一覧
$ dpkg -l | more

2.Linuxの仕組み

2.1 LinuxOSの構成
 LinuxOSの構成を下記に示します。ここでカーネル部分だけを指す場合はLinuxカーネル、システムコンポーネント、ユーザアプリケーションも含めたシステム全体をLinuxシステムと呼びます。

(1)Linuxカーネル
 Linuxカーネルはカーネルモードで動作(カーネル空間で実行され、ユーザ空間からはアクセスできない)するソフトウエアで主に以下の機能があります。
①プロセススケジューリング
 プロセスのライフサイクル(生成、実行可能、実行、待機、停止)を管理します。
②プロセス間通信
 プロセスは他のプロセスやカーネルと相互に通信することで自らの作業を行う。通信の仕組みとして、シグナル、パイプ、セマフォ、メッセージ、共有メモリなどがあります。
③メモリ管理
 プロセスにメモリを割り当てます。また物理メモリなどのストレージを仮想メモリとして管理して、巨大なアドレス空間の確保、プロセス毎に仮想アドレス空間を分けるなどデータ保護、複数のプロセスで共有できる仮想メモリなどの機能を有します。
④仮想ファイルシステム
 様々なブロックデバイス(ファイル)を単一(ドライブ番号やドライブ名といったデバイス識別子を使わない)の階層的なツリー構造に統合します。またブロックデバイスの操作の違いをブロックデバイスのデバイスドライバが担うことで、どのブロックデバイスも同じ方法でファイルとして操作できます。
⑤ネットワークシステム
 BSDソケット(BSD系UNIXを起源とするAPI)でIPベースのTCP/UDPプロトコルとネットワークデバイスとしてEthernet、PPP、SLIPをサポートします。
⑥デバイスドライバ
 デバイス間の差異を吸収し、カーネルが処理できるようにするカーネルのモジュールです。
 すべての物理デバイスは独自のハードウェア制御するコントローラを持っています。デバイスドライバはそのコントローラのデバイス間の差異を吸収して、同じ方法で操作あるいは管理できるようにするソフトウェアでメモリに常駐する共有ライブラリです。

(2)システムライブラリ
 システムライブラリはアプリケーションからカーネルを呼び出すために利用するシステムコールです。

(3)システムコンポーネント
①initデーモン
 メモリに常駐し、ファイルで指定されているプログラムを起動します。
②システムデーモン
 sshd(Secure Shell demon)はメモリに常駐して、sshクライアントから実行されたコマンドを実行します。
③ウィンドウマネージャー
 デスクトップ環境を提供します。

(4)ユーザアプリケーション
①シェル
 Linuxカーネルへ要求を伝達するプログラムです。シェルにはsh (Bourne shell/Bシェル)、bash(Bourne-Again shell)などがあります。またシェルへ送るコマンドの集まりをシェルスクリプトと言いいます。 
②ミドルウェア
 ミドルウェアは、オペレーティングシステムの機能の拡張、あるいはアプリケーションソフトウェアの汎用的(共通的)な機能を集めたソフトウェアです。(引用:Wikipedia)
③ライブラリ
 ライブラリは、汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたソフトウェアです。(引用:Wikipedia)

2.2 LinuxOSの起動と停止
(1)起動
 起動は下記の順に行われます。

 systemdはカーネルが生成する最初のユーザプロセスで、デーモンの起動・停止、サービスの起動・停止、ファイルシステムのマウントなどのシステムの設定、システムの管理を行います。システム起動した後は、「systemctl」コマンドでsystemdプロセスにメッセージを送ることでシステムの管理を行います。

(2)シェル
 シェルはLinuxカーネルとユーザの仲立ちをするユーザインターフェースでコマンドプロンプトから入力されたコマンドを解釈してコマンドを実行します。シェルにはsh、bashなどがあります。
 シェルに組み込まれたコマンド(/bin/bash)の他、外部コマンド(/bin、/sbin)があります。
 現在使用しているシェルは、
 $ echo $SHELL
で確認できます。また、使用可能なシェルは
 $ cat /etc/shells
で確認できます。

 シェルは組み込みコマンドでないときは、環境変数PATHに登録されたディレクトリで探します。
 現在のパスの表示は下記のコマンドを実行します。
 $ echo $PATH
 環境変数の一覧の表示は下記のコマンドを実行します。
 $ export -p

(3)サービス管理
 systemdは多くのLinuxディストリビューションで使われているinitシステム(Linuxカーネルのブート後に起動させるコンポーネント)で、Unitという単位で管理して設定ファイルとして持ちます。
 起動時のシステムの設定やサービスの起動などはsystemdが行い、起動後はsystemctlコマンドでsystemdにD-busでメッセージを送って管理を行います。
 systemdを管理するための主なコマンドを下記に示します。
①全てのユニットファイルの表示
 systemdがロードしないものを含め、systemdパス内の利用可能な全てのユニットファイルの表示は下記のコマンドを実行します。
 # systemctl list-unit-files
②サービスの一覧
 # systemctl list-unit-files –type service
③ロード済みサービスの一覧
 # systemctl list-units –type service

(4)サービスの起動と停止
 # systemctl {サブコマンド}[サービス]
(例)apache2.service
①ユニット状態の表示
 # systemctl status apache2

②サービスの停止
 # systemctl stop apache2

③サービスの起動
 # systemctl start apache2

④サービスの再起動
 # systemctl restart apache2
⑤サービスの有効化と無効化
 systemdのブート時にサービスを自動的に起動するためには、enableコマンドでサービスを有効にします。
 # systemctl enable apache2
 サービスの自動起動を無効にするためにはdisableコマンドでサービスを無効にします。
 # systemctl disable apache2

(5)サービス設定ファイル(ユニットファイル)
 ユニットファイルは下記のコマンドで表示できます。
 $ systemctl cat [サービス]
 (例)
 $ systemctl cat apache2.service

(6)systemctlによる停止、電源OFF、再起動
①停止
 # systemctl halt 
②電源OFF
 # systemctl poweroff
③再起動
 # systemctl reboot

(7)shutdownコマンドによる電源OFF
 # shutdown now

3 ファイル操作
(1)ファイルの作成
 $ touch [オプション] ファイル名
 オプション:
  -i:[[CC]YY]MMDDhhmm[ss]形式のタイムスタンプに変更
  -a:アクセス日時のみ変更
  -m:更新日時のみ変更
(2)ファイルの削除
 $ rm [オプション] ファイル名
 オプション:
  -i:削除前にユーザに確認する
  -f:ユーザに確認無しで削除する
(3)ディレクトリの作成 
 $ mkdir ディレクトリ名

(4)ディレクトリの削除 
 $ rm [オプション] ディレクトリ名
 オプション:
  -i:削除前にユーザに確認する
  -f:ユーザに確認無しで削除する
  -R:指定されたディレクトリ内のファイル、ディレクトリも全て削除する

(5)ファイル・ディレクトリの移動
・ファイルの移動
 $ mv [オプション] 移動元ファイル名 移動先ディレクトリ名
・ディレクトリの移動
 $ mv [オプション] 移動元ディレクトリ名 移動先ディレクトリ名
 オプション:
  -i:上書きを確認する
  -f:強制的に上書きする

(6)標準入出力
 全てのプロセスには起動時に標準入力、標準出力、標準エラー出力が作成され、デフォルトは標準入力:キーボード、標準出力/標準エラー出力:コマンドを実行した端末になります。
 標準出力、標準エラー出力をリダイレクションとファイル記述子で出力先を変えることができます。 
(例)$ ls sample1 sample2 1> list 2> error
 カレントディレクトリのリストを「list」に格納し、エラーを「error」に格納する。
(例)$ cat < sample1 | head -3
 ファイルの内容をcatコマンドに取り込み、catコマンドの標準出力をパイプでheadコマンドの標準入力とする。
 ファイルの3行目までが端末に表示されます。 

(7)パーミッション
 ユーザは1つ以上のグループに属し、ユーザとグループでファイル所有者の管理を行います。また、ファイルやディレクトリは「誰に」「どのような操作」を許可するかを設定することができます。
・ログインしているユーザの所属グループの表示 
 $ groups
・ユーザ名を指定して所属グループの表示
 $ groups [ユーザ名]
・ログインしているユーザとグループの表示
 $ id [ユーザ名]
・パーミッションの確認
 $ ls -l
  drwxrwxr-x 2 **** **** 4096 12月 10 22:05 .
  -rw-rw-r– 1 **** **** 113 12月 10 21:30 error
  1列目:ファイルの種類(-:通常ファイル、d:ディレクトリ、l:シンボリックリンク)
  2列目-4列目:ユーザ(所有者)のアクセス権限
  5列目-7列目:ユーザが所属するグループのアクセス権限
  8列目-10列目:その他のアクセス権限    
 アクセス権限の3列は、順に読み込み、書き込み、実行の権限で、許可は「r」(読み込み)、「w」(書き込み)、「x」(実行)、無許可は「-」で表わす。
・パーミッションの変更
 $ chmod [オプション] モード ファイル名
 オプション:
  -R:ディレクトリに指定した場合にサブディレクトリを含めて再帰的にパーミッションが変更される。
 パーミッションの設定方法は、シンボリックモードとオクタルモードの2通りあります。
①シンボリックモード 
 (例)$ chmod a+x,g-w sample1
 ユーザ、操作、パーミッションの組み合わせで設定します。
ここで、ユーザは「u」:所有者、「g」:グループ、「o」:その他、「a」:全てのユーザ、操作は「+」:許可、「-」:許可を削除、パーミッションは「r」:読み取り権、「w」:
書き込み権、「x」:実行権とします。

②オクタルモード
(例)$ chmod 755 sample1
 パーミッションを8進数の数値で設定します。
 (4:読み取り権、2:書き込み権、1:実行権、0:権限無し)
 1列目:所有者の権限、2列目:グループの権限、3列目:その他の権限とします。
 上記の例では、所有者は7=4(:読み取り権)+2(:書き込み権)+1(:実行権)で、グループとその他ユーザは5=4(:読み取り権)+1(:実行権)となります。

(8)ファイル編集(viエディッタ)
 テキスト編集用のエディッタです。
 $ vi ファイル名
 使用方法はここでは記載しません。
 下記サイトを参考にさせていただきました。
 https://vim.jp.net/

4.ユーザ管理
 ログインユーザとして、管理者(root)と一般ユーザがあります。
(1)ユーザの登録
 $ useradd[オプション]ユーザ名
 オプション:
  -g:グループid(プライマリーグループ)
  -m:ホームディレクトリを作成する
  -M:ホームディレクトリを作成しない
  など
(例)
 # useradd testuser
 オプションを指定しないでコマンドを実行したときはデフォルト値(下記)で作成されます。
 $ cat /etc/default/useradd

(2)パスワードの設定
 $ passwd [オプション] [ユーザ名]
 オプションを省略したときは、対話形式でパスワードの設定を行います。

(3)ユーザアカウントの削除
 $ userdel [オプション] ユーザ名
 オプション:
  -r:ユーザのホームディレクトリを削除します。

(4)ユーザ一覧の表示
 $ less /etc/passwd
 (例)

(5)グループの新規作成・変更・削除
 Linuxは一つのコンピュータを複数のユーザで使うことを前提に作られているため、ファイルやディレクトリにパーミッション(権限)がグループ単位で設定できるようになっている。
 ユーザーは必ず1つ以上のグループに所属し、メインのプライマリーグループ(一般的にはユーザー名と同じグループ名で登録)とサブのセカンダリグループ(複数持てる)がある。
①グループの作成
 # groupadd [-g グループID] グループ名
 オプション:
  -g:オプションを指定しないときは、現在使用されている最大値+1が設定される
②グループの削除
 # groupdel グループ名
③グループ一覧
 $ cat /etc/group
 (例)

④グループの変更
 $ groupmod [オプション] 変更するグループ名
  オプション:
   -n 変更後グループ名:グループ名の変更
   -g 変更後グループID:グループIDの変更
   -p 変更後パスワード:パスワードの変更

(6)所属グループの変更
 $ usermod [オプション] ユーザー名
  オプション:
   -g グループ名:プライマリーグループの変更
   -G グループ名,…:セカンダリグループの変更、複数ある場合は「,」で区切って指定)、追加は-aオプションを同時に指定(-aG グループ名)する。

(7)ログイン管理
 Linuxでは複数のユーザで利用することを前提にしているため、アカウントの有効期限の設定やアカウントのロックなどを行うことができるようになっています。 
①アカウントのロック  
 # usermod -L ユーザ名
 又は
 # passwd -l ユーザ名
②ログインユーザの表示
 $ who、又は$ w
 現在ログインしているユーザを表示します。
 wコマンドは、カレントプロセスなども表示します。
③ログイン履歴の表示
 $ last

5.スクリプト
 シェルスクリプトはシェルを使って複数の処理をまとめて行うインタプリタ型のプログラムです。
(1)シェルスクリプトの作成
 1行目にはシェルスクリプトを実行するインタプリタを記述(シバンと呼びます)します。
 #! /bin/bash
(2)シェルスクリプトの実行
 $ ./シェルスクリプト
 シバンと呼んでインタプリタを起動します。
 $ bash [オプション]シェルスクリプト
 インタプリタを指定して、インタプリタを起動します。
  オプション:
   -n:文法エラーがないかチェックします
   -e:実行時エラーになったときエラーを返して実行を停止します。
   -x:シェルスクリプトで実行した内容を1ステップ毎にコマンドライン上に表示します。
(3)引数と特殊変数
 シェルスクリプトは特殊変数($0,$1~$n,・・・)を持ち、実行時の引数を取得したり、スクリプトの実行に利用されます。使える特殊変数には以下のようなものがあります。
 $0: シェルスクリプトのファイル名
 $1~$n:シェル引数の値。$1は第1引数、$2は第2引数…。
 $#: シェル引数の数
 $*:$0以外の引数を全て一つの文字列として格納。
 $$: 実行時のシェルのプロセスIDを格納。
 $?:終了ステータスで成功「0」、失敗「1」を格納。
などがあります。

6.システム管理

6.1 パッケージ管理
 Linuxではソフトウエアをプログラム、ライブラリ、設定ファイル、ドキュメントなどをまとめたパッケージ単位で管理します。このパッケージのインストール、アンインストールなどはパッケージ管理システムを使い、Linuxディストリビューションによってパッケージ形式が異なります。

6.2 CentOSのパッケージ管理

(1)パッケージ情報の表示
 # rpm [オプション] パッケージ
  オプション:
   -q,–query:指定したパッケージのバージョンの表示
   -a,–all:インストール済のrpmパッケージ情報を一覧表
   -i,–info:指定したパッケージの詳細情報を表示
   他

(2)パッケージのインストール、アンインストール
 # rpm [オプション] パッケージ
  オプション:
   -i,–install:パッケージのインストール(アップデートは行わない)。依存関係のあるパッケージがインストールされていないときはインストールを中断する。  
  -U,–upgrade:パッケージをアップグレードする
  -F,–freshen:パッケージをアップデートする
  -e,–erase:パッケージを削除する。他のパッケージに依存するときは削除を中断する。

(3)yumコマンド
 rpmパッケージを管理するユーティリティで、パッケージの依存関係を自動的に解決して、パッケージのインストール、削除、アップデートを行う。
 yumコマンドはインターネット上のリポジトリと通信してパッケージの管理を行う。
 また、yumコマンドを改善したDNF(Dandified Yum)コマンドもあります。
 $ yum [オプション] コマンド [パッケージ名など]
  オプション:
   -v –verbose: 詳細メッセージを出力する
  コマンド:
   install: 指定したrpmパッケージをインストールする
   remove:指定したrpmパッケージを削除する
   update:インストール済のrpmパッケージで更新可能なもの全て更新する
   upgrade:システム全体のパッケージのリリースバージョンアップを行う
   info:指定したrpmパッケージの詳細を表示する
   list:利用可能な全てのrpmパッケージ情報を表示する
   search:指定したキーワードでrpmパッケージの検索結果を表示する

(4)CentOSのリポジトリ
 リポジトリにはCentOSで公式にサポートされているパッケージを提供する標準リポジトリと、サードパーティによるパッケージを提供する外部リポジトリがあります。
 標準リポジトリは下記のディレクトリにインストールされます。
 # ls -l /etc/yum.repos.d

(5)CentOSの標準リポジトリミラーサイト
 Mirror List
 https://www.centos.org/download/mirrors/

6.3 Ubuntuのパッケージ管理
 Debian形式(.deb)のパッケージの管理を行う

(1)パッケージ情報の表示
 # dpkg [オプション] アクション
  オプション:
   -l,–list:指定したパターンにマッチするパッケージの一覧表示
   -L,–listfiles:指定したパッケージ名でインストールされたファイルの一覧表示

(2)パッケージのインストール、アンインストール
 # dpkg [オプション] アクション
  オプション:
   -i,–install:パッケージのインストール  
   -r,–remove:設定ファイルは残してパッケージを削除する。
   -P,–purge:設定ファイル含めてパッケージを削除する。

(3)aptコマンド
 deb形式のパッケージを管理するユーティリティで、パッケージの依存関係を自動的に解決して、パッケージのインストール、削除、アップデートを行う。
 aptコマンドはインターネット上のリポジトリと通信してパッケージの管理を行う。
 $ apt [オプション] サブコマンド
 サブコマンド:
  install: 指定したパッケージをインストールする
  remove:設定ファイルは残して、指定したrpmパッケージを削除する
  purge:設定ファイル含めてパッケージを削除する。
  update:パッケージインデックスファイルとソースの同期を行う
  upgrade:システムにインストールされている全てのパッケージを最新バージョンにアップグレードする。
  show:指定したパッケージの詳細を表示する
  list:利用可能な全てのパッケージ情報を表示する
  search:指定したキーワードでパッケージの検索結果を表示する

(4)Ubuntuのリポジトリ
 Ubuntuのリポジトリはaptコマンドによって新たにパッケージをインストールするときなどにアクセスされます。
 下記のディレクトリにリポジトリの設定ファイル(sources.list)が配置されます。
 # ls -l /etc/apt

「sources.list」
 リポジトリのURLなどが記載されています。

7.ディスクの管理
 1台の物理的なディスクを複数の独立した論理的なデバイスとして扱えるようにする操作をパーティションニングといい、分割された領域をパーティションといいます。
 パーティションに分けることでパーティション単位のバックアップなどが行えるようになります。

(1)デバイスファイル
 デバイスへアクセスするためのデバイスファイルは/devディレクトリ配下におかれ、デバイスの規格によってデバイスファイル名が決められます。
 ハードディスクはIDE,SATAなどの規格があり、SATAの場合はコントローラの1番目のポート(Port0)に接続されたディスクは/dev/sdaとなります。 

(2)ディスクパーティションの形式 
 ディスクパーティションの形式にはMBR(Master Boot record)とGPT(GUID Partition Table)があります。
 パーティション管理ツールとして、MBRパーティション管理用のfdiskとGPTパーティション管理用のgdiskがあります。

(3)MBRパーティション管理(fdisk)
 パーティションの表示は下記のコマンドで行います。
# fdisk -l

(4)ファイルシステム
 パーティション内にファイルを配置できるようにするために、パーティション内にファイルシステムを作成します。 
 ファイルシステムは、xfs(CentOS)、ext4(Ubuntu)などがあります。 
 ファイルシステムの種類は下記コマンドで確認できます。
 $ df -T

(5)マウント
 マウントはあるディレクトリにあるパーティションを接続する操作のことで、マウントすることで/(ルート)からのアクセスが可能となります。
 # mount [オプション] [デバイスファイル名(ファイルシステム)] [マウントポイント(ディレクトリ)]
 オプション:
  -oプション,–optionsオプション:マウントオプション(「,」区切りで複数指定可能)
  -r,–read-only:読み込み専用でマウントする
  -w,–rw:読み書き可能な状態でマウントする(デフォルト)
(例)デバイスをマウント
 # mount /dev/sdb1 /usr/local/data1
(例)usbをマウント
 ・デバイスが認識されていることを確認する
  $ dmesg
  dmesgコマンドはカーネルリングバッファのデータを表示するためのコマンド。

・# mount (デバイスファイル名) /mnt

(6)アンマウント
 # umount マウントポイント

8.ネットワーク管理
 ネットワークの設定はネットワークマネージャーで行います。
(1)ネットワークに関する設定ファイル
 ①/etc/services
  サービス名とポート番号の対応
 ②/etc/protocols
  プロトコル番号の一覧
 ③/etc/hosts
  ホスト名とIPアドレスの対応

(2)NetworkManager
 ネットワークの設定は、コンソール上で対話形式のツールのnmtui(NetworkManager Text User Interface)とコマンドベースのnmtcli(NetworkManager Command Line Interface)による方法があります。
①nmtuiによる設定
 $ mntui

②nmcli
 $ nmcli [オプション] オブジェクト
 オブジェクト:
  device:ネットワークデバイスと接続状態の表示
  connection:ネットワークデバイスの接続一覧表示
  radio:ネットワークの接続状態の表示

(3)ネットワーク監視コマンド
 iproute2パッケージのコマンドについて記載します。
 ip [オプション] オブジェクト [サブコマンド]
  オプション:
   -s:情報を詳しく表示する
  オブジェクト
   addr:ネットワークデバイスのIPアドレス
   route:ルーティングテーブルのエントリー
   link:ネットワークデバイス
 (例)
 ・デバイスの設定の一覧表示
  $ ip addr 
 ・指定したデバイスに設定されているIPアドレスの表示
  $ ip addr show dev enp0s3
 ・IPアドレスの追加
  $ ip addr add 192.168.2.101/24 dev enp0s3
 ・IPアドレスの追加
  $ ip addr del 192.168.2.101/24 dev enp0s3

(参考文献)
・The Linux Kernel
http://archive.linux.or.jp/JF/JFdocs/The-Linux-Kernel-6.html
・「本気で学ぶLinux実践入門」
著者:大竹龍史、山本道子 発行:SBクリエイティブ株式会社

The end