Linuxのシステムアーキテクチャ

# 基本的なハードウェア
CPUやメモリ、ストレージなどのハードウェア情報を確認したり、設定したり、問題発生時の調査のためのコマンドやオプションがいくつか用意されている。


## デバイスファイル
デバイスを表すファイルのこと。デバイスファイルは`/dev`ディレクトリ以下に配置される。これらのデバイスファイルは、udevという仕組みによって自動的に作成される

Linuxカーネルが認識しているデバイスに関する情報の一部は、`/proc`ディレクトリ以下のファイルで確認できる。これらはファイルとして実体がない仮想的なファイルで、一部のファイルはテキストファイルとして閲覧可能

| ファイル名 | 説明 |
|:-:|:-:|
| /proc/cpuinfo  | CPU情報  |
| /proc/interrupts  | IRQ情報  |
| /proc/ioports  | I/Oアドレス情報  |
| /proc/meminfo  | メモリ情報  |
| /proc/bus/usb/*  | USBデバイス情報  |
| /proc/bus/pci/*  | PCIデバイス情報  |
| /proc/dma  | 使用中のDMAチャネルに関する情報  |

::: note info
**・DMA(Direct Memory Access)とは？？**
CPUを介することなくメインメモリと周辺機器の間で直接的に情報転送を行う方式
:::


### udev(Userspace Device management)
ホットプラグデバイスを接続した際、`/dev`ディレクトリ以下のデバイスファイルを自動的に作成する。デバイスが接続されるとカーネルがそれを検知し、`/sys`ディレクトリ以下にD-Bus（Desktop Bus:デバイス情報)を作成する。
設定情報ファイルは`/etc/udev/rules.d`に配置される


::: note info
**・ホットプラグデバイスとは？？**
システムが起動している状態でもデバイスの差し替えができるデバイスのこと。プラグアンドプレイデバイスとも呼ばれる。USBやPCカード(PCMCIA)などがある

**・コールドプラグデバイスとは？？**
システムが停止している状態でのみデバイスの差し替えができるデバイスのこと。システム起動時にデバイスを認識する。NIC(ネットワークカード)などがある
:::


### lspciコマンド
PCIバスに接続されているデバイスを一覧表示するコマンド。オプションを使えば**IRQ情報やバススピード、ベンダーID**など、デバイスに関するさまざまな情報を取得できる。

| オプション | 内容 |
|:-:|:-:|
| -s  | バス番号、デバイス番号、ファンクション番号を指定し、該当するデバイスのみを表示する  |
| -v  | 詳細な情報を表示する  |
| -vv  | より詳細な情報を表示する  |

::: note info
**・PCI(Peripheral Component Interconnect)バスとは？？**
PCIは拡張ボードを差し込むための接続規格で、バスはコンピューター内のデバイス間でデータをやり取りするための通信路。これらを合わせてコンピューターと拡張ボードをPCIを利用してつなぐバスのことをPCIバスという。

**・IRQ(Interrupt Request)とは？？**
割り込み要求のことで、デバイスがCPUに信号を送り、現在実行中の処理を中断して指定した処理を行うように強制すること。`/proc/interrupts`ファイルで情報が確認できる

**・バススピード？？**
マザーボードのスピードのこと。CPU がそれ以外のパーツとデータをやり取りするスピード
:::

### D-Bus(Desktop Bus)
プログラム同士が情報を伝達する**プロセス間通信機構**の一つ。Linuxではdbus-daemonなどがプロセス間通信の中継を行う。
新しいデバイスの認識情報を他のアプリケーションに伝達し、そのアプリケーションが新しいデバイスをすぐに使えるようになるなどのシステム管理上の利便性も向上する。


## USB(Universal Serial Bus)デバイス
周辺機器を接続するために広く普及している規格。USBにはいくつかのバージョンがあり、最大データ転送速度などが異なる。クラスドライブ（Linuxに最初から搭載されている汎用のドライブ）で対応できるため、専用のデバイスドライブをインストールする必要はない

+ 最大127台まで接続可能
+ 同一のコネクタで接続可能
+ 電源を入れたままの接続・取り外し対応（ホットプラグ）
+ USBポートから電源供給可能

| バージョン | 最大データ転送速度 |
|:-:|:-:|
| USB 1.0  | 12Mビット/秒  |
| USB 1.1  | 12Mビット/秒  |
| USB 2.0  | 480Mビット/秒  |
| USB 3.0  | 5Gビット/秒  |
| USB 3.1  | 10Gビット/秒  |

| デバイスクラス | デバイス |
|:-:|:-:|
| HID(Human Interface Device)  | キーボード、マウス、ジョイスティックなど  |
| Mass Storage Class  | ハードディスク、USBメモリーなど  |
| ACM Communication Device Class  | モデム、TAなど  |
| Audio Class  | スピーカー、マイクなど  |



### lsusbコマンド
接続されているUSBデバイスの情報を一覧表示するコマンド。
`/proc/bus/usb/devices`には接続されたUSBデバイスの情報が格納されている。
|  オプション | 内容 |
|:-:|:-:|
| -v  | 詳細な情報を表示する  |
| -t  | USBデバイスの構造を階層ツリー上に表示する  |



## デバイスドライバ
デバイスを利用するために必要な制御プログラムのこと。コンピューター内のストレージに保存される。Linuxでは**カーネルモジュール**として提供されていて、カーネルに取り込むことを「ロードする」という。

::: note info
**・カーネルモジュールとは？？**
Linuxカーネルに追加できるプログラムのこと。カーネルの機能を拡張することができる
:::

### lsmodコマンド
modは「module」の意味で、ロードされているカーネルモジュールを一覧表示するコマンド。`/proc/modules`ファイルの内容が読み込まれて表示される。

### modprobeコマンド
**書式：modprobe [オプション] モジュール名**
probeは「調査」を意味し、カーネルモジュールを手動でロード・アンロードするコマンド。
blasklist（ブラックリスト）を設定することにより、「**ロードすると問題が発生するモジュールや不要なモジュールを、システム起動時にロードしない**」ようにできる。
その際は、modprobeの設定ファイルである`etc/modprobe.d/`**ディレクトリ配下の.confの拡張子を持つファイル**でblacklistを指定する

| オプション | 説明 |
|:-:|:-:|
| options  |  各カーネルモジュールのデフォルトパラメータを指定する |
| alias  | カーネルモジュールに別名をつける  |
| install  | 特定のカーネルモジュールのロード時に実行されるコマンドを指定する  |
| -r(remove)  | モジュールを削除する  |
| blacklist  | ロードしたくないカーネルモジュールを指定する  |




# システム起動までの流れ

### ブートシーケンス
システムを立ち上げる処理を「boot」と呼び、電源を入れてからログイン画面あるいはログインプロンプトが表示されるまでに、カーネルの初期設定、ファイルシステムのマウント、システムの様々な管理をするプログラム(デーモン)の起動、ネットワークの設定など、OSが起動するために必要なすべての設定までの一連の流れのこと。

![キャプチャ9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/e7e075d2-7d17-4b54-8b3d-f9c726cd21df.png)




## 1.BIOS(Basic Input/Output System)/UEFI（Unified Extensible Firmware Interface）が起動する
ハードディスクの先頭領域に書き込まれたブートローダをメモリに読み込み起動させる。

BIOSとは「基本入出力システム」のことで、コンピューター内のハードウェアを制御するNVRAM(Non Volatile RAM:不揮発性メモリ)に格納された最も基本的なプログラムのこと。マザーボード上のROM(Read only memory：読み出し専用メモリ)に書き込まれている。電源を入れて**最初に起動され**、コンピューターに接続されているハードウェアをチェックした後使用できる状態に準備する。
そして、ストレージ上からブートローダーを読みだした後ブートローダーに制御を移していく。

UEFIはファームウェアとOSの間の通信仕様を定めた規格の1つで、現在ではBIOSの後継として普及している。


::: note info
BIOSのセットアップ画面では以下の設定が行える。設定の保存後に再起動すれば変更が有効になる。
+ ハードウェア構成の確認
+ 認識しているハードウェアの有効・無効化
+ 日付や時刻（ハードウェアクロック）
+ 電源管理
+ 起動ドライブの順序設定
+ 自己診断プログラムの実行
+ IRQの割り当て
:::




## 2.ブートローダー(Bootloader)が起動する
ブートローダーとはOSを起動するためのプログラムで、OS本体であるカーネルをストレージ上からメモリ上に読み込む役割を持つ。
ブートローダーはHDDの最初のセクタ(512バイト)にあるMBR(マスターブートレコード)に格納されている。以下のように使用する領域が決まっている

+ **ブートストラップローダ(446バイト)**
+ **第1パーティション情報(16バイト)**
+ **第2パーティション情報(16バイト)**
+ **第3パーティション情報(16バイト)**
+ **第4パーティション情報(16バイト)**
+ **ブートシグニチャ(2バイト)**


::: note info
MBRにインストールされるGRUBのプログラム（stage1と呼ばれる）のサイズは440バイトのため、MBRにあるGRUBのstage1を読み書きする場合はbs=440と指定することもできる
:::




### GRUB（Grand Unified Bootloader）
**書式：grub> linux カーネルイメージ [オプション]**
一般的に利用されているブートローダー。多数のファイルシステムを認識し、シェル機能を搭載しコマンドによる高度な管理が可能。
通常はデフォルトでインストールされている。うまくインストールができなかった場合、以下のコマンドを使用しインストール先を指定する。

| 起動オプション | 説明 |
|:-:|:-:|
| init=パス  | initの代わりに指定コマンドを実行  |
| root=デバイス名  | ルートパーティションを設定  |
| 数字(0‐6)  | 指定したランレベルで起動  |
| quiet  | 起動中のカーネルからの情報出力を抑制する  |

起動時にカーネルに渡された引数を確認するには`/proc/cmdline`ファイルで確認できる。


~~~ mb
grub-install /dev/sda
~~~

| 設定項目 | 内容 |
|:-:|:-:|
| default  | デフォルトで起動するブートエントリの番号や名前などを指定。titleでエントリされた何番目の物かを表す。最初は0番目  |
| timeout  | OSを自動起動するまでの待機時間(単位：秒)を定義する  |
| title  | 起動するOSに対して名前を定義する |
| karnel  | カーネルのイメージファイルとカーネルオプションを指定する |
| initrd  | 初期RAMディスクのイメージファイルを指定する |
| CMDLINE_LINUX  | カーネルに渡される起動オプションを指定する  |




#### GRUB Legacy(GRUB1)
バージョン0.9系のGRUBバージョン。設定ファイルは「`/boot/grub/menu.lst`」、ディストリビューションによっては「`/boot/grub/grub.conf`」になる。

下記コマンドで起動するカーネルイメージと起動オプションを指定することが出来る

~~~ md
#/boot/grub/menu.lstにおいてシステム起動時のカーネルイメージ「/boot/vmlinuz-2.6.35 」と起動オプションを指定
# kernel /boot/vmlinuz-2.6.35 root=/dev/hda1
~~~

ルートパーティションを指定するには、「**root (hdディスク番号,パーティション番号)**」と指定し、その際**番号はどちらも0から数える**

+ root (hd0,0)：1番目のディスクの1番目のパーティション
+ root (hd0,1)：1番目のディスクの2番目のパーティション
+ root (hd1,1)：2番目のディスクの2番目のパーティション



#### GRUB2
バージョン1.9系のGRUBバージョン。設定ファイルは「`/boot/grub/grub.cfg`」だが、**このファイルを直接編集することはない**。「`/etc/default/grub`」ファイルおよび「`/etc/grub.d`」ディレクトリ内のファイルに記述し、以下コマンドで設定内容をファイルに反映させる

パーティションを指定する際は、「(hdディスク番号,パーティション番号)」のように指定する。**ディスク番号は0から、パーティション番号は1から**数える。


| 主なディレクトリと設定ファイル | 説明 |
|:-:|:-:|
| /boot/grub  | 設定ファイルとモジュールの置かれたディレクトリ。ディストリビューションによっては`/boot/grub2`  |
| /boot/grub/grub.cfg  | 設定ファイル。ディストリビューションによっては`/boot/grub2/grub.cfg`  |
| /ust/lib/grub/i386-pc  | モジュールの置かれたディレクトリ  |
| /etc/grub.d  | 設定ファイルgrub.cfgの生成時に実行されるスクリプトが置かれたディレクトリ  |

+ menuentry:各項目の名前としてメニューに表示するエントリ名
+ insmod:ロードするモジュールの名前を指定する項目
+ set:設定項目を指定するキーワード




### grub-mkconfigコマンド
設定ファイルgrub.cfgを生成するコマンド。引数なしで実行すると設定ファイルの内容を標準出力に出力する。

~~~ md
## Debian系の場合2つのうちどちらか
update-grub
grub-mkconfig -o /boot/grub/grub.cfg

## Red Hat系の場合
grub2-mkconfig -o /boot/grub2/grub.cfg

~~~

::: note info
GRUB2では機能ごとにモジュールが用意されており、モジュールを使う際にはinsmodでロードするモジュールを指定する
:::





+ **オプション設定**
ブートローダー起動時に、システムの動作をしているするための様々なオプションを指定することが出来る。起動時の画面でＥキーを押すと画面が表示される

| パラメーター | 説明 |
|:-:|:-:|
| root=デバイス  | ルートパーティションとしてマウントするデバイス  |
| nousb  | USBデバイスを使用しない  |
| single  | シングルユーザーモードで起動する  |
| 1~5  | 指定したランレベルで起動する  |




## 3.カーネルが起動する
**initramfs(初期RAMディスク**)という圧縮アーカイブファイルを展開し、ファイルシステムへアクセスするために必要なドライバやスクリプトを使用してルートファイルシステムをマウントする。
initまたはsystemdプロセスを生成する（OS起動の仕組みにSysVinitを採用している場合はinitプロセス、systemdの場合はsystemdプロセス）

+ ファイルシステムへアクセスするのに必要なドライバやスクリプトが含まれている
+ `/boot`ディレクトリに格納される
+ カーネルのバージョンごとに内容が異なる

### SysVinit(SystemV Init)
OS起動の仕組みの1つで、SystemV(システムファイブ)と呼ばれるUNIXの仕組みに基づいている。
あらかじめ決められた順にサービスが起動していくため、あるサービスの起動に手間取るとそれ以後に起動するサービスが待たされてしまい、最終的な起動完了まで時間がかかってしまう。

+ **initプロセス**
SystemVinitにおいてシステムで最初に実行されるプロセスのこと。最初に実行されるプロセスなので**PIDは１**となり、実行されるプログラムは`/sbin/init`になる。

+ **/etc/inittabファイル**
デフォルトのランレベルやinitが起動するプログラムが記述されており、initが設定に従ってシステムに必要なサービスを順次起動していく。最終行の数字を変更することでデフォルト設定を変更することが出来る
「ctrl+alt+del」キーを押すとシステムの動作を設定することができる

`/etc/inittab`の記述に基づいて、自動起動するべきプロセスを立ちあげるなど、アプリケーションレベルの初期化を行う。

~~~ md
id:5:initdefault:
~~~

スクリプトのファイル名は次の規則で命名される
+ 1文字目:S(Start,サービスを起動)、K(Kill,サービスを停止)
+ 数字:実行優先順位、若番のものが先に実行される
+ サービス名：任意の名前を付ける

::: note info
以下コマンドを実行することで、システムを再起動せずに再読み込みさせ即座に変更を反映させることが出来る

~~~ md
# init q
# init Q
# telinit q
# telinit Q
~~~
:::


::: note warn
**Upstart,systemdは`/etc/inittab`を設定ファイルとして使用しないinitプログラムである**
:::




#### runlevelコマンド
左側に1つ前のランレベル、右側に現在のランレベルを表示する。ランレベルと呼ばれる動作モードごとに、どのサービスを起動するかしないかを決めることができる。一般的なランレベルは以下の通りとなる。

| ランレベル | 説明 |
|:-:|:-:|
| 0  | システムの停止  |
| 1(Sまたはs)  | シングルユーザーモード  |
| 2  | マルチユーザーモード(テキストログイン・ネットワークなし)  |
| 3  | マルチユーザーモード(テキストログイン)  |
| 4  | 未使用  |
| 5  | マルチユーザーモード(グラフィカルログイン)  |
| 6  | システムの再起動  |
| N  | 1つ前のランレベルが存在しない  |

`/etc/rc0.d`～`/etc/rc6.d`ディレクトリに各ランレベルごとに起動するスクリプトファイルが格納されている。
rc＝run commandの略で、d＝daemon(メモリ上に常駐しているサービスを提供するプロセス)の略

::: note info
**・シングルユーザーモードとは？？**
rootユーザーだけが利用できる特殊な状態のこと。一般ユーザーはログインできないため、システムのメンテナンスなど一般ユーザーが利用しては困る場合などに使われる
:::

通常、ランレベルは3または5を使用する。2と3はCUIで、5はGUIでシステムを使用する。

#### initコマンド
**書式：init ランレベルの数字**
ランレベルを変更することができる。ランレベルが切り替わるとユーザー名とパスワード名を求められる。

::: note info
telinitコマンドでもランレベルを変更することが出来る。
:::


#### wallコマンド
**書式：wall 'メッセージ文'**
ログイン中のユーザー(自分自身も含めて)に一斉にメッセージを送るコマンド

~~~ md
$ wall 'This system is going into maintenance mode, please log out!'

Broadcast message from taro@localhost.localdomain (pts/0) (Wed Nov 30 22:05:44 2022):

This system is going into maintenance mode, please log out!
~~~

### Upstart
SysVinitを改善した新しいinitの仕組み。サービスの依存関係を適切に設定し、並列で起動することで短時間でシステムを起動したりすることが出来るようになった

+ サービスやタスクを「ジョブ」という単位で扱う
+ イベント駆動型
前提条件がすべて成立した時点でジョブを実行する。SysVinitの順次起動と異なり不要な待機時間が無くなる

+ サービスの並列起動処理が可能
各ジョブの実行が並列に行われるため、関連のない独立したサービスは同時に起動させることができる

### 起動スクリプト
SysVinitでは各種サービスの起動には、`/etc/init.d`ディレクトリ以下に用意されているスクリプトが使われる。ランレベルが異なれば起動するサービスも異なる。
起動スクリプトは、システムサービスや各種サーバを起動・再起動・終了したりする場合に利用する

~~~ md
#httpdを起動する場合
# /etc/init.d/httpd start

#httpdを終了する場合
# /etc/init.d/httpd stop
~~~


### ACPI（Advanced Configuration and Power Interface）
コンピュータの電源管理や構成に関する規格のこと。OS上でシャットダウンや再起動などを行う際の命令は、ACPIイベントとして通知される。
acpidデーモンはACPIイベントを監視し、イベントに対応する処理を実行する。

+ Power/Sleep/Suspend ボタンなど、特殊なキーを押す
+ ノートパソコンのフタを閉じる
+ ノートパソコンに AC 電源アダプタを接続 (切断) する
+ イヤフォンジャックを接続 (切断) する

![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/9878d63d-699f-a05d-5e94-d638ee148512.png)


## 4.initまたはsystemdプロセスを実行する

### systemdとは？
SysVnitに代わって導入されたOS起動の仕組みであり現在の主流。複数のデーモンプロセス（常駐プロセス）が連携して動作する。
今まではサービスを1つずつ順番に起動しなければならなかったが、必要なサービスを必要なタイミングで起動できるようになった。また、並列起動を行うことができシステムの起動時間が短いという特徴がある。

+ 扱う処理をUnitという単位で管理する
+ サービスの並列起動によって高速なシステム起動や停止が行える
+ cgroupsでプロセスのリソースを管理する

| 拡張子 | 機能 |
|:-:|:-:|
| device  | 各種デバイスを管理するUnit  |
| mount  | ファイルシステムのマウントを管理するUnit  |
| service  | サービスを制御するUnit  |
| swap  | スワップ領域を制御するUnit  |
| target  | 複数のサービスを一つのグループにするためのUnit  |

::: note info
**・デーモン（daemon）とは？？**
メモリ上に常駐してシステムサービスやサーバサービスを提供するプロセス
:::


### systemdの起動処理
システムの起動処理をUnit(ターゲット)と呼ばれる単位に分けて管理をし、まず`/etc/systemd/system/default.target`というUnitを起動する。

サーバとして動作させる場合はランレベル3を指定するので、`runlevel3.target`,`multi-user.target`となる

+ **graphical.target**
グラフィカルログイン（従来のランレベル5）で起動するサービスをまとめたUnit。グラフィカルログインをデフォルト環境にするには
`/lib/systemd/system/graphical.target`へのシンボリックリンク`default.target`を作成する。

::: note info
**・ターゲットとは？？**
SystemVinitのランレベルに該当する。各ターゲットには起動するサービスがUnitとしてまとめられており、起動することでランレベルと同じ役割を果たす。

| ランレベル | ターゲット |
|:-:|:-:|
| 0  | poweroff.target  |
| 1  | rescue.target  |
| 2,3,4  | multi-user.target  |
| 5  | graphical.target  |
| 6  | reboot.target  |

:::


### systemctlコマンド
**書式：systemctl サブコマンド Unit名**
サービスを管理(Control)するためのコマンド。以下のサブコマンドが存在する。

| サブコマンド | 説明 |
|:-:|:-:|
| start  | サービス起動  |
| stop  | サービス停止  |
| restart  | サービス再起動  |
| reload  | サービスの設定を再読み込みする  |
| status  | サービスの稼働状態を表示  |
| is-active  | サービスが稼働中か確認する  |
| enable  | システム起動時にサービスを自動的に起動  |
| disable  |システム起動時にサービスを自動的に起動しない   |
| is-enabled  | サービスの自動起動が有効か確認する  |
| mask  | 指定したUnitをマスクし手動でも起動できないようにする  |
| unmask  | 指定したUnitのマスクを解除する  |
| list-dependencies  | Unitの依存関係を表示する  |
| list-unit  | 起動している全てのUnitを表示する  |
| list-unit-files  | 全てのUnitファイルを表示する  |
| reboot  | システムの再起動  |
| halt  | システムを停止しhalt状態(ホールト:システムを停止し電源を切れる状態)にする  |
| poweroff  | システムを停止しシャットダウン  |
| get-default  |現在のデフォルトモードを確認  |
| set-default  | システム起動時のデフォルトのターゲットを変更  |
| rescure  | 現在のランレベルをシングルユーザーモード（systemdの rescue.target 起動に相当）に変更する  |

::: note info
**# systemctl rescueから通常の起動状態に戻る場合**
+ Ctrl-Dを入力する
+ systemctl reboot コマンドを実行する
+ systemctl default コマンドを実行する
:::


~~~ md
#メールサーバのPosfixサービスを起動する場合
# systemctl start postfix.service
~~~



### dmesg、journalctlコマンド
**書式：dmesg(journalctl) | head 表示する行数**
**書式：journalctl　-k[オプション]**
システム起動時にカーネルが出力したメッセージを一時的に蓄えておくバッファ内容を確認することができる。長時間稼働している場合、起動時のメッセージは残っていないことがある。

メッセージは`/var/log`ディレクトリ内のファイルにも保存されている。閲覧にはroot権限が必要の場合がある。systemdであればjournalctlコマンドも使用可能で「-b」オプションでシステム起動時のメッセージを表示できる。

~~~ md
[root@ip-10-0-2-18 ~]# dmesg | head -5
[    0.000000] Linux version 6.1.34-56.100.amzn2023.x86_64 (mockbuild@ip-10-0-39-17) (gcc (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4), GNU ld version 2.39-6.amzn2023.0.6) #1 SMP PREEMPT_DYNAMIC Tue Jun 20 20:55:54 UTC 2023
[    0.000000] Command line: BOOT_IMAGE=(hd0,gpt1)/boot/vmlinuz-6.1.34-56.100.amzn2023.x86_64 root=UUID=0bfb954f-5412-4d5a-8d40-3a2596532c79 ro console=tty0console=ttyS0,115200n8 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 selinux=1 security=selinux quiet
[    0.000000] KASLR disabled
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
~~~

::: note info
**journalctlコマンドの「-k」オプション、または「--dmesg」オプションで、dmesgコマンドと同じ情報（起動時にカーネルが出力したメッセージ）が出力される**
:::


# システムの終了と再起動

## shutdownコマンド
**書式：shutdown [オプション] 時間[メッセージ]**
PCと同じでシステムを終了させるにはシャットダウンが必要。rootユーザーのみ実行が可能になる。
分単位の場合は「＋」、時刻の場合はダブルコロンで記載する。
systemdであればpoweroff,rebootのサブコマンドを使用してシャットダウンや再起動が可能


| オプション | 説明 |
|:-:|:-:|
| -h  | シャットダウンする  |
| -r  | シャットダウン後にシステムを再起動する  |
| -f  | 次回起動時にfsckをスキップする（-hまたは-rと組み合わせて利用）  |
| -F  | 次回起動時にfsckを必ず実行する（-hまたは-rと組み合わせて利用）  |
| -k  | 実際にシャットダウンせず警告メッセージを通知する  |
| -c  | 現在実行中のシャットダウンをキャンセルする  |

~~~ md
#ただちにシステムを停止する場合
$ shutdown -h now

#警告メッセージの表示
$ shutdown -k 'Please logout immediately'

#10分後にシステムを再起動
$ shutdown -r +10

#22時30分にシステムを再起動
$ shutdown -r 22:30
~~~