Linux基本

#そもそもLinuxとは
OSの一種で、unixから派生してできた(UnixはオープンソースではないがLinuxはオープンソース)。ちなみにmacのOSはmacOS(ターミナルでlinuxのコマンドが使えるからLinuxと勘違いしていたが、あれはmacOS)。LinuxはWEBシステムのデファクトスタンダード(標準)と呼ばれている。つまりWEBサーバーのOSではLinuxを使うのが主流。またよく聞くUbuntuやcentOSはLinuxのディストリビューションと呼ばれ、これもLinuxであり、こちらもよくWEBサーバーのOSとして使われる。

補足(現在のローカル環境でサーバと同じ環境にするための工夫)
しかしほとんどのユーザーは自分のPCにLinux環境がない状態。しかしvigrantやvirtual boxを使用する事で自分のPCでLinux環境が使えるようになる。具体的には自分のPCのOSの上にvitual boxを置き、vagrantを使ってその上にLinux環境を構築する。このように元々PCにないOSを、元々のPCの上に置く事を仮想化と呼ぶ。vigrantは、元々設定されている環境(ボックス)をvitual boxに配置するのに必要。vagrantfileはvirtual boxの上にあるサーバー一つ一つに必要で、そこにIPアドレスなどを設定してやらないといけない。なぜならばvirtual boxの中には複数のサーバーを置いて置けるから。

vagrant upで仮装マシーンが起動する。

[Linuxって何？](https://kitsune.blog/linux-summary#Linux%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%83%87%E3%83%95%E3%82%A1%E3%82%AF%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%80%E3%83%BC%E3%83%89)
[【Linux環境構築】VagrantとVirtualBoxとは？使い方を初心者向けに解説！](https://kitsune.blog/linux-environment)

Virtual boxやvigrantは仮想環境作りに便利だが、より便利に仮想環境作りができるもののが出てきた。それがDocker。Dockerも元のPCのOSの上に置いて(それをコンテナと呼ぶ)仮想化をする。Dockerには「不変的なインフラ」という考え方を元に作られており、インフラに対して変更を加えたい場合は、Dockerをいじる事でインフラをいじらずに済ませてしまえる。コードだけでインフラを作れてしまうという凄さ！！→インフラを壊して作るのが非常に楽になる。ちなみにvigrantfileのように仮想化環境の内容はdockerfileに記述。

Dockerのコンテナ(仮想化環境)は下層のLinuxカーネルを利用しているから動作が速い。
Virtual boxとの大きな違いはここで、Virtual boxはホストOSとは別にゲストOSを作って起動させるので、下層のLinuxカーネルを利用しているDockerより処理量が大きい。


Dockerの実際の使い方
ローカルPCのOSの上にDockerをおき、その上でOSなど指定して開発をする
↓
デプロイしたい時、サーバーのOSの上にもDockerをおき、その上に開発で作った物をそのまま移行して置くだけ。

[Dockerって何](https://kitsune.blog/docker-summary)

#Linux構成要素
シェルとlinuxカーネル
カーネルが内側で、その外側に存在するのがシェル。
カーネルは道具というイメージでPC内で働く機能を持っている。
シェルは人間のコマンドとカーネルの仲介となり、カーネル実行できるように人間のコマンドを翻訳している。

またシェルを自分好みに変更できる（コマンド入力でシェルを切り替えることができる！）。主に使われているシェルはbashである。

ログインシェル→ログインした時に自動的に反映されるシェルの事

シェルスクリプト→元々あるコマンドを組み合わせて自分だけのコマンドを作る事

#コマンドの書き方、絶対パス相対パス

コマンド+場所+オプション

コマンドとは実行したい内容を命令する

場所とはPCの場所や物を指定する。
・ディレクトリー→箱みたいなの
・ファイル→紙みたいなの

/とはrootディレクトリという意味
そのため/aaa/bbb/という意味はrootディレクトリのaaaの..となる。
つまり頭に/がつけば絶対パスとなり、そうではない場合は相対パスとなる。

オプションとは
コマンドの後ろに-をつけてオプションをつける事で、コマンドをより細かく使える。
同じオプション(文字)の入力の仕方でも、コマンドによって内容は変わる

#ログイン
PCに入る時に自分のアカウントにログインする。
↓
この状態でコンソール開くと、上でログインした自分のアカウントでログインされている状態になる。

今の自分のユーザーからrootユーザーになりたい場合は
sudo su -
で入る

sudo su -でrootユーザーになれる

#エイリアス

alias 名前 コマンド→コマンド内容を定義できる、シェルスクリプトのかわいい版
unalias 名前→定義を無効にする
type 名前→どんな定義か知る

set shopt→オプションのオンオフを決める

#シェル変数(環境変数)
bash内での変数を定義できる
注意は=では式と式の間にスペースを作らない
→自分の定義した変数が利用できるようにするにはexport シェル変数をしないといけない

元々入っているシェル変数
PATH→全てのコマンド(シェル)が入っている場所を教えてくれる(一つの場所とは限らない)
LANG→エラー文が何語で出るか教えてくれる

PATHを通すとはそのファイルをカーネルとして扱うようにすること。そのファイルが人間のコマンド→シェルによって読み出されるようにすること。
PATHの通し方に関してはこちらの方がわかりやすく説明されています。
[MacでPATHを通す](https://qiita.com/nbkn/items/01a11392921119fa0153)
コマンドの中で直接exportコマンドを使えばpathを通せる

#ユーザーグループの管理
Linuxでは登録されたユーザーがシステム利用をすることができる。システム利用をしたい人が複数いるならばそれぞれにユーザーアカウントを作成しないといけない。そしてLinuxにはディレクトリやファイルがあるが、誰でも弄れるわけではなく権限のあるものが弄れる。そして複数のユーザーをグループとしてまとめて管理できる。そのグループに属しているユーザーはOOというファイルを閲覧する権限があるなどして使う。

・ユーザー作成
ユーザーを作成はrootユーザーで行う。Linuxで作成したユーザーの情報は/etc/passwdにある。
↓
/etc/passwdにはユーザーIDやホームディレクトリー、シェルが明記されている。
ホームディレレクトリーは各ユーザーに与えられたもので(例えば/home/ishikawa)、その中でならユーザーは好きにファイルを作ったりして良い。macOSの場合は「/Usesrs/ユーザー名」になる。


・グループ作成
また複数のユーザーをグループとして作成できる。etc/groupにグループの情報がある。そこにはグループ名とグループIDとサブグループとして追加されているユーザーの情報がある。ユーザーを作成した時、ユーザー名と同名のグループにそのユーザーが属するように設定される。この時のグループをユーザーに取手のプライマリーグループと言う。
またユーザは複数のグループに入ることができる。自分がプライマリーグループ以外に所属してグループをサブグループと言う。

またユーザー登録時に既存のグループ名を指定することで、そのユーザーのプライマリーグループは指定した既存のグループとなる。

#ファイルのオーナー
全てのファイルやディレクトリにはオーナー(所有ユーザー)が存在する
しかしこれらを扱う人はオーナーだけではない

オーナー、グループ、その他である。
グループとはそのパソコンに登録しているユーザーの事、その他はそうではない人。それぞれによってそのファイルに出来ることが変わってくる


ls -lでファイルの詳細を見ると確認できる
↓

```
-rw-r--r-- 1 root root 81233 最終更新日 ファイル名
```
頭にはファイルモード(一文字目)と権限(2から10文字目)が書かれている

ファイルモード
-は普通のファイル、dはディレクトリってこと、lはシンボリックファイルってこと

操作できる範囲（rw-rw-r--→のようにオーナー、グループ、その他の順で何ができるか分かる。）
r→読み出し
w→書き込み
x→実行

1とはリンクの数、ハードリンクの数を示す。(シンボリックリンクの数は含めない)

一つ目のrootは所有ユーザーのこと。このファイルを所有しているユーザー。
二つ目のrootは所有グループのこと。基本的に所有ユーザーのプライマリーグループとなる。そのグループに属していれば、それ以外のグループに比べてできることが変わる可能性がある。

#####権限のために使うコマンド
rootユーザーだけができるコマンド

chmod→これらの権限の変更ができる この後の数字は644→rw-r--r--という意味。11-　1--　1--を十進数に直しているって感じ。
chown→ファイルの所有ユーザー自体を変えたい時に使用する。再帰的に変更したいときは-Rをつける
chgrp→所有グループを変えたい時に使用

スーパーユーザー
→rwx全てが出来るユーザー

su→スーパーユーザーにログイン
sudo コマンド→一時的にスーパーユーザーになってコマンド実行

#####コマンド実行にはどの権限が必要なのか
cdはそのディレクトリに対して現在のユーザーがX権限がないとダメ

lsはそのディレクトリに対して現在のユーザーがR権限がないとダメ

touchやrmはそのディレクトリに対して現在のユーザーがW,X権限がないとダメ

#プロセスとジョブ

プロセスはコマンドによってメモリ内で発生している作業。一つのコマンドによって複数のプロセスが発生する事もある。

LinuxはマルチタスクをするOSなので、同時にたくさんのプロセスを行っている。正確には細かくプロセスを切り替えて作業するため、同時に行っているように見えるだけ。つまりLinuxが稼働しているサーバーではすごい量のプロセスが実行されている。

psでプロセスが見れる(基本的に全てのプロセスを見やすくするためにauxオプションをつける)。 pidがプロセス番号
詳しくは[初心者向け】Linuxのプロセスについて一通りわかる！](https://eng-entrance.com/linux-process)

プロセスによってプロセスが発生するといったが、現在実行中のそのプロセスの関係性をみるにはpstreeを用いることで、見れる。

killコマンドを使うことで、指定したプロセスを停止させることができる。

ジョブとは作業している時に別の資料を見れるようにするためにある、一度その作業を一時停止してから別の資料を見れるようにする。その作業のことをジョブという。基本的にあまり使われることは少ない。

一時停止方法
ctl+z→作業を一時停止してジョブとして認識

ジョブの一覧を見る方法
jobs→ジョブ番号と何の作業を一時停止しているか知る

fg %ジョブ番号→作業再開

kill %ジョブ番号→そのジョブの一時停止をやめる

bg %ジョブ番号→作業を再開、コピーとか使われる


#リダイレクトとパイプライン

リダイレクトは入力と出力の場所変更

入力リダイレクト→コマンド < 読み取る場所
読み取る場所を変更する。あまり使うことはない。。

出力リダイレクト→コマンド > 読み出す場所
読み出す場所を変更する。読み出す場所を特定のファイルにして、ログを見たりするのに使う。

エラー構文出力→ コマンド 2> 読み出す場所
→エラー内容を保存

dev/null→ここには何を書き込まれても、なにも残らず。なにを取り出しても何も出てこない
↓
ファイルを空っぽにしたい時は
ファイル < /dev/null
をすると良い

パイプラインとはコマンドとコマンドをつなげるために間にl を入れる

#シェルスクリプト

シェルスクリプトとはコマンドを組み合わせて作った自分だけのシェルの事

お手本
シェルのある場所にシェルスクリプト用のファイルを作る、名前の後ろに.shと付ける
↓
ファイルの中の1行目には
＃! ファイルの場所
を書く
↓
chomadで権限を与える
↓
source 自作シェルファイル名
or 
. 自作シェルファイル名
で実行
自作シェルスクリプトの中にaliasコマンドがあればsourceを使う

#アーカイブと圧縮

アーカイブとは複数のファイルやディレクトリをまとめたファイルの事、アーカイブの名前は後ろに.tarと付ける

圧縮とはファイルのサイズを小さくすること


tar cf アーカイブ名前 アーカイブにしたいディレクトリ
tar tf アーカイブ→アーカイブの中身確認
tar xf アーカイブ→アーカイブを解凍

gzip 圧縮元ファイル→圧縮、圧縮ファイルは元のファイル名に.gzがついた名前になる
gzip -d 圧縮ファイル名→解凍

bzip2はgzipより圧縮する
xyはbzip2より圧縮する

・アーカイブと圧縮を一気にやる方法
tar czf 圧縮アーカイブ名(〜.tar.gz) 元ディレクトリ
→アーカイブして圧縮

tar xzf 圧縮アーカイブ名(〜.tar.gz)→解凍

tar cjf 圧縮アーカイブ名(〜.tar.bz2) 元ディレクトリ
→アーカイブしてbzip2に圧縮

tar cJf 圧縮アーカイブ名(〜.tar.xy) 元ディレクトリ
→ アーカイブしてxyに圧縮


zip -r 圧縮アーカイブ(.zip) 元ディレクトリ
→アーカイブにして圧縮を一気にやる、

zip -er 圧縮アーカイブ(.zip) 元ディレクトリ
→アーカイブにして圧縮を一気にやる、パスワードもつけれる

unzip 圧縮アーカイブ→解凍

#パッケージのダウンロード

パッケージとはソフトウェアを動かすのに必要なアーカイブ
パッケージにも形式がある。rmp型とdeb型。型によってインストールの仕方も変わる

yum型
yum install パッケージ名→インストール
yum erase/remove パッケージ名→削除
yum search all 検索ワード→パッケージを検索
yum info パッケージ名→情報を知る

deb型
sudo apt-get install パッケージ名→インストール
sudo apt-get remove パッケージ名→削除
apt-cache search 検索ワード→検索
apt-cache show パッケージ名→情報を知る

#リモートログインとssh

リモートログインとは自分のパソコンから別のサーバーにログインする事
↓
その時に相手のサーバーのIPアドレスとsshが必要になる。IPアドレスはパソコンの住所。sshはサーバーとサーバーとの間となるトンネルのような存在。

ログイン方法
ssh ユーザー名 相手のIPアドレス


またリモートサーバーにsshを介してデータを送る事をポートフォワーディング、トンネルリングと呼ぶ
↓
前提
自分、相手それぞれのサーバーにはポートという情報を出港させる場所をたくさん持っている。
↓
ポートフォワーディングのやり方
ssh -L ローカルポート番号 リモートIPアドレス リモートポート番号
→これでデータ送信ができる

#主なコマンド1
cd 場所→移動
pwd→今どこのディレクトリにいるか知る
ls 場所→今いるディレクトリに何が入っているかを知る

.→今いる場所を示す
..→親のディレクトリの場所を示す
~ or 何もなし→ホームディレクトリの場所を示す。homeディレクトリの中の自分のアカウントの中身を示す！
/→ルートディレクトリの場所を示す！、これはパソコンの本当に一番上のディレクトリ

#主なコマンド２

mkdir→ディレクトリを作る
touch→ファイルを作る
rm→ファイル削除
rm -r→ディレクトリ削除
rmdir→空のディレクトリ削除
cat -n→ファイルの中身を知れる、スクロール出来ない
less→ファイルの中身を見れて、スクロール可能

cp→同じ場所での複製、別の場所での複製、上書きコピーもできる
cp a b→ bが既に存在してなければ複製、存在していればbにaの内容を上書き、
cp a ディレクトリ→ディレクトリに複製

mv→転送or名前の変更
mv ファイル ファイル→ファイル名を2回目へ変更
mv ファイル  ディレクトリ→ディレクトリにファイルを移動

locate→findより速く検索できる
man→コマンドの使い方を知る
which→コマンドがどこにあるか知る

ln リンク元　登録名→リンク元の指定を登録名という名前で指定できる(複製って感じ？、権限も全く同じ。ようはリンク元に別名をつけるだけ)。ハードリンク作成(ハードリンクを使用することは比較的少ない)

ln -s リンクA リンクB→リンクAのシンボリックリンクであるリンクBを作成してくれる。シンボリックリンクとはアクセスされたら元のリンクに繋ぐリンク。元のリンクAとは別物と考える。
元のリンクが削除された時、ハードリンクの場合は内容は残るがシンボリンクの場合参照する相手がいなくなって何もできなくなる。

厳密に言うとファイル名はi-node(実行内容が書かれたハードディスクの場所)と紐づいている。ハードリンクは元のリンクと同じi-nodeであるため、元のファイルが消えてもi-nodeにアクセスして実行できる。シンボリックリンクの場合は自分のi-nodeにアクセスすると元のファイルを実行するとなる、しかし元のファイルが存在しなければ実行できない。

詳しくは[lnコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-ln)
ハードリンクとシンボリックリンクの違いについては[シンボリックリンク (symbolic link)](https://wa3.i-3-i.info/word1151.html)

find 検索開始ディレクトリ 条件→条件にあったものを開始ディレクトリから探していく(こちらの記事が非常にわかりやすかったです。[【find・grep】特定の文字列を含むファイルのリストを取得する方法。](https://qiita.com/pokari_dz/items/0f14a21e3ca3df025d21))

#主なコマンド3
wc→ファイルの行数、単語数、バイト数が分かる
sort→並び替え デフォではアルファベット順になる
uniq→重複した行を消す

cut d 区切り文字 -f フィールド番号 ファイル名を
→ファイルの中のそれぞれの行を区切り文字で分けて、フィールド番号番目の内容だけど、catのように読み出す
↓
つまりファイルの中身が行ごとに同じ感じでないといけない！

tr 置換前文字 置換後文字→ファイルの文字の置換をする、1文字1文字しかできない
tr -d 文字→ファイルの文字の削除をしてくれる

tail , head→ファイルの最後や最初の10行の内容を教えてくれる

diff 比較元ファイル 比較ファイル→何が変わったかを教えてくれる

grep 言葉 ファイル→言葉を含むファイルを教えてくれる、-nをつけると行数付き -iをつけると大文字小文字関係なく -rをつけると今のディレクトリより下の層全てを調べてくれる 
↓
他にも言葉の部分をメタ文字として任意の文字でも検索できるようにできる
(こちらの記事が非常にわかりやすかったです。[【find・grep】特定の文字列を含むファイルのリストを取得する方法。](https://qiita.com/pokari_dz/items/0f14a21e3ca3df025d21))
[grepコマンドの詳細まとめました【Linuxコマンド集】](https://eng-entrance.com/linux-command-grep)



sed→trでできなかった単語単位で置換できる
sed アドレス数d ファイル→ファイルのアドレス行目を削除
sed -n アドレス数p ファイル→ファイルのアドレス行目を表示
sed 's/A単語/B単語' ファイル→ファイルの中のA単語をB単語に置換する

awk '{print フィールド数}'→ファイル内の指定したフィールド数の内容だけを表示

du ファイル→ファイルの使用容量を知れる

#使用例
docker rmi \$(docker images | awk '{ print $3}' | tail -2)

$()で先にここの内容をやってしまう

awkは前のコマンドで得た結果(表)を引き継いでそこから抽出を行う、print $3で表の三列目の結果を得ることになる

tail -2で下から2つ分の結果を得ることになる
↓
これをすることで、余ったdocker image2つを削除することができる


find ファイルパス -type f | xargs grep -n '検索したい文字列'

findの結果をそのまま引き継ぐためにxargsを使用
grep -nで行数まで確認可能


watch -t 'コマンド'
コマンドを定期で実行して、内容をリアルタイムで教えてくれる


#ディレクトリの種類
/bin→重要なコマンドがこの中に格納されている
/home→ホームディレクトリ、リナックスユーザー毎に割り当てられる個人用の箱(つまりcdでホームに行くと自分のアカウントの中身に飛ぶ)