学習トピック一覧(139)
基礎から組込みまで、Linux の学習トピックをトラック別にまとめました。各ページで要点・用語・関連コマンドを確認できます。
1. 基本操作・コマンド
現在地とディレクトリ移動
Linuxの操作はまず「いま自分がどのフォルダにいるか」を意識することから始まります。pwd で現在地を表示し、ls で中身を…
ファイルとディレクトリの操作ファイルやフォルダは作る・コピーする・移動(名前変更)する・消す、の4操作が基本です。mkdir でフォルダを作り、touch…
ファイルの中身を見るテキストファイルの内容を確認する方法はいくつかあります。短いファイルは cat で一気に表示、長いファイルは less でスク…
パーミッション(アクセス権)Linuxの各ファイルには「誰が・何をできるか」の権限が設定されています。読み(r)・書き(w)・実行(x)の3種類を、所有者…
プロセスを確認するいま動いているプログラムは「プロセス」として管理され、それぞれにPID(プロセス番号)が付きます。ps で一覧を取得し、top…
パッケージ管理の基本ソフトの導入や更新は、ディストリビューションごとのパッケージマネージャ経由で行います。Debian/Ubuntu系は apt、…
2. シェルスクリプト
シェルスクリプトと実行権限
シェルスクリプトは、いつも端末に打っているコマンドをファイルにまとめて一気に実行する仕組みです。1行目に #!/bin/bas…
変数とクオート変数は name="値" の形で代入します。= の前後にスペースを入れない点が要注意です。値を取り出すときは $name また…
コマンド置換コマンドの実行結果を、そのまま変数や別のコマンドの一部として使う仕組みがコマンド置換です。$(コマンド) と書くと、中のコマン…
条件分岐(if / test)条件によって処理を分けるには if 文を使います。if 条件; then ... fi の形が基本で、必要に応じて elif …
繰り返し(for / while)同じ処理を何度も行うには繰り返し(ループ)を使います。for は決まったリストを1つずつ処理するのに向き、for f in *…
関数と引数よく使うひとまとまりの処理は関数にして名前を付けられます。name() { ... } と定義し、name 引数 と呼び出しま…
リダイレクトとパイプコマンドの入出力は自由につなぎ替えられます。> は標準出力をファイルへ上書き保存、>> は末尾へ追記、< はファイルを標準入力…
3. 正規表現・テキスト処理
正規表現とは・基本のメタ文字
正規表現は「文字列のパターン」を表す書き方で、検索や置換を一気に行えます。多くの文字はそのままの意味ですが、特別な働きを持つ文…
文字クラスで候補を絞る角かっこ [ ] で囲むと、その中のどれか1文字にマッチする「文字クラス」になります。[abc] は a か b か c のい…
量指定子で繰り返しを表す直前のパターンが何回繰り返されるかを表すのが「量指定子」です。* は0回以上、+ は1回以上、? は0回または1回(あってもな…
grep で行を検索するgrep はファイルや標準入力から、パターンに一致する行を取り出すコマンドです。grep "パターン" ファイル の形で使い、…
拡張正規表現(grep -E / egrep)正規表現には基本(BRE)と拡張(ERE)の2つの方言があります。基本では + ? { } ( ) | を使うのに \ が必要…
sed で置換・行加工するsed は1行ずつ読み込んでテキストを加工するストリームエディタです。最もよく使うのが置換で、sed 's/古い/新しい/' …
awk でフィールド処理するawk は行を空白で区切られた「フィールド」に分けて扱える、表形式テキスト向けのツールです。各列は $1 $2 … で参照でき…
パイプでつなぐ定番テキスト加工テキスト処理の力は、小さなコマンドをパイプ | でつなぐと一気に高まります。cut で列を切り出し、tr で文字を置換・削除し…
4. ネットワーク基礎
IPアドレスとサブネット
IPアドレスはネットワーク上の機器を識別する番号です。IPv4では192.168.1.10のように4つの数字で表します。アドレ…
ルーティングとゲートウェイ自分のネットワークの外(別のネットワークやインターネット)へ届けるには、パケットの中継役が必要です。その出口になるのがデフォル…
ポートとプロトコル(TCP/UDP)1台の機器では複数のサービスが同時に動くため、IPアドレスだけでなく「ポート番号」で通信相手のサービスを区別します。Webは8…
DNSの仕組み(名前解決)私たちは example.com のような名前でアクセスしますが、通信に使われるのはIPアドレスです。この名前をIPアドレスへ…
ネットワークインターフェースの確認Linuxでは有線・無線・仮想などの接続口を「インターフェース」として扱い、それぞれに名前(例: eth0、ens33、lo)…
疎通確認の方法「相手とつながっているか」を確かめる基本が疎通確認です。ping は相手へ小さなパケットを送って応答時間を測り、到達できるかを…
名前解決の確認つながらない原因が「経路」なのか「名前解決」なのかを切り分けることは重要です。IPアドレス直打ちでは届くのに名前ではダメな場合…
5. サーバ構築
サービス管理の基本(systemd)
サーバ上で常時動き続けるプログラムは「サービス(デーモン)」と呼ばれ、RHEL/MiracleLinux系では systemd…
Webサーバの導入(nginx / Apache httpd)代表的なWebサーバは nginx と Apache httpd の2つです。どちらも dnf install で導入でき、s…
ドキュメントルートと設定ファイルWebサーバが公開するファイルを置く場所を「ドキュメントルート」と呼びます。nginx の既定は /usr/share/ngi…
ファイアウォールでポートを開放するRHEL/MiracleLinux系では firewalld が既定のファイアウォールで、外部からの通信を初期状態で多くしゃ断…
ポートと待ち受け状態の確認サービスが正しく起動しても、想定したポートで待ち受けていなければ通信できません。ss コマンドで「いまどのポートが開いて待ち受…
ログでサービスの状態を調べるサービスが起動しない・応答しないときは、まずログを読むのが鉄則です。systemd 管理下のサービスは journalctl …
SSHサーバの基本サーバはディスプレイを繋がず、手元のPCからネットワーク越しに操作するのが普通です。その入口が SSH で、サーバ側では ss…
6. Git バージョン管理
リポジトリを作る(init / clone)
Gitはファイルの変更履歴を記録するバージョン管理ツールです。記録の入れ物を「リポジトリ」と呼び、新規に作るときは git i…
ステージングとコミットGitでは変更をいきなり記録せず、まず「ステージング(インデックス)」という準備エリアに載せてから記録します。git add …
状態と履歴を確認する(status / log)いまどのファイルが変更され、何がステージに載っているかは git status で確認します。これは作業中に最もよく使うコマン…
ブランチとマージブランチは履歴を枝分かれさせる仕組みで、本流に影響を与えずに新機能や修正を試せます。git branch で一覧や作成を行い、…
リモートと同期(remote / push / pull)手元のリポジトリと、GitHubなどサーバー上のリポジトリ(リモート)をやり取りすると、他の人と変更を共有できます。リモートの…
.gitignore で除外する.gitignore は「履歴に含めたくないファイル」を指定するテキストファイルです。ビルド生成物・ログ・パスワードを含む設定…
取り消し操作の基本(restore / reset)Gitでは操作を取り消す方法が状況ごとに分かれています。作業ツリーの編集を捨てて元に戻すには git restore、ステージ…
7. コンテナ Docker/Podman
コンテナとイメージの違い
コンテナを学ぶ最初の関門が「イメージ」と「コンテナ」の区別です。イメージはアプリと実行に必要なファイル一式を固めた読み取り専用…
コンテナの起動と管理コンテナの基本操作は、起動する・一覧する・止める、の3つです。docker run でイメージからコンテナを起動し、-d を付…
イメージの取得とビルドイメージは2通りで手に入ります。1つは docker pull でレジストリ(Docker Hub など)から既成のイメージを…
ボリュームによる永続化コンテナは消すと中のデータも一緒に消えます。データベースのファイルなど残したいものは、ボリュームを使ってコンテナの外に保存しま…
ポート公開でアクセスするコンテナ内で動くWebサーバなどに外からアクセスするには、ポートを公開する必要があります。docker run の -p オプ…
ログ確認とコンテナ内操作動いているコンテナの様子を知る基本が docker logs です。コンテナが標準出力に書いた内容を表示し、-f を付ければロ…
Podman との関係Podman は Docker とよく似たコンテナ管理ツールで、RHEL系(MiracleLinux など)で標準的に使われま…
8. Raspberry Pi セットアップ
Raspberry Pi OS の書き込み(Imager)
Raspberry Pi は本体にストレージを内蔵せず、microSDカードにOSを書き込んで起動します。書き込みには公式ツー…
初回設定(raspi-config)初めて起動したあとの各種設定は、付属の設定ツール raspi-config でまとめて行えます。sudo raspi-conf…
SSH と VNC の有効化ラズパイはモニターやキーボードをつながず、別のPCから遠隔操作するのが一般的です。文字ベースで操作するならSSH、デスクトップ…
ネットワーク設定とIPアドレスの確認遠隔操作するには、ラズパイが今どのIPアドレスを持っているかを知る必要があります。最も手軽なのは hostname -I で、…
パッケージの更新OSを書き込んだ直後は、まずソフトウェアを最新の状態にするのが基本です。Raspberry Pi OS は Debian 系な…
GPIOピンの概要ラズパイの大きな特徴は、基板上に並ぶ40本のピン(GPIOヘッダ)です。GPIOは汎用入出力の意味で、LEDを光らせたりセンサ…
温度や状態の確認ラズパイは小型のため、高負荷が続くとCPU温度が上がり、性能を自動で落とす(サーマルスロットリング)ことがあります。状態の確認…
9. システムコール
システムコールとは(ユーザ空間とカーネル空間の境界)
プログラムが画面表示・ファイル読み書き・通信などを行うとき、ハードウェアを直接触ることはできません。これらはカーネルだけが持つ…
主要なシステムコール(open/read/write/close)ファイル操作の土台は open・read・write・close の4つのシステムコールです。open はファイルを開き、成功…
プロセス生成(fork/exec/wait)Linuxで新しいプログラムを動かす基本は fork と exec の組み合わせです。fork は呼び出したプロセスをほぼ丸ご…
strace でシステムコールを観察するstrace は、あるコマンドが内部でどのシステムコールを、どんな引数で呼び、何を返したかを順番に表示するツールです。プログラ…
man 2 でシステムコールを調べるLinuxのマニュアルはセクション番号で分かれており、セクション2がシステムコール、セクション3がライブラリ関数です。同じ名前…
errno とエラー処理の考え方多くのシステムコールは、成功すると 0 以上の値を、失敗すると -1 を返します。「なぜ失敗したか」は戻り値そのものではなく、…
ライブラリ関数とシステムコールの違いprintf や fopen はC標準ライブラリ(libc)の関数で、システムコールそのものではありません。これらは内部でバッ…
10. デバイスドライバ実装
カーネルモジュールとは
Linuxカーネルは、機能をあとから追加・取り外しできる「カーネルモジュール」という仕組みを持っています。デバイスドライバの多…
モジュールの確認と操作モジュールはコマンドで一覧・調査・着脱ができます。lsmod でいま組み込まれているモジュールの一覧を見て、modinfo で…
デバイスファイルと /devLinuxでは「すべてはファイル」という思想のもと、ハードウェアもファイルとして扱います。その入口が /dev ディレクトリに…
キャラクタ型デバイスの概要デバイスファイルは大きく「キャラクタ型」と「ブロック型」に分かれます。キャラクタ型は1バイトずつ順番にやり取りする機器で、キー…
メジャー番号とマイナー番号デバイスファイルは名前ではなく、2つの番号でカーネル内のドライバと結びつきます。メジャー番号は「どのドライバが担当するか」を、…
dmesg でカーネルログを確認するドライバ開発では「カーネルが何を言っているか」を読むことが何より大切です。カーネルやモジュールが出力するメッセージはカーネルリ…
Hello World モジュールの流れ(概念)最初のドライバ学習は、メッセージを出すだけの「Hello World モジュール」を作る流れで全体像をつかみます。C言語で初期…
11. セキュリティ/権限強化
最小権限の考え方
セキュリティの土台は「必要な人に、必要な分だけ、必要な間だけ権限を与える」という最小権限の原則です。常に管理者(root)で作…
ユーザ権限とsudosudo は「この1コマンドだけ管理者として実行する」ための仕組みです。root に直接ログインする代わりに、許可された一般ユ…
SSH鍵認証と堅牢化SSH はリモートのサーバへ安全に接続する仕組みです。パスワード認証は総当たり攻撃に弱いため、公開鍵認証への切り替えが推奨され…
ファイアウォール(firewalld / nftables)ファイアウォールは、どの通信を通し、どれを遮断するかを決める「関所」です。必要なポートだけを開け、それ以外を閉じることで攻撃の…
SELinux / AppArmor の概要通常のパーミッションに加えて、より強力にプロセスの行動を縛る仕組みが MAC(強制アクセス制御)です。RHEL/Miracle…
パスワードとアカウント管理アカウントの安全はパスワードの管理から始まります。passwd で自分や他ユーザのパスワードを変更し、推測されにくい長く複雑な…
fail2ban で不正アクセスを防ぐインターネットに公開したサーバには、ログイン試行を繰り返す自動攻撃が日常的に届きます。fail2ban はログ(例: SSHの…
12. ストレージ/ファイルシステム
ブロックデバイスとパーティション
ハードディスクやSSD、USBメモリは「ブロックデバイス」として扱われ、/dev/sda や /dev/nvme0n1 のよう…
ファイルシステムの作成(mkfs)パーティションはそのままでは使えず、ファイルを置けるようにする「ファイルシステム」を作成(フォーマット)する必要があります。L…
マウントとアンマウントLinuxではファイルシステムを使う前に、ディレクトリツリーのどこかに接続する「マウント」が必要です。接続先のディレクトリを「…
/etc/fstab による永続マウントmount コマンドでの接続は再起動すると消えます。起動時に自動でマウントするには、設定ファイル /etc/fstab に1行…
ディスク使用量の確認容量不足はトラブルの定番原因です。df はファイルシステム単位の空き容量と使用率を一覧し、-h を付けると人が読みやすい単位(…
LVM(PV/VG/LV)の概要LVM(論理ボリュームマネージャ)は、物理ディスクを抽象化して柔軟に容量を扱う仕組みです。物理ディスクやパーティションを「物理…
RAIDの概要RAIDは複数のディスクを束ねて、速度や耐障害性を高める技術です。RAID0は分散書き込みで高速ですが冗長性がなく、RAID1…
13. プロセス監視/障害対応
障害対応の手順の考え方
障害対応はやみくもに触るのではなく、決まった順序で切り分けると速く確実です。まず「いつ・何が・どう変わったか」を現象として正確…
リソース監視(CPU・メモリ・負荷)サーバが重いと感じたら、まずCPU・メモリ・負荷の3点を見ます。uptime や top でロードアベレージを確認し、CPUコ…
プロセスの調査リソースを食っている犯人を特定するには、プロセス単位で見ます。top や htop はCPU・メモリ順に並べ替えられるので、上…
ログの調査(journalctl・dmesg)障害の原因はログに残っていることが多く、現象を把握したら真っ先に確認します。systemd環境では journalctl で各…
ディスク満杯の調査と対処「書き込めない」「サービスが起動しない」障害の典型原因がディスク満杯です。まず df -h で各マウントポイントの使用率を見て…
ネットワーク疎通の切り分け「つながらない」障害は、どの層で止まっているかを順に切り分けます。まず ping で相手まで届くかを確認し、応答がなければ経路…
開いているファイル・ポートの確認Linuxではファイルもソケットも「ファイルディスクリプタ」として扱われ、lsof で誰が何を開いているかを一覧できます。ls…
14. 自動化/定期実行
cron による定期実行のしくみ
決まった時刻や間隔でコマンドを自動実行したいときは cron を使います。cron は常駐しているデーモン(crond)が一定…
crontab の書式(5フィールド)crontab の1行は「分 時 日 月 曜日 コマンド」の順で書きます。先頭の5つが実行タイミングを表すフィールドで、それぞ…
systemd timer による定期実行近年のディストリビューションでは cron の代わりに systemd の timer ユニットで定期実行を組む方法が広く使わ…
at による単発予約「繰り返しではなく、一度だけ後で実行したい」処理には at を使います。at に時刻を渡すと専用のプロンプトが開き、入力したコ…
シェルスクリプトと組み合わせた自動化定期実行では、1行のコマンドではなく複数の処理をまとめたシェルスクリプトを呼び出すのが定石です。スクリプト先頭に #!/bin…
環境変数と PATH の注意点cron で動かしたスクリプトが「手で打つと動くのに失敗する」最大の原因は環境変数の違いです。cron はログインシェルを通さ…
Ansible の概要(ad-hoc と playbook)複数台のサーバへ同じ設定を一斉に適用したいときは Ansible が便利です。Ansible は管理対象にエージェントを常駐さ…
15. C・ビルドツール
gccでCソースをコンパイルする
Cのソースコードは、そのままでは実行できません。コンパイラ gcc に渡して、CPUが解釈できる機械語の実行ファイルへ変換しま…
コンパイルの4段階gcc は内部で4つの工程を順に実行しています。まず前処理(プリプロセス)で #include や #define を展開し、…
ヘッダとライブラリのリンク標準入出力の printf などは、ヘッダファイル(.h)で関数の宣言を取り込み、実体はライブラリ側にあります。コンパイラは …
Makefileの基本ソースが増えると毎回長い gcc コマンドを打つのは大変です。Makefile にビルド手順を書いておけば、make と打つだ…
警告とデバッグ情報(-Wall -g)コンパイルが通っても、潜在的なバグが残っていることはよくあります。-Wall を付けると未使用変数や型の取り違えなど、多くの警…
gdbによるデバッグプログラムが期待通り動かないとき、gdb を使うと実行を一時停止させて内部状態を調べられます。-g 付きでビルドした実行ファイ…
共有ライブラリの確認Linuxの実行ファイルの多くは、共有ライブラリ(.so)を実行時に読み込む形でビルドされています。ldd ./prog と打…
16. OS内部/起動の仕組み
起動シーケンスの全体像
電源投入からログインプロンプトまでには、いくつもの段階が順に実行されます。まずファームウェア(BIOSまたはUEFI)がハード…
ブートローダ GRUB の役割GRUB(GRand Unified Bootloader)は、ファームウェアとカーネルの橋渡しを担うプログラムです。起動時に…
systemd と unit / targetsystemd は現代の多くのディストリビューションで採用されている、最初のユーザ空間プロセス(PID 1)です。管理対象を「…
/proc 疑似ファイルシステム/proc はディスク上に実体を持たない疑似ファイルシステムで、カーネルが保持する情報をファイルのように見せてくれます。/pr…
/sys 疑似ファイルシステム/sys はカーネルが認識しているデバイスやドライバ、バスの構造を階層的に公開する疑似ファイルシステムです。/proc が主に…
起動時間の分析起動が遅いと感じたら、原因を勘で探す前に計測します。systemd-analyze は、ファームウェア・ブートローダ・カーネル…
カーネルとバージョン確認OSの中核であるカーネルは、ハードウェアとソフトウェアの間に立ち、メモリ・プロセス・デバイスを管理します。動作中のカーネルの情…
17. クロスコンパイル
クロスコンパイルとは
クロスコンパイルとは、プログラムを動かす機械(ターゲット)とは別の機械(ホスト)の上でビルドする手法です。組込みLinuxでは…
クロスツールチェーンの構成クロスツールチェーンは、ターゲット向けのバイナリを作るために必要な道具一式です。中心となるのはコンパイラ(gcc)ですが、それ…
トリプレットとABIトリプレットは、ターゲットの素性を表す識別子で、おおむね「アーキテクチャ-ベンダ-OS-ABI」の形をとります。たとえば ar…
ターゲット向けgccでビルドする実際のビルドは、ネイティブの gcc の代わりにトリプレット付きのクロスコンパイラを呼ぶだけです。たとえば arm-linux…
生成バイナリのアーキを確認するクロスコンパイルで一番やりがちな失敗は、うっかりネイティブの gcc を呼んでホスト向けのバイナリを作ってしまうことです。これ…
sysrootとライブラリターゲット用のプログラムが外部ライブラリ(たとえば libssl や zlib)を使う場合、リンク時にはホスト用ではなくターゲ…
MakeとconfigureでのCROSS_COMPILE1ファイルなら手でクロスgccを呼べば済みますが、実際のプロジェクトは Makefile や configure 経由でビルド…
18. 組込みビルド Yocto/Buildroot
組込みLinuxイメージを自作するとは
PCのLinuxはディストリビューションをインストーラで導入しますが、組込み機器ではターゲットのCPUやストレージに合わせてO…
Buildrootの概要と使い方BuildrootはMakefileとKconfigだけで構成された、軽量で理解しやすいビルドシステムです。make menu…
Yoctoの概要(レイヤ・レシピ・BitBake)Yocto Projectは、レシピ(recipe)・レイヤ(layer)・BitBakeという3つの仕組みで成り立つ大規模な…
カーネル・rootfs・ブートローダの一括生成ビルドシステムが「OSを組み立てる」とは、別々に開発されている部品をまとめて作ることを指します。具体的には、ハードを制御するL…
生成物を確認するビルドが終わったら、書き込む前に成果物を点検します。ls -lh で出力ディレクトリを眺め、カーネルイメージ・rootfsアー…
BuildrootとYoctoの使い分け両者は同じ「イメージ自作」を担いますが、設計思想が異なります。Buildrootは構成が単純で初回ビルドが速く、小規模で固定的…
19. ブートローダ U-Boot
ブートローダの役割
電源投入直後のSoCはROM内の小さなコードしか実行できず、Linuxカーネルをいきなり起動することはできません。ブートローダ…
U-BootとはU-Boot(Das U-Boot)は、組込みLinuxで広く使われるオープンソースの二次ブートローダです。多数のSoC・ボー…
U-Bootの環境変数U-Bootの挙動は「環境変数」で制御します。printenv で一覧や個別の値を確認し、setenv で変数を作成・変更・削…
起動の流れとbootcmdU-Bootは起動時、まず bootdelay 秒だけコンソール入力を待ちます。この間にキー入力がなければ、環境変数 boot…
カーネルとデバイスツリーのロードLinuxを起動するには、カーネルイメージ(uImage / zImage / Image など)と、ハードウェア構成を記述し…
ネットワーク経由起動(TFTP)の概要開発中はカーネルを書き換えるたびにストレージへ焼き直すのは手間です。U-Bootはネットワークから直接イメージを取得でき、tf…
デバイスツリー(DTB)の役割ARMなどの組込み環境では、接続されている周辺機器をカーネル自身が自動検出できないため、ハードウェア構成を外部データとして与え…
20. 実機制御 GPIO/I2C/SPI・RT
GPIOの基本と制御(libgpiod)
GPIOは基板上のピンを汎用の入出力として使う仕組みで、LEDの点灯やボタンの読み取りといった実機制御の土台になります。現在の…
sysfs方式の概要(/sys/class/gpio・非推奨)かつてGPIOは /sys/class/gpio 以下に echo でピン番号を書き込み、export して directio…
I2Cデバイスの検出と読み取りI2CはSDA(データ)とSCL(クロック)の2本でセンサやEEPROMなど複数のデバイスを数珠つなぎにできる通信方式で、各デ…
SPIの概要SPIはMOSI・MISO・SCLK・CSの4線を使う高速なシリアル通信で、I2Cよりも速度が出る反面、デバイスごとにCS(チ…
PWMの概要PWM(パルス幅変調)は一定周期の中でHIGHの時間(デューティ比)を変えることで、LEDの明るさやモータの速度、サーボの角度…
リアルタイムLinux(PREEMPT_RT)の概要通常のLinuxは「平均的に速い」ことを目指す汎用OSで、ある処理が必ず期限内に終わる保証(リアルタイム性)はありません。PR…
ピン配置の確認実機制御の事故の多くは「どのピンが何か」の取り違えから起きます。物理ピン番号(基板上の1〜40)とBCM番号(SoC内部の論理…