Linux標準教科書

基本ソフトウェアと応用ソフトウェア
コンピューターはハードウェアとソフトウェアに分けられ、またソフトウェアは基本ソフトウェア(OS)と応用ソフトウェア(エクセルやパワポなど)がある。
基本ソフトウェアは
- 応用ソフトウェアで使うであろう共通部品を提供する
- 本来のコンピューターであれば同時に1つの処理しかできないが、各ソフトウェアを素早く切り替えることで同時に動かしている。

今日先輩になんでLinuxを勉強しようと思ったのか?と聞かれて、うまく答えられなかった。なので追記。
なんでそもそもLinuxというものが必要なのか?
- ワークフローを改善
- セキュリティ
- ツールが充実している
- タスクの自動化をコマンドを書くだけでできる
- 本番環境で使われている
本番環境で使われているのがなぜ良いかというと
- ローカルと本番環境と同じOS環境の方が差異がなく、エラーが起きにくい
- Webサービスの本番環境OSの9割以上がLinuxなどのUnix系である
なぜ本番環境でLinuxが使われているのか
- オープンソースで無料
- 安定している
- 高いセキュリティ
- パフォーマンスの高さ
- カスタマイズ性
本番環境ではコスパ、安定性、要件を満たせることが大切。これを満たせているからLinuxが使われている。
もしそれができたとしても本番で動かない可能性もあるよねってことか。
実際のサーバではLinuxが主流だから、ローカルでもLinuxを使えば本番環境にあわせることになるので、ローカルのためだけに環境を作るわけではなくなるのが良い点。
仮想環境を使う理由としては、ただで手に入るし、どんなことをしても構わないスペースだから。仮想環境の中で作業していれば取り返しのつかない行為をしたとしてもメインは無事。仮想環境が壊れてもなんら問題なし。
「くそう、本番環境で出る不具合が、ローカルだと再現しない…」
このため、WindowsやMacでVirutalBox越しにLinuxを立ち上げ、極力似たような環境を構築するという対策を行いました。
しかしそれはあくまで似た環境なのであり、AWSなどが用意している環境を100%再現するには至りません。
もし上司に本番環境にVirtualBoxを入れましょう、そうすれば環境の違いを無視出来ますよ!…と進言すると「アホか、オーバーヘッドデカすぎで使い物にならんわ」と頭叩かれます。
https://wa3.i-3-i.info/word12471.html
結論 「現時点の業務では必要ないが、のちのち必要だしやるにこしたことはない」
結局のところ、本番環境までリリースすることを考えたりインフラ周りを気にしたりする場合にはLinuxの知識が必須ということですね。確かに現時点ではそんなに気にしなくて良いし、すぐに役に立つかと言われたらNo。
Dockerとかも実際はインフラに強い人がいればその人が書いたものを実行するだけって場合もあるし。
個人開発とかでAWSとか、Webサーバを触るってなると必須。
まぁとりあえず知っておくくらいの経験はしておいても良いと思ったし、基本的なコマンド・権限・ネットワークの設定・ファイルシステムとかは今の時点でも知っておいた方が良いと思った。

UNIX
UNIXの誕生
UNIXはもともと使われていないコンピュータに対し、Ken Thompson氏が自分で考えた機構を試すために作られ、そこにOSの基本要素となるプログラムを搭載した。(すごい。頭の中どうなってるの。)
もともとUNIXは商品として考えていなかったためソースコードを手に入れたユーザは自由に研究や開発をすることができた。
さまざまな分離・統合
配布されていろんなUNIXができてきてまとまりがなくなってきたので、AT&Tが正式にライセンス契約を初めてUNIXを管理するようにした。
それ以降はUNIXと契約を結んだ組織のみがUNIXと名乗ることができるようになり、契約していない組織が開発したUNIXのことをUNIX互換OSというようになる。
Linuxの誕生
フィンランドの大学生が作ったUNIX互換OSが設計はUNIXそっくりだが、拡張機能やソフトウェア、ツールを組み合わせることでUNIX互換のOSとなり、Linuxが誕生した。
- プログラムを実行する自由
- ソースの改変の自由
- 利用・再配布の自由
- 改良したプログラムをリリースする権利
などの特徴をもつフリーソフトウェアライセンスであったため、多くのディストリビューターによって開発され、多くのユーザに使われるようになった。

Linuxの特徴
カーネルとユーザランド
基本ソフトウェアは2つに分類することができ、 カーネル
と ユーザランド
に分類できる。
カーネル
OSの中核で、ハードウェアと直接やりとりする機能を受け持つ。カーネルはハードウェアの違いを吸収してプログラムがどのハードウェアでも動くようにする役割がある。
ユーザランド
OSが動作するのに必要なカーネル意外の部分を指す。ファイルシステムやファイル操作コマンド、シェルなどの基本的なソフトウェア群を指す。
Linuxを使う
Linuxはコマンドで操作し、コマンドはユーザランドで動作する。
広義のLinuxは、 ハードウェア
カーネル
応用ソフトウェア
の3つを合わせていう。また狭義のLinuxはカーネル
を指す。
以下の記事によると広義のLinuxとしてCentOSなどがあるということ。Linuxはあくまでカーネルを指し、その他の応用ソフトウェアなどをくっつけて配布してくれているのが広義のLinuxでありCentOSなどであるということ。
シェル
Linuxはコマンドで操作する
のコマンドとは命令のことで、さまざまなコマンドがある。
Linuxにはシェルというコマンド入力環境が用意されており、シェルは入力されたコマンドを理解して実行する。
シェルには大きく2つの役割がある。
- コマンド入力を受け付ける
- シェルスクリプトの実行(コマンドの入力を自動化するためのもの)
シェルスクリプトは1つのファイルに1行ずつコマンドを記述しておき、作成したシェルスクリプトを実行することでコマンドの実行を自動化することができる。
シェルスクリプトを使って作成したシェルスクリプトをサーバの起動時や数時間ごとに実行することもできる。
ログイン
Linuxでは利用開始時にユーザ名とパスワードを入力する。この組み合わせのことをアカウントという。
このアカウントを使ってLinuxを使い始めることをログインするという。ログインすることでそのコンピュータの利用が可能になる。

ディストリビューション
ディストリビューションの誕生
当初のLinuxはインストールが困難であったため、さまざまな団体が簡単な手順でLinuxをインストールできるようにしていった。
代表的なディストリビューターとしては Red Hat
Debian Project
Canonical
などがある。(聞いたことある)
パッケージ
Linuxに対して追加機能を提供するもの。従来、応用ソフトウェアをLinux上で動かすためにはソースをダウンロードして自らビルドする必要があった。その手間を解決するために、ディストリビューターがビルドして簡単に応用ソフトウェアを導入するためのパッケージが作られるようになっていった。
パッケージマネージャ
応用ソフトウェアの導入には依存するプログラムなどがあるとそれらを正しい場所に正しい順序でインストールする必要がある。
さらに開発が盛んなプログラムはバグの修正や機能改善、セキュリティの脆弱性の修正など常に更新されており、新しいプログラムをインストールする際には古いプログラムを削除してからインストールする必要がある。
そこでパッケージを簡単にインストールしたり、アップデートするパッケージマネージャというものが標準で用意されるようになった。

Linuxのインストール
今回はMacに対してVirtualBoxを使ってCentOSをインストールする方法をとる
M1にVirtualBoxはインストールできないようになっているみたい...。(VirtualBox v6.1.30から?)
IntelチップのMac使うしかないようなのでCentOS使うときはPCかえる必要があるな...
CentOS8を探しても見つからない...と思ったら2021年末にメンテナンスが終了していた。ひとまずコマンドの練習くらいならCentOS7でも大丈夫かなと思ったので、いったんCentOS7をインストール。
なんでここでVirtualBoxを使う必要があるのかを調べると、Macの場合はMacOSがすでに存在しているため、CentOSを入れてしまうとOSが2つ存在してしまうことになる。
言ってしまえばPCの人格が2つになってしまう?から、そうしないために、既存のOSの上で別のOSを実行するための仮想環境を用意するためのソフトウェア。
デュアルOSという設定をすれば2つのOSを入れることはできるみたいであるが、そうすると現在実行中のOSと別のOSを起動させたいときには再起動する必要があるとのこと。
でもVirtualBoxを使えば、ホストOS(MacOS)を起動したままゲストOS(CentOS)を起動することができる。便利。

いったんコマンドとvimの章は飛ばす
コマンドは触ってみた。

正規表現とパイプ
Linuxを理解するために正規表現とパイプの知識は重要みたいなのでやってみる。
標準入出力
Linuxのプログラムには「1つの入り口と2つの出口」がある。それぞれ 標準入力
標準出力
標準エラー出力
という。
- 標準入力
プログラムに入ってくるデータのこと
- 標準出力
プログラムの実行結果を書き出す先のことを指す。一般的にはプログラムを実行した端末のディスプレイになっている。
- 標準エラー出力
エラーメッセージを書き出す先のこと。一般的にはプログラムを実行した端末のディスプレイになっている。
ls
コマンドを打った場合、カレントディレクトリのファイルとディレクトリの一覧が画面上に表示される。このようにコマンドを実行した結果が画面上に表示されることを「標準出力に出力された」と表現する。
リダイレクト
コンソールに標準出力された文字列はリダイレクトを使ってファイルに書き込むことができる。リダイレクトは >
を使って表現する。
出力のリダイレクト
$ ls > ls-output
上記を実行すると ls-output
というファイルが作成され、lsの実行結果が入っている。
標準エラー出力
リダイレクトを用いて標準出力されるエラーメッセージを任意のファイルに出力することができる。
$ ls -l tekitou 2> ls-l-output
上記のようにした場合、エラーメッセージは画面に表示されることはなく、 ls-l-output
というファイルにエラーメッセージが出力される。コマンド中で指定している 2
は標準エラー出力を表している。標準出力の場合には 1
を指定する。
パイプ
例えば以下のようなコマンドを打ったとする。
$ ls -l /usr/bin
ここにはコマンドが1000以上あるため、そのままではすべてのコマンドを画面に表示しきることができない。そのため次のように入力する。
$ ls -l /usr/bin | less
コマンドとコマンドを |(パイプ)
で繋げることによってパイプの前のコマンドを後ろのコマンドの標準入力とすることができる。つまり、ls -l /usr/bin
の結果を less
することができる。
grepコマンド
ファイルの中からデータを検索できるコマンド。
ここで正規表現を使えると検索できる幅が増える。ここは飛ばそう。
必要になれば正規表現は調べる。
あと、業務でこのQiita教えてもらってすごく便利だった。

基本的なコマンド
ファイルのタイムスタンプの変更(touch)
今までファイル作成のコマンドだと思っていたけど、実際はタイムスタンプを変更するコマンドみたい。
ファイルが存在しない場合には中身が空の0バイトのファイルを作成する。
touch [オプション] ファイル名
ファイルの一部の取得(head, tail)
ファイルの先頭や末尾など一部分のみを見る場合のコマンド。
headはオプションをつけない場合には先頭から10行を標準出力する。
head [オプション] ファイル名
tailはファイルの終わり部分を標準出力する。これも同じくオプションがない場合には末尾から10行を標準出力する。
tail [オプション] ファイル名
テキストファイルのソート(sort)
テキストファイルの中身をソートできる。オプションでソートの設定ができる。
sort [オプション] ファイル名
行の重複の削除(uniq)
直前の行と同じ内容があった場合、対象行を出力しない。連続している同じ内容の行を1行にまとめられる。
全データから重複しない要素だけをピックアップすることができる。あくまで直前の行と同じ内容であれば出力しない。(AAA, BBB, CCC, CCC, AAA)の記述があるファイルをuniqすると、CCCは1行だけ出力されるが、AAAは連続していないのでどちらも出力される。
uniq ファイル名
文字列の置き換え(tr)
trコマンドを使えば、標準入力からのデータを文字ごとに置き換えることができる。
tr 文字列1 文字列2
cat FILE | tr abc ABC
めっちゃ便利。
ファイルの比較(diff)
変更の有無を調べる場合にはdiffコマンドを使う。結果は標準出力されるが、リダイレクトすればファイルに出力することもできる。
diff [オプション] ファイル1 ファイル2

管理者の仕事
このへんはさっくり概要を知りたい。詳しい使い方は今は良い(2022.05.25)
グループとユーザ
Linuxを使うにはユーザアカウントが必要。任意のユーザでログインすることでLinuxを使うことができ、ログインすることでLinuxというシステムの利用権限をもっているため。グループという機能もあるらしい。
グループとユーザを適切に設定して、ファイルやディレクトリ、プログラムなど、必要な人に必要な権限を与えることができる。
グループ・ユーザの作成はroot権限を持っている必要がある。
ユーザ
ユーザというのがメモリやファイルを利用するための最小単位。システム管理者が作成できる。
ユーザの定義は /etc/passwd
ファイルに記述する。
Linuxでは/etc/passwd
ファイルを直接触らない。
-
useradd
コマンドを使って新しいユーザを追加 -
usermod
コマンドでユーザの定義を変更 -
userdel
コマンドでユーザを削除
グループ
複数のユーザの権限をまとめて扱うためにグループを使う。ユーザは必ず1つ以上のグループに所属しており、主に所属するグループを プライマリグループ
という。
最初から用意されているグループに加えて、システム管理者が違うグループを追加することができる。
グループの定義は /etc/group
ファイルに記述する。
Linuxでは直接/etc/group
ファイルを触らない。
-
groupadd
コマンドを使って新しいグループを追加 -
groupmod
コマンドでグループの定義を変更 -
groupdel
コマンドでグループを削除
パスワードとパスワードファイル
ユーザを利用するためにはパスワードが必要で、パスワードは /etc/shadow
ファイルに暗号化して記録される。
変更するためには passwd
コマンドを使う。
パスワードファイル(/etc/passwd)
ユーザの情報は /etc/passwd
ファイルに保存され、1行に1ユーザの情報を :
で区切って記述する。
account:password:UID:GID:GECOS:directory:shell
-
account
そのシステムでのユーザ名。大文字は不可 -
password
以前まではユーザの暗号化されたパスワード。今はx
らしい。 -
UID
ユーザID -
GID
ユーザが所属するプライマリグループID -
GECOS
ユーザの名前またはコメントのフィールド -
directory
ユーザのホームディレクトリ -
shell
ログイン時に起動されるユーザのコマンドインタプリタ
従来はパスワードファイルに暗号化されたパスワードを記述していたが、セキュリティを考慮してシャドウファイルにパスワードを記述しているらしい。また、パスワードファイルは直接エディタで編集するべきでない。
useradd
コマンドなどのコマンドにて操作するのが推奨。
グループファイル(/etc/group)
グループの情報は /etc/group
に保存され、1行に1グループの情報を :
で区切って記述する。
グループファイル内に登録された1つのグループの内容は以下のようになる。
group_name:password:GID:user_list
-
group_name
グループの名前 -
password
以前は暗号化されたグループのパスワードまたはパスワードが不要なら空欄 -
GID
グループID -
use_list
所属するユーザのリスト。それぞれのユーザ名はコンマで区切られる。
これもエディタで直接触らずに、 groupadd
コマンドなどで操作することを推奨している。
パスワード
ユーザの権限を使うには、ユーザ名とパスワードを使って認証する。作成したユーザはパスワードを登録するとログイン可能になる。
ユーザのパスワードの登録・変更には passwd
コマンドを使う。
passwd [ユーザ名]
シャドウファイル(/etc/shadow)
ユーザのパスワードが保存されているファイル。シャドウファイルに登録された1つのユーザの内容は以下
account:password:last_changed:may_be_changed:must_be_changed:warned:expires:disabled:reserved
-
account
ユーザ名 -
password
暗号化されたパスワード -
last_changed
1970年1月1日から最後にパスワードが変更された日までの日数 -
may_be_changed
パスワードが変更可能となるまでの日数 -
must_be_changed
パスワードを変更しなければならなくなるまでの日数 -
warned
パスワード有効期限がくる前に、ユーザが渓谷を受ける日数 -
expires
パスワード有効期限が過ぎ、アカウントが使用不可になるまでの日数 -
disabled
1970年1月1日からアカウントが使用不可になる日までの日数 -
reserved
予約フィールド
用意されているユーザとグループ
rootユーザ
システム設定の変更や、プログラムのインストールや削除、ユーザを作成・削除することが可能。制限がなく、なんでもできる。
suコマンド
suコマンドはすでに別のユーザでログインしているユーザが一時的に他のユーザになるためのコマンド。オプションとしてユーザを指定しなければrootユーザでシェルを起動する。
複数人でLinuxシステムを管理している場合には、rootユーザで直接ログインして作業をするとrootユーザとしての履歴だけが残り、誰がどんな作業をしたかがわからなくなってしまう。そのため、通常は一般ユーザからrootユーザへと切り替えるようにしていると、rootユーザとして作業を開始した時刻などがすぐにわかる。そのため、安全性や管理性を考えると一般ユーザ -> rootユーザとするのが良い。
sudoコマンド
sudoコマンドを使えば、root権限でコマンドを実行できる。必要に応じてsudoを使いコマンドを実行することで、suコマンドでユーザを切り替える必要がなく、root権限が必要な設定やプログラムを実行することができる。
CentOSでは初期設定のままではsudoコマンドは利用できない。sudoコマンドを使うには、ユーザを wheelグループ
というroot権限をもつグループに登録する必要がある。

ユーザ権限とアクセス権
ディレクトリとファイルの所有者と所有権についての理解をする章。
ファイルの所有者と所有グループ
ファイル作成者のユーザIDとグループIDがファイルの所有者と所有グループになる。
所有者は chown
コマンドで変更でき、所有グループは chgrp
コマンドで変更できる。
所有者の変更
chown ユーザ[.グループ] ディレクトリ
chown ユーザ[.グループ] ファイル
ユーザとグループを変更するにはrootユーザである必要がある。ディレクトリとファイルは区別なく変更できる。
所有グループの変更
chgrp
コマンドで変更可能
chgrp グループ ディレクトリ
chgrp グループ ファイル
ファイルとアクセス権
ファイルはファイルを所有するユーザ、ファイル所有グループからファイル所有者を除いたユーザ、その他のユーザの3つのレベルで権限を設定できる。
ファイルには、読み・書き・実行の3つの権限がある。
ファイルに設定できるアクセス
所有ユーザ、所有グループで所有者以外のユーザ、所有グループ以外のユーザごとに3つの権限を設定できる。
この権限は ls -l
コマンドを実行したときに表示される1つ目のカラムの内容である。
d rwx rwx rwx
d
はファイル種別
1つ目のrwx
は所有ユーザ、2つ目のrwx
は所有グループ、3つ目の rwx
はその他である。
r
は読み込み権限、 w
は書き込み権限、 x
は実行またはディレクトリの移動権限を表す。
アクセス権の変更
ファイルのアクセス権を変更するには chmod
コマンドを使う。
chmod モード[, モード]... ディレクトリ
chmod モード[, モード]... ファイル
chmod 8進数表現のモード ディレクトリ
chmod 8進数表現のモード ファイル
ファイルのモードを所有ユーザと所有グループとそれ以外のユーザについて設定できる。