Linuxの再学習したので備忘録としてまとめていきます。第1回はLinuxの概要/インストール方法/ターミナルからコマンドを打ってみるまでを記載していきます。
再学習の理由
- Dockerに入門した際に、改めてLinuxの基礎から整理をする必要が出てきたから
- Ubuntuを触ってみたかったから
学習内容をまとめるにあたって、以下のUdemy教材を参考にさせていただきました。筆者は15年以上実務でLinuxを使っていますが、新しい発見がたくさんありました。初学者の方にも、ミドル以上のエンジニアの方にもおすすめの教材です。
【参考資料/Udemy】
- 【Udemy】【3週間で学ぶ】Amazon Linux Bash シェルスクリプト実践講座!!
- 【Udemy】もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう
【参考資料/書籍など】
【参考資料/ChatGPT】
また、情報収集にChatGPTを使用しました。
かなり強力な情報収集ツールになるという印象です。
(ただし、出力結果は鵜呑みにせず、随時公式ドキュメントなどで裏どりする必要があります)
【関連記事】
Linuxとは
- OSの一種/コンピュータを動かすための基本ソフト
- 1991年にリーナス・トーバルスがUNIXをベースに一から開発
- 現在もっとも普及しているOS
UNIX
- 背景として有料版のUNIXがあった
- 小さなOOSと呼ばれプアーな環境でも快適に動いた
- 当時のコンピューターは低スペックであったため、UNIXは大学や研究機関で普及した
- UNIXはオープンソースコードだったが有料版であった
Linuxの特徴
- オープンソースなので誰でも自由に使える
- 世界中で使われていて信頼性が高い
- 品質が高い多くのソフトウェアが利用できる
- 自動化するための仕組みがあり、サーバーの運行がしやすい
- 商用アプリケーションがあまりない(MS Officeなどが使えない)
- 日本語対応がされていない部分が多い
Linuxを学習するメリット
- 汎用性が高い(幅広い場所で使われている)
- LinuxはIT業界で幅広く使われているため、汎用性が高い
- サーバー用、組み込み機器など多様な場所で使われている
- 長い時間をかけて多くのユーザーに検証されている
- 大きな変更がなくなっている
- 一度習得すれば、長い時間使える
カーネルとディストリビューション
- カーネル # OSの中核となるソフトウェア
- ディストリビューション # カーネルに色々なソフトウェアを足して使いやすくしたもの
- ディストリビューションは1000種類以上あり、独自のコミュニティが存在
- RedHat系とDebian系が主流
Linuxカーネルとは
- カーネルを通してLinuxはハードウェアにアクセスする
- Linuxカーネルにアクセスするためのプログラム=Linuxコマンド
主なディストリビューション
RedHat系 | ・RedHat Enterprise Linux ・CentOS ・Fedora |
Debian系 | ・Debian GNU/Linux ・ubuntu |
シェルとは
- LinuxのCLIを提供するソフトウェア
- プロンプトはコマンド入力待ちの記号
- ユーザーにLinux OSを扱うためのインターフェースを提供
- コマンドやプログラムの実行を行う
+------+ +-------+ +---------------+
| user |-------->| シェル | -------------------> Linux カーネル
| | input | | コマンドを解釈して伝える
| | | | | |
| |<--------| | <-------------------| |
| | 結果表示 コマンド実行
+------+ +-------+ +---------------+
シェルの画面
ユーザー名 ホスト名 プロンプト
[conti @ localhost ~ ]$
シェルの仕組み
1 ユーザーがプロンプトにコマンドを打つ
2 シェルが入力された名前のコマンドを探す
3 Linuxカーネルが見つかったコマンドを実行する
4 シェルが実行結果を画面に表示する
ターミナル
- ターミナルは画面を担当するソフトウェア
- シェルはコマンドを解釈するソフトウェア
代表的なシェル
sh(シェル) | ・最も古い ・ほぼ全てのUNIXで利用可能 ・機能少ない |
csh(シーエスエイチ) | ・Bashよりも古く現在はあまり利用されない |
bash(バッシュ) | ・最も一般的 ・shの機能拡張版 ・Linux環境のデフォルトログインシェル |
zsh(ゼットエスエイチ) | ・Macではデフォルトのシェル ・Bashの機能も盛り込んだ最新のシェル |
Linuxの設計思想
- Linuxでは、カーネルとシェルが分かれていたり、シェルとターミナルが分かれている
- このように、Linuxには「分業制、機能は分ける」という設計思想がある
Linuxの環境構築
さまざまな方法が可能ですが、以下をハンズオンしてみました。
- 例1 GCPでGCEを起動 → Ubuntuをインストール
- 例2 Docker上でCentOSのコンテナを起動 → CentOSのBashを起動
- 例3 Docker上でUbuntuのコンテナを起動 → bashを起動
以下に手順を記載していきます。
例1 GCPでGCEを起動/Ubuntuをインストール
【Docker第2回】Linuxの概要/GCPでGCEを起動→Ubuntuインストール
例2 Docker上でCentOSのコンテナを起動 → CentOSのBashを起動
【関連記事】
【Docker第1回】DockerでLinux(CentOS7)を起動し、シェルスクリプトを操作する環境を構築する
手順
> MacのAPPランチャーでDockerを起動
> MacのターミナルでDockerのディレクトリに移動し、以下のコマンドを入力
# docker run -it cents
> プロンプトが変わったら、起動完了
※VSCodeの場合、Spril Terminalをしておくと、片方はDocker上のCentOS, 片方はMacのターミナルが使えるので便利
例3 Docker上でUbuntuのコンテナを起動 → bashを起動
【関連記事】
DockerでUbuntuのコンテナを起動し、Hello Worldを表示
手順
# DockerでUbuntuのbashを起動
cd ~/tutorial/tutorial_docker
docker run -it ubuntu:20.04 bash
# 全てのコンテナを確認する
docker ps -a
# Docker上のコンテナで起動したUbuntuでユーザーを作成
adduser conti # example
password conti # example
su - conti # example
# result
conti@nnnnnnnnnnn:~$
コマンドの意味
- Dockerを使用してUbuntu 20.04のコンテナを起動し、Bashシェルにアクセス
- 通常のUbuntuとの主な違いは、コンテナが仮想化されていること
つまり、実際の物理マシンではなく、Dockerエンジンが管理する仮想環境で実行される - ホストシステムとは別のファイルシステム、ネットワークスタック、プロセス空間、
そしてユーザーアカウントを持っている - これにより、Dockerコンテナは、異なるバージョンのアプリケーションやライブラリ、
異なるオペレーティングシステムに依存するアプリケーションなど、ホストシステムとは別の環境で実行可能
Dockerコンテナ
- Dockerコンテナは、クロスプラットフォームのポータブル性を提供し、
実行環境を迅速にデプロイしたり、開発環境をセットアップしたりするための便利な方法 - しかし、コンテナは通常のUbuntuシステムとは異なるユーザーアカウント、
権限、およびリソースの制限を持つため、完全に同じものではない
コンテナ内で追加した作業を次回起動時に引き継ぐ方法
dockerでUbuntuを起動するところから、ハンズオンしましたので手順を記載します。
DockerでUbuntuを起動 → コンテナ内のUbuntuでBashを起動 → 変更を加える
docker run -it ubuntu:20.04 bash
- -it オプションを使用してコンテナをインタラクティブモードで起動
- ubuntu:20.04 イメージを使用してコンテナを起動している
- bash コマンドを実行することで、Dockerコンテナ内でbashシェルを起動している
- 上記により、コンテナにはターミナルがアタッチされるため、コンテナ内での操作が可能となる
ハンズオン
# MacのZshで以下のコマンドを実施していく
# はじめにコンテナがないことを確認
% docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
% docker run -it ubuntu:20.04 bash
:
:
# プロンプトが変わり、Ubunsu内に移動したら、ユーザーを追加する
#
# adduser conti
Adding user `conti' ...
:
New password:
Retype new password:
passwd: password updated successfully
:
:
Is the information correct? [Y/n] Y
# 無事ユーザーが追加されたか確認
# su - conti
$ whoami
conti
# コンテナで加えた変更を保存するため、Exitする
$
$ exit
logout
# exit
exit
%
以上で変更完了
Dockerコンテナに加えた変更を保存しておく
- 変更を保存した新しいDockerイメージを作成
- そのイメージを使って新しいDockerコンテナを起動
ハンズオン
# コンテナを停止する
# コンテナIDを確認するために、docker ps -a コマンドを実行する
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
561a579f52b4 ubuntu:20.04 "bash" 5 minutes ago Exited (0) 4 minutes ago objective_mccarthy
# 変更を加えたDockerコンテナを元に新しいDockerイメージを作成する
# docker commit {container_id} {new_image_name}
$ docker commit 561a579f52b4 ubuntu:20.04_20230307_0600
sha256:8e425ee091913515b5044a524ccf0bf87bc4e509e19f3c67a4874da55a0a976d
# 新しいDockerイメージが作成されたことを確認するために、 docker images コマンドを実行
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04_20230307_0600 8e425ee09191 38 seconds ago 66MB
# 新しいDockerイメージを使用して、新しいDockerコンテナを起動
# docker run -it {new_image_name} bash
$ docker run -it ubuntu:20.04_20230307_0600 bash
#
# su - conti
$ whoami
conti
$
以上、でLinuxで作業可能な環境が構築できました。
コマンドを打ってみる
dateコマンド
# 現在時刻を表示
$ date
Thu Feb 16 08:55:26 UTC 2023
# フォーマット指定
# %u : 曜日
$ date '+%Y%m%d %u %H:%M:%S'
20230216 4 08:56:48
処理の流れ
Terminal # date コマンドを打つ
↓
bash # dateコマンドを解釈
↓
bash # dateというコマンドを探す
↓
カーネル # Linuxのカーネルにdateコマンドの実行を指示
↓
カーネル # Linuxのカーネルがdateコマンドを実行
↓
bash # 結果をbashが受け取る
↓
Terminal # 結果をTerminalが受け取る
↓
Terminal # 標準出力として結果が表示される