Linuxのサービスと時刻設定や言語設定について

# サービス
- Linux起動時に実行され、システム終了までバックグランドで動き続けるプログラムのこと
- デーモン(daemon)やサーバとも言い、様々な機能を他のプログラムやユーザに提供する

### プロセス一覧の表示
`$ps ax`

## chkconfigコマンド
- サービスのシステム起動時の挙動設定を行うコマンド
- システム起動時に自動起動するサービスの設定や、不必要なサービスを停止するなどの設定を行うことができる

### サービスの設定リストを閲覧する
`$ cd /sbin/`
`$ chkconfig --list`

### ランレベル(Run Level) 
- サービスはランレベルごとの起動と停止を設定でき、サービスの起動や停止はシェルスクリプトによって制御される
- ランレベルごとに(rc0.d～rc6.d)のディレクトリがあり、それぞれ中に各サービスのシェルスクリプトへのシンボリックリンクが格納されている

- ランレベルと説明は以下のようになっている

| Run Level | 状態 |
|--:|:--|
| 0 | システムの停止 |
| 1 | シングルユーザモード |
| 2 | マルチユーザモード |
| 3 | マルチユーザモード(コンソールログイン) |
| 4 | 未使用 |
| 5 | マルチユーザモード(ディスプレイマネージャ使用) |
| 6 | システム再起動 |

### サービス設定の追加と削除
- 追加の場合は`$ chkconfig --add サービス名`を、削除の場合は`$ chkconfig --del サービス名`で行う

### ランレベル指定でのサービスの起動設定
`$ chkconfig --level ランレベル サービス名 on`

## サービスの起動と停止
- サービスごとのシェルスクリプト、またあはserviceコマンドを利用できる
- ただし、init.dでの起動の場合はコマンド実行時の環境変数全てを引き継がれるのに対し、serviceコマンドではPATHとTERMのみが引き継がれる

### サービスの起動
`$ /etc/init.d/サービス名 start`
`$ service サービス名 start`

### サービスの停止
`$ /etc/init.d/サービス名 stop`
`$ service サービス名 stop`


# 時刻設定の仕組み
## タイムゾーン
- UTC（Coordinated Universal Time：協定世界時）
    - 世界共通の標準時刻
    - UTCとの時刻差を表記。日本だと[UTC+9]となる
- JST(Japan Standard Time：日本標準時)
    - 日本の標準時刻

### タイムゾーンの確認と変更方法
- 確認方法
    - `$ date`でタイムゾーンの確認を行うことができる
- 変更方法
   - `cp /etc/localtime /etc/localtime.org`でバックアップ後、`ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime`にて設定したいタイムゾーンのシンボリックリンクを張る
    - 再起動時後でも新規設定タイムゾーンを適用した場合は[こちら](https://qiita.com/azusanakano/items/b39bd22504313884a7c3)を参照

### ハードウェアクロックとシステムクロック
- ハードウェアクロック
    - マザーボードが持つ内部時計
    - PCの電源がオフの状態でも動作
- システムクロック
    - PC起動時にハードウェアクロックを参照して設定

### 時刻の確認と変更
- `date`コマンド
    - システムクロックを参照して表示する
- `hwclock`コマンド
    - rオプションでハードウェアクロックを表示
    - wオプションでシステムクロックをハードウェアクロックに設定
- `ntpdate`コマンド
    - NTP(Network Time Protocol)サーバに接続してシステムクロックを設定
    - `$ ntpdate [オプション] NTPサーバー`で実行
    - なお、NTPサーバーの例としては以下のようなものがある
        - 独立行政法人情報通信研究機構(NICT) : ntp.nict.jp
        - 国立天文台 : s2csntp.miz.nao.ac.jp
        - インターネットマルチフィード (MFEED) : ntp.jst.mfeed.ad.jp
 
| オプション | 説明 |
|:--|:--|
| B | slewモード。徐々に時刻の修正を行う。 |
| b | stepモード。即座に時刻の修正を行う。 |
| d | デバックモード。時刻の修正は行わない。 |
| q | NTPサーバーへ日付と時刻の問い合わせのみを行う。時刻の修正は行わない。 |
| v | 詳細情報を表示。 | 

- ntpdデーモン
    - ntpdデーモンをクライアントとして動作するように起動させることで、ntpサーバと時刻を同期させる
    - 「/etc/ntp.conf」に設定がかかれ、`$ntpq -p`で時刻同期の確認ができる

## NTP
- NTP(Network Time Protocol)とは、ネットワーク上で時間を同期するプロトコル
- コンピュータの内部時刻を正しく設定するための、ネットワーク上の時刻サーバに問い合わせを行う手順を定義
- これを利用するサービスとして、ntpdやntpdateなどがある

### Time Protocolについて
- NTPに対して古典的な方法として、Time Protocolというものがある
- ネットワーク経路間の時刻補正が含まれておらず誤差が発生してしまう
- NTPはこれに対し、以下が考慮されることで補正されている
    - クライアントがクエリを発信した時刻
    - サーバがクエリを受信した時刻
    - サーバが応答を発信した時刻
    - クライアントが応答を受信した時刻

### NTPの階層構造
- NTPサーバーは階層構造で管理されており、この階層はストラタムと呼ばれる
- ストラタムは1から16まで存在し、数字が小さいほど、正確な時刻を刻む
- ストラタム0ではGPSや原子時計の時刻が刻まれ、ストラタム1（NTP）ではストラタム0を参照している
- サービスでは上位のストラタムだけでなく、複数の同位や下位ストラタムとも接続できるようになっており、突発的な通信遅延の変化等にも対応できるようになっている

### SNTP
- 「Simple Network Time Protocol」の略
- NTPは非常に複雑なプロトコルでありのに対し、簡易版にあたるプロトコル

### 時刻修正について
- 例えばサーバを運用している際に、時刻が大きく狂ってしまったとしてもstepモード等で即時反映させてはいけない
- これは、cron等が多重実行されてしまう可能性があり、結果的に未来時刻にマウントされる可能性があるため


# 言語設定の仕組み
## ロケールとローカライゼーション
- 各言語などの地域情報をロケールと呼び、地域情報等の書式ルールに準拠して利用しやすくすることをローカライゼーションという
- 日本の文字コードの場合、「ja_JP.UTF-8」が主流で利用されている
- Internationalization」国際化)を「i18n」と略すことが多々ある

## LANG環境変数
- ローカライゼーションを行い日本語の表示対応をする場合、LANG変数に「ja_JP.UTF-8」もしくは「ja_JP.utf8」を適用することがほとんど
- `$ locale`によってローカライゼーション系の環境変数を表示できる
- 指定できるロケールは`$locale -a`で確認できる
- 例えばbashシェルからデフォルトのロケール（Cロケール）に変更する場合、`$ LANG=C`と環境変数を利用するのみで変更できる
    - なお、恒久的に変更したい場合はシェルスクリプトやロケールを定義しているスクリプトに記述が必要

# 参考
- [Linux実習/サービス](http://linux.k-sakabe.com/Linux_Server1_c2.html)
- [chkconfgまとめ](https://qiita.com/shell/items/30031862d91cedf9ceef)
- [Linux - サービスの init.d 起動と service 起動の違い](https://www.mk-mode.com/octopress/2014/04/08/linux-difference-of-service-start/)
- [【Linux】タイムゾーン(Timezone)の変更](https://qiita.com/azusanakano/items/b39bd22504313884a7c3)
- [Linux 自国の確認・変更](http://www.dn-web64.com/archives/web/linux_clock/)
- [ntpdate - 日付と時刻をNTPサーバーと同期 - Linuxコマンド](https://webkaru.net/linux/ntpdate-command/)
- [Linuxのローカライゼーション系LANG変数：langについて](https://eng-entrance.com/linux-localization-lang)