🧙‍♂️

Linuxをちょっと理解する

2024/07/19に公開

LinuxやUbuntuとは何かを理解して、windows環境でLinuxを触れる環境を作るまでを行う。
またLinuxの勉強を始めるにあたって躓く部分を整理する

Linuxとは

OSの1つ
OSSでサーバーサイドだけではなく、デスクトップやタブレット、組み込みシステムなど用途は多岐にわたる

よく聞くRedhat系やDebian系とは

以下のNOTEを参照して整理する
https://note.com/_chibisuke/n/n0ae85ead39cd

Redhat系

Redhat社が開発しているRed Hat Enterprise Linuxから派生したディストリビューションのことがRedhat系と呼ばれる。
ディストリビューションはLinuxディストリビューションの略称で、カーネルであるLinuxとその他必要なソフトウェアが揃ってパッケージ化された状態のLinuxをLinuxディストリビューションと呼ぶ。
狭義のOS=Linux
広義のOS=Linuxディストリビューション

参考
https://wa3.i-3-i.info/word12473.html

Debian系

企業などに依存せず、ボランティアによって開発されているDebianを中心にそこから派生したディストリビューションのことがDebian系と呼ばれる。
最近ではUbuntuが人気なようで、GUIが提供されているので扱いやすい。

代表的なディストリビューション

・centOS(Redhat系)
・Ubuntu(Debian系)

CLIで使用する場合ほとんどコマンドは同じ。一部異なる部分があるがどちらか一方を理解すれば学習は難しくないらしい。

ubuntuをインストールする

ディストリビューションの中でもubuntuが人気のようなので以下の記事を参照してインストールしてみる。3つの手順で完了する
https://note.com/hiro20180901/n/nc798a07485e2

  1. powershellを開いてwslのインストール状況を確認。
wsl --version


2. 以下のコマンドでubuntuをインストールする。

 wsl --install -d Ubuntu

usernameはhokoriにしてパスワードと確認用のパスワードを入力するとインストール完了。簡単だ!

3. インストールできたら記事の内容に沿ってパッケージの更新を行う。
※これはaptというコマンドを使用してカーネルのバージョンアップを行っている。ディストリビューションとカーネルのバージョンがそれぞれ存在することに注意

以上。

WSLとHyper-V

WSL(Windows Subsystem for Linux)はWindows上でLinuxを動かすための仕組みのこと。WSLにより、WindowsのパソコンでLinuxのコマンドやLinuxでしか動かないツールを使うことができる。
また、WSLでUbuntuをインストールしたとき、内部的にはHyper-Vと呼ばれる仮想化のためのソフトウェアを使用して仮想化した環境でubuntuを動作させる。
以下のようなイメージ

Ubuntuを触る前に基本的な知識を理解する

Ubuntuを触る中で知っておかないと躓く知識を以降に羅列する。必要になったタイミングで参照する。
以下の動画シリーズを参照
https://www.youtube.com/watch?v=YGfQ-4J-Khk

OS

オペレーティングシステムとはコンピュータ全体を制御し、管理するためのソフトウェアの集合体。そのためオペレーティングシステムの中にカーネルやシェルなどが含まれる。

カーネル

カーネルはOSの中心的なソフトウェアで制御プログラムと呼ばれる。
カーネルの仕事は「CPU」や「メモリ」「HDD」等のコンピュータに接続された装置とプログラムを繋げること。プログラムがある空間をユーザ空間、カーネルがある空間をカーネル空間と呼ぶ。
カーネルが存在しない場合、悪意のあるプログラムをインストールしていたら、勝手にHDDにアクセスして好き勝手してしまう。それを制御するためにカーネルが必要になってくる。

システムコール

プログラムが機器に接続したいとカーネルに対してお願いをする場合、「システムコール」という関数を使用する必要がある。

カーネルへの変更(カーネルモジュール)

カーネルに変更を入れた場合、再度コンパイルが必要になる。毎回再起動するのは現実的ではないので、カーネルモジュールを使用する。カーネルモジュールはLinuxの再起動なしで機能をつけたり削除できたりする。

Linuxの起動プロセス

  1. BIOSが起動
  2. ブートローダーでカーネル選択
  3. Linuxカーネルが起動
  4. Linuxカーネルがinit(PID:1、ユーザ空間)で実行。ubuntuだとsystemdを立ち上げる(後述するプロセスを参照)

ターミナルとShell

ターミナルは打ち込まれたコマンドをカーネルに渡すもの。
shellはコマンドを理解してOSとやりとりするもの。
ここでポイントとなるのはターミナルはshellとOSとのやり取り結果を画面に出すだけで、実際にコマンドを理解するのはshellと呼ばれるプログラム。shellがOSとやりとりをしてそのやり取りをユーザに伝えてくれている。つまりターミナルの仕事とは、シェルが行うOSとのインタラクションをグラフィカルに表現するだけ。
ちなみにshellを実現するプログラムとしてBashやsh、zshがある。
シェルスクリプトはshellを動かす再利用かのうなスクリプトのことでunixコマンドで書く。

ターミナル = shellとosのインタラクションをグラフィカルに表現したもの
bash = shellを実現するプログラム。ニアリーイコール。
shell = コマンドを理解してOSと対話するもの。ユーザとOSの仲介(ユーザ→shell→os)

内部コマンド

Shell自身が持つコマンドでShell自身で実行できる。

外部コマンド

Shellが持たないコマンド。Shellでは実行できないのでカーネルに実行を依頼する。

ターミナルの見方

# ユーザ名@パソコン名:カレントディレクトリ$
xxx@zzz:~$

フォルダ構成

ルートディレクトリ

スラッシュ(/)で表現される
配下にあるフォルダの役割(目役)
・bin:バイナリ実行ファイル
・etc:設定ファイル
・tmp:30日ほどで自動削除される
・dev:デバイスファイル
・usr:各ユーザ用
・var:ログなど良く変更を行う
・sbin:システムバイナリファイル

ホームディレクトリ

チルダ(~)で表現される
/home/ユーザ名のフォルダにあたる

パーミッション(権限)

それぞれのファイル、フォルダには権限を設定することができる。
読み込み(r)、書き込み(w)、実行(x)の3つの権限がある。

ユーザと管理者権限、グループ

スーパーユーザ

rootユーザとも呼ぶ。suコマンドでスーパーユーザに切り替えることができる。これをrootを取るという。
基本的に何でもできてしまうスーパーユーザで作業は行わずに、後述するsodoコマンドを実行できる一般ユーザで操作を行う。

一般ユーザ

できることが制限されたユーザ。スーパーユーザでしかできないことをするために毎回suで切り替えるのは面倒なので、sudoコマンドを使ってコマンドを実行する。sudoコマンドの使用権限はスーパーユーザから一般ユーザに与える必要がある。

グループ

一般ユーザは複数のグループというものに所属することができる。
グループには権限を与えることができるため、各個人のユーザに権限を与える必要がなくなり便利。

環境変数、PATH、.bashrc

ターミナルが持つ変数のことを環境変数という
envコマンドで確認することができる。

環境変数はexportコマンドで設定できる。

# 設定
export TEST=XXX
# 削除
export TEST=

ターミナルを再起動すると消えるので注意。
毎回環境変数を追加するのは現実的ではないため、基本的には.bashrcに記述する
起動時もしくはsourceコマンドを実行することで記述した環境変数を読み込むことができる

source .bashrc

環境変数は$マークを頭につけることで参照することができる。
envで一覧表示した中から適当に選んでみる

echo $PATH

パスを通す

環境変数PATHにプログラムまでのパスを設定しておくと簡単に呼び出すことができる。
例えばはlsコマンドはPATHに設定されている。lsコマンドとlsまでのパスの実行結果が全く同じになることがわかる。

hokori@pon:/$ ls
bin   dev  home  lib    lib64   lost+found  mnt  proc  run   snap  sys  usr
boot  etc  init  lib32  libx32  media       opt  root  sbin  srv   tmp  var
hokori@pon:/$ which ls
/usr/bin/ls
hokori@pon:/$ /usr/bin/ls
bin   dev  home  lib    lib64   lost+found  mnt  proc  run   snap  sys  usr
boot  etc  init  lib32  libx32  media       opt  root  sbin  srv   tmp  var

便利な.bashrc

環境変数以外にも.bashrcにはプログラムを書くことができるので、起動時に毎回実行したいプログラムがあれば.bashrcに書くとよい。

パッケージ管理ソフト

・どのプログラムの何のバージョンをどこに入れたのか?
・不要になったらどうするのか?
・更新はあるか?
・インストールしたプログラムに依存したプログラムの更新は必要か
上記を手作業でやるのは不可能なのでaptを使用する。
aptはdpkgの進化版で、aptの進化版としてはaptitudeがある。

パッケージのインストールと更新

  1. sudo apt updateでパッケージ情報を管理するapt.listを更新する
  2. sudo apt install xxxでxxxをインストール
  3. sudo apt upgradeで最新のパッケージに更新

プロセス

プロセスはツリーになっており、Ubuntuだと一番最初のプロセス(init)としてsystemdプロセスが動く。
このsystemdプロセスの下にプロセスがぶら下がっていく。上のプロセスを「親プロセス」下のプロセスを「子プロセス」という。
pstreeコマンドでツリーを確認できる。

各プロセスにはPIDというプロセスIDが採番される。
各プロセスにはワーキングディレクトリが設定される。

デーモンプロセス

init以外に依存しないinit直下にぶら下がるプロセスでバックグラウンドで動作する。init以外のプロセスが死んでも動作し続けて欲しい場合はデーモンプロセスに設定する。

プロセスの一生

Jobの管理

複数のプロセスの塊をjobと呼ぶ。
複数の子プロセスをforeground(fg)/badckground(bg)で管理できる。

Ubuntuを操作する

コマンドとはプログラムのこと。
ハイフンが付いたものをオプションと呼ぶ。
パイプ(|)を使用することで左から右に実行結果を渡してコマンドを実行できる。

# ログアウト
exit
# ログイン
ubuntu

基本コマンド

# フォルダ作成
mkdir

# フォルダ削除
rm
rm -r (フォルダの中身ごと削除)

# フォルダの移動、フォルダ名の変更
mv フォルダ名 パス(フォルダの移動)
mv フォルダ名 フォルダ名(フォルダ名変更)

# コピー
cp -R

# フォルダの中身
ls

# 移動
cd パス
pushd パス(popdで戻ってくることができる)

# 現在のフォルダ
pwd

# フォルダのzip圧縮
zip -r 圧縮後フォルダ名 圧縮対象のフォルダ
unzip zipフォルダ

Discussion