【LinuC_Level1_101】勉強の記録_１日目

# 101試験
例）mkdir -p /home/user1/test
もし/homeディレクトリがまだ存在しない場合、-pオプションが指定されているため、/homeディレクトリも作成される。

ls -1r：縦に並べて（-1）、逆順に表示（-r）。

ls -R:ディレクトリ内のファイルも把握できる。

ls -l：権限などが把握できる。
→　drwxrwxrwx（権限） ハードリンク数　所有者　所有グループ　ファイルのバイト数　タイムスタンプ　ファイル名
<font color="red">
ls -lt：日付の新しい順に並び替え。
ls -ltr:日付の古い順に並び替え。
</font>
su -：ルートユーザーになる。
macの場合、Sorryと表示されるので、以下の手順でパスワードの設定が必要。
※ macの場合：https://izumii19.hatenablog.com/entry/2018/11/27/171545

chmod 744 ファイル名：実行権限の変更
読み取り：４
書き込み：２
実行：１

chmod ugo+rwx：ユーザー（u）、グループ(g)、その他(o)に、読み取り(r)、書き込み(r)、実行(x)の権限を付与。

chmod ugo-rwx：ユーザー（u）、グループ(g)、その他(o)に、読み取り(r)、書き込み(r)、実行(x)の権限をなくす。

umask 006：デフォルトのアクセス権を変更。新規ファイルの作成時点でファイルの所有グループに読み取り権と書き込み権がある状態にする（デフォルトが666で指定した値を引いた権限がデフォルトで付与されるようになる）。

```terminal:terminal
// c言語の出力
gcc sample.c
./a.out
// 上２行の処理をまとめると、
gcc -o sample.txt sample.c && ./sample.txt
```
\n：改行（print文の中に入れる）。エスケープシーケンスと呼ぶ。
```c:sample.c
  printf("Hello, world\n");
  printf("Hello, America\n");
```

cp -p file1 file2：-pのオプションをつけることで、file1と同じ情報（日付など）のファイルを作成することができる。

rmdir ディレクトリ名：中に何も入ってないディレクトリのみ削除可能。

cp -r dir1 dir2：ディレクトリのコピー

mkdir -p dir1/subdir1/subsubdir1/：-pをつけることでディレクトリ内にディレクトリを複数作ることが可能。

mv file1 dir1：file1をdir1に入れる。

mv -i：上書きの確認。

rm file*：接頭辞がfileのファイルをすべて削除。
rm file?.txt:任意の一文字のときは？を使用。
rm file[0-3]：任意の一文字が0~3の場合削除。

tar -cf file.tar file1 file2 file3：file1, file2, file3のファイルをfile.tarとして圧縮する（c：圧縮、f：ファイル）。
tar -tf file.tar：中のファイル名を表示。
tar -xf file.tar：ファイルの解凍。
gzip file1：ファイルの圧縮。
gunzip file1.gz：ファイルの解凍。

mv test1.txt test2.txt:ファイル名の変更

ln sample.txt sample_hard.txt：ハードリンクの作成。
ls -li：ノード番号の表示。（最初の番号が同じならば、正常にハードリンクの作成ができている。）
※　ハードリンクは元のファイルを削除しても問題なく閲覧できる。
※ シンボリックリンクはファイル名をリンク先として持っている。

find . -name file*.txt：現在ディレクトリ内のfile*.txtの条件に当てはまるファイルを表示。

mtime：ファイルが最後に修正された時間（modify time）を示す。つまり、ファイルの内容が変更された場合に更新される。
※ ファイルがコピーされたり、名前が変更されたりしても、mtimeは更新される。

atime:ファイルに最後にアクセスされた時間（access time）を示す。つまり、ファイルが読み込まれた、実行された、またはその他の方法でアクセスされた場合に更新される。
※ ファイルの内容自体が変更された場合は更新されない。

ls *.?[0-8]：*は0文字以上の文字列。?は任意の1文字。[0-8]は0-8までの数字。（例）filename.a1。

whereis ifconfig：ifconfigコマンドのパス、マニュアルファイルやソースコードが置かれている場所を検索。

/etc：システムの設定ファイルを配置するディレクトリ。
/home：ユーザー毎のファイルを配置するディレクトリ。
/boot：ブートローダー関連（カーネル情報）のファイルを配置するディレクトリ。
/root：ルートユーザーのホームディレクトリ。
/var：ログを出力するパーティション。

less, more：ファイルの中身を表示。lessの方が新しく、逐次的に読み込むため、メモリ使用量が少ない。

gdisk：GPTでのパーティションの作成や削除を行うことができる。
parted：GPTとMBRどちらでもパーティションの作成や削除を行うことができる
fdisk：パーティションを作成するためのコマンド。
fsck：ファイルシステムのチェックや修復をするコマンド。
mkfs：パーティション上にファイルシステムを作成するコマンド。

スワップスペース：メモリが不足した場合にメモリ上のデータを退避する。
- スワップスペースへのデータの退避すること：スワップアウト
- 退避したデータをメモリに戻すこと：スワップイン

apt purge パッケージ名：設定ファイルも含めてパッケージを削除する。
※ apt remove　の場合設定ファイルは残る。

yum provides /etc/hosts：ファイルを含むパッケージを検索する。

install：特定のパッケージのインストール。
update：パッケージの一覧を更新（パッケージそのものを更新するわけではない）。
upgrade:システム全体のパッケージを更新。

-F：ソフトウェアをアップデート。
-i：ソフトウェアのインストール。
-ql：ソフトウェアのファイル一覧の表示。

apt-cache search パッケージ名：Debianパッケージの検索を行うコマンド。

~/.ssh/known_hosts：サーバーの公開鍵が登録されるファイル。

shutdown -h +5：５分後にシステムを停止。
shutdown -r +5：5分後にシステムを再起動。
shutdown -r 5:00：5時に再起動。
shutdown -h 5:00：5時に停止。

・バックグラウンドで実行するにはコマンドの末尾に&をつける。
（例）tail -f /var/log/messages &

xdpyinfo:ディスプレイ番号、スクリーン番号、解像度などのディスプレイの情報を取得.
showrgb:利用できる色とその名前の対応表を表示.
xlsclients:ディスプレイ上で動作しているクライアントアプリケーションの一覧を表示.
xwininfo:ディスプレイのウィンドウ位置、サイズなどの情報を表示.

systemctl set-default ~：os起動時のsystemdのターゲットを変更するコマンド。
※ systemctl isolate ~：現在のターゲットを変更。

-c:ファイルのバイト数を表示。
（例）wc -c /etc/passwd
-l：行数を表示。

expand sample.txt：テキストファイル内のタブ文字を半角スペースに置き換えて出力。
unexpand sample.txt：テキストファイル内の半角スペースをタブ文字に置き換えて出力。
uniq:ファイルの行の重複を削除。

tee：標準入力から受け取った内容を標準出力とファイルに書き出す。

2> error.txt:標準エラー出力のみをファイルに書き込む。
> error.txt：標準出力のみをファイルに書き込む。

sed s/level/Level/g test.txt：test.txt の中に書かれている「level」という文字をすべて「Level」に置き換える。

○ grep系コマンドの違い
grep、egrep、およびfgrepは、UNIXおよびLinuxシステム上でテキスト検索を行うためのコマンド。これらのコマンドは、それぞれ異なる検索方法を使用するため、以下のように使い分けることができる。

・grep : 標準的な正規表現を使用してテキストを検索するために使用される。grepは、基本的な正規表現のメタ文字をサポートしていて、例えば、grep 'pattern' file.txtとコマンドを実行すると、file.txtファイル内でpatternという文字列を検索し、一致した行を表示する。

・egrep : 拡張正規表現を使用してテキストを検索するために使用される。egrepは、基本的な正規表現のメタ文字に加えて、括弧、角括弧、波括弧、アスタリスク、縦棒、およびその他のメタ文字をサポートしている。例えば、egrep '(pattern1|pattern2)' file.txtとコマンドを実行すると、file.txtファイル内でpattern1またはpattern2という文字列を検索し、一致した行を表示する。

・fgrep : 固定文字列を使用してテキストを検索するために使用される。fgrepは、正規表現のメタ文字を特別扱いしない。fgrepは、非常に高速で、大量のテキストファイルを検索する場合に適している。例えば、fgrep 'pattern' file.txtとコマンドを実行すると、file.txtファイル内でpatternという文字列を検索し、一致した行を表示する。

これらのコマンドは、異なる種類の正規表現を使用してテキストを検索するため、目的に応じて使い分けることが重要。基本的には、grepは正規表現の一般的な検索に適している。egrepはより複雑な正規表現に対応する必要がある場合に使用される。fgrepは、正規表現のメタ文字を使用せず、高速な検索を必要とする場合に使用される。

yy：行のコピー。
x:文字の削除。
p:コピーしたものを行の下に貼り付ける。
3dd：３行削除。

○ viのコマンドモード
i：カーソル位置から入力。
o：次の行から入力。
a:カーソル位置の右から入力。

○ SUID（Set User ID）とは？
SUIDは、UNIXおよびLinuxシステムで使用される権限の一つで、実行ファイルに対して設定できる。SUIDが設定されたファイルは、通常のユーザーでも、そのファイルを所有するユーザーと同じ権限で実行することができる。

つまり、一般ユーザーが実行できるプログラムでも、SUIDが設定されたプログラムは、実行時にはそのプログラムを所有するユーザーと同じ権限で実行されるため、一般ユーザーでも特定の権限を持つことができる。

SUIDは、セキュリティ上のリスクがあるため、慎重に設定する必要がある。SUIDが設定されたファイルを誰でも実行できる場合、攻撃者がそのファイルを利用してシステムに悪影響を与えることができる。そのため、SUIDを設定する場合は、必要最小限のプログラムに限定し、セキュリティ上の注意を払う必要がある。

SUIDを設定するには、chmodコマンドを使用する。例えば、chmod u+s file.txtとコマンドを実行すると、file.txtファイルにSUIDビットが設定され、実行時にそのファイルを所有するユーザーと同じ権限で実行される。

SUIDが設定されたファイルのユーザのパーミッションはrwsとなる。

sshサーバーのログアウト：ctrl+D、exit、logout
公開鍵と秘密鍵のペアを作成:ssh-keygen
sshd：SSHのサーバープログラム　

・sshサーバー
- 設定ファイル →　/etc/ssh/sshd_config
- 秘密鍵 → /etc/ssh/ssh_host_rsa_key
- 公開鍵　→　/etc/ssh/ssh_host_rsa_key.pub
-　　認証鍵リスト： ~/.ssh/authorized_keys

・sshクライアント
- 設定ファイル：./etc/ssh/ssh_config
- 秘密鍵 → ~/.ssh/id_rsa
- 公開鍵 → ~/.ssh/id_rsa.pub
- 認証鍵リスト → ~/.ssh/known_hosts

SSH接続時のホスト認証では、SSHサーバから送信された公開鍵と、SSHクライアントの「~/.ssh/known_hosts」の公開鍵が一致するかどうかを確認する。

仮想マシン（VM：Virtual Machine）：ハイパーバイザーという仮想化ソフトウェア上で仮想的なハードウェア（仮想マシン）を起動し、ゲストOS（仮想マシンにインストールしたOS）を動作させる方式

仮想マシンのハイパーバイザーの種類：ネイティブ型（またはベアメタル型）とホスト型

○ハイパーバイザーの詳細
ハイパーバイザーは、コンピューター上で複数の仮想マシンを実行するためのソフトウェア。ハイパーバイザーは、物理的なハードウェアのリソースを仮想マシンに割り当て、それらを独立して実行することができる。つまり、複数のオペレーティングシステムを同じハードウェア上で同時に実行することが可能。

ハイパーバイザーは、2つの主要なタイプがある。
- Type 1ハイパーバイザー
- Type 2ハイパーバイザー

Type 1ハイパーバイザーは、ハードウェア上に直接実行される。高いパフォーマンスを実現することが可能。例としては、VMware ESXiやMicrosoft Hyper-Vがある。

Type 2ハイパーバイザーは、オペレーティングシステム上で実行される。Type 1ハイパーバイザーよりも低速になる可能性がある。例としては、Oracle VirtualBoxやVMware Workstationがある。

ハイパーバイザーの利点は、物理的なハードウェアを効率的に使用できることや、複数の仮想マシンを同時に実行できること。これにより、オペレーティングシステムやアプリケーションを仮想マシン内で簡単にテストしたり、アプリケーションを異なる環境で実行したりすることができる。また、仮想マシンをバックアップしておくことで、システムの復旧やデータの復旧も容易になる。

・コンテナ
ホストOSと異なるOSをコンテナで使用することはできない。

Linuxのユーザ名前空間（User Namespace）の機能を使うことで、コンテナ内のrootユーザをホスト上の一般ユーザとして扱うことができ、コンテナとホスト間でユーザ権限の分離ができるようになる。

KVM（Kernel-based Virtual Machine）：Linuxに標準搭載されている仮想化ソリューション

-i, --interactiveオプション（キーボードなどからの標準入力を受け付ける）と、-t, --ttyオプション（疑似端末を割り当てる）を使用することで、起動したコンテナにログインできる。「-it」のようにまとめて指定することも可能。

ゲストOS：仮想マシンにインストールしたOS

XML（Extensible Markup Language）：
テキストベースのマークアップ言語で、データの構造化と交換に使用される。XMLは、HTMLと同様にタグを使用して情報を記述するが、XMLのタグは、自分で作成できるカスタムタグを含め、より柔軟性がある。XMLは、データを階層的な構造に整理することができ、データの意味や関係を明確にすることが可能。XMLは、ウェブサービスの通信やデータの転送、データベースのエクスポートやインポート、ドキュメントの作成など、さまざまな場面で使用される。また、XMLは、様々なプログラミング言語で解析や処理が可能であるため、広く使用されている。

○ virsh（バーシュ）コマンドの主なサブコマンド
- create：XML形式のファイルの形式から仮想マシンを作成し。起動する。
- shutdown：仮想マシンを正常に終了。
- destroy：仮想マシンを強制終了。
- reboot：再起動
- suspend:一時停止
- resume:再開

※ rebootとresumeの違い
・rebootコマンド：
コンピューターを再起動するために使用される。つまり、システムをシャットダウンし、再起動する。再起動の理由として、新しい設定の適用、システムのアップグレード、またはシステムのトラブルシューティングが挙げられる。rebootコマンドを実行すると、すべてのプロセスが終了し、システムが再起動される。

・resumeコマンド
休止状態からシステムを再開するために使用される。つまり、システムを再起動せずに休止状態から復帰する。休止状態は、システムが実行中の状態を保持しながら省電力モードに切り替えることで、電力の節約ができる。resumeコマンドを実行すると、システムは休止状態から再開され、実行中のプロセスが復元される。

したがって、rebootはシステム全体を再起動させるためのコマンドであり、resumeはシステムを休止状態から再開するためのコマンドである。

○ CPUの仮想化支援機能(仮想化ソフトウェアが行う処理の一部をCPUが分担することで処理を高速化する機能)
- Intel VT(Intel Virtualization Technology）
- AMD-V（AMD Virtualization）

○ ネイティブ型の仮想化ソフトウェア（Type1）
Xen
Hyper-V（Microsoft）
vSphere Hypervisor（VMware）

○ ホスト型の仮想化ソフトウェア(Type2)
Oracle VM VirtualBox
VMware Workstation
Parallels Desktop

docker exec：起動中のコンテナでコマンドを実行
docker attach：コンテナの標準入出力に接続
docker rm:コンテナの削除

libvirt：オープンソースの仮想化管理用のライブラリ（virt-managerやvirshコマンドなどが利用）

KVM（Kernel-based Virtual Machine）：Linuxに標準搭載されている仮想化ソリューション

○ 仮想マシンタイプのネイティブ型の仮想化ソフトウェア
Hyper-V
VMware ESXi

○ 仮想マシンタイプのホスト型の仮想化ソフトウェア
VirtualBox

virshコマンドのサブコマンドで、仮想マシンの定義ファイルをXML形式で出力する：dumpxml
（例）virsh dumpxml centos
仮想マシンの一覧を表示：list
（例）virsh list --all
※ -allをつけることで起動していない仮想マシンもすべて表示される。
仮想マシンの強制終了：destroy
（例）virsh destroy
※ 正常終了はvirsh shutdown
一時停止中の仮想マシンを再開：resume

virshコマンド:様々な仮想化ソフトウェアと仮想マシンを管理できるコマンドラインツール

systemctl enable httpd：自動起動の有効化(httpd)

指定したファイルまたはディレクトリの所有グループのみを変更可能なコマンド:chgrp
所有グループだけでなく所有ユーザも変更可能なコマンド:chown
パーミッションを変更するコマンド:chmod

○ 所有権の変更(chown, chgrp)
・所有ユーザのみを変更する場合
chown [-R] ユーザ名 ファイルまたはディレクトリ

・所有ユーザと所有グループを同時に変更する場合
chown [-R] ユーザ名:グループ名 ファイルまたはディレクトリ

・所有グループのみを変更する場合
chown [-R] :グループ名 ファイルまたはディレクトリ
chgrp [-R] グループ名 ファイルまたはディレクトリ

※ 以下のコマンドは同じ意味
chown staff:staffgroup file.txt
chown staff.staffgroup file.txt

問：現在22:00である。23:00にサーバを停止するコマンドは？
shutdown -h 23:00　　（２３時に停止）
shutdown -h +60　　（６０分後に停止）
shutdown 60　

-rは再起動、-kはシャットダウンは行わず、ログイン中の全ユーザーにメッセージを送る。
-cは実行中のシャットダウンをキャンセル

メモリやスワップ領域の使用状況を表示：top
実行中のプロセスの表示：ps
バックグラウンド動作に切り替え：bg
システムの負荷平均を表示：uptime

一時停止しているプロセスを再開するシグナル:CONT

例1）プロセスIDが5472の一時停止中のジョブを再開する場合
kill -CONT 5472

例2）ジョブ番号が1の一時停止中のジョブを再開する場合
$ kill -CONT %1

シグナル名：シグナル番号：処理内容
HUP(SIGNUP)：１：端末の切断による終了
INT(SIGINT)：２：Ctrl＋Cの処理
KILL（SIGKILL）：９：強制終了
TERM（SIGTERM）：１５：クリーンアップして終了
CONT（SIGCONT）：１８：一時停止のプロセスを再開
STOP（SIGSTOP）：１９：一時停止
TSTP（SIGTSTP）：２０：端末から入力された一時停止

pgrep：実行中のプロセスから特定の名前を持つプロセスIDを検索
例）pgrep ssh

# 参考
https://www.udemy.com/course/linuxlpic

https://mondai.ping-t.com