概要
エンジニアになってしばらく経つがLinuxの基本を改めて学んだ。
調べながら「なんとなくわかる」を繰り返すより、AIに質問しながら手を動かして確認する方法が自分には合っていた。
この記事では、その過程で理解できたことをまとめる。
「Linuxって何となく怖い」「コマンドは打てるけど仕組みがよくわからない」という人に届けば嬉しい。
学習環境
- ホストOS: macOS
- Linux環境: Docker上のUbuntu 24.04
- シェル: bash
普段のプロジェクト環境を使うと独自の設定に引っ張られるため、使い捨てできるDockerコンテナを学習用に用意した。
コンテナは
docker run --rm -it ubuntu:24.04 bash
の一行で起動できる。
--rm を付けておけば終了時に自動削除されるので、気軽に試せる。
Linuxとディストリビューションの話
まず最初に混乱しがちな「LinuxとUbuntuの違い」から整理した。
Linux はOSの核となる部分(カーネル)のこと。サーバやコンテナで広く使われている。
Ubuntu はそのLinuxを実際に使えるようにパッケージ化したもので、ディストリビューションと呼ばれる。
ディストリビューションはUbuntuだけじゃなく、用途に応じていくつかある。
| ディストリビューション | 特徴 |
|---|---|
| Ubuntu / Debian | apt でパッケージ管理。情報が多く開発環境でよく使われる |
| Rocky Linux / AlmaLinux | dnf を使う。企業サーバに多い |
| Alpine | 超軽量。Dockerイメージでよく見かける。apk を使う |
「Dockerfileで apt install するやつ」と「apk add するやつ」が違う理由はここにある。ベースイメージのディストリビューションが違うからコマンドも変わる。
ディレクトリの配置には標準がある(FHS)
Linuxでは「設定ファイルはここ」「ログはここ」という配置の標準規格があり、FHS(Filesystem Hierarchy Standard) と呼ばれる。
覚えておくと役立つ代表的なディレクトリはこちら。
| ディレクトリ | 役割 |
|---|---|
/etc |
設定ファイル置き場 |
/var/log |
ログ置き場 |
/usr/bin |
コマンドの実体が入っている |
/tmp |
一時ファイル置き場 |
/home |
一般ユーザのホームディレクトリ |
/root |
rootユーザのホームディレクトリ |
「このログどこ?」となったとき /var/log を見ればよいとわかるし、「このコマンドの実体は?」なら /usr/bin を見ればよい。場所に迷ったときの手がかりになる。
シェルの基本
パイプとリダイレクト
コマンドを組み合わせて使うときに欠かせないのがパイプとリダイレクトだ。
リダイレクト(> / >>) はコマンドの出力をファイルに保存する。
echo hello > sample.txt # 上書き保存
echo world >> sample.txt # 追記
パイプ(|) は左のコマンドの出力を、右のコマンドの入力に渡す。
# ログファイルからエラー行だけ取り出して件数を数える
cat app.log | grep ERROR | wc -l
実務では「ログからエラーだけ探す」「コマンド結果を絞り込む」場面でよく使う。
環境変数
環境変数は、コマンドやアプリが参照する設定値のこと。HOME や PATH が代表例だ。
echo $HOME # ホームディレクトリのパス
echo $PATH # コマンドを探すディレクトリ一覧
変数を設定するだけでは今のシェル内だけで有効だが、export すると子プロセスにも引き継がれる。
MYNAME=taro # このシェルだけ
export MYNAME=taro # 子プロセスにも渡る
.env ファイルは環境変数そのものではなく、KEY=VALUE 形式で値を書いたテキストファイル。アプリやツールがそれを読み込んで、実行時に環境変数として使う仕組みになっている。
PATH
ls や git をフルパスなしで使えるのは、そのコマンドがある場所が PATH に登録されているから。
echo $PATH | tr ':' '\n' # : 区切りを1行ずつ表示して確認
which ls # ls の実体がどこにあるか確認
自作のスクリプトをコマンドとして使いたいときは、置き場所を PATH に追加すればよい。
mkdir -p /tmp/mybin
# スクリプトを作って実行権限を付ける
chmod +x /tmp/mybin/myscript
# PATH に追加
export PATH=/tmp/mybin:$PATH
「PATHを通す」とよく言うが、やっていることはこれだけだ。
RCファイル
シェルを起動するたびに手動でPATH設定や環境変数を書くのは面倒なので、それを自動化するのが RC ファイルだ。
- bash の場合:
~/.bashrc - zsh の場合:
~/.zshrc(macOSのデフォルト)
# ~/.bashrc に追記する例
echo 'export PATH=/tmp/mybin:$PATH' >> ~/.bashrc
# 今のシェルに即反映したいとき
source ~/.bashrc
設定を書いておけば、次回起動時から自動で読み込まれる。
SSH
SSHはリモートサーバに安全に接続するための仕組みで、Secure Shell の略だ。
通信が暗号化されるので、インターネット越しでも安全に操作できる。
認証方式は主に2つある。
- パスワード認証: IDとパスワードで接続
- 公開鍵認証: 秘密鍵と公開鍵のペアを使う。GitHubのSSH設定がこれ
公開鍵認証では、秘密鍵は手元のPCに、公開鍵は接続先サーバに置く。
関連ファイルは ~/.ssh/ 以下にまとまっている。
~/.ssh/id_ed25519 # 秘密鍵
~/.ssh/id_ed25519.pub # 公開鍵(接続先に登録するもの)
~/.ssh/known_hosts # 過去に接続したサーバの記録
cron(定期実行)
cron はLinuxの定期実行の仕組みで、crontab がその設定表にあたる。
crontab -l # 現在の設定を確認
crontab -e # 設定を編集
書き方はこんな形。
# 分 時 日 月 曜日 コマンド
0 9 * * * /usr/local/bin/job.sh
これは「毎日9時0分に /usr/local/bin/job.sh を実行する」という意味。
バックアップや定時バッチを自動化するのに使われる。
パッケージマネージャー
Linuxでソフトをインストールするときはパッケージマネージャーを使う。
Ubuntuでは apt がそれにあたる。
apt update # インストール可能なパッケージ情報を最新化
apt install -y tree # tree をインストール
apt list --installed | grep tree # インストール済みか確認
apt update はOS自体を更新するわけではなく、「どんなパッケージが今使えるか」のリストを更新する操作だ。よく混同されるので注意。
パッケージは リポジトリ(配布元のサーバ)から取得される。設定は /etc/apt/ 以下で確認できる。
学んでみて
「なんとなく知ってるつもり」だった部分がかなり整理できた。
特に、AIに「なぜこうなるのか」を聞きながら実際に手を動かすという進め方が良かった。コマンドを打って、動きを見て、それについて質問する、というサイクルを繰り返すと、言葉としてだけでなく動きとして理解できる。
DockerやCIが普段は隠してくれている部分ではあるが、こういう基礎がわかっていると「なぜ設定が反映されないのか」「なぜこのコンテナでコマンドが使えないのか」といったトラブルの見当がつきやすくなる。

コメント