この記事の対象読者
- プログラミングは始めたけど、Linuxは「なんとなく」で使っている方
- Dockerやクラウドを触り始めて「Linuxの知識が足りない」と感じた方
- WindowsやmacOSしか使ったことがないが、サーバーサイドに興味がある方
この記事で得られること
- Linuxの正体: カーネルとディストリビューションの違いを正しく理解できる
- 実践力: ファイルシステム、パーミッション、プロセス管理を手を動かして身につけられる
- トラブル対応力: 現場でよく遭遇するエラーの原因と対処法がわかる
この記事で扱わないこと
- Linuxカーネルのソースコード解析やカーネルモジュール開発
- 特定ディストリビューション(Ubuntu、CentOS等)の詳細な差異比較
- デスクトップLinuxのGUI設定やテーマカスタマイズ
1. Linuxとの出会い
「Linuxって何?」と聞かれて、自信を持って答えられますか?
私がLinuxに初めて触れたのは、AI開発でGPU環境を構築しようとした時でした。CUDAのセットアップガイドを開いたら、大半がLinux前提の手順。Dockerコンテナの中身も結局Linux。「サーバーはLinux」「コンテナはLinux」「組み込みもLinux」と、どこを掘ってもLinuxが出てくる。
なのに、自分が知っていたのはlsとcdくらい。
「わかったつもり」が一番厄介だと痛感した瞬間でした。ファイルのパーミッションでPermission deniedが出ても「とりあえずsudo」で乗り切る。プロセスが暴走してもkillの仕組みを理解せずに叩く。そんな状態では、いつか必ず詰みます。
Linuxを一言で説明するなら、「世界中のサーバー、スマホ、IoT機器、スパコンの中で黙々と働いている、オープンソースのOS」です。料理に例えるなら、Linuxカーネルは「レシピ」で、Ubuntu等のディストリビューションは「そのレシピで作られた完成品の料理」。同じレシピでも、シェフ(開発コミュニティ)によって味付けが違う、というイメージです。
ここまでで、Linuxのざっくりしたイメージが掴めたでしょうか。次は、この記事で使う用語を整理しておきましょう。
2. 前提知識の確認
本題に入る前に、この記事で頻出する用語を確認します。「知ってるよ」という方も、認識のズレがないか軽くチェックしてみてください。
2.1 カーネル(Kernel)とは
OSの「心臓部」です。ハードウェア(CPU、メモリ、ストレージ等)とソフトウェアの仲介役を担います。アプリケーションが「ファイルを読みたい」「ネットワーク通信したい」と要求すると、カーネルがハードウェアを操作して実現します。
Linuxカーネルの最新安定版は6.19(2026年2月8日リリース)です。Linus Torvalds氏は次期バージョンを7.0にすると発表しました。「指とつま先で数えられなくなった」というのが理由で、技術的な大変更ではありません。
2.2 ディストリビューション(Distribution)とは
カーネル単体では使い物になりません。パッケージマネージャ、シェル、各種ツールをセットにして「すぐ使える状態」にしたのがディストリビューション(通称ディストロ)です。Ubuntu、Debian、Fedora、Arch Linux、CentOS Stream等が代表例です。
2.3 シェル(Shell)とは
ユーザーがカーネルと対話するためのインターフェースです。コマンドを入力すると、シェルがそれを解釈してカーネルに伝えます。bash(Bourne Again Shell)が最も一般的で、最近はzshやfishも人気があります。
2.4 パッケージマネージャとは
ソフトウェアのインストール・更新・削除を管理するツールです。Windowsで言えば「Microsoft Store + Windows Update」を統合したようなもの。ディストロによって異なります(apt、dnf、pacman等)。
これらの用語が押さえられたら、Linuxの背景を見ていきましょう。
3. Linuxが生まれた背景
3.1 始まりは一人の大学生
1991年、フィンランドのヘルシンキ大学に在籍していたLinus Torvalds(当時21歳)が、自分用のOS作りを始めたのがLinuxの起源です。当時、UNIX系OSはライセンス料が高額で学生には手が出ませんでした。
Torvaldsがニュースグループに投稿した有名な一文:
「私はフリーのOSを作っています(386(486)AT互換機向けの、単なる趣味です。GNUのように大きくてプロフェッショナルなものにはならないでしょう)」
この「単なる趣味」が、33年後の2026年現在、世界のサーバーの96%以上、スマートフォン(Android)の72%以上、クラウドインスタンスの90%以上で動作するOSに成長しました。
3.2 なぜLinuxがここまで普及したのか
| 要因 | 説明 |
|---|---|
| オープンソース | 誰でもソースコードを読み、改変し、再配布できる(GPLv2ライセンス) |
| 無料 | ライセンス料がゼロ。企業もコスト削減のために採用 |
| 安定性 | 数年間再起動なしで稼働できるサーバーが珍しくない |
| セキュリティ | 世界中の開発者が脆弱性を発見・修正。パッチ適用が迅速 |
| 柔軟性 | 組み込み機器からスパコンまで、あらゆる規模に対応 |
| コミュニティ | 5,000〜6,000人のカーネル開発者、200以上の企業が貢献 |
「Linuxは無料だから品質が低い」という誤解がまだ根強いですが、実態は真逆です。Google、Microsoft、Amazon、Intel、Red Hatなど世界有数の企業がカーネル開発に人員と資金を投じています。
背景がわかったところで、基本的な仕組みを見ていきましょう。
4. 基本概念と仕組み
4.1 Linuxのアーキテクチャ
Linuxの構造は、大きく4層に分かれています。
┌──────────────────────────────────┐
│ ユーザーアプリケーション │ ← ブラウザ、エディタ、自作プログラム等
├──────────────────────────────────┤
│ シェル / GUI │ ← bash, zsh, GNOME, KDE等
├──────────────────────────────────┤
│ システムコール(syscall) │ ← カーネルへの「お願い窓口」
├──────────────────────────────────┤
│ Linuxカーネル │ ← プロセス管理, メモリ管理, デバイスドライバ等
├──────────────────────────────────┤
│ ハードウェア │ ← CPU, RAM, ストレージ, NIC, GPU等
└──────────────────────────────────┘
アプリケーションがファイルを読み書きしたい場合、直接ハードウェアを操作するのではなく、システムコール(syscall)を通じてカーネルに依頼します。カーネルがハードウェアを安全に操作して結果を返す。この仕組みにより、アプリ同士の干渉やハードウェアの破壊を防いでいます。
4.2 ファイルシステム階層(FHS)
WindowsではC:\Users\のようにドライブレターがありますが、Linuxには存在しません。すべてがルート(/)を起点とするツリー構造です。
| ディレクトリ | 役割 | 覚え方 |
|---|---|---|
/ |
ルート。すべての起点 | 「木の根っこ」 |
/home |
ユーザーのホームディレクトリ | WindowsのC:\Users\
|
/etc |
設定ファイル置き場 | Editable Text Configuration |
/var |
可変データ(ログ等) | Variable |
/tmp |
一時ファイル | Temporary |
/usr |
ユーザー用プログラム | Unix System Resources |
/bin |
基本コマンド | Binaries |
/sbin |
システム管理コマンド | System Binaries |
/dev |
デバイスファイル | Devices |
/proc |
プロセス情報(仮想FS) | Process |
/opt |
オプションソフトウェア | Optional |
豆知識: Linuxでは「すべてがファイル」です。ハードディスクも(/dev/sda)、キーボードも(/dev/input/)、プロセス情報も(/proc/)ファイルとして扱われます。この統一的な抽象化がLinuxの美しさであり強みです。
4.3 パーミッション(権限管理)
Linuxのパーミッションは、誰が・何をできるかを3x3のマトリクスで管理します。
-rwxr-xr-- 1 user group 4096 Mar 1 10:00 script.sh
│└┬┘└┬┘└┬┘
│ │ │ └── Other(その他): 読み取りのみ
│ │ └────── Group(グループ): 読み取り+実行
│ └────────── Owner(所有者): 読み取り+書き込み+実行
└──────────── ファイルタイプ(-: 通常ファイル, d: ディレクトリ)
| 記号 | 数値 | 意味 |
|---|---|---|
r |
4 | 読み取り(Read) |
w |
2 | 書き込み(Write) |
x |
1 | 実行(eXecute) |
- |
0 | 権限なし |
よく使う組み合わせ:
| 数値 | 記号 | 用途 |
|---|---|---|
755 |
rwxr-xr-x |
実行可能スクリプト(所有者フル、他は読み+実行) |
644 |
rw-r--r-- |
一般的なファイル(所有者が読み書き、他は読みのみ) |
600 |
rw------- |
秘密鍵など(所有者のみ読み書き) |
777 |
rwxrwxrwx |
全員フルアクセス(本番環境では絶対NG) |
chmod 777はトラブルシューティングで「とりあえず」やりがちですが、セキュリティホールの原因になります。本番環境では最小権限の原則を守りましょう。
4.4 プロセスとシグナル
Linuxで動作するすべてのプログラムは「プロセス」として管理されます。各プロセスには一意の**PID(Process ID)**が割り振られます。
主要なシグナル:
| シグナル | 番号 | 動作 | 使い場面 |
|---|---|---|---|
SIGTERM |
15 | 正常終了を要求 |
kill <PID>(デフォルト) |
SIGKILL |
9 | 強制終了(拒否不可) |
kill -9 <PID> どうしても止まらない時 |
SIGINT |
2 | 割り込み | Ctrl+C |
SIGTSTP |
20 | 一時停止 | Ctrl+Z |
SIGHUP |
1 | 設定再読み込み | デーモンの設定変更時 |
私がハマったポイント: 暴走したPythonスクリプトをkill -9で殺したら、一時ファイルが残ってディスクを圧迫していたことがあります。まずSIGTERM(15)を送って正常終了を試み、それでもダメならSIGKILL(9)という順序を守るのが大事です。
基本概念が理解できたところで、実際にコードを書いて動かしてみましょう。
5. 実践:実際に使ってみよう
5.1 環境構築
この記事の実践パートは、以下の環境で動作確認しています。
| 項目 | バージョン |
|---|---|
| OS | Ubuntu 24.04.4 LTS(Noble Numbat) |
| カーネル | 6.17(HWEカーネル) |
| シェル | bash 5.2 |
| Python | 3.12 |
Windowsの方は**WSL2(Windows Subsystem for Linux)**でUbuntuを導入すれば、同じ環境を再現できます。wsl --install -d Ubuntu-24.04 で一発です。
5.2 環境別の設定ファイル(.bashrc)
シェルの設定ファイル.bashrcは、用途に応じて使い分けると効率が上がります。以下の3パターンを用意しました。
開発環境用(~/.bashrc.dev)
# ~/.bashrc.dev - 開発環境用(このままコピーして使える)
# 使い方: echo 'source ~/.bashrc.dev' >> ~/.bashrc
# --- プロンプトのカスタマイズ(ブランチ名表示) ---
parse_git_branch() {
git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
export PS1='\[\033[01;32m\]\u@dev\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]$(parse_git_branch)\[\033[00m\]\$ '
# --- エイリアス(開発効率化) ---
alias ll='ls -alF --color=auto'
alias la='ls -A --color=auto'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias ports='ss -tulnp'
alias myip='curl -s ifconfig.me'
# --- Python仮想環境の自動有効化 ---
activate_venv() {
if [ -f "./venv/bin/activate" ]; then
source ./venv/bin/activate
elif [ -f "./.venv/bin/activate" ]; then
source ./.venv/bin/activate
fi
}
cd() {
builtin cd "$@" && activate_venv
}
# --- ヒストリー設定 ---
HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoreboth:erasedups
shopt -s histappend
# --- 開発用環境変数 ---
export EDITOR=vim
export LANG=ja_JP.UTF-8
export PYTHONDONTWRITEBYTECODE=1
本番サーバー用(~/.bashrc.prod)
# ~/.bashrc.prod - 本番サーバー用
# 特徴: 安全性重視、操作ログ記録、誤操作防止
# --- プロンプト(赤色で本番であることを明示) ---
export PS1='\[\033[01;31m\][PROD]\[\033[00m\] \[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
# --- 危険コマンドの安全装置 ---
alias rm='rm -i' # 削除前に確認
alias cp='cp -i' # 上書き前に確認
alias mv='mv -i' # 移動前に確認
alias chmod='chmod --preserve-root' # / への再帰的変更を防止
alias chown='chown --preserve-root'
# --- 操作ログの記録 ---
export PROMPT_COMMAND='echo "$(date "+%Y-%m-%d %H:%M:%S") $(whoami) $(pwd) $(history 1)" >> /var/log/user_commands.log'
# --- タイムアウト設定(放置セッション対策) ---
export TMOUT=1800 # 30分で自動ログアウト
# --- 本番環境変数 ---
export LANG=C.UTF-8
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
テスト/CI環境用(~/.bashrc.test)
# ~/.bashrc.test - テスト/CI環境用
# 特徴: 非対話的処理向け、ログ出力最適化
# --- プロンプト(黄色でテスト環境を明示) ---
export PS1='\[\033[01;33m\][TEST]\[\033[00m\] \u@\h:\w\$ '
# --- テスト用エイリアス ---
alias pytest='python -m pytest -v --tb=short'
alias lint='python -m flake8 --max-line-length=120'
alias typecheck='python -m mypy --ignore-missing-imports'
alias coverage='python -m pytest --cov=. --cov-report=html'
# --- テスト用環境変数 ---
export ENV=test
export LOG_LEVEL=DEBUG
export DATABASE_URL="sqlite:///test.db"
export PYTHONPATH="$(pwd)/src:$PYTHONPATH"
# --- CI用ヘルパー ---
ci_test() {
echo "=== Lint Check ==="
lint || return 1
echo "=== Type Check ==="
typecheck || return 1
echo "=== Unit Tests ==="
pytest || return 1
echo "=== All checks passed ==="
}
5.3 基本操作の実践
まずは必須コマンドを実際に叩いてみましょう。
#!/usr/bin/env bash
# linux_basics.sh - Linux基本操作デモスクリプト
# 実行方法: bash linux_basics.sh
set -euo pipefail # エラー時に即停止
echo "=== 1. システム情報の確認 ==="
echo "カーネルバージョン: $(uname -r)"
echo "ディストリビューション: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "ホスト名: $(hostname)"
echo "現在のユーザー: $(whoami)"
echo "シェル: $SHELL"
echo ""
echo "=== 2. ファイルシステム操作 ==="
# 作業ディレクトリの作成
WORK_DIR="/tmp/linux_practice_$$"
mkdir -p "$WORK_DIR"/{src,config,logs}
echo "作業ディレクトリを作成: $WORK_DIR"
tree "$WORK_DIR" 2>/dev/null || find "$WORK_DIR" -type d | head -10
echo ""
echo "=== 3. ファイル操作 ==="
# ファイルの作成と書き込み
echo "Hello, Linux!" > "$WORK_DIR/src/hello.txt"
echo "追記テスト" >> "$WORK_DIR/src/hello.txt"
echo "ファイル内容:"
cat "$WORK_DIR/src/hello.txt"
echo ""
echo "=== 4. パーミッションの確認と変更 ==="
ls -la "$WORK_DIR/src/hello.txt"
chmod 755 "$WORK_DIR/src/hello.txt"
echo "chmod 755 適用後:"
ls -la "$WORK_DIR/src/hello.txt"
echo ""
echo "=== 5. プロセス情報 ==="
echo "現在のプロセス数: $(ps aux | wc -l)"
echo "メモリ使用状況:"
free -h | head -2
echo ""
echo "=== 6. ディスク使用量 ==="
df -h / | head -2
echo ""
# クリーンアップ
rm -rf "$WORK_DIR"
echo "✅ 作業ディレクトリを削除しました"
5.4 実行結果
上記のスクリプトを実行すると、以下のような出力が得られます:
$ bash linux_basics.sh
=== 1. システム情報の確認 ===
カーネルバージョン: 6.17.0-11-generic
ディストリビューション: Ubuntu 24.04.4 LTS
ホスト名: dev-machine
現在のユーザー: hiroki
シェル: /bin/bash
=== 2. ファイルシステム操作 ===
作業ディレクトリを作成: /tmp/linux_practice_12345
/tmp/linux_practice_12345
/tmp/linux_practice_12345/src
/tmp/linux_practice_12345/config
/tmp/linux_practice_12345/logs
=== 3. ファイル操作 ===
ファイル内容:
Hello, Linux!
追記テスト
=== 4. パーミッションの確認と変更 ===
-rw-r--r-- 1 hiroki hiroki 28 Mar 1 10:00 hello.txt
chmod 755 適用後:
-rwxr-xr-x 1 hiroki hiroki 28 Mar 1 10:00 hello.txt
=== 5. プロセス情報 ===
現在のプロセス数: 142
メモリ使用状況:
total used free shared buff/cache available
Mem: 62Gi 12Gi 38Gi 256Mi 12Gi 49Gi
=== 6. ディスク使用量 ===
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 1.8T 234G 1.5T 14% /
✅ 作業ディレクトリを削除しました
5.5 よくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
Permission denied |
実行権限がない、または書き込み権限がない |
chmod +x ファイル名 で実行権限を付与。ディレクトリの場合はls -laで権限を確認 |
command not found |
コマンドが未インストール、またはPATHが通っていない |
which コマンド名で確認 → apt install パッケージ名でインストール。PATHはecho $PATHで確認 |
No space left on device |
ディスク容量不足 |
df -hで容量確認 → du -sh /var/log/*等で大きいファイルを特定 → 不要なログを削除 |
Too many open files |
ファイルディスクリプタの上限超過 |
ulimit -nで現在値確認 → ulimit -n 65535で一時的に引き上げ。恒久対策は/etc/security/limits.confを編集 |
Connection refused |
対象ポートでサービスが起動していない | `ss -tulnp |
bash: ./script.sh: /bin/bash^M: bad interpreter |
WindowsのCRLF改行コードが混入 |
sed -i 's/\r$//' script.sh または dos2unix script.sh で変換 |
あるあるの落とし穴: WindowsのVS Codeで編集したシェルスクリプトをLinuxで実行すると、最後の^M: bad interpreterエラーが頻発します。VS Codeの右下にある「CRLF」を「LF」に切り替えるか、.editorconfigで改行コードを統一しておくと防げます。
5.6 環境診断スクリプト
問題が発生した場合は、以下のスクリプトで環境を診断できます:
#!/usr/bin/env python3
"""
Linux環境診断スクリプト
実行方法: python3 check_linux_env.py
"""
import subprocess
import shutil
import os
import sys
from pathlib import Path
def run_cmd(cmd: str) -> str:
"""コマンドを実行して結果を返す"""
try:
result = subprocess.run(
cmd, shell=True, capture_output=True, text=True, timeout=10
)
return result.stdout.strip()
except (subprocess.TimeoutExpired, Exception):
return "取得失敗"
def check_environment():
"""環境をチェックして問題を報告"""
issues = []
warnings = []
print("=" * 50)
print("Linux環境診断レポート")
print("=" * 50)
# --- 1. OS情報 ---
print("\n📋 OS情報:")
os_info = run_cmd("cat /etc/os-release 2>/dev/null | grep PRETTY_NAME | cut -d'\"' -f2")
kernel = run_cmd("uname -r")
arch = run_cmd("uname -m")
print(f" ディストリビューション: {os_info}")
print(f" カーネル: {kernel}")
print(f" アーキテクチャ: {arch}")
# --- 2. Python環境 ---
print("\n🐍 Python環境:")
print(f" バージョン: {sys.version}")
if sys.version_info < (3, 9):
issues.append(f"Python 3.9以上を推奨(現在: {sys.version_info.major}.{sys.version_info.minor})")
# --- 3. ディスク容量 ---
print("\n💾 ディスク容量:")
disk = shutil.disk_usage("/")
used_percent = (disk.used / disk.total) * 100
print(f" 合計: {disk.total // (1024**3)} GB")
print(f" 使用: {disk.used // (1024**3)} GB ({used_percent:.1f}%)")
print(f" 空き: {disk.free // (1024**3)} GB")
if used_percent > 90:
issues.append(f"ディスク使用率が{used_percent:.1f}%です。容量を確保してください。")
elif used_percent > 80:
warnings.append(f"ディスク使用率が{used_percent:.1f}%です。そろそろ注意が必要です。")
# --- 4. メモリ ---
print("\n🧠 メモリ:")
mem_info = run_cmd("free -h | grep Mem")
if mem_info:
parts = mem_info.split()
print(f" 合計: {parts[1]}, 使用中: {parts[2]}, 空き: {parts[3]}")
# --- 5. 必須コマンドの存在確認 ---
print("\n🔧 必須コマンド:")
essential_cmds = ["git", "curl", "wget", "ssh", "tar", "gzip"]
for cmd in essential_cmds:
path = shutil.which(cmd)
if path:
print(f" ✅ {cmd}: {path}")
else:
warnings.append(f"{cmd}が見つかりません(apt install {cmd} でインストール可能)")
print(f" ❌ {cmd}: 未インストール")
# --- 6. ネットワーク ---
print("\n🌐 ネットワーク:")
dns_check = run_cmd("nslookup google.com 2>/dev/null | grep 'Address' | tail -1")
if dns_check:
print(f" DNS解決: OK")
else:
warnings.append("DNS解決に問題がある可能性があります")
print(f" DNS解決: NG")
# --- 7. ロケール ---
print("\n🌏 ロケール:")
locale = run_cmd("locale | grep LANG=")
print(f" {locale}")
# --- 結果サマリー ---
print("\n" + "=" * 50)
if issues:
print("❌ 問題が見つかりました:")
for issue in issues:
print(f" 🔴 {issue}")
if warnings:
print("⚠️ 注意事項:")
for warning in warnings:
print(f" 🟡 {warning}")
if not issues and not warnings:
print("✅ 環境は正常です!")
print("=" * 50)
if __name__ == "__main__":
check_environment()
実装方法がわかったので、次は具体的なユースケースを見ていきます。
6. ユースケース別ガイド
6.1 ユースケース1: Webサーバーの構築と管理
想定読者: Webアプリを開発していて、本番サーバーの基本操作を覚えたい方
推奨構成: Ubuntu 24.04 LTS + Nginx + systemd
サンプルコード:
#!/usr/bin/env bash
# setup_webserver.sh - Nginx Webサーバーセットアップスクリプト
# 実行方法: sudo bash setup_webserver.sh
set -euo pipefail
echo "=== Nginx Webサーバーセットアップ ==="
# 1. パッケージの更新とインストール
echo "[1/5] パッケージを更新中..."
apt update -qq
apt install -y nginx ufw
# 2. ファイアウォール設定
echo "[2/5] ファイアウォールを設定中..."
ufw allow 'Nginx HTTP'
ufw allow 'OpenSSH'
ufw --force enable
# 3. Nginxの設定ファイルを作成
echo "[3/5] Nginx設定を作成中..."
cat > /etc/nginx/sites-available/myapp << 'EOF'
server {
listen 80;
server_name _;
root /var/www/myapp;
index index.html;
# ログ設定
access_log /var/log/nginx/myapp_access.log;
error_log /var/log/nginx/myapp_error.log;
# セキュリティヘッダー
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
location / {
try_files $uri $uri/ =404;
}
}
EOF
# 4. サイトの有効化
ln -sf /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
# 5. テスト用HTMLの配置
mkdir -p /var/www/myapp
cat > /var/www/myapp/index.html << 'EOF'
<!DOCTYPE html>
<html><head><title>Hello Linux!</title></head>
<body><h1>Linux Web Server is Running!</h1></body>
</html>
EOF
# Nginx設定テスト & 再起動
nginx -t
systemctl restart nginx
systemctl enable nginx
echo "✅ セットアップ完了! http://localhost でアクセスできます"
echo "📊 状態確認: systemctl status nginx"
echo "📁 ログ確認: tail -f /var/log/nginx/myapp_access.log"
6.2 ユースケース2: AI/ML開発環境の構築
想定読者: PyTorchやCUDA環境をLinux上で構築したい方
推奨構成: Ubuntu 24.04 LTS + CUDA Toolkit + Python venv
サンプルコード:
#!/usr/bin/env bash
# setup_ai_env.sh - AI/ML開発環境セットアップスクリプト
# 実行方法: bash setup_ai_env.sh
set -euo pipefail
echo "=== AI/ML開発環境セットアップ ==="
# 1. 基本パッケージのインストール
echo "[1/4] 基本パッケージをインストール中..."
sudo apt update -qq
sudo apt install -y python3-pip python3-venv build-essential git curl
# 2. Python仮想環境の作成
PROJECT_DIR="$HOME/ai-project"
echo "[2/4] プロジェクトディレクトリを作成中: $PROJECT_DIR"
mkdir -p "$PROJECT_DIR"
cd "$PROJECT_DIR"
python3 -m venv .venv
source .venv/bin/activate
# 3. 必須ライブラリのインストール
echo "[3/4] Pythonライブラリをインストール中..."
pip install --upgrade pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
pip install numpy pandas matplotlib jupyter
# 4. GPU確認スクリプトの作成
echo "[4/4] GPU確認スクリプトを作成中..."
cat > check_gpu.py << 'PYEOF'
import torch
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
if torch.cuda.is_available():
print(f"CUDA version: {torch.version.cuda}")
print(f"GPU count: {torch.cuda.device_count()}")
for i in range(torch.cuda.device_count()):
props = torch.cuda.get_device_properties(i)
vram_gb = props.total_mem / (1024**3)
print(f" GPU {i}: {props.name} ({vram_gb:.1f} GB VRAM)")
else:
print("⚠️ CUDAが利用できません。CPU モードで動作します。")
print(" → NVIDIAドライバとCUDA Toolkitのインストールを確認してください")
PYEOF
python check_gpu.py
echo ""
echo "✅ セットアップ完了!"
echo "📂 プロジェクト: $PROJECT_DIR"
echo "🔧 仮想環境の有効化: source $PROJECT_DIR/.venv/bin/activate"
6.3 ユースケース3: ログ監視と自動アラート
想定読者: サーバーの運用監視を始めたい方
推奨構成: systemd + journalctl + シェルスクリプト
サンプルコード:
#!/usr/bin/env bash
# log_monitor.sh - シンプルなログ監視スクリプト
# 実行方法: bash log_monitor.sh [監視対象ログファイル]
# 例: bash log_monitor.sh /var/log/syslog
set -euo pipefail
LOG_FILE="${1:-/var/log/syslog}"
ALERT_KEYWORDS=("error" "critical" "fatal" "panic" "OOM" "segfault")
CHECK_INTERVAL=30 # 秒
ALERT_LOG="/tmp/log_monitor_alerts.log"
# 色の定義
RED='\033[0;31m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
NC='\033[0m'
echo -e "${GREEN}=== ログ監視開始 ===${NC}"
echo "対象: $LOG_FILE"
echo "監視キーワード: ${ALERT_KEYWORDS[*]}"
echo "チェック間隔: ${CHECK_INTERVAL}秒"
echo "---"
# ログファイルの存在確認
if [ ! -f "$LOG_FILE" ]; then
echo -e "${RED}エラー: $LOG_FILE が見つかりません${NC}"
exit 1
fi
# 監視ループ
LAST_LINE=$(wc -l < "$LOG_FILE")
while true; do
CURRENT_LINE=$(wc -l < "$LOG_FILE")
if [ "$CURRENT_LINE" -gt "$LAST_LINE" ]; then
# 新しい行を取得
NEW_LINES=$(sed -n "$((LAST_LINE + 1)),${CURRENT_LINE}p" "$LOG_FILE")
for keyword in "${ALERT_KEYWORDS[@]}"; do
MATCHES=$(echo "$NEW_LINES" | grep -i "$keyword" || true)
if [ -n "$MATCHES" ]; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "${RED}[ALERT]${NC} ${TIMESTAMP} - キーワード '${keyword}' を検出:"
echo "$MATCHES" | head -5
echo "[$TIMESTAMP] $keyword: $MATCHES" >> "$ALERT_LOG"
fi
done
LAST_LINE=$CURRENT_LINE
fi
sleep "$CHECK_INTERVAL"
done
ユースケースを把握できたところで、この先の学習パスを確認しましょう。
7. 学習ロードマップ
この記事を読んだ後、次のステップとして以下をおすすめします。
初級者向け(まずはここから)
- 公式のLinux入門ガイドを読む: The Linux Foundation - Introduction to Linux(無料のオンラインコース)
- 基本コマンドを毎日使う: WSL2やVirtualBoxでUbuntuを導入し、ターミナルで日常操作する習慣をつける
- シェルスクリプトを書く: 日常の繰り返し作業を自動化する小さなスクリプトから始める
中級者向け(実践に進む)
- サーバー管理を学ぶ: VPS(Vultr、DigitalOcean等)を借りてWebサーバーを構築・運用する
- Dockerとの組み合わせ: コンテナ技術はLinuxカーネルの機能(namespace、cgroup)がベース。Dockerを学ぶとLinuxの理解も深まる
-
パフォーマンスチューニング:
top、htop、vmstat、iostatでボトルネックを特定する手法を身につける
上級者向け(さらに深く)
- Linuxカーネルのソースコードを読む: kernel.orgからソースを取得し、特定のサブシステム(例: スケジューラ)を追いかける
- LPIC / LinuC資格: 体系的な知識の証明として資格取得を目指す
- OSS貢献: カーネルパッチの提出は敷居が高いが、ドキュメントの修正やディストロのパッケージングから始められる
8. まとめ
この記事では、Linuxについて以下を解説しました:
- Linuxの正体: カーネルとディストリビューションの関係、33年の歴史と普及の理由
- 基本概念: アーキテクチャ、ファイルシステム階層、パーミッション、プロセスとシグナル
- 実践: 環境別の設定ファイル、基本操作スクリプト、環境診断ツール
- ユースケース: Webサーバー構築、AI/ML開発環境、ログ監視
私の所感
正直に言うと、私自身「Linuxはなんとなく使えてるからいいや」という時期が長かったです。転機になったのは、RTX 5090でAI開発環境を構築しようとした時。CUDA Gapの解決にLinuxカーネルのバージョンとドライバの依存関係を理解する必要があり、「基礎を飛ばしたツケ」を痛感しました。
2026年現在、Linux 7.0の開発が始まり、Ubuntu 26.04 LTS "Resolute Raccoon" が4月にリリース予定です。Rustで書き直されたcoreutils、Wayland完全移行、TPM暗号化など、Linuxは今なお進化し続けています。
「わかったつもり」から「本当にわかっている」へ。この記事がその第一歩になれば幸いです。
参考文献
- The Linux Kernel Archives — カーネルの公式サイト
- Ubuntu Official Documentation — Ubuntuの公式ドキュメント
- Filesystem Hierarchy Standard — FHSの仕様書
- Linux Foundation Training — 公式トレーニング
- Linux kernel version history - Wikipedia — バージョン履歴
この記事は「わかったつもりになってない?」シリーズの一部です。
次回は「Ubuntuってなんだ?」を予定しています。
📌 X(Twitter)でも技術情報を発信しています: @geneLab_999