Skip to content

Linux 基礎

はじめに

サーバーの世界において、Linux は絶対的な主役です。 世界中のサーバーの 90% 以上が Linux を実行しており、毎日使っている WeChat から Google 検索まで、その裏側はすべて Linux が支えています。開発者にとって Linux の基礎を習得することは、選択肢ではなく必修科目です。

この記事で学べること

この章を終えると、次のことが身につきます:

  • ファイルシステム:Linux のディレクトリ構造と「すべてはファイル」という哲学を理解
  • 基本的なコマンド:ファイル操作、テキスト処理、プロセス管理などのコアコマンドを習得
  • パーミッションモデル:ユーザー、グループ、権限の概念を理解
  • Shell の基礎:パイプ、リダイレクト、環境変数などの Shell のコア概念を理解
  • 実践スキル:ログ確認、プロセストラブルシューティング、ネットワーク診断などの運用の基本を習得
内容コア概念
第1章ファイルシステムディレクトリ構造、すべてはファイル
第2章基本コマンドファイル、テキスト、プロセス、ネットワーク
第3章パーミッションモデルユーザー、グループ、rwx、sudo
第4章Shell の基礎パイプ、リダイレクト、変数、スクリプト
第5章実践シナリオログトラブルシューティング、パフォーマンス診断

1. ファイルシステム:すべてはファイル

Linux の最も核心的な哲学の一つはすべてはファイルです。通常のファイルもファイル、ディレクトリもファイル、ハードディスクもファイル、さらにはネットワーク接続やプロセス情報もファイルです。この統一的な抽象化により、同じツールセット(読み取り、書き込み、権限制御)でほぼすべてのシステムリソースを操作できます。

Linux Filesystem Hierarchy
Click a directory to see what it is used for
📁/Root directory
⚙️/binEssential commands
📋/etcConfiguration files
🏠/homeUser home directories
📊/varVariable data
🗑️/tmpTemporary files
📦/usrUser programs
🔍/procProcess information
🔌/devDevice files
/
The starting point of the whole filesystem. Every directory and file begins here. In Linux, everything is a file, including devices and process information exposed through this directory tree.

ディレクトリ構造の覚え方

Linux のファイルシステムを逆さまの木として想像してください:

/                    ← ルートディレクトリ(木の根)
├── home/            ← ユーザーのホーム(あなたのファイルはここにある)
├── etc/             ← 設定ファイル(システムの「設定パネル」)
├── var/             ← 変化するデータ(ログ、キャッシュ)
├── usr/             ← ユーザーがインストールしたプログラム
├── tmp/             ← 一時ファイル(再起動で消える)
├── proc/            ← プロセス情報(仮想的、ディスクを消費しない)
├── dev/             ← デバイスファイル(ハードディスク、ターミナル)
├── bin/             ← 基本コマンド(ls、cp、mv)
├── sbin/            ← システム管理コマンド(root 権限が必要)
├── opt/             ← サードパーティソフトウェア
└── root/            ← root ユーザーのホームディレクトリ

パスの2つの書き方

タイプフォーマット説明
絶対パス/ から始まる/home/alice/code/app.jsルートディレクトリから出発、曖昧さがない
相対パスカレントディレクトリから始まる./code/app.js または ../config. はカレントディレクトリ、.. は親ディレクトリ

「すべてはファイル」の威力

CPU 情報を知りたい?ファイルを読む:cat /proc/cpuinfo メモリ使用量を知りたい?ファイルを読む:cat /proc/meminfo 乱数を生成したい?ファイルを読む:cat /dev/urandom 出力を破棄したい?ファイルに書く:echo "no thanks" > /dev/null

専用の API は不要。ファイルの読み書きだけで十分です。これが Unix 哲学の優雅さです。


2. 基本コマンド

Linux コマンドは統一されたフォーマットに従います:コマンド [オプション] [引数]。例えば ls -la /home では、ls がコマンド、-la がオプション、/home が引数です。

Linux Command Cheat Sheet
Browse common commands and examples by category
lsList files and directories
ls -la /home
cdChange directory
cd /var/log
cpCopy files
cp -r src/ backup/
mvMove or rename
mv old.txt new.txt
rmRemove files
rm -rf dist/
mkdirCreate directories
mkdir -p src/components
findFind files
find . -name "*.js" -type f

最もよく使う10個のコマンド

もし10個のコマンドしか覚えられないなら、これらを覚えてください:

コマンド用途覚え方
lsファイル一覧表示list
cdディレクトリ移動change directory
catファイル内容表示concatenate
grepテキスト検索global regular expression print
findファイル検索そのまま find
psプロセス表示process status
tail -fリアルタイムログ監視ファイルの「末尾」を見る、-f は follow
chmod権限変更change mode
curlHTTP リクエスト送信client URL
sshリモートログインsecure shell

コマンド組み合わせの芸術

Linux の強さは個々のコマンドではなく、コマンドの組み合わせにあります。パイプ | で複数のシンプルなコマンドを繋ぎ、複雑な問題を解決します:

bash
# CPU 使用率が最も高い5つのプロセスを見つける
ps aux --sort=-%cpu | head -6

# ログで最も頻繁に出現するエラータイプを集計
grep "ERROR" app.log | awk '{print $4}' | sort | uniq -c | sort -rn | head -10

# 100MB より大きいファイルを検索
find / -size +100M -type f 2>/dev/null

# ログのエラーをリアルタイムで監視
tail -f /var/log/app.log | grep --color "ERROR"

Unix 哲学

「一つのことを、しっかりと。」各コマンドは一つの機能だけを担当し、パイプの組み合わせで複雑な操作を実現します。これが Linux コマンドがシンプルな理由です — それらはスイスアーミーナイフではなく、組み立てブロックなのです。


3. パーミッションモデル

Linux はマルチユーザーシステムであり、パーミッションモデルはセキュリティの基盤です。すべてのファイルには3つの権限セットがあり、所有者(Owner)グループ(Group)その他(Others) が何をできるかを制御します。

ls -l の出力を読む

bash
$ ls -l app.js
-rwxr-xr-- 1 alice developers 2048 Jan 15 10:30 app.js
│├──┤├──┤├──┤
          └── ファイルサイズ
     └── グループ
     └── 所有者
   └── その他の権限:r-- (読み取り専用)
   └── グループの権限:r-x (読み取り+実行)
 └── 所有者の権限:rwx (読み取り+書き込み+実行)
└── ファイルタイプ:- 通常ファイル、d ディレクトリ、l リンク

3種類の権限操作

権限文字数字ファイルに対する意味ディレクトリに対する意味
読み取りr4ファイルの内容を見るディレクトリの内容を一覧表示(ls)
書き込みw2ファイルの内容を変更ディレクトリ内にファイルを作成/削除
実行x1プログラム/スクリプトを実行ディレクトリに入る(cd)
Linux Permission Decoder
Enter a numeric permission and inspect what it means
-rwxr-xr-x
Owner
Group
Others
Common permission combinations
644Normal file: owner can read/write, others read-only
755Executable file or directory: owner has full access
600Private file: only owner can read/write
777Fully open: not recommended

数値パーミッションの早見計算

3つの数字はそれぞれ Owner、Group、Others の権限を表し、各数字は r(4) + w(2) + x(1) の合計です:

chmod 755 script.sh
  7 = rwx (4+2+1)  → 所有者:読み取り+書き込み+実行
  5 = r-x (4+0+1)  → グループ:読み取り+実行
  5 = r-x (4+0+1)  → その他:読み取り+実行
よくあるパーミッション意味典型的な用途
644rw-r--r--通常ファイル(所有者は書き込み可能、その他は読み取り専用)
755rwxr-xr-x実行可能ファイル/ディレクトリ
600rw-------プライベートファイル(SSH 鍵など)
777rwxrwxrwx全員が読み書き実行可能(危険、使用を避ける)

sudo:一時的にスーパーユーザー権限を取得

通常ユーザーの権限は限られており、一部の操作には root 権限が必要です。sudo を使うと一時的に root としてコマンドを実行できます:

bash
# 通常ユーザーはシステム設定を変更できない
$ vim /etc/nginx/nginx.conf
# Permission denied

# sudo で一時的に権限を昇格
$ sudo vim /etc/nginx/nginx.conf
# パスワードを入力すると編集可能

# root ユーザーに切り替え(慎重に使用)
$ sudo su -

最小権限の原則

権限問題を解決するために chmod 777 を使ってはいけません。それはドアの鍵を外すようなものです。正しいアプローチは、誰がどの権限を必要としているかを明確にし、正確に付与することです。同様に、root として長時間操作せず、必要な時だけ sudo を使ってください。


4. Shell の基礎

Shell はあなたと Linux カーネルの間の「通訳」です。あなたがコマンドを入力すると、Shell が解釈してカーネルに実行を渡します。最も一般的な Shell は Bash(ほとんどの Linux ディストリビューションのデフォルト)と Zsh(macOS のデフォルト)です。

パイプとリダイレクト

Shell の最も強力な2つの機能です:

記号名前機能
``パイプ前のコマンドの出力を次のコマンドの入力として渡す
>出力リダイレクト出力をファイルに書き込む(上書き)echo "hello" > file.txt
>>追記リダイレクト出力をファイルの末尾に追加echo "world" >> file.txt
<入力リダイレクトファイルから入力を読み取るwc -l < file.txt
2>エラーリダイレクトエラーをファイルに書き込むcmd 2> error.log
2>&1出力の統合エラーと標準出力を統合cmd > all.log 2>&1

環境変数

環境変数は Shell の「グローバル設定」であり、コマンドの動作に影響します:

bash
# すべての環境変数を表示
env

# 特定の変数を表示
echo $PATH
echo $HOME

# 一時的な設定(現在の Shell のみ有効)
export API_KEY="abc123"

# 永続的な設定(設定ファイルに書き込む)
echo 'export API_KEY="abc123"' >> ~/.bashrc
source ~/.bashrc   # 設定を即座に反映
よく使う変数意味例の値
$PATHコマンド検索パス/usr/local/bin:/usr/bin:/bin
$HOMEユーザーのホームディレクトリ/home/alice
$USER現在のユーザー名alice
$PWD現在の作業ディレクトリ/var/log
$SHELL現在使用している Shell/bin/bash

Shell スクリプト入門

複数のコマンドを一つのファイルに書き込むと、それが Shell スクリプトになります。自動化運用の起点です:

bash
#!/bin/bash
# deploy.sh - シンプルなデプロイスクリプト

APP_DIR="/opt/myapp"
LOG_FILE="/var/log/deploy.log"

echo "$(date) - デプロイ開始..." >> $LOG_FILE

# 最新のコードをプル
cd $APP_DIR && git pull origin main

# 依存関係をインストール
npm install --production

# サービスを再起動
pm2 restart myapp

echo "$(date) - デプロイ完了" >> $LOG_FILE
bash
# スクリプトに実行権限を付与して実行
chmod +x deploy.sh
./deploy.sh

スクリプトのデバッグのコツ

スクリプトの先頭に set -ex を追加:-e はエラー発生時にスクリプトを即座に終了し(継続せず)、-x は実行される各コマンドを出力します(トラブルシューティングに便利)。この2つのオプションは本番スクリプトでほぼ標準です。


5. 実践シナリオ

理論が終わったら、開発で最もよく遭遇する実践シナリオを見てみましょう。

5.1 ログトラブルシューティング

サービスに問題が発生したら、まずログを確認します。以下はログトラブルシューティングの一般的なアプローチです:

bash
# 1. リアルタイムでログを追跡(最もよく使う)
tail -f /var/log/app/error.log

# 2. 特定の時間帯のエラーを検索
grep "2024-01-15 14:" error.log | grep "ERROR"

# 3. 時間あたりのエラー数を集計
grep "ERROR" app.log | awk '{print substr($1,1,13)}' | uniq -c

# 4. 最新の100行のログを表示
tail -100 app.log

# 5. 複数のログファイルで検索
grep -r "OutOfMemory" /var/log/app/

5.2 プロセストラブルシューティング

アプリケーションのフリーズ、CPU の急上昇、メモリリーク — これらはすべてプロセスから調べる必要があります:

bash
# CPU 使用率が最も高いプロセスを表示
ps aux --sort=-%cpu | head -10

# メモリ使用量が最も高いプロセスを表示
ps aux --sort=-%mem | head -10

# 特定のプロセスを検索
ps aux | grep "node"

# プロセスの詳細情報を表示(スレッドを含む)
top -Hp <PID>

# プロセスが開いているファイルを表示
lsof -p <PID>

# プロセスを正常に終了(SIGTERM)
kill <PID>

# 強制終了(SIGKILL、最後の手段)
kill -9 <PID>

5.3 ネットワーク診断

サービスに接続できない?ネットワークの問題かアプリケーションの問題かをまず確認します:

bash
# ターゲットが到達可能かテスト
ping -c 4 google.com

# ポートが開いているか確認
telnet db-server 3306
# または nc を使用
nc -zv db-server 3306

# ローカルマシンでリッスンしているポートを表示
ss -tlnp
# または
netstat -tlnp

# DNS 解決チェック
dig api.example.com
nslookup api.example.com

# HTTP エンドポイントをテスト
curl -v http://localhost:3000/health

# ネットワーク接続統計を表示
ss -s

5.4 ディスク容量のトラブルシューティング

ディスクフルは本番環境で最もよくある問題の一つです:

bash
# 各パーティションの使用状況を表示
df -h

# 最も容量を占めているディレクトリを見つける
du -sh /* 2>/dev/null | sort -rh | head -10

# 大きなディレクトリをさらに詳しく
du -sh /var/log/* | sort -rh | head -10

# 大きなファイル(>100MB)を検索
find / -type f -size +100M 2>/dev/null | head -20

# よくある容量の消費をクリーンアップ
# 古いログをクリーンアップ
sudo journalctl --vacuum-size=500M
# 未使用の Docker イメージをクリーンアップ
docker system prune -a

本番トラブルシューティングの公式

「一にログ、二にプロセス、三にネットワーク、四にディスク」。本番環境の問題の 90% はこの4つのステップで根本原因を特定できます。習慣になれば、トラブルシューティングの効率は劇的に向上します。


まとめ

Linux は開発者にとって必須のスキルであり、基礎を習得すれば、日常の開発と運用シナリオの大部分に対応できます。

この章の重要ポイントを振り返ります:

  1. すべてはファイル:Linux はファイル抽象化により、ハードウェア、プロセス、ネットワークなどのリソースへのアクセスを統一
  2. コマンドの組み合わせ:個々のコマンドはシンプルだが、パイプ | で組み合わせることで真の力を発揮
  3. パーミッションモデル:Owner/Group/Others × Read/Write/Execute、数字(755 など)で素早く設定
  4. Shell の基礎:パイプ、リダイレクト、環境変数、スクリプトは自動化の基盤
  5. 実践的トラブルシューティング:ログ → プロセス → ネットワーク → ディスク、4つのステップでほとんどの本番問題を特定

参考文献