コース内容#
ディレクトリ構造#
-
-
-
最上部の root はルートディレクトリ / であり、root ユーザーではない
-
さらに、ルートディレクトリ / の下には root フォルダがあり、これは root ユーザーのホームディレクトリである
- root ユーザー以外の他のユーザーは入ることができない
-
bin、sbin バイナリ /[システムの]
-
etc 設定ファイルフォルダ【グローバル】
-
opt オプションであり、存在意義はあまり強くない、ユーザーがファイルを選択的に置くことができる
-
run 現在実行中のファイル、一般的には注目しない
-
var 動的データ
- mail システムの通知メカニズムであり、e-mail ではない
- log ログ【重要、変更しないこと】
- 情報を確認するには一般的に sudo 権限が必要であり、一般的には error、warning の位置を確認する
- last で表示されるログイン情報は wtmp ファイルに保存されている
-
boot カーネルファイル、起動関連
-
home すべてのユーザーのホームの親ディレクトリ
- ユーザーのホームは home の下にあり、パスは ${HOME} または~
-
lib、lib64 ライブラリ
-
media メディア [初期のフロッピーディスク、光ドライブ用、USB メモリはここにはなく、今はあまり使われていない]
-
mnt マウントディレクトリ
- 他のファイルシステムをマウントする、例えば USB メモリ、WSL の CD... ドライブ
- 慣習的なマウントポイントであり、自動的にはマウントされず、他の任意の場所にマウントポイントを持つことができる
-
proc プロセス
- ps で対応するプロセス ID を確認した後、proc ディレクトリ内で対応する ID のディレクトリを見つけることができる
- ディレクトリ内のファイルはほとんどが 0KB であり、実際には存在せず、表示のためだけに存在する
- その中に fd ディレクトリ→ファイルディスクリプタ file descriptor
-
- stdout【#1】に abc を入力すると、端末に表示される
- 10 が何をしているかは一時的に無視する
-
-
tmp 一時フォルダ
- シャットダウンすると空になる、バッファではない
- [PS] tmpfile コマンドで一時ファイルを作成でき、man tmpfile を参照
-
dev デバイスファイル
-
usr ユーザーが自発的にインストールしたファイル
- 一般的には管理者ユーザーであり、通常のユーザーはソフトウェアをインストールできない
- local 共有ファイル [マニュアル...]
起動プロセス#
- 👉電源ボタンを押す
- 👉BIOSを読み込む:ハードウェアの検出 [CPU、ディスク、メモリなど]、設定を読み込む [システムインストール位置など]、MBR を読み込むまで
- BIOS—— 基本入出力システム、CMOS チップに基づくファームウェア
- ファームウェアはソフトウェアとハードウェアに基づき、いくつかのプログラムをチップに固化 [焼き付け] する
- 常に電源が供給されている [ボタン電池]、電源が切れると初期化される
- BIOS—— 基本入出力システム、CMOS チップに基づくファームウェア
- 👉最初のブート可能デバイス内の MBR [マスターブートレコード] を読み込む
- ブートローダーを保存している
- kernel を読み込む:ハードウェアを検出し、ドライバを読み込む
- この時、kernel が BIOS の作業を引き継ぐ
- 👉ブートプログラムを実行する [Ubuntu:Grub]
- 仮想ファイルシステムを読み込み、カーネル kernel を実行する
- 👉ディスクを初期化し、システムイメージファイルを読み込む
- 👉プロセス 1 を起動する
- 以前は init と呼ばれていたが、現在は cnd と呼ばれている
- この時点でシステムには独自の機能がある
- 👉ディスクを読み込み、データをマウントし、さまざまなサービスを起動し、端末に接続する
- 👉【最後に】x windows システムを実行する→グラフィカルインターフェースがある
実行レベル#
Linux では、異なる実行レベルが異なるサービスに対応してシステムを起動する
実行レベル | 意味 | 備考 |
---|---|---|
0 | 停止 | システムシャットダウン |
1 | シングルユーザーモード | システムに問題が発生したときのメンテナンス用、セーフモードに似ている |
2 | マルチユーザー、nfs なし | nfs:ネットワークファイルシステム |
3 | 完全マルチユーザーモード | 完全なマルチユーザーのテキストモード【一般的】 |
4 | 未使用 | システムが保持している、使用されていない |
5 | X11 | 実行レベル 3 の基礎の上に X windows を読み込む |
6 | 再起動 | 再起動 |
- 起動方式の進化
- System V [順次起動]
- Upstart [グループ起動、依存関係のないサービスは同時に起動できる]
- Systemd [すべてのサービスを同時に起動し、依存関係のあるサービスは少し遅れて起動し、さらに同時実行性を向上させる]
- システムの起動速度はシステムの性能を示すものではなく、大型機器の場合、数年に一度再起動する必要があり、ハードウェアをしっかり確認する必要がある
- ホットスタート:必要がない場合、BIOS のハードウェア検出プロセスをスキップして起動速度を上げる
設定ファイル#
ファイルシステム#
- /etc/fstab 起動時にマウントされるファイルシステム
- 静的ファイルシステム情報であり、マウントする必要があるシステムディスクを指示する
- 例えば:会社のマシンに他のディスクをマウントする必要がある場合、ここで設定できる
- /etc/mtab 現在マウントされているファイルシステム
ユーザーシステム#
- /etc/passwd ユーザー情報
- 通常のユーザーだけでなく、多くのシステムユーザーも含まれている
- ユーザー:パスワード占有符:uid:gid: ユーザー説明:ホームディレクトリ:デフォルトシェル
- 以前はパスワード占有符にパスワードが保存されていたが、現在は👇に保存されている
- /etc/shadow ユーザーパスワード
- 表示されるパスワードは暗号化されており、復号化コストは取得の価値を上回る可能性がある
- /etc/group グループ情報
- /etc/gshadow グループパスワード
- 基本的に使用しない、root が全体のシステムを管理すればよく、グループに細分化する必要はない
- /etc/sudoers Sudoer リスト
- % はグループを表す
- 自分で追加できる
シェル#
- echo ${SHELL} でそのユーザーのシェルタイプを確認する
- /etc/shells 使用可能なシェルのリスト
【zsh に関して】
- /etc/zsh/zprofile ユーザーの優先設定【グローバル】
- ⭐man zsh で検索 ——FILES を見れば、すべての zsh の設定可能なファイルパスが表示される
- 例:4 つのグローバル設定、4 つのユーザー設定で echo "In ..."
- ユーザーが zsh にログインする際、表示順序は以下の通り:
-
- 順序:zshenv→zprofile→zshrc→zlogin、最初はグローバル (G)、次にユーザー (L)
- [PS] ユーザー設定ファイル
- $ZDOTDIR/.zshenv
- $ZDOTDIR/.zprofile
- $ZDOTDIR/.zshrc
- $ZDOTDIR/.zlogin
- $ZDOTDIR/.zlogout
- $ZDOTDIR—— デフォルトではユーザーのホームディレクトリ
システム環境#
- /etc/environment 環境変数
- PATH 環境変数:${PATH}
- which コマンドはこの【PATH 環境変数】内のパスでコマンドに対応するファイルを探す【ファイルは実行可能である必要がある】
- ⭐PATH に "." を追加:PATH=${PATH}:.
- PATH 変数の後に:. を直接追加することで接続できる
- また、export PATH=${PATH}:. を使用することもできる
- ❗ ただし、どちらの方法もメモリ内で変更され、シェルを再接続すると消えてしまう
- 詳細は次の 2 節 —— 環境変数を参照
- /etc/updatedb.conf ファイル検索データベースの設定情報
- updatedb データベースを更新する [更新後、作成されたばかりのファイルが locate で見つかるようになるが、データベースはリアルタイムで更新されない]
- /etc/issue、/etc/issue.net 発行情報、[リモートログイン時の表示]
- /etc/os-release より詳細なシステム情報
ネットワーク#
- ⭐/etc/hosts ホストリスト
- 静的 DNS とも呼ばれ、対応関係を書くことができる
- ❗ ドメイン名 [ホスト名]→IP アドレス
- [自分の理解] Windows の hosts に似ており、名前の解決はまず hosts を探し、その後 DNS を使用する
- /etc/hostname ホスト名
- ①sudo 権限が必要で、新しいホスト名に変更する
- ②ホストを再起動;または [hostname 新しいホスト名] を使用してメモリ内のホスト名を一時的に変更する、そうでなければ変更しても環境内のホスト名は変わらない
- ③再接続すればよい
- [自分の理解] 第①ステップで変更されるのは実際のホスト名であり、第②ステップの hostname はメモリ内のホスト名を一時的に変更するために使用され、直接再起動することでもメモリをリフレッシュできる
- ⭐/etc/resolv.conf ドメイン名解決サーバーアドレス
- DNS 動的ドメイン名サーバー
- ❗ ドメイン名→IP アドレス
- /etc/network/interfaces ネットワークカード設定ファイル、まずは自分で確認する
環境変数#
- env すべての環境変数、通常は大文字で命名される
- $ に環境変数の名前を付けることで呼び出すことができる
- PATH 実行可能ファイルのフォルダのパス
- OLDPWD 前回の作業ディレクトリ
- HISTSIZE 保存される履歴のサイズ [入力コマンド]
- bash はデフォルトで 1000 行を保存する
- zsh は一時的にこの変数を持たない
- history を使用して入力したコマンドの履歴を確認でき、無痕ブラウジングで自分で検索することができる
- export
- export PATH=${PATH}:.
- PATH=${PATH}:. と同等である
- 環境変数に直接値を割り当てるよりも、export の方が規範的である
- これはメモリ内で変更されるものであり、この変数を固定化して毎回接続時に有効にするには、任意の【設定ファイル】に上記の文を追加する必要がある。zsh の設定ファイルについては上記 3 節 —— シェルを参照
- [PS] set を使用してすべてのローカル定義された環境変数を確認できる
ソフトウェア管理#
- ソースコードのインストール
git clone XXXX # ソースコードをダウンロード
cd XXX
make # コンパイル
make install # インストール
- ソフトウェアパッケージ管理システム
- ⭐apt を推奨:apt-get と apt-cache の高級統合版と理解できる
- man apt でその説明を見ることができる:高級で、apt-get、apt-cache よりもインタラクティブ性が高い
- 例:
授業中の練習#
コードデモ#
追加の知識点#
- シェルで宣言された変数はメモリに保存され、プロセス空間内にあり、シェルを閉じて再度開くと変数は消える
- すべてがファイルであるという概念を過剰に理解しないでください。ファイルは静的であり、プロセスがファイルを維持し、動的にする必要がある
- 変数はプロセス空間に保存される
- ps を使用してプロセス ID を見ることができる
- ⭐ssh を使用してニックネームでクラウドホストにログインする、例えば ssh Ten、WSL 上の効果は以下の通り👇
-
- WSL または MacOS に関して
- ①自分のマシンの /etc/hosts にクラウドホストの IP を追加し、ニックネーム Ten に対応させる、例えば:45.123.111.1 Ten
- ②自分のマシンにユーザーを作成し、ログインしたいクラウドホストのユーザーと一致させる、例えば:hz [自分のマシンのユーザー]、hz [クラウドホストのユーザー]
- ③この時、自分のマシンで ssh Ten を実行し、パスワードを入力すればログインできる
- ❗ 再起動後は無効になる [WSL 2 に関して、他のシステムの方法は自分で検索し、WSL 1 では chattr できない]
- sudo chattr +i /etc/hosts を使用して /etc/hosts を読み取り専用にし、再起動してもリセットされないようにする
- 再度変更するには:sudo chattr -i /etc/hosts
- [PS] ssh-copy-id を使用してパスワードなしでログインすることもでき、tldr ssh-copy-id でヘルプ説明を確認できる
-
- ドメイン名と IP は多対多であり、負荷分散を行うことができる
思考点#
ヒント#
- [bash 下] /etc/profile ユーザーの優先設定【グローバル】 [デフォルトシェルが bash の場合、最初に実行されるファイル]