# CH10 必須システムサービス
※記載している画像の出典は書籍「Linux教科書 LPIC レベル1」です。
## 10.1 システムクロックの設定
時刻はログやメールの記録に使われるので、正確に調整するべき。
### 10.1.1 システムクロックとハードウェアクロック
#### ハードウェアクロック
- ハードウェアとして内蔵された時計
- 電源がオフでも内臓電池で動く
#### システムクロック
- Linuxのカーネル内に存在する時計
- Linux起動時にハードウェアクロックを参照して設定される→その後は独立して動く
#### 時刻関連のコマンド群
- `date`
- システムクロックを参照して日付を表示する
- 書式:`date [MMDDhhmm[[CC]YY][.ss]]`
- CC: 西暦の上2桁
- YY: 西暦の下2桁
- ss: 秒
- ex. `$ date "+%Y/%m/%d (%a)"`
- [Q]なんで曜日がaなんだろう、、、
- `hwclock`
- `-r`: ハードウェアクロックを表示する
- `-w(--systohc)`: システム→ハードに設定する
- `-s(--hctosys)`: ハード→システムに設定する
- `timedatectl`
- systemdが動いてるときに使える時刻管理ツール
### 10.1.2 NTPによる時刻設定
- 正確な時間は、NTPサーバから取得する
- Network Time protocol:ネットワーク経由でクロックを同期するプロトコル
- NTPネットワークは階層構造になっていて、最上位には原子時計やGPSがいる
- `ntpdate <ntp server name>`:NTPサーバから現在時刻を取得する
- NTPサーバを自前で運用できる
- 組織内にNTPクライアントが多い場合におすすめ
- 起動例
- `# /etc/init.d/ntpd start`
- `# systemctl start ntpd.service`
- `ntpq`:NTPサーバの状態を照会できる
- `/etc/ntp.conf`でサーバの設定を行う
<img width="569" alt="Screenshot 2023-02-12 at 16 38 04" src="https://user-images.githubusercontent.com/27912121/218298907-468cb922-63a1-4216-b89b-0cf49e074f2a.png">
```bash
$ sudo apt install ntp
$ systemctl start ntpd.service
$ systemctl status ntp
● ntp.service - Network Time Service
Loaded: loaded (/lib/systemd/system/ntp.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2023-02-11 11:38:21 JST; 5s ago
Docs: man:ntpd(8)
Process: 3540 ExecStart=/usr/lib/ntp/ntp-systemd-wrapper (code=exited, status=0/SUCCESS)
Main PID: 3546 (ntpd)
Tasks: 2 (limit: 2275)
Memory: 1.3M
CPU: 31ms
CGroup: /system.slice/ntp.service
└─3546 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 114:124
Feb 11 11:38:24 lts ntpd[3546]: Soliciting pool server 46.249.42.12
Feb 11 11:38:24 lts ntpd[3546]: Soliciting pool server 3.114.30.212
Feb 11 11:38:25 lts ntpd[3546]: Soliciting pool server 129.250.35.250
Feb 11 11:38:25 lts ntpd[3546]: Soliciting pool server 133.243.238.163
Feb 11 11:38:25 lts ntpd[3546]: Soliciting pool server 44.190.40.123
Feb 11 11:38:25 lts ntpd[3546]: Soliciting pool server 45.76.211.39
Feb 11 11:38:26 lts ntpd[3546]: Soliciting pool server 118.27.19.72
Feb 11 11:38:26 lts ntpd[3546]: Soliciting pool server 162.159.200.1
Feb 11 11:38:26 lts ntpd[3546]: Soliciting pool server 103.29.68.66
Feb 11 11:38:26 lts ntpd[3546]: Soliciting pool server 91.189.91.157
$ ntpq -p localhost # localhostで稼働しているNTPサーバから問い合わせされているNTPサーバのリストを表示
remote refid st t when poll reach delay offset jitter
==============================================================================
0.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.000
1.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.000
2.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.000
3.ubuntu.pool.n .POOL. 16 p - 64 0 0.000 +0.000 0.000
ntp.ubuntu.com .POOL. 16 p - 64 0 0.000 +0.000 0.000
#shtucer.tntu.ed 31.28.161.68 2 u 55 64 1 277.577 +11.537 10.516
#122x215x240x51. 35.73.197.144 2 u 52 64 1 15.741 -35.868 5.073
#ntp2.inx.net.za 238.72.153.243 2 u 55 64 1 533.218 -61.872 60.078
+y.ns.gin.ntt.ne 129.250.35.222 2 u 55 64 1 8.024 -2.816 7.000
+46.249.42.12 (c 216.239.35.12 2 u 57 64 1 259.772 -2.513 26.942
+ec2-3-114-30-21 133.243.238.163 2 u 55 64 1 15.750 -4.127 5.727
+x.ns.gin.ntt.ne 129.250.35.222 2 u 56 64 1 8.061 -3.159 7.784
+ntp-b2.nict.go. .NICT. 1 u 53 64 1 43.853 +10.097 10.681
+tama.paina.net 131.112.125.48 2 u 1 64 3 17.125 -3.386 4.652
+44.190.40.123 66.220.9.122 2 u 1 64 3 123.868 -0.440 6.679
+time.cloudflare 10.51.8.166 3 u 55 64 1 8.720 -5.939 4.528
+v118-27-19-72.c 133.243.238.164 2 u 55 64 1 15.873 -3.111 4.598
+dojo.ruselabs.c 61.205.120.130 2 u 53 64 1 42.724 +9.329 10.610
alphyn.canonica 142.3.100.2 2 u 63 64 1 166.207 -2.634 0.000
*133.100.9.2 .PPS. 1 u 56 64 1 21.141 -3.024 4.167
185.125.190.58 167.28.20.25 2 u 63 64 1 235.239 -8.354 0.000
+2602:80f:9002:8 169.254.169.123 4 u 52 64 1 14.772 -3.627 7.807
```
:::info
💡
いっぱいあるのは負荷分散のため。
:::
### 10.1.3 Chrony
- ntpd/ntpdateの代替となるNTPサーバ/クライアントソフトウェア
- `chronyd`: デーモンプロセス
- `chronyc`: クライアントコマンド
- `/etc/chrony.conf`: 設定ファイル
Ubuntu22.04LTSにChrony入れたらこうなった。
```bash
# Welcome to the chrony configuration file. See chrony.conf(5) for more
# information about usable directives.
# Include configuration files found in /etc/chrony/conf.d.
confdir /etc/chrony/conf.d
# This will use (up to):
# - 4 sources from ntp.ubuntu.com which some are ipv6 enabled
# - 2 sources from 2.ubuntu.pool.ntp.org which is ipv6 enabled as well
# - 1 source from [01].ubuntu.pool.ntp.org each (ipv4 only atm)
# This means by default, up to 6 dual-stack and up to 2 additional IPv4-only
# sources will be used.
# At the same time it retains some protection against one of the entries being
# down (compare to just using one of the lines). See (LP: #1754358) for the
# discussion.
#
# About using servers from the NTP Pool Project in general see (LP: #104525).
# Approved by Ubuntu Technical Board on 2011-02-08.
# See http://www.pool.ntp.org/join.html for more information.
pool ntp.ubuntu.com iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
# Use time sources from DHCP.
sourcedir /run/chrony-dhcp
# Use NTP sources found in /etc/chrony/sources.d.
sourcedir /etc/chrony/sources.d
# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys
# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift
# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony
# Uncomment the following line to turn logging on.
#log tracking measurements statistics
# Log files location.
logdir /var/log/chrony
# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0
# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can’t be used along with the 'rtcfile' directive.
rtcsync
# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3
# Get TAI-UTC offset and leap seconds from the system tz database.
# This directive must be commented out when using time sources serving
# leap-smeared time.
leapsectz right/UTC
```
- ntpとchronyの両方を同時に使うことはできない
```bash
$ chronyc sources # 時刻ソースとなるNTPサーバごとの情報を表示
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? prod-ntp-3.ntp4.ps5.cano> 2 6 7 44 +93ms[ +93ms] +/- 220ms
^- prod-ntp-4.ntp4.ps5.cano> 2 6 177 42 +69us[ +69us] +/- 112ms
^- prod-ntp-5.ntp4.ps5.cano> 2 6 177 44 -520us[ -520us] +/- 112ms
^- prod-ntp-5.ntp4.ps5.cano> 2 6 177 43 +14ms[ +14ms] +/- 125ms
^- 20.210.35.61 2 6 177 44 -108us[ -108us] +/- 123ms
^* ntp-b2.nict.go.jp 1 6 177 46 -1918us[-2503us] +/- 12ms
^- ntp7.mum-in.hosts.301-mo> 2 6 177 46 +4691us[+4691us] +/- 126ms
^- tg-time01.isnic.is 2 6 17 34 +84ms[ +84ms] +/- 242ms
```
## 10.2 システムログの設定
- `ログ`
- コンピュータの動作状況の記録
- `syslog`
- 様々なイベントのログの入出力を管理するソフトウェア
- 他には`rsyslog`, `syslog-ng`などがある
- 他プログラムからのメッセージを受け取り、出力元や優先度に応じて分類し、指定された出力先に送る
<img width="504" alt="Screenshot 2023-02-12 at 16 38 51" src="https://user-images.githubusercontent.com/27912121/218298925-3e4fbc35-c217-4021-97bb-36833d7bba8c.png">
### 10.2.1 rsyslogの設定
- `/etc/rsyslog.conf`および`/etc/rsyslog.dディレクトリ以下のファイル群`で行う
ex. Ubuntu22.04...
```bash
$ cat /etc/rsyslog.conf
# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
#module(load="immark") # provides --MARK-- message capability
# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")
# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Filter duplicated messages
$RepeatedMsgReduction on
#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
```
- 設定ファイルの書式:`<ファシリティ>.<プライオリティ> <出力先>`
- ファシリティ
- メッセージの生成もと(具体的にはカーネルや実行中のプロセス)
- プライオリティ
- メッセージの重要度(低く設定するほど、ログ情報量が多くなる)
- 「.」で指定→指定したプライオリティ以上を出力
- 「=」で指定→指定したもののみ出力
- [感想] alert > crit なのね👀
- 出力先
- ログファイルやユーザの端末、他ホストなどを選択できる
- /etc/rsyslog.confの設定例
- `kern.* -/var/log/kern.log`
- カーネルのログを対象ファイルに出力(-は書き込みを同期しないという意味→システムクラッシュ時に保存されない可能性はある)
- `*.*;authpriv.none /var/log/messages`
- 認証情報以外を全てファイルに保存する
- `logger`
- ログメッセージの生成
- 書式:`logger [-p facility.priority] [-t tag] messages`
- `systemd-cat`
- コマンド実行結果をジャーナルに書き込める
- 書式:`systemd-cat <command>`
:::danger
🚨重要
`/etc/rsyslog.conf`設定項目を`理解`すべし
:::
### 10.2.2 ログ調査
ログから、システムの利用状況やソフトウェアの動作に異常がないかどうかを確認、また問題の兆候を発見できることがある。
主要なログファイルと閲覧コマンド
| file | description | command |
| --- | --- | --- |
| /var/log/messages | 主要なログファイル | less, tail, grep... |
| /var/log/syslog | syslog関連 | less, tail, grep... |
| /var/log/secure | 認証などセキュリティ関連 | less, tail, grep... |
| /var/log/wtmp | 最近ログインしたユーザ情報 | last |
| /var/log/utmp | ログイン中のユーザ情報 | who, w |
| /var/log/lastlog | ユーザごとの最近のログイン情報 | lastlog |
- ログ確認では`tail`や`grep`をよく使う
- `who`:ログイン中のユーザを調べる
- `w`:システム情報も加えて表示できる
- これらは/var/run/utmpを参照している
- `last`:最近ログインしたユーザの一覧を表示できる
- /var/log/wtmpを参照する
- `lastlog`:/var/log/lastlogファイルを参照し、ユーザごとに最近のログイン一覧を表示する
- `journalctl`:systemdのログを閲覧できる
- ex. sshd.service関連のログのみ表示:`journalctl -u ssh.service`
- 保存先:/var/log/journalや/var/run/log/journal内にあるバイナリ(/runは揮発性あり)
ex. Ubuntu22...
```bash
cat /etc/systemd/journald.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file, or by creating "drop-ins" in
# the journald.conf.d/ subdirectory. The latter is generally recommended.
# Defaults can be restored by simply deleting this file and all drop-ins.
#
# Use 'systemd-analyze cat-config systemd/journald.conf' to display the full config.
#
# See journald.conf(5) for details.
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes
#Audit=no
```
### 10.2.3 ログファイルのローテーション
- 膨大していくログを切り分けて、整理できる機能のこと
- `logrotate`ユーティリティがローテーション機能を提供する
- cronで定期実行する
- 設定ファイルは`/etc/logrotate.conf`
<img width="572" alt="Screenshot 2023-02-12 at 16 39 34" src="https://user-images.githubusercontent.com/27912121/218298949-42e74922-b6cc-4c4a-b9c9-ec2d7060272b.png">
ex. Ubuntu22.04
```bash
cat /etc/logrotate.conf
# see "man logrotate" for details
# global options do not affect preceding include directives
# rotate log files weekly
weekly
# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
#dateext
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# system-specific logs may also be configured here.
```
## 10.3 メール管理
### 10.3.1 メール配送の仕組み
- 電子メールを取り扱うソフトウェア
- MTA(message transfer agent
- メールの配送に使われる
- SMTPプロトコルでメッセージのやり取りをするため、SMTPサーバと呼ばれる
- 代表的なSMTPサーバ:sendmail, Postfix, exim
- MDA(mail delivery agent
- ローカル配送プログラム
- MUA(mail user agent
- メールクライアントソフトウェア
- 作成されたメールが相手に届くまでの流れ
- 差出人側
- MUAで作ったメールが、送信用MTA①に送られる
- MTA①は、メールアドレスから配送先メールサーバを調べ、メールをMTA②へ送る
- 配送先メールサーバを尋ねる先は、相手ドメインのDNSサーバ
- [脱線]MXレコード(mail excahnger record)
- DNSで定義されるドメイン情報の一つ
- 特定のドメイン宛ての電子メールをどのメールサーバーに転送すればいいか指定するレコード
- メールサーバのホスト名(FQDN)を指定
- MTA②がメールを受け取ると、MDAがメールの宛先となっているユーザのメールボックスにメールを格納する
- 受取人側
- POPサーバやIMAPサーバを経由して、自分のメールボックスからメールを取り出す
<img width="563" alt="Screenshot 2023-02-12 at 16 39 59" src="https://user-images.githubusercontent.com/27912121/218298964-830b144b-3bc9-4f26-baf0-5438bd9049ca.png">
### 10.3.2 MTAの起動
システムごとに異なるが、25番ポートを開いているソフトウェアを調べると動いてるMTAがわかる
- コマンド例:`netstat -atnp | grep 25`(コマンド詳細は11.3.1にて)
ex. Ubu...
```bash
$ sudo netstat -atnp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 591/systemd-resolve
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 1464/master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 674/sshd: /usr/sbin
tcp 0 0 192.168.64.6:22 192.168.64.1:64675 ESTABLISHED 790/sshd: ubuntu [p
tcp6 0 0 :::25 :::* LISTEN 1464/master
tcp6 0 0 :::22 :::* LISTEN 674/sshd: /usr/sbin
```
デフォルトのUbuntu22.04LTS上では、systemd、DNS、メールサーバ、SSHサーバが動いているようですね👀(Multipass経由である点に注意)
### 10.3.3 メールの送信と確認
- `mail`
- コマンドラインでメールを送信したり、受信メールを確認できる
- 書式:`mail [-s subject] [mail address | user name]`
- ユーザ名のみを指定すると、ローカルシステムのユーザ宛にメールを送る
実際に使ってみた例
```bash
sudo apt install mailutils
...
mail -s "test mail" narutyan0711@gmail.com
Cc:
test
<ctrl + d>
```
<img width="572" alt="Screenshot 2023-02-07 at 21 46 13" src="https://user-images.githubusercontent.com/27912121/217248689-8dbb82fb-5c75-45e4-98d5-fa3cd19b9832.png">
Gmailサーバのフィルタで弾かれると思ったが、大丈夫だった。同じIPから来たら通るようになってるのかな?👀
### 10.3.4 メールの転送とエイリアス
ある宛先に届いたメールを、別のメールアドレスで受け取る方法
- `/etc/aliases`でエイリアスを設定する方法
- ex. root宛のメールをadminとlpicで受け取れるようにする(rootには届かなくなる
- `newaliases`: 設定内容を有効化する
```
root: admin, lpic
```
- 各ユーザのホームディレクトリに`.forward`ファイルを用意する方法
- ファイルに転送先のメールアドレスを記述する
- 一時的にメールを転送したい場合などに便利
:::danger
🚨重要
上記二つのエイリアス設定方法と`newaliases`コマンドの必要な理由を理解すべし
:::
- メールキュー
- 送信待ちのメールが蓄えられるところ
- 定期的に再送信が試みられ、規定回数内に送信できない場合は送信者に通知する
- 蓄えられる理由
- 送信先メールサーバが停止している
- 宛先がDNSで検索できなかった
- `mailq`で内容を表示できる
## 10.4 プリンタ管理
### 10.4.1 印刷の仕組み
- CUPS(Common Unix Printing System):多くのLinuxディストリビューションで採用されている印刷サブシステム
- 主な特徴
- IPP(Internet Printer Protocol)の採用
- インターネット経由での印刷ができる(リモートプリント)
- [Epsonの記事](https://www.epsonconnect.com/iguide/ja/iPrint_remote.htm)
- PPD(PostScript Printer Description)ファイルのサポート
- AdobeのPPD形式のファイル(テキストファイル)でデバイスドライバの設定ができる
- プリンタの機種依存情報を記述するところ
- PPDファイルは/etc/cups/ppd以下に格納する
- [Canonの記事](https://faq.canon.jp/app/answers/detail/a_id/17844/~/%E3%80%90pixel%E3%80%91ppd%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF)
- Webブラウザで設定できる
- 631番ポートに接続すると、Webインターフェースが表示される
- プリンタクラス(複数プリンタを一台のプリンタに見せかける機能)をサポート
- 設定ファイル
- `/etc/cups/cupsd.conf`
- 印刷要求をネットワーク経由で受け付ける場合のポート番号や、接続するクライアントのアクセス許可を設定する
- `/etc/cups/printers.conf`
- プリンタに関する情報などを設定する
- サービスの起動
- SysVinit: `/etc/init.d/cups start`
- systemd: `systemctl start cups.service`
- CUPSを使った印刷処理の流れ
- ①アプリケーションや印刷コマンドから印刷データを受け取る
- プリンタの設定オプションはPPDファイルから受け取る
- ②スプーラが印刷データを受け付け、スケジューリングを行う
- ③プリンタが受け付けられない形式のデータを、一旦中間形式としてPDFまたはPostScriptにフィルタで変換する
- ④PPDに定義されたフィルタにより、最終の印刷データに変換する
- ⑤処理した印刷データをCUPSのバックエンドに送る
- ⑥バックエンドは印刷データをローカル接続(ex. USB)またはネットワーク経由(ex. IPP, LPR)でプリンタに渡す
- LPR(Line PRinter daemon protocol):TCP/IPベースのプリンタプロトコル
<img width="554" alt="Screenshot 2023-02-12 at 16 40 57" src="https://user-images.githubusercontent.com/27912121/218299012-f35ff3d4-0e8e-4ec2-a543-e00630438160.png">
### 10.4.2 印刷関連コマンド
- `lpr`:プリントキューにファイルや標準入力を送る
- `lpr -#5 /etc/passwd`
- `cat ~/.ssh/<secret key name> | lpr`(これはやめよう
- `lpq`:プリントキューの内容を表示する
- `lprm`:プリントキューにある印刷要求を削除する
:::danger
🚨重要
各印刷処理コマンドを理解すべし
:::
:::warning
⚠️注意
各コマンドはBSD LPR印刷システムと互換性がある。
対して、System V印刷システムと互換性を持つコマンド群(`lp`, `lpstat`, `cancel`)もあり、CUPSではこちらが標準。
:::