【備忘録】初心者が理解しにくいLinux関連の諸知識

#背景
社内で主にジョブ管理のツール利用しているHinemosのバージョンアップ及びジョブ移行にあたり、パッケージのインストール、サーバーの諸設定などを行いました。
その際に得たLinuxにおける操作等々の知識。
初心者にとっては普段馴染みのないことで忘れがちですが、またその知識が必要な場面が来るだろうと思い、自分で調べて理解しつつ簡単な備忘録として残すことにしました。
#備忘録
サーバーの設定をするような流れで書いてみます。
##■su,sudo
###su
Switch Userの略で、**ユーザーを切り替える**ためのコマンド
`su - (ユーザー名)`：指定のユーザーに切り替える。無指定の場合rootユーザーに切り替える。

ただし、切り替えの際にパスワードが求められます。
-(ハイフン)を付けると、そのユーザーのカレントディレクトリに移動します。
###sudo
Super User DOの略で、**スーパーユーザー(rootユーザー)で実行する**ためのコマンド
rootユーザーに切り替える`su`とは、基本的には**一時的にrootユーザーとなっている**という点で違います。

###便利コマンド`sudo su -`
作業を進める中でsuを叩くたびにパスワードが求められて面倒、またはパスワードがわからないときに便利なのが**`sudo su -`**です。
※sudoの権限がついているのが前提

日本語にすると、
**一時的にrootユーザーになって、rootユーザーに切り替える**

一見よくわかりませんが
`sudo`で一時的にrootユーザーになって`su`を実行する(rootユーザーとして操作できるようになる)という意味合いになります。
rootユーザーは管理者なので、`su`でパスワードを求められることはありません。

##■yum,rpm
少し脱線しますが、まずパッケージ管理の概念から。

Linuxでパッケージをインストールするためにはパッケージ管理システムを利用します。
yum(Yellowdog Updater Modified)とrpm(Red Hat Package Manager)はRedHat系Linuxのパッケージ管理システムのツールのことです。
`yum`や`rpm`というコマンドを叩くことで、Linuxの中にパッケージをインストールしたりアップデートしたりして管理をすることができます。

一旦コマンドのことを忘れて、yumとrpmの概念を少し整理すると以下のイメージかと思います。

**yum：システム内の複数のパッケージを統合的に管理する**
**rpm：個々のパッケージを管理する**

その上で、yumとrpmのコマンドの使い方を見ていきます。
以下のようにコマンドとしての機能はほとんど変わりがないです。
しかし、システムにインストールされたパッケージを全てアップデートする`yum update`といった統合的な管理にはyumを使うことになります。
また、コマンドを比較してもわかる通り、yumは英語でコマンドが明示的なのでわかりやすいという点でよく利用されているように思います。
###yum
```bash

#インストール
yum install (パッケージ名)

#アップデート
yum update (パッケージ名)

#検索
yum search (パッケージ名)

#削除
yum remove (パッケージ名)
```
###rpm
```bash

#インストール
rpm -ivh (rpmパッケージ名)

#アップデート
rpm -Uvh (rpmパッケージ名)

#検索
rpm -qa (rpmパッケージ名)

#削除
rpm -e (rpmパッケージ名)
```

##■pip
yum,rpmと同じくパッケージ管理システムの1つですが、**Pythonのパッケージ(ライブラリ)管理システム**です。
Pythonのパッケージ(ライブラリ)をLinux上で管理するためにはpipが必要です。

pipと同様に、言語ごとにパッケージ管理があります。

[Pythonを使う上で欠かせないパッケージ管理システムpipの使い方](https://qiita.com/saitoxu/items/18e6a1c8c7840029147e)

##■curl,wget
ざっくりいうと2つとも、**Webからコンテンツをダウンロードできる**ツール(コマンド)です。
とはいえ、かなり違いがあるのでまとめます。
###・ツールの体裁
curlは単なるコマンドラインツールとしてだけでなく**ライブラリ(libcurl)もありAPIとして高級言語でも利用できます。**
一方で、wgetにはライブラリはないです。
libcurlをCやPythonなどでAPI利用するときの話が記事にあります。
[PycURLでHTTPリクエストあれこれ](https://qiita.com/TakesxiSximada/items/db015b8d030cefa578a1)
[[C言語] curl libを使ってみる](https://qiita.com/edo_m18/items/a0073d81431bfd5681e2)

###・対応プロトコル
curlは**対応するプロトコルが多い**です。
curlはHTTP、HTTPS、FTPだけではなく、SMTPやPOP3などに対応しているためコマンドラインからメールの送信ができたり受信したメールを読むことができます。
(wgetが対応しているプロトコルはHTTP、HTTPS、FTPのみ)

###・ダウンローダーとしての動きと機能
####curl
**連番ファイルの一括ダウンロード**に向いています。

```bash

# 1～100までのファイル
curl -O http://www.example.com/file_[1-100].jpg

# a～zまでのファイル
curl -O http://www.example.com/file_[a-z].jpg

# 1～100までを10きざみで
curl -O http://www.example.com/file_[1-100:10].jpg
```
wgetの場合は、複数のURLを記述したファイルを作成`wget -i (URLが記述されたファイル)`となり一つ一つURLをファイルに書き出す必要があるので、連番で大量のファイルをダウンロードする場合はcurlのほうが使い勝手が良いです。
####wget
curlの利点ばかりあげてきましたが、wgetにしかできない機能もあります。

wgetは**クローラとして動作ができる**という点に特徴があります。
クローラはわかりやすく言うとWeb上をあっちこっちと見て回れるものです。
このクローラとしての動きで、細かな設定をしてファイルをダウンロードすることができます。

```bash
#指定フォルダ以下の全てをダウンロード(=再帰的にダウンロード)
wget -r http://www.example.com/

#出力先、ファイル名を指定してダウンロード
wget -O (出力先ローカルパス) http://www.example.com/file
```

1つ目に記載した**オプション`-r`を使った再帰的にダウンロードできるのがwgetの最大の利点です。**



curlとwgetの特徴を活かして使い分けすると良さそうです。

##■hostnamectl,timedatectl ,localectl
RHEL7におけるホストネーム、タイムゾーン、ロケールの変更に使うコマンドたちです。
コマンドを理解するというよりは、存在を知っておいて使うときに確認するくらいのコマンドかと思います。

###hostnamectl

```bash
#ホストネームを変更する
hostnamectl set-hostname (ホスト名)
```
###timedatectl
```bash
#現在の時間設定の確認をする
timedatectl 

#タイムゾーンを設定する
timedatectl set-timezone Asia/Tokyo

#設定できるタイムゾーンのリストを表示
timedatectl list-timezones
```
時計のように秒単位での細かな時間設定も可能です。
###localectl
```bash
#現在のロケール設定の確認をする
localectl

#ロケールを変更する(ja_JP.UTF-8の場合)
localectl set-locale LANG=ja_JP.UTF-8
source /etc/locale.conf

#使用可能なロケールのリストを表示
localectl list-locales

```
ロケールの変更するには`source /etc/locale.conf`で環境変数を反映させる必要があります。


##■chkconfig
システム内のサービスの管理を行うコマンドです。
自動起動の設定を確認し、変更することができます。

```
#サービスの状態を確認する
chkconfig --list
```
読み方に関しては、分かりやすい記事がありました。
[chkconfig - サービスの自動起動の設定 / CentOS](https://qiita.com/yukikimoto/items/6bd18c8c74e580af177b)

##■chmod
`ls -l`と入力し、フォルダの表示内容を表示すると左端にでてくる`-rw-rw-r--`のような表示を変更できるコマンドです。
そもそもこれらの表示(`-rw-rw-r--`)は、そのファイル、フォルダのアクセス権限を表しています。
左端1文字が、ファイル(-)ディレクトリ(d)シンボリックリンク(l)を表します。
次から3文字ずつ、所有者・グループユーザー・その他ユーザーのアクセス権限を読み取り(r)、書き出し(w)、実行(x)で示します。

これらを前提にして、chmodでファイルやフォルダのアクセス権限の設定を行います。

```bash
chmod (アクセス権限) (ファイル名)
```
アクセス権限の部分に、3桁の数字を入力します。数字は2進数を10進数にした数字で決まります。
r→1
w→2
x→4
として、
許可を与えたい権限の数字を足した数字を、所有者・グループユーザー・その他ユーザーに割り当てて3桁の数字を決めます。
例えば、すべてのユーザーに対して読み取り・書き込み・実行を許可する場は777を入力するといった感じです。



##■history
これまで入力したコマンドを表示するコマンドです。
少し前に入力した長いコマンドをまた使いたいけど、なんだっけ…みたいなときに使えるので、便利です。

#おわりに
今まで意味も分からず使っていたコマンドなども、理解できるとコマンド叩くときも意識ができて良い気がしました。

「調べて理解する→なるべく自分の言葉に変換して記事に書く」の繰り返しでこの記事を書きました。
そのため、思った以上に時間がかかりましたが、かなり自分のタメにはなりました。

自分のインプットをなるべくわかりやすい形で記事にしていく作業は自分の理解にも繋がってとても良いことですね。。

#参考
[【初心者にもわかる】rpmとyumの違いと使い分け一通り](https://eng-entrance.com/linux-package-rpm-yum-def)
[curlとWgetの比較](https://postd.cc/curl-vs-wget/)
[パーミッションなどを設定する！chmodコマンドの詳細まとめ【Linuxコマンド集】](https://eng-entrance.com/linux-command-chmod#i)
[CentOS7 タイムゾーン・時刻・日付の設定方法](https://www.server-memo.net/centos-settings/centos7/timedatectl.html)