Linux+コマンドを始めよう!

## コマンド

- ディレクトリ関連の記号
`絶対パス`：ルートディレクトリから記述　`相対パス`：カレントディレクトリから記述
`.`：カレントディレクト　`..`：親ディレクトリ
`~`：自分のホームディレクトリ

`ch`：カレントディレクトリ移動

`pwd`：カレントディレクトリ
`ls`：配下ファイルを一覧表示　`-a`：ドットファイル・ディレクトリを確認　
`ls -l`：ファイルの詳しい情報（属性）を表示する
↳`ファイルの種類`：1文字でd(ディレクトリ)、l(シンボリックリンク)、-(通常ファイル)
↳`パーミッション`：3種類×3組の9文字がパーミッション。3文字ずつ「所有ユーザへの許可」「所有グループへの許可」「それ以外への許可」が表示される。
`r`：`4`：readeable 
`w`：`2`：writeble
`x`：`1`：executable
↳`リンク数`：通常ファイルは1
↳`所有ユーザと所有グループ`：
↳`ファイルサイズ`：
↳`ファイルの更新日`：
↳`ファイル名とリンク先`：最後にファイル名が表示。（シンボリックリンクの場合、`->`が表示さ、後ろのリンク先（ファイルの実体）が表示）

`stat`：ファイルディレクトリの属性を表示
`chmod`：
`ps`：現在端末で実行されるプロセス（シェル）を表示する。


`mkdir`：ディレクトリ作成
`rmdir`：空のディレクトリを削除
`touch`：空のファイルを作成
`cat`：ファイルを作成表示
cat：指定したファイルを画面に表示
cat -n：ファイルを行番号付きで表示

head：テキストファイルの先頭10文字を表示
tail：末尾10行を表示
head 3：出力する行数を指定する。

find <検索式> | head 3：findコマンドで自分が思うような指定で検索できているかを確認したい場合に、3件分だけ試せる。

tail -f：ログファイルは新しい結果がファイルの末尾に追加されている場合は多く、最新のログを見たい場合。（ログファイルを監視してログが追加されたらその都度表示するという使い方も）
tail -f var/log/syslog：syslogの末尾10行分つまり最新ログが10行分表示され、そのまま待機の状態となる。（Ubuntuはvar/log/syslogにシステムの動作ログが書き込まれる）

more：テキストファイルを一画面ずつ停止しながら表示する。最下行に現在どのくらいまで表示できるかが%で表示される。


主な正規表現
^行頭
$行末
<語頭
>語尾
.改行以外の任意文字
\w
\W
[abc]囲まれている文字のどれか。abcのどれか
[^abc]囲まれている文字でない文字。abc以外
[a-c]指定範囲のどれかの文字。abcのどれか

拡張正規表現
`rm`：ファイルディレクトリを削除
`rm -r`：再帰的にディレクトリを削除

`cp <コピー元><コピー先>`：コピー先に既存のファイルを指定した場合ファイルは上書きされる。コピー先にディレクトリを指定したら、ディレクトリの中にコピーされる。
`cp -r <ディレクトリコピー元><ディレクトリコピー先>`：ディレクトリをコピー

~~`mv`：ファイルディレクトリの移動や名前変更~~
`-n`：ファイルを上書きするような場合は実行を中止する
`mv <ディレクトリ1><ディレクトリ2>`：ディレクトリ2が存在しない場合、ディレクトリ1をディレクトリ2に変更。
ディレクトリ2が存在する場合、ディレクトリ1をディレクトリ2の中に移動。
`mv <ファイル1><ファイル2>`ファイル1の名前がファイル2に変更。ファイル2が存在した場合上書きされる。


`?`：任意の一文字
`*`：任意の文字列


## 用語

`コマンドライン`：（Linuxの操作はコマンドで行う）コマンドを入力する場合や入力する内容のこと
`シェル`：このコマンドラインを提供しているソフト

`ログインシェル`：コンピューターにログインした際に実行されるシェルでユーザごとに設定。端末ウィンドウを開いたときに実行されているシェルはログインシェル。
環境変数SHELLでログインシェルを確認できる。
`プロンプト`：端末を実行するとシェルが起動し、シェルはユーザから入力を即すためのもの。
`ドットファイル`：明示しない限り、表示や操作の対象にならない。
`シンボリックリンク`：実体が別の場所にファイルで1文字目が`l`と表示







## はじめに

OSはコンピュータ全体を制御して、アプリ（Wordmxcel）を実行できる環境を整えるソフト。
PCではwindows,macOSなど。
スマホではiOS,Android。
サーバ、RaspberryPiは`Linux`が使われている。


`UNIX`
`カーネル`：OSの核。ディスク装置を使用した外部装置の管理、プロセス管理（メモリー配分、CPU時間配分）などを行う。
`ディストリビューション`：カーネルを中心にOSとしてすぐに利用できるように組み合わせたソフトのセットのこと。
（初期のLinuxは公開されたソースコードを自分のPCで動くようにツールなどを組み合わせて構築していた。）
ソフトウェアの管理方法：
Red Had系：`rpm`というパッケージ形式が使われている。
Ubuntu：`deb`というパッケージ形式が使われている。

~~`bootstrap`：コンピュータが起動する時に小さなソフトが次のソフトを読み込むという作業が繰り返す。~~

電源を入れてから、ログインできるまでの流れ↓
`電源ON`
`BIOS（マザーボードに組み込まれている）起動`：起動に使用するデバイスの優先順位が設定できる。
`ブートローダーを起動`：最初に読むべきカーネルなどを選択できる。
`カーネル読み込まれる`：
`初期化システムが起動`：システム全体の初期化。`systemd`
`ログイン`：
`シェル`：ログインが終わるとシェルプログラムが起動される。
（コンピュータを操作するとき、カーネルを直接使用するのでなく、シェルを通じてコマンドが実行される）
（ユーザからの入力を付けてコマンドを実行する）

- ルートディレクトリ：
ルートから始まるツリー構造。
ディレクトリ構成：(ディレクトリ構成はディストリビューションによって異なりますが概ね`FHS`という標準仕様)
`/boot`：最初の起動に必要なファイルが格納。
`/etc`：設定ファイルがある。リナックス自体の設定に関わるファイルがある。
`/bin` ：両ユーザが使用するコマンドの実行ファイルがある。
`/usr`：システムを利用するユーザが共有するコマンドやマニュアルのデータファイルを格納。
`/usr/local`：ディストリビューションの標準ではないがシステム利用者で共有するコマンドが格納。
`/home`：ユーザのホームディレクトリ。
`/mnt`：DVD USBメモリなどシステム起動後に手動でマウントする際のマウントポイントとして利用するディレクトリ。
`/var`：変化するデータがある。アプリケーションが動作する上で作成されたログがある。頻繁に変更されるファイルを格納するディレクトリ。システムログ。
`/tmp`：システム用の作業ファイルなど、一時的に利用されるファイルを格納。
`/dev`：ハードウェアをファイルとして扱えるファイル
`/sbin`：管理者向けのコマンドの実行ファイルがある。

<details><summary>/binと/usr/bin</summary>

同じディレクトリがある理由は、歴史的な理由。
記憶媒体(HDDやSDD)はパーティション単位でマウントする。
カーネルはシステムの起動に（必要なファイルか格納されている）パーティションを最初にマウントして必要なファイルを読み込んで実行し、
その後で（システム起動には直接必要ないファイルが格納されている）パーティションをマウントする。
現在はパーティションをそこまで細かく分ける必要がなくなり、物理的に同じ場所にコマンドを格納しているが、
互換性のためシンボリックリンクというしくみで、同じ場所を２つの名前で利用できるようになっている。
</details>

## パッケージ管理

UbuntuなどのDeblan系のディストリビューションではdebパッケージというフォーマットのパッケージが使用されており、
aptコマンドで操作する。
パッケージ情報の表示は一般ユーザでも可能ですが、パッケージのインストールや更新、削除にはroot権限がいる。
実行時にパスワードが求められる場合はsudoコマンドを実行しているユーザのパスワードを入力してください。

`sudo apt install <パッケージ名>`：パッケージをインストール。すでにインストールされている場合は最新版がインストールされる。
`sudo apt remove<パッケージ名>`：削除
`sudo apt reinstall <パッケージ名>`：削除後にインストール

インストールや更新の際は依存パッケージのダウンロードやインストールも同時に行われる。
`sudo apt -y install <パッケージ>`：確認メッセージを省略

`apt search <検索パターン>`：正規表現による検索パターンをパッケージの説明文から検索。通常、検索した文字列をそのまま指定する。

`apt-file list <パッケージ>`：指定したパッケージに収録されているファイルを一覧表示

`sudo apt upgrade`：インストール済みパッケージをまとめて更新
`sudo apt update`：更新に先立ち、パッケージの情報を更新したい場合



`パッケージ管理システム`：Linuxにソフトウェアをインストールしたり、必要に応じてアップデートしたり、安全な形でアンインストールしたりするためのシステム、Ubuntuの場合はAPT(aptコマンド)

パッケージのインストールで大切なことは、ファイルを適切な場所に配置すること。
パスが通った場所にコマンドを置き、マニュアル用のファイルや設定ファイルを適切な場所に置くこと。

`バイナリパッケージ`：実行可能形式のファイルが収録されたパッケージ
`ソースパッケージ`：ソースファイル（実行ファイル）が収録されたパッケージ
ソースパッケージもパッケージ管理コマンドでダウンロードできるが、通常ソースパッケージを利用するケースはすくない。

`依存`：Aコマンドをインストールして実行するにはBライブラリが必要、あるいは別のパッケージに入っているCコマンドもいる。
あるソフトを使うにはこのソフトが必要という関係のこと。
依存関係をチェックするのが、パッケージ管理システムの重要な役割。時には必要なパッケージを自動でインストールする。また、アンインストールの際はそのパッケージがほかのパッケージに必要とされていないかを確認。

`ライブラリ`：よく使う機能を部品のようにまとめておくと便利。このような部品を集めて再利用できるようにしたファイルのこと。
`共有ライブラリ`：いろいろなプログラムが利用するライブラリ。Unix系OSではllbc

`静的リンク`：ライブラリの使い方は実行ファイルを作るときにライブラリを組み込み方法
`動的リンク`：実行するときにライブラリから読み込む方法


`リポジトリ`：パッケージ管理システムでインストールしたソフトウェアはデータベースで管理されている、
このデータベースを参照することで、現在システムにインストールされているソフトウェアやバージョンがわかるようになっている。
さらにインターネット上にはパッケージをまとめて保管している場所があり、このような場所はリポジトリという。



## ネットワーク構成
lspciコマンド、journalctlコマンド：カーネルが認識しているネットワークデバイスを確認
ipコマンド、ifconfigコマンド：ネットワークインターフェースの設定や設定情報の確認

ipコマンド：ネットワークインターフェースやルーティングテーブル、ARPテーブル等を管理するコマンド

ifconfigコマンド：ipコマンド以前に広く使われていたコマンドで、現在でも多くのディストリビューションで利用できる

ARP：
イーサネットでの通信ではMACアドレスを使って送信先を指定。TCPIPを使った通信は個々のホストのIPアドレスしかわからない。そのためARPを使い、MACアドレスとIPアドレスを変換。


無線ネットワークの設定

WEPとWPA：無線LAN通信のセキュリティを確保する仕組み
SSID：無線LANのアクセスポイントを識別するID、この文字列によって無線ネットワークが識別される。
アクセスポイントと各端末にSSIDを設定し、SSIDが一致する組み合わせしか通信できないよう設定する。
ifconfigコマンド：無線LANインターフェースを設定したり状態を確認したりする
iwコマンド：無線インターフェースの情報を参照、設定






## DNSサーバ
名前解決：DNSサーバの基本的な役割。ホスト名とIPアドレスを相互に変換する。
正引き：ホスト名からIPアドレスを求めること、その反対を逆引き。


## HTTPサーバとプロキシサーバ
Apache HTTPサーバはwebサーバ。
インストールするには
・ディストリビューションごとに用意されているパッケージを利用する方法
・ソースからコンパイルする方法がある。

httpd.conf：メインの設定ファイル。ディストリビューションによってインストール先やファイル名が異なる。
ディレクティブ：tpd.confの設定項目

`systemctl start httpd.serviceコマンド`：Apache HTTPサーバ起動（CentOS）
`systemctl start apache.serviceコマンド`：Apache HTTPサーバ起動（Ubuntu）

Nginx：高速で動作し負荷に強いwebサーバ。またリバースプロキシサーバ、メールプロキシサーバの機能も。
/etc/nginx/nginx.conf：設定ファイル

## ファイルシステムとストレージ管理
`ファイルシステム`：ストレージ（SSD、ハードディスク記憶装置）にファイルを保存して管理する仕組み。多くの種類があり、OSや媒体によってつかわれるファイルシステムもさまざま。ext4,etx3
`デバイスドライバ`：HDDドライバ、CD-ROMドライバ、USBドライバ
`VFS`：Linuxではさまざまな種類のファイルシステムを統一的に取り扱うことができるようする仕組み。
VFSは各種ファイルシステムとユーザプログラムの中間にあってファイルシステムの差異を吸収し、ユーザプログラム側はファイルシステムの違いを気にせず統一的に扱うことができる

`/etc/fstabファイル`：システムで利用するファイルシステムの情報

`マウント`：ファイルシステムを利用するには任意ディレクトリをマウントポイントとしてマウントする必要がある
`mountコマンド`：ファイルシステムをマウントする
`umountコマンド`：ファイルシステムをアンマウントする

`ファイルシステム`：ストレージ（SSD、ハードディスク）にファイルを保存して管理する仕組み。
（OSや媒体によって使われるファイルシステムもさまざま）
Linuxではさまざまな種類のファイルシステムを統一的に取り扱うことができるよう、VFSという仕組みを取り入れている。
`VFS`：各種ファイルシステムとユーザプログラムの中間にあってファイルシステムの差異を吸収し、ユーザプログラムはファイルシステムの違いを気にせず統一的に扱うことができる。

`/etc/fstab`：ファイルシステムの情報ファイル
1デバイスファイル名：UUIDで指定されることもある。 `UUID`：デバイスを一意に識別するための、他とは重ならない文字列。確認するにはblkidコマンド
2マウントポイント
3ファイルシステムの種類

ファイルシステムの種類
`ext2`：Linux用ファイルシステムextを拡張したファイルシステム
`ext3`：ext2を機能拡張したファイルシステム
`ext4`：ext3を機能拡張したファイルシステム
`NTFS`：windowsで使われるファイルシステム
`HFS`：MacOSのファイルシステム

`/etc/mtab`：現在どのようなファイルシステムがマウントされているか、またどのようなマウントオプションが使われているか
（設定ファイルでなくシステムが利用するファイル、不用意に編集しないこと）
`/proc/mouts`：現在どのようなファイルシステムがマウントされているか、またどのようなマウントオプションが使われているか

ファイルシステムを利用するには任意のディレクトリをマウントポイントとしてマウントする必要がある。
`mountコマンド`：ファイルシステムろマウントする。または現在マウントされているデバイスが一覧される。


















## 最後に



シェルの種類：