2026/10/31

rpm / dnf チートシート(Amazon Linux 2023)

## 1. 使い分け

- **このサーバにインストール済みのものを調べる**:`rpm`
- **リポジトリと関わる(インストール、更新、アンインストール、提供されているパッケージやアドバイザリを調べる)**:`dnf`

| | `rpm` | `dnf` |
|---|---|---|
| 見る対象 | インストール済みのパッケージ | リポジトリとインストール済みのパッケージ |
| 依存関係 | 解決しない | 自動で解決する(必要なものを一緒にインストール・アンインストールする) |
| ネットワーク | 使わない | 使う |
| 主な用途 | 何が入っているか、ファイルがどのパッケージのものか、設定ファイルが変更されていないか | インストール、更新、アンインストール、更新や CVE の有無の確認 |


- インストール・アンインストールは `dnf` で行う(`rpm -i` / `rpm -e` は依存関係を解決しないため使わない)

---

## 2. rpm

### 2-1. オプションの組み立て

`-q`(調べる)に、対象を表すオプションを付ける。`-qa` は `-q -a` をまとめて書いたもの。

| オプション | 対象・意味 | 指定するもの |
|---|---|---|
| `-q` | パッケージ | パッケージ名 |
| `-qa` | インストール済みのすべてのパッケージ(all) | なし、または名前のパターン |
| `-qf` | ファイルを含むパッケージ(file) | ファイルのパス |
| `-ql` | パッケージに含まれるファイルの一覧(list) | パッケージ名 |
| `-qc` | パッケージに含まれる設定ファイルの一覧(config) | パッケージ名 |
| `-qi` | パッケージの詳細(info) | パッケージ名 |
| `-V` / `-Va` | インストール時の状態からの変更の検証(verify) | パッケージ名 / なし(すべて) |
| `--last` | インストール日時の新しい順に表示 | `-q` / `-qa` と組み合わせる |
| `--queryformat`(略:`--qf`) | 表示の書式 | 書式(`'%{NAME}\n'` など) |


- `-qf`(ファイルを含むパッケージ)と `--qf`(表示の書式)は別のオプション

### 2-2. よく使うコマンド

```bash
# パッケージが入っているか、バージョンは何か
rpm -q system-release
rpm -q kernel --last | head -n 1          # インストール済みの最新のカーネル

# インストール済みのパッケージの一覧
rpm -qa | sort
rpm -qa 'php8.5*' | sort                  # 名前で絞る
rpm -qa --last | head -n 20               # 最近インストール・更新されたもの

# パッケージ名だけを表示(バージョンなし)
rpm -qa --queryformat '%{NAME}\n' 'php8.5*' | sort

# ファイルを含むパッケージ(どのパッケージにも属さなければ、その旨が表示される)
rpm -qf /etc/php.ini

# パッケージに含まれるファイル / 設定ファイル
rpm -ql php8.5-fpm
rpm -qc php8.5-fpm

# パッケージの詳細(バージョン、ビルド日、説明など)
rpm -qi php8.5-cli

# 変更履歴(修正された CVE が書かれていることが多い)
rpm -q --changelog php8.5-cli | head -n 30
```

### 2-3. 変更されたファイルの検証

```bash
# パッケージのファイルのうち、インストール時から内容が変わったもの
sudo rpm -V php8.5-common
sudo rpm -Va 2>/dev/null | grep '^..5'     # すべてのパッケージ(数分かかる)
```

```
S.5....T.  c /etc/php.ini
│ │    │   └ c:設定ファイル
│ │    └ T:更新日時が変わっている
│ └ 5:内容が変わっている
└ S:サイズが変わっている
```

### 2-4. --queryformat の書式

| 書式 | 表示 |
|---|---|
| `%{NAME}` | パッケージ名 |
| `%{VERSION}` | バージョン |
| `%{RELEASE}` | リリース |
| `%{ARCH}` | アーキテクチャ |
| `%{SUMMARY}` | 一行の説明 |
| `%{SIZE}` | インストール後のサイズ(バイト) |
| `%{INSTALLTIME:date}` | インストール日時(`:date` で日時の形式にする) |
| `%{BUILDTIME:date}` | ビルド日時 |
| `\n` | 改行(付けないとすべてが 1 行につながる) |


- `NAME` などはパッケージのヘッダに記録された情報の名前(タグ)。大文字・小文字は区別しない

```bash
rpm -qa --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' 'php8.5*' | sort
rpm -qa --queryformat '%{SIZE}\t%{NAME}\n' | sort -n | tail -n 10   # サイズ(バイト)の大きいパッケージ 10 個

# 使えるタグの一覧
rpm --querytags | less
```

---

## 3. dnf

### 3-1. コマンドの組み立て

`dnf サブコマンド [オプション] [パッケージ名]` の形で使う。

| サブコマンド | 意味 |
|---|---|
| `list` | パッケージの一覧(`--installed`:インストール済み / `--available`:インストールできるもの / `--upgrades`:更新があるもの) |
| `info` | パッケージの詳細 |
| `search` | 名前や説明にキーワードを含むパッケージを探す |
| `provides` | ファイルやコマンドを含むパッケージを探す(インストールしていないものも対象) |
| `repoquery` | リポジトリにあるパッケージの情報(`-q`:余計な表示をしない / `-l`:含まれるファイル) |
| `repolist` | 有効なリポジトリの一覧 |
| `check-release-update` | 新しいリリースがあるか |
| `updateinfo` | アドバイザリ(`summary`:件数 / `list`:一覧 / `info`:詳細) |
| `install` | インストール |
| `upgrade` | 更新(パッケージ名を省略するとすべて) |
| `remove` | アンインストール |
| `needs-restarting` | 再起動が必要か(`-r`:OS の再起動が必要かだけを表示) |
| `history` | 実行した操作の履歴(`list` / `info` / `undo`) |
| `clean` | キャッシュを捨てる(`metadata` / `all`) |

| オプション | 意味 |
|---|---|
| `--releasever=latest` | 最新のリリースのリポジトリを対象にする(付けないと、サーバが固定されているリリースの範囲内だけが対象) |
| `--repo=amazonlinux` | AL2023 標準のリポジトリだけを対象にする |
| `--all` | `updateinfo` で、適用済みのアドバイザリも表示する |
| `--cve CVE番号` | `updateinfo` で、その CVE に関係するアドバイザリだけを表示する |
| `--allowerasing` | 競合するパッケージをアンインストールしてインストールする |
| `-C`(`--cacheonly`) | キャッシュだけを使い、ネットワークにつながない |
| `-y` | 確認せずに y で進める(手順では使わず、一覧を確認してから y を押す) |


- 実行前に `sudo dnf clean metadata` で最新の情報を取り直しておく

### 3-2. 調べる

```bash
# パッケージの一覧
dnf list --installed 'php8.5*'                                   # インストール済み
sudo dnf list --available --releasever=latest 'php8.5*'          # インストールできるもの
sudo dnf list --upgrades --releasever=latest                     # 更新があるもの

# パッケージの詳細
sudo dnf info --releasever=latest php8.5-cli

# 名前や説明にキーワードを含むパッケージ
sudo dnf search --releasever=latest imagick

# ファイルやコマンドを含むパッケージ(インストールしていないものも対象)
sudo dnf provides --releasever=latest /usr/bin/convert

# リポジトリにあるパッケージの情報(何も出なければ提供なし)
sudo dnf repoquery -q --releasever=latest php8.5-pdo
sudo dnf repoquery -l --releasever=latest php8.5-fpm             # 含まれるファイル

# 有効なリポジトリ
dnf repolist
```

### 3-3. 更新・アドバイザリ・CVE

```bash
# 新しいリリースがあるか
sudo dnf check-release-update

# 未適用のアドバイザリの件数 / 一覧
sudo dnf updateinfo summary --releasever=latest
sudo dnf updateinfo list --releasever=latest

# 特定の CVE(何も出なければ未適用のものはない)
sudo dnf updateinfo list --releasever=latest --cve CVE-YYYY-NNNNN
sudo dnf updateinfo list --all --releasever=latest --cve CVE-YYYY-NNNNN   # 行頭に i があれば適用済み
sudo dnf updateinfo info --releasever=latest --cve CVE-YYYY-NNNNN         # 対象パッケージと修正版のバージョン
```

### 3-4. インストール・更新・アンインストール

一覧を確認してから y を押す。

```bash
# インストール
sudo dnf install --releasever=latest php8.5-pdo

# 更新
sudo dnf upgrade --releasever=latest                       # すべて
sudo dnf upgrade --releasever=latest 'php8.5*'             # 名前で絞る

# アンインストール
sudo dnf remove 'libreoffice25.8*'

# 競合するパッケージをアンインストールしてインストール(例:php8.4 → php8.5)
sudo dnf install --releasever=latest --allowerasing php8.5-cli php8.5-fpm

# 再起動が必要か
sudo dnf needs-restarting -r
```

### 3-5. 履歴

```bash
sudo dnf history list | head -n 20           # 実行した操作の一覧(ID 付き)
sudo dnf history info ID                     # その操作でインストール・更新・アンインストールしたパッケージ
sudo dnf history undo ID                     # その操作を取り消す(一覧を確認してから y)
```

### 3-6. キャッシュ

```bash
sudo dnf clean metadata     # リポジトリの情報を捨てる(次回の実行時に取り直す)
sudo dnf clean all          # ダウンロードしたパッケージも含めてすべて捨てる(ディスクを空けたいとき)
```

2026/10/30

PHP 8.4 → 8.5 アップグレード手順(Amazon Linux 2023 / Apache + PHP-FPM)

- 対象環境:Amazon Linux 2023、PHP は AL2023 標準パッケージ(`php8.4*` → `php8.5*`)、Web サーバは Apache(`httpd`)+ PHP-FPM
- 8.4 と 8.5 は同時にインストールできないため、**8.4 をアンインストールし、8.5 をインストールする**(`dnf install --allowerasing` で同時に行う)

---

## 1. 事前確認

### 1-1. OS 全体を最新のリリースに更新しておく

更新の前に、EC2 コンソールから AMI またはスナップショットを取得する。

```bash
# 更新前の状態
rpm -q system-release            # 現在のリリースのバージョン
sudo find /etc \( -name '*.rpmnew' -o -name '*.rpmsave' \) 2>/dev/null   # 既存の設定ファイルの競合
systemctl --failed               # 起動に失敗しているサービスがないか
systemctl status php-fpm --no-pager
systemctl status httpd --no-pager

# 新しいリリースがあるか(何も出なければ最新なので、1-2 へ進む)
sudo dnf check-release-update

# OS 全体を最新リリースに更新(一覧を確認してから y)
sudo dnf upgrade --releasever=latest

# 再起動が必要か確認して、必要なら再起動
sudo dnf needs-restarting -r
sudo reboot

# 再起動後の確認
rpm -q system-release            # 新しい日付になっているか
sudo dnf check-release-update    # 何も出なければ最新
sudo find /etc \( -name '*.rpmnew' -o -name '*.rpmsave' \) 2>/dev/null   # 設定ファイルの競合(更新前から増えていないか)
systemctl --failed               # 起動に失敗しているサービスがないか
systemctl status php-fpm --no-pager
systemctl status httpd --no-pager
```

### 1-2. 8.5 のパッケージが提供されているか

```bash
sudo dnf clean metadata
sudo dnf list --available --repo=amazonlinux --releasever=latest 'php8.5*'
```

- `--repo=amazonlinux`:AL2023 標準のリポジトリのみ表示
- `php8.5-opcache` はない(8.5 から OPcache は PHP 本体に組み込み)

### 1-3. アプリケーションの互換性

- PHP 8.5 の移行ガイド(非互換の変更、非推奨になった機能):https://www.php.net/manual/en/migration85.php
- 使用しているフレームワーク・ライブラリが 8.5 に対応しているかを確認する
- Composer を使っている場合は、8.5 の環境で次を実行する

```bash
# composer.json / composer.lock の PHP バージョン・拡張モジュールの要件を満たしているか
composer check-platform-reqs
```

### 1-4. 自分でビルドした拡張モジュールがないか

```bash
# 拡張モジュールのディレクトリ
d=$(php -r 'echo ini_get("extension_dir");'); echo "$d"

# パッケージに含まれない拡張モジュール(pecl install などでインストールしたもの)。何も出なければなし
for f in "$d"/*.so; do rpm -qf "$f" >/dev/null 2>&1 || echo "パッケージ外: $f"; done
```

- 表示されたものは 8.5 用に再ビルドする

---

## 2. 現状の記録とバックアップ

```bash
# PHP のバージョン(CLI / FPM)
php -v
php-fpm -v

# インストール済みの PHP パッケージ(バージョン付き)
rpm -qa 'php8.4*' | sort

# インストール済みの PHP パッケージ名(バージョンなし。3. と 8. で使う)
rpm -qa --qf '%{NAME}\n' 'php8.4*' | sort | tee ~/php84-packages.txt

# 有効な拡張モジュールと設定値(アップグレード後の比較用)
php -m > ~/php84-modules.txt
php -i > ~/php84-info.txt

# エラーログの現在の行数(7. で、作業開始後に追加された行だけを表示するため)
sudo cat /var/log/php-fpm/error.log | wc -l | tee ~/php-fpm-error-lines.txt
sudo cat /var/log/httpd/error_log | wc -l | tee ~/httpd-error-lines.txt

# 設定ファイルのバックアップ
sudo tar czf /root/php84-config.tar.gz \
  /etc/php.ini /etc/php.d /etc/php-fpm.conf /etc/php-fpm.d /etc/httpd/conf.d/php.conf
```

- EC2 コンソールから **AMI またはスナップショットを取得**(切り戻し用)

---

## 3. インストールするパッケージの確認

```bash
# パッケージ名の php8.4 を php8.5 に置換した一覧
sed 's/^php8\.4/php8.5/' ~/php84-packages.txt | tee ~/php85-packages.txt

# 8.5 で提供されていないパッケージを表示(何も出なければすべて提供あり)
for p in $(cat ~/php85-packages.txt); do
  [ -z "$(sudo dnf repoquery -q --repo=amazonlinux --releasever=latest "$p")" ] && echo "提供なし: $p"
done
```

- 「提供なし」のパッケージは `~/php85-packages.txt` から行を削除する
  - `php8.5-opcache`:削除するだけでよい
  - それ以外:その拡張モジュールが必要か、別の入手方法があるかを確認する

---

## 4. 8.4 のアンインストールと 8.5 のインストール

```bash
# 8.5 をインストールし、競合する 8.4 をアンインストール(一覧を確認してから y)
sudo dnf install --releasever=latest --allowerasing $(cat ~/php85-packages.txt)
```

y を押す前に、表示される一覧で次を確認する。

| dnf の表示 | 確認すること |
|---|---|
| インストール(Installing) | `php8.5-xxx` が `~/php85-packages.txt` のとおり並んでいるか |
| 削除(Removing) | `php8.4-xxx` だけになっているか(**PHP 以外のパッケージがアンインストール対象に入っていたら中止する**) |

---

## 5. 設定ファイルの確認

```bash
# 退避・競合した設定ファイル(.rpmsave:元の設定が退避されたもの / .rpmnew:新しい標準設定)
sudo find /etc/php* /etc/httpd \( -name '*.rpmnew' -o -name '*.rpmsave' \) 2>/dev/null

# バックアップを展開して、アップグレード前との差分を確認
mkdir -p ~/php84-config
sudo tar xzf /root/php84-config.tar.gz -C ~/php84-config
sudo diff ~/php84-config/etc/php.ini /etc/php.ini
sudo diff -r ~/php84-config/etc/php.d /etc/php.d
sudo diff ~/php84-config/etc/php-fpm.conf /etc/php-fpm.conf
sudo diff -r ~/php84-config/etc/php-fpm.d /etc/php-fpm.d
sudo diff ~/php84-config/etc/httpd/conf.d/php.conf /etc/httpd/conf.d/php.conf
```

- `.rpmnew` が出た場合(例:`/etc/php.ini.rpmnew`):現在のファイルは変更済みのためそのまま残り、8.5 の標準が `.rpmnew` として置かれている。`.rpmnew` に自分で変更した設定を反映して、現在のファイルと置き換える

```bash
# 有効な設定だけの差分(コメントと空行を除く。< が現在の設定、> が 8.5 の標準)
diff <(sudo grep -Ev '^\s*(;|$)' /etc/php.ini) <(sudo grep -Ev '^\s*(;|$)' /etc/php.ini.rpmnew)
```
- 変更した設定が消えていたら、8.5 の新しいファイルに変更点だけを反映する(8.4 のファイルで上書きしない)
- `/etc/php.d/10-opcache.ini` は 8.5 のファイルになり、`zend_extension=opcache` の行がなくなる(8.5 から OPcache は PHP 本体に組み込み)。それ以外の差分は 8.5 の標準ファイルのコメントの違い
- OPcache の設定値に変わりがないかを確認する

```bash
# OPcache の設定値の差分(何も出なければ同じ)
php -i | grep '^opcache\.' | diff <(grep '^opcache\.' ~/php84-info.txt) -
```

- `opcache.file_cache_read_only` の追加と `opcache.jit_hot_loop` の 64 → 61 は 8.5 の初期値によるもの(`jit_hot_loop` は JIT を使う場合のみ関係する)

---

## 6. サービスの再起動

```bash
# 自動起動が有効か(8.4 のアンインストール時に無効化される場合がある)
systemctl is-enabled php-fpm
sudo systemctl enable php-fpm    # disabled と出た場合

sudo systemctl restart php-fpm   # 必須:8.5 の php-fpm を起動
sudo apachectl configtest        # Syntax OK を確認
sudo systemctl reload httpd
```

---

## 7. アップグレード後の確認

```bash
# バージョン
php -v ; php-fpm -v               # 8.5 になっているか
rpm -qa 'php8.5*' | sort          # インストール済みの PHP パッケージ(バージョン付き)
rpm -qa | grep php8.4             # 何も出なければ OK

# 拡張モジュールの差分(< が 8.4 にだけあったもの)
php -m | diff ~/php84-modules.txt -

# サービスの状態
systemctl status php-fpm --no-pager
systemctl status httpd --no-pager

# 作業開始後に追加されたエラーログ(Deprecated / Warning / Fatal / error が出ていないか)
sudo tail -n +$(( $(cat ~/php-fpm-error-lines.txt) + 1 )) /var/log/php-fpm/error.log
sudo tail -n +$(( $(cat ~/httpd-error-lines.txt) + 1 )) /var/log/httpd/error_log
```

- 拡張モジュールの差分に出たものは、3. で一覧から削除したもの以外なら原因を確認する
- ブラウザで各サイトの主な画面を確認する(ログイン、DB 参照、画像やファイルのアップロード、メール送信、PDF・Excel 出力など)

---

## 8. 切り戻し

問題が出た場合は、AMI から復元するか、8.5 をアンインストールして 8.4 を再インストールする。

```bash
# 8.4 を再インストールし、競合する 8.5 をアンインストール(一覧を確認してから y)
sudo dnf install --releasever=latest --allowerasing $(cat ~/php84-packages.txt)

# 設定ファイルをアップグレード前の状態に戻す
sudo tar xzf /root/php84-config.tar.gz -C /

sudo systemctl enable php-fpm
sudo systemctl restart php-fpm
sudo apachectl configtest
sudo systemctl reload httpd

# 切り戻し後の確認
php -v ; php-fpm -v               # 8.4 に戻っているか
rpm -qa | grep php8.5             # 何も出なければ OK
systemctl status php-fpm --no-pager
systemctl status httpd --no-pager
```

2026/10/22

PHP / OS 更新チートシート(Amazon Linux 2023 / Apache + PHP-FPM)

- 対象環境:Amazon Linux 2023、PHP は AL2023 標準パッケージ(`php8.x*`)、Web サーバは Apache(`httpd`)+ PHP-FPM
- コマンド中の `php8.4` は、使用している PHP のバージョンに読み替える

---

## 1. PHP の更新

> AL2023 の dnf コマンドには `--releasever=latest` を付ける。付けないと、OS のリリースバージョンが固定されているため新しいパッケージが見えない。

### 1-1. 現状確認

```bash
# PHP バージョン(CLI / FPM の両方)
php -v
php-fpm -v

# インストール済み PHP パッケージ
rpm -qa | grep php
```

### 1-2. 未適用の修正版・セキュリティアドバイザリの確認

```bash
# 1) キャッシュを捨てて、最新の情報を取り直す(古いキャッシュだと新しいパッケージが見えない)
sudo dnf clean metadata

# 2) インストール済みの PHP パッケージに更新があるか(何も出なければ更新なし)
sudo dnf list --upgrades 'php8.4*' --releasever=latest

# 3) PHP 関連の未適用アドバイザリ(ALAS)
sudo dnf updateinfo list --security --releasever=latest | grep -i php

# 4) 特定の CVE に対応するアドバイザリがあるか(例:CVE-2026-109618)
sudo dnf updateinfo list --releasever=latest --cve CVE-2026-109618
```

- 1):2)〜4) の出力に表示される「メタデータの期限切れの最終確認」の日時が古い場合は、1) をやり直す
- 2):`dnf list available` はインストールしていないパッケージしか表示しないので、更新の確認には `dnf list --upgrades` を使う
- 4):適用済みかどうかの確認や詳細の表示など、CVE 指定の確認方法は 2-1「特定の CVE の確認」を参照

**AWS 側の対応状況の確認先**

php.net で修正版が出ても、AL2023 のパッケージに反映されるまでは時間差がある(通常数日)。

| 確認したいこと | 確認先 |
|---|---|
| 特定の CVE の対応状況 | `https://explore.alas.aws.amazon.com/<CVE番号>.html` 例:https://explore.alas.aws.amazon.com/CVE-2026-109618.html |
| AL2023 のセキュリティアドバイザリ一覧 | https://alas.aws.amazon.com/alas2023.html |

CVE ページの「Status」の見方:

| Status | 意味 | 対応 |
|---|---|---|
| Pending Fix | 影響あり、修正版を準備中 | 回避策を入れて、修正版が出るのを待つ |
| Fixed | 修正版を公開済み(ALAS 番号と公開日が載る) | 1-3 以降で更新する |
| No Fix Planned | 修正版は出ない予定(サポート終了のバージョンなど) | サポートされているバージョンへ移行する |
| Not Affected | 影響なし | 対応不要 |

PHP 本体の情報(脆弱性の内容、修正版のバージョン、回避策):

- PHP 公式のお知らせ:https://www.php.net/
- PHP のセキュリティアドバイザリ(技術的な詳細):https://github.com/php/php-src/security/advisories

### 1-3. バックアップ

- EC2 コンソールから **AMI またはスナップショットを取得**(切り戻し用)
- 複数台ある場合は、1台で更新・動作確認してから残りに展開する

### 1-4. 更新

```bash
# インストール済みの PHP 関連パッケージをすべて最新に(一覧を確認してから y)
sudo dnf upgrade --releasever=latest 'php8.4*'
```

- インストール済みの php8.4 関連パッケージ(拡張モジュールを含む)だけが最新版に置き換わる。パッケージの追加や削除はされない

### 1-5. 設定ファイルの競合を確認

```bash
# 何も出なければ競合なし
sudo find /etc/php* /etc/php-fpm* /etc/httpd -name '*.rpmnew' 2>/dev/null
```

- `/etc/php.ini`、`/etc/php.d/*.ini`、`/etc/php-fpm.d/www.conf` などの変更は上書きされない
- `*.rpmnew` が出た場合は、既存の設定との差分を確認する

### 1-6. サービスの再起動

```bash
sudo systemctl restart php-fpm   # 必須:PHP 本体の反映
sudo apachectl configtest        # 推奨:httpd の設定に問題がないか(Syntax OK を確認)
sudo systemctl reload httpd      # 推奨:httpd 用の設定ファイルの反映(接続は切れない)
```

PHP パッケージの更新では、次の2種類のファイルが置き換わるため、それぞれ反映する。

| 置き換わるもの | 反映方法 |
|---|---|
| PHP 本体(PHP-FPM で動いている) | `php-fpm` の再起動 |
| httpd 用の設定ファイル(`/etc/httpd/conf.d/php.conf` など。`.php` へのリクエストを PHP-FPM に渡す設定) | `configtest` で確認してから、httpd の `reload` |

### 1-7. 更新後の確認

```bash
# バージョン
php -v ; php-fpm -v
rpm -qa | grep php8.4

# サービスの状態
systemctl status php-fpm --no-pager   # active (running)、起動時刻が更新後になっているか
systemctl status httpd --no-pager     # active (running) か(reload では起動時刻は変わらない)

# 未適用の PHP アドバイザリが残っていないか(何も出なければ OK)
sudo dnf updateinfo list --security --releasever=latest | grep -i php

# エラーログ
sudo tail -n 50 /var/log/php-fpm/error.log
sudo tail -n 50 /var/log/httpd/error_log
```

- ブラウザで各サイトの主な画面を確認する(ログイン、DB 参照、画像やファイルのアップロードなど、使用している拡張モジュールに関わる処理)

### 1-8. 定期確認(新しい修正が出ていないか)

```bash
sudo dnf clean metadata
sudo dnf list --upgrades 'php8.4*' --releasever=latest
sudo dnf updateinfo list --security --releasever=latest | grep -i php
```

- 更新が表示されたら、1-3〜1-7 を行う
- 修正待ちの CVE がある場合は、1-2 の CVE ページで Status が「Fixed」になったかも確認する

---

## 2. OS 全体の更新

### 2-1. リリースバージョンの固定状況の確認

AL2023 のリポジトリには日付付きのバージョン(例:`2023.10.20260120`)があり、各サーバーは**起動に使った AMI のバージョンに固定**される。

- 普通の `dnf upgrade` は、固定されたバージョンの範囲内でしか更新しない
- 新しいバージョンのパッケージを入れるには `--releasever=latest`(または特定の日付)を指定する
- 自分でバージョンを進めないと、セキュリティ修正も入らない(構築時のバージョンのまま取り残される)

```bash
# 今固定されているリリースのバージョン
rpm -q system-release

# 新しいリリースがあるか(出力にリリースノートの URL も表示される)
sudo dnf check-release-update

# 未適用のアドバイザリ件数
sudo dnf updateinfo summary --releasever=latest
```

- AL2023 のリリースノート:https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes.html

**特定の CVE の確認**(`CVE-YYYY-NNNNN` を確認したい CVE 番号に置き換える)

```bash
# 1) その CVE に対応する未適用のアドバイザリ(何も出なければ未適用のものはない)
sudo dnf updateinfo list --releasever=latest --cve CVE-YYYY-NNNNN

# 2) 適用済みのものも含めて表示(行頭に i が付いたものは適用済み)
sudo dnf updateinfo list --all --releasever=latest --cve CVE-YYYY-NNNNN

# 3) アドバイザリの詳細(対象パッケージ、修正版のバージョン、関連する CVE)
sudo dnf updateinfo info --releasever=latest --cve CVE-YYYY-NNNNN
```

- 実行前に `sudo dnf clean metadata` で最新の情報を取り直しておく
- 1) で何も出ない場合、「適用済み」「修正版がまだ出ていない(Pending Fix)」「影響なし」のどれかなので、2) と `https://explore.alas.aws.amazon.com/CVE-YYYY-NNNNN.html` の Status(1-2 の表)で区別する
- 1) で表示された場合は、2-2 以降で更新する

### 2-2. 事前準備

**バックアップ**

- EC2 コンソールから AMI またはスナップショットを取得する
- 可能であれば、本番の AMI から検証用のインスタンスを起動して先に試す

```bash
# /etc 全体のバックアップ(更新後の比較用)
sudo tar czf /root/etc-backup-$(date +%Y%m%d).tar.gz /etc
```

**変更した設定ファイルの確認**

パッケージに含まれるファイルを、インストール時の状態と比べて、内容を変更したものを洗い出す(全パッケージを調べるため数分かかる)。

```bash
# 1) 内容を変更した「設定ファイル」(更新しても基本的に変更は残る)
sudo rpm -Va 2>/dev/null | grep '^..5' | awk '$2=="c"'

# 2) 内容を変更した「設定ファイル以外」(更新で上書きされて変更が消える → 要対応)
sudo rpm -Va 2>/dev/null | grep '^..5' | awk '$2!="c"'
```

出力の例と見方:

```
S.5....T.  c /etc/httpd/conf/httpd.conf     ← 1) に出る:設定ファイル
S.5....T.    /usr/lib/systemd/system/xxx.service   ← 2) に出る:設定ファイル以外
│ │    │   │
│ │    │   └ "c" があれば設定ファイル(なければ空欄)
│ │    └ T:更新日時が変わっている
│ └ 5:内容が変わっている(grep '^..5' でこれを含む行だけに絞っている)
└ S:サイズが変わっている
```

- 先頭の9文字は、インストール時から変わった項目を表す(変わっていない項目は `.`)
- `rpm -Va`:インストール済みの全パッケージ(`-a`)のファイルを検証(`-V`)する
- 2) に出たファイルは、更新前に変更内容を控えておくか、上書きされない場所(systemd なら `/etc/systemd/system/`)に移しておく

更新時の設定ファイルの扱い:

| 設定の種類 | 更新時の動き |
|---|---|
| 自分で新しく作ったファイル(例:`/etc/httpd/conf.d/サイト名.conf`) | 影響なし |
| パッケージ付属の設定ファイルを編集したもの | 基本的に残る。新しい標準設定は `*.rpmnew` として置かれる |
| 同上だが、パッケージ側が「上書き」指定にしているもの(少数) | 新しいものに置き換わり、元のファイルは `*.rpmsave` として退避される |
| パッケージ付属の、編集していない設定ファイル | 新しいバージョンのものに黙って置き換わる |
| 設定ファイル以外を直接編集したもの(例:`/usr/lib/systemd/system/*.service`) | 上書きされて変更が消える |
| サービスの自動起動設定、ユーザー、cron、`/var/www` のデータなど | 影響なし |

- `/usr/lib/systemd/system/` 配下などを直接編集している場合は、更新前に `sudo systemctl edit サービス名` で `/etc/systemd/system/` 側の上書き設定に移しておく

### 2-3. 更新

```bash
# OS 全体を最新リリースに更新(一覧を確認してから y)
sudo dnf upgrade --releasever=latest
#   特定のバージョンに揃えたい場合は日付を指定する
#   sudo dnf upgrade --releasever=2023.12.20261016

# 再起動が必要か確認して、必要なら再起動
sudo dnf needs-restarting -r
sudo reboot
```

- 更新の中で `system-release` パッケージも新しくなり、固定先がそのバージョンに進む

### 2-4. 更新後の確認

```bash
# 固定先が進んだか
rpm -q system-release            # 新しい日付になっていれば OK
sudo dnf check-release-update    # 新しいリリースが表示されなければ最新

# 起動中のカーネルが、インストール済みの最新のカーネルと同じか(同じバージョンなら OK)
uname -r                         # 起動中のカーネル
rpm -q kernel --last | head -n 1 # インストール済みの最新のカーネル(kernel6.12 などを使っている場合は kernel を置き換える)

# 設定ファイルの競合(.rpmnew:新しい標準設定 / .rpmsave:元の設定が退避されたもの)
sudo find /etc \( -name '*.rpmnew' -o -name '*.rpmsave' \) 2>/dev/null

# 退避された設定がある場合は差分を確認して、必要な変更を戻す
sudo diff /etc/xxx.conf.rpmsave /etc/xxx.conf

# 起動に失敗しているサービスがないか
systemctl --failed
sudo apachectl configtest
systemctl status php-fpm --no-pager
systemctl status httpd --no-pager
```

- 1-7 と同様に、エラーログとブラウザでの動作を確認する

### 2-5. 定期的な更新の運用

- 固定先を定期的に進める(`sudo dnf upgrade --releasever=latest`)。SSM Patch Manager で自動化するのもおすすめ
- `/etc/dnf/vars/releasever` に `latest` と書くと、常に最新のリポジトリを見るようになる(ただし勝手にリリースが進むので、検証環境と本番環境でバージョンを揃えたい場合は、毎回 `--releasever` を明示的に指定する運用にする)
- 新しいサーバーを構築するときは、パッケージをインストールする前に `sudo dnf upgrade --releasever=latest` で最新リリースに上げておく(AMI 作成時点のバージョンに固定されているため)

---

## 参考:作業ログの記録

```bash
# プロンプトに日時を表示する(コマンドごとの時刻がログに残る。このログイン中だけ有効)
export PS1='[\D{%F %T}] \u@\h:\w\$ '

# 記録開始(入力したコマンドと出力をファイルに記録。-a:追記 / -f:すぐ書き込む)
script -a -f ~/worklog_$(date +%Y%m%d_%H%M).log

# 記録終了
exit
```

2026/10/09

nslookup チートシート

## 1. 基本の書式

```
nslookup [オプション] <調べる名前> [問い合わせ先DNSサーバー]
```

| 部分 | 内容 | 例 |
|---|---|---|
| オプション | レコードの種類の指定やデバッグ表示など | `-type=mx`、`-debug` |
| 調べる名前 | ドメイン名・ホスト名・IPアドレス(**名前の末尾に `.` を付けるのが確実**。3章参照) | `example.com.` |
| 問い合わせ先 | 省略すると、PCに設定されたDNS(ルーターやプロバイダのDNSなど)を使う | `ns1.example.net` |

### 対話モード
引数なしで実行すると、対話モードになります。

| 対話モードのコマンド | コマンドラインでの同等の指定 |
|---|---|
| `set type=mx` | `-type=mx` |
| `set debug` / `set nodebug` | `-debug` |
| `server ns1.example.net` | 末尾に問い合わせ先 `ns1.example.net` を指定 |
| `example.com.`(名前だけを入力) | 問い合わせの実行 |
| `set all` | (なし)現在の設定(type、debug、問い合わせ先など)を一覧表示する |
| `exit` | 対話モードの終了 |

---

## 2. よく使うオプション

| オプション | 意味 |
|---|---|
| `-type=<種類>` | レコードの種類を指定する(`-q=<種類>` も同じ)。省略するとA(とAAAA) |
| `-debug` | 実際に送った問い合わせ名(QUESTIONS)、応答の種類、TTLなどの詳細を表示する |
| `-norecurse` | 問い合わせ先に「代わりに調べて」と頼まない(相手のDNSが持っている情報だけを見たいとき) |
| `-timeout=<秒>` | 応答を待つ時間 |

### レコードの種類(`-type=`)

| 種類 | 内容 | 主な用途 |
|---|---|---|
| `a` | 名前 → IPv4アドレス | Webサイトやサーバーの接続先の確認 |
| `aaaa` | 名前 → IPv6アドレス | 同上(IPv6) |
| `mx` | メールの受信先サーバー(優先度付き) | メールがどこに届くかの確認 |
| `txt` | 任意の文字列 | SPF(`v=spf1 …`)、DMARC(`_dmarc.` の下)、ドメインの所有権確認 |
| `ns` | そのドメインを管理するDNSサーバー(向き先) | どのDNSでゾーンが管理されているかの確認 |
| `soa` | ゾーンの管理情報(管理元・シリアル番号・既定値など) | ゾーンの有無、変更の目安 |
| `cname` | 別名 | 別名の参照先の確認 |
| `ptr` | IPアドレス → 名前(逆引き) | IPアドレスがどのサーバーのものかの確認 |
| `any`(`all` も同じ) | 全種類 | **確認には使わない**。DNSサーバーによって返る内容が異なり、最小限の応答(`HINFO RFC8482`)しか返さないものも多い。全レコードの一覧は得られない |

---

## 3. 注意点

### 名前の末尾には `.` を付ける(Windowsの場合)
Windows の `nslookup` は、末尾に `.` のない名前を問い合わせるとき、**まずPCのDNSサフィックス(例:`isp.example.ne.jp`)を補った名前で問い合わせます**。

```
nslookup -type=ns example.com a.dns.jp
→ 実際には example.com.isp.example.ne.jp を問い合わせ、無関係な結果が表示されることがある

nslookup -type=ns example.com. a.dns.jp
→ 意図どおり example.com を問い合わせる
```
(`a.dns.jp`:.jp ドメインを管理するJPRSのDNSサーバー)

- 通常のDNSサーバーに問い合わせた場合は、補った名前が「存在しない」と返り、元の名前で問い合わせ直すので気付きにくい。
- 上位のDNSサーバー(`a.dns.jp` など)は「委任先の案内」を返すため、補った名前の結果がそのまま表示されてしまう。
- 実際に送った名前は、`-debug` の `QUESTIONS:` 欄で確認できる。
- PCに設定されているサフィックスは、`ipconfig /all` の「接続固有の DNS サフィックス」「DNS サフィックス検索一覧」で確認できる(Windowsの場合)。

### レコードの種類を必ず指定する
`-type` を省略するとAレコードとして問い合わせます。たとえばDMARC(TXTレコード)を種類なしで問い合わせると「ない」という結果になり、**設定されていないと誤認**します。

### 問い合わせ先によって結果の意味が変わる

| 問い合わせ先 | 得られるもの |
|---|---|
| 省略(PCのDNS) | キャッシュを含む結果。TTLは**残り時間**(カウントダウンされた値) |
| 権威DNS(そのゾーンを持つDNS) | ゾーンに設定されている**正の値**。TTLは設定値 |
| 上位のDNS(TLDを管理するDNS) | 「このドメインはどのDNSが管理しているか」という委任の情報 |

---

## 4. 出力の読み方
表示の文言は、Windowsの場合のものです。

| 表示 | 意味 |
|---|---|
| `Non-authoritative answer:` | キャッシュDNSからの応答(権威DNSの応答ではない) |
| `auth. answer`(`-debug` のヘッダー) | 権威DNSからの応答 |
| `ttl = 3600 (1 hour)`(`-debug`) | TTL。権威DNSに問い合わせたときは設定値 |
| SOAだけが返る(`primary name server = …` だけ表示) | **その名前・種類のレコードはない**(ゾーン自体はある) |
| `can't find … : Non-existent domain` | その名前自体が存在しない |
| `Query refused` | そのDNSサーバーは、そのドメインを管理していない(または問い合わせを拒否している) |
| `HINFO CPU = RFC8482` | `-type=any` への最小限の応答。全レコードの一覧ではない |
| `??? unknown type 65 ???` | nslookupが表示に対応していない種類のレコード(例:65はHTTPSレコード) |
| `default TTL = …`(SOAの表示) | SOAの最後の項目(MINIMUM)。現在の規格では**ネガティブキャッシュの時間**(「存在しない」という応答を保持する時間) |
| 権威DNSなのにTTLが問い合わせのたびに減る | 参照先の値を返すエイリアス型(CNAMEフラットニング)のレコードと考えられる |

---

## 5. 用途別コマンド集

### 5-1. ドメインを管理しているDNSサーバーはどこか(NSレコード)

```
nslookup -type=ns example.com.
nslookup -type=ns example.jp. a.dns.jp
```
- 上位のDNSに問い合わせると、「どのDNSサーバーがこのドメインの設定(ゾーン)を管理しているか」という登録内容(委任)が分かる。**ここに出るDNSサーバーだけが外部から参照される。**
- `a.dns.jp`:.jp を管理するJPRSのDNSサーバー(a〜hの8台)。.com・.net の場合は `a.gtld-servers.net` など。
- TLDを管理するDNSサーバーの一覧は、次のコマンドで確認できる。
```
nslookup -type=ns jp.
nslookup -type=ns com.
```

### 5-2. DNSサーバーがそのドメインの設定(ゾーン)を持っているか(SOAレコード)

```
nslookup -type=soa example.com. ns1.example.net
```
- SOAが返れば、そのDNSサーバーはゾーンを持っている。
- シリアル番号は、日付形式(例:`2024010500`)で付けられていることが多く、最終変更の目安になる。

### 5-3. メールがどのサーバーに届くか(MXレコード)

```
nslookup -type=mx example.com.
nslookup -type=mx example.com. ns1.example.net
```
- 優先度(preference)の値が小さいサーバーから順に使われる。

### 5-4. どのサーバーからのメール送信が許可されているか(SPF:TXTレコード)

```
nslookup -type=txt example.com. ns1.example.net
```
- 返ってきたTXTのうち、`v=spf1` で始まるものがSPF。**1本だけ**であることを確認する(2本以上あると無効)。
- 例:`v=spf1 include:spf.example.net ~all` は、`spf.example.net` で許可された送信元を許可し、それ以外は「怪しいが受け取ってよい」(`~all`)という意味。`-all` の場合は「拒否してよい」。
- 参考:include 先の名前のTXTを問い合わせると、許可されている送信元(IPアドレスなど)を見られる。
```
nslookup -type=txt spf.example.net.
```

### 5-5. 認証に失敗したメールの扱いが指定されているか(DMARC:TXTレコード)

```
nslookup -type=txt _dmarc.example.com. ns1.example.net
```
- **`-type=txt` を必ず指定する**。
- `p=none`(何もしない)、`p=quarantine`(迷惑メール扱い)、`p=reject`(拒否)のいずれかが指定されている。

### 5-6. 送信メールの電子署名を検証する公開鍵があるか(DKIM:TXTレコード)

```
nslookup -type=txt <セレクタ>._domainkey.example.com.
```
- セレクタ名が分からないと照会できない。送信側の設定や、受信したメールのヘッダー(`DKIM-Signature` の `s=`)で確認する。

### 5-7. レコードがどれくらいの時間キャッシュされるか(TTL)

```
nslookup -debug -type=mx example.com. ns1.example.net
```
- 権威DNSに `-debug` 付きで問い合わせると、`ttl =` に設定値が表示される。
- 何度か問い合わせて値が変わらなければ固定の設定値、減っていく場合はキャッシュの残り時間か、エイリアス型のレコード。

### 5-8. 名前とIPアドレスの対応(Aレコード/逆引きのPTRレコード)

```
nslookup -type=a mail.example.com.
nslookup -type=ptr 10.2.0.192.in-addr.arpa.
nslookup 192.0.2.10                       ← IPアドレスを渡すと逆引きになる
```
- 逆引きの名前は、IPアドレスを逆順に並べて `.in-addr.arpa.` を付けたもの(192.0.2.10 → `10.2.0.192.in-addr.arpa.`)。

### 5-9. 実際にどの名前で問い合わせたか(補完の確認)

```
nslookup -debug -type=ns example.com a.dns.jp
```
- `QUESTIONS:` 欄に表示される名前が、実際に問い合わせた名前。サフィックスが補われていないかを確認できる(3章参照)。

### 5-10. DNSの変更がすべての管理サーバーに反映されたか

```
nslookup -debug -type=mx  example.com. ns1.example.net
nslookup -debug -type=mx  example.com. ns2.example.net
nslookup -debug -type=txt example.com. ns1.example.net
nslookup -debug -type=txt example.com. ns2.example.net
```
- 権威DNSが複数ある場合は、**すべてに問い合わせて**同じ新しい値が返ることを確認する(外部からは、どの権威DNSに問い合わせが行くか分からないため)。
- PCのDNS(問い合わせ先を省略)では、TTLが切れるまで古い値が返ることがある。

---

## 6. 補足:WHOIS(ドメインの登録情報)
WHOISのコマンドは、OSによっては標準で入っていない(Windowsでは、Sysinternals の Whois を別途導入する)。次のWebサービスでも確認できる。
- .jp ドメイン:JPRS WHOIS([https://whois.jprs.jp/](https://whois.jprs.jp/))
- .com・.net・.org などのgTLD:ICANN Lookup([https://lookup.icann.org/](https://lookup.icann.org/))。ドメイン名の国際的な管理団体(ICANN)の公式ページ
- その他の国別ドメイン(.uk、.de など):IANA WHOIS([https://www.iana.org/whois](https://www.iana.org/whois))でTLDを検索すると、そのTLDを管理するレジストリとWHOISサーバーが分かる

2026/10/03

CVP分析グラフ

## CVPグラフ

## 損益構造の恒等式
| 区分 | 式 |
|---|---|
| 売上 | 変動費 + 固定費 + 利益 = 費用 + 利益 = 変動費 + 限界利益 |
| 費用 | 変動費 + 固定費 = 売上 − 利益 |
| 変動費 | 売上 × 変動費率 = 売上 − 限界利益 = 費用 − 固定費 |
| 固定費 | 費用 − 変動費 = 限界利益 − 利益 |
| 利益 | 売上 − 費用 = 限界利益 − 固定費 = 売上 × 限界利益率 − 固定費 |
| 限界利益 | 売上 − 変動費 = 固定費 + 利益 = 売上 × 限界利益率 |
| 変動費率 | 変動費 ÷ 売上 = 1 − 限界利益率 |
| 限界利益率 | 限界利益 ÷ 売上 = 1 − 変動費率 |

## 損益の構造図

2026/09/29

Linux ネットワーク/Wi-Fi コマンド チートシート

## 0. コマンドの役割

| コマンド | 主な用途 | 備考 |
|---|---|---|
| `ip` | インターフェース、IPアドレス、ルート、MACアドレスの確認・一時操作 | `iproute2`に含まれる |
| `nmcli` | NetworkManagerの接続・プロファイル管理 | 設定を永続化できる |
| `iw` | Wi-Fiデバイス、接続先、周波数、電波情報の確認 | 無線LANの低レベル情報 |
| `rfkill` | Wi-Fiなどの無線機能のブロック状態確認 | ハード/ソフトブロックを確認 |
| `lsusb` | USBデバイスの認識確認 | USB Wi-Fiドングルの確認 |
| `ethtool` | NICのドライバーやリンク情報の確認 | 無線では主にドライバー確認に使用 |

> 対象: Debian/Ubuntu系およびRHEL/Rocky/AlmaLinux系。`nmcli`はNetworkManager使用環境が前提です。

## 1. インターフェース一覧

```bash
ip link
ip -br link
nmcli device status
iw dev
```

## 2. USB Wi-Fiドングルの認識確認

```bash
lsusb
sudo dmesg | grep -iE 'usb|wifi|wlan|wireless|firmware'
sudo journalctl -k | grep -iE 'usb|wifi|wlan|wireless|firmware'
sudo ethtool -i wlan1
readlink -f /sys/class/net/wlan1/device/driver
```

## 3. MACアドレスの確認

```bash
ip link show wlan1
cat /sys/class/net/wlan1/address
nmcli -g GENERAL.HWADDR device show wlan1
ip -br link
```

## 4. IPアドレスの確認

```bash
ip address
ip addr show dev wlan1
ip -br addr
nmcli device show wlan1
nmcli -g IP4.ADDRESS,IP4.GATEWAY,IP4.DNS device show wlan1
```

## 5. Wi-Fiアクセスポイントの検索

```bash
nmcli device wifi rescan
nmcli device wifi list
nmcli device wifi list ifname wlan1
nmcli -f IN-USE,SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY device wifi list ifname wlan1
sudo iw dev wlan1 scan
sudo iw dev wlan1 scan | grep -E 'BSS |SSID:|freq:|signal:'
```

## 6. Wi-Fiへ接続

### SSIDを指定

```bash
nmcli device wifi connect "SSID" password "PASSWORD" ifname wlan1
```

パスワードをコマンド履歴へ残したくない場合:

```bash
nmcli --ask device wifi connect "SSID" ifname wlan1
```

### BSSIDを指定

```bash
nmcli device wifi connect "AA:BB:CC:DD:EE:FF" password "PASSWORD" ifname wlan1
```

SSIDとBSSIDを両方指定:

```bash
nmcli device wifi connect "SSID" bssid "AA:BB:CC:DD:EE:FF" password "PASSWORD" ifname wlan1
```

### 既存プロファイルを有効化

```bash
nmcli connection up "接続名" ifname wlan1
```

## 7. 接続中のWi-Fi情報

```bash
iw dev wlan1 link
nmcli device show wlan1
nmcli -f IN-USE,SSID,BSSID,CHAN,FREQ,SIGNAL device wifi list ifname wlan1
```

`iw dev wlan1 link`の主な項目:

- `Connected to`: 接続中のBSSID
- `SSID`: 接続中のSSID
- `freq`: 中心周波数
- `signal`: 受信信号強度
- `tx bitrate`: 送信リンク速度

## 8. チャネル/周波数の確認

```bash
iw dev wlan1 link
iw dev wlan1 info
nmcli -f IN-USE,SSID,BSSID,CHAN,FREQ device wifi list ifname wlan1
```

### 代表的な周波数とチャネル

| 周波数 | チャネル |
|---:|---:|
| 2412 MHz | 1 |
| 2437 MHz | 6 |
| 2462 MHz | 11 |
| 5180 MHz | 36 |
| 5200 MHz | 40 |
| 5220 MHz | 44 |
| 5240 MHz | 48 |
| 5500 MHz | 100 |
| 5520 MHz | 104 |
| 5540 MHz | 108 |
| 5560 MHz | 112 |

## 9. 内蔵Wi-FiからUSB Wi-Fiへ切り替える

例:

- 内蔵Wi-Fi: `wlan0`
- USB Wi-Fi: `wlan1`

```bash
nmcli device disconnect wlan0
nmcli device wifi connect "SSID" password "PASSWORD" ifname wlan1
nmcli device status
iw dev wlan1 link
ip route
```

内蔵Wi-Fiを一時停止:

```bash
sudo ip link set wlan0 down
```

元に戻す:

```bash
sudo ip link set wlan0 up
```

NetworkManagerの管理対象外にする:

```bash
sudo nmcli device set wlan0 managed no
sudo nmcli device set wlan0 managed yes
```

## 10. 接続プロファイルの管理

```bash
nmcli connection show
nmcli connection show --active
nmcli connection show "接続名"
```

プロファイルを特定インターフェースへ固定:

```bash
nmcli connection modify "接続名" connection.interface-name wlan1
```

BSSIDを固定/解除:

```bash
nmcli connection modify "接続名" 802-11-wireless.bssid "AA:BB:CC:DD:EE:FF"
nmcli connection modify "接続名" 802-11-wireless.bssid ""
```

自動接続と優先度:

```bash
nmcli connection modify "接続名" connection.autoconnect yes
nmcli connection modify "接続名" connection.autoconnect-priority 100
```

設定反映:

```bash
nmcli connection down "接続名"
nmcli connection up "接続名"
```

## 11. Wi-Fi無線機能の有効/無効

```bash
nmcli radio wifi
nmcli radio wifi on
nmcli radio wifi off
rfkill list
sudo rfkill unblock wifi
sudo rfkill unblock all
```

## 12. インターフェースの有効/無効

```bash
sudo ip link set wlan1 down
sudo ip link set wlan1 up
nmcli device disconnect wlan1
nmcli connection up "接続名" ifname wlan1
```

## 13. デフォルトルートの確認

```bash
ip route
ip route get 8.8.8.8
ip -6 route
```

例:

```text
default via 192.168.1.1 dev wlan1 proto dhcp metric 600
```

この場合、デフォルト通信は`wlan1`を使用します。

## 14. インターフェースの優先順位

Linuxは通常、デフォルトルートの`metric`が小さい経路を優先します。

```bash
ip route
nmcli connection modify "USB-WiFi" ipv4.route-metric 100
nmcli connection modify "Internal-WiFi" ipv4.route-metric 600
nmcli connection modify "USB-WiFi" ipv6.route-metric 100
nmcli connection modify "Internal-WiFi" ipv6.route-metric 600
nmcli connection down "USB-WiFi"
nmcli connection up "USB-WiFi"
```

## 15. Wi-Fiの対応周波数・チャネル確認

```bash
iw phy
iw phy phy0 info
iw list
```

確認できる主な項目:

- 対応周波数・使用可能チャネル
- 無効化されたチャネル
- 対応インターフェースモード
- HT/VHT/HE/EHT対応状況
- 対応チャネル幅

## 16. リージョン/規制ドメイン

```bash
iw reg get
sudo iw reg set JP
iw reg get
iw list
```

> 恒久設定方法はディストリビューションと無線ドライバーによって異なります。

## 17. 通信状態の確認

```bash
ip -s link show wlan1
ip route
ping -c 4 192.168.1.1
ping -c 4 8.8.8.8
ping -c 4 example.com
nmcli general status
```

## 18. NetworkManagerログの確認

```bash
systemctl status NetworkManager
sudo journalctl -u NetworkManager -b
sudo journalctl -u NetworkManager -f
sudo journalctl -u NetworkManager -b | grep -iE 'wifi|wlan|802-11|supplicant'
systemctl status wpa_supplicant
```

## 19. 変更前後の確認セット

### 変更前

```bash
ip -br link
ip -br addr
ip route
nmcli device status
nmcli connection show --active
iw dev
iw dev wlan1 link
```

### 変更後

```bash
nmcli device status
nmcli connection show --active
iw dev wlan1 link
ip addr show dev wlan1
ip route
ip route get 8.8.8.8
```

## 20. トラブルシューティング基本フロー

### 1. USBデバイスとして認識されているか

```bash
lsusb
```

### 2. インターフェースが作成されているか

```bash
ip -br link
iw dev
```

### 3. ドライバー/ファームウェアエラーがないか

```bash
sudo journalctl -k -b | grep -iE 'firmware|wifi|wlan|wireless|usb|error|failed'
```

### 4. 無線機能がブロックされていないか

```bash
rfkill list
nmcli radio
```

### 5. NetworkManagerが管理しているか

```bash
nmcli device status
```

### 6. アクセスポイントを検出できるか

```bash
nmcli device wifi rescan ifname wlan1
nmcli device wifi list ifname wlan1
```

### 7. 接続できているか

```bash
iw dev wlan1 link
```

### 8. IPアドレスが割り当てられているか

```bash
ip addr show dev wlan1
```

### 9. デフォルトルートがあるか

```bash
ip route
```

### 10. 経路、外部疎通、DNSを切り分ける

```bash
ip route get 8.8.8.8
ping -c 4 8.8.8.8
ping -c 4 example.com
```

## 21. よく使うワンライナー

Wi-Fiインターフェース名:

```bash
iw dev | awk '$1=="Interface"{print $2}'
```

MACアドレス:

```bash
cat /sys/class/net/wlan1/address
```

接続中のBSSID:

```bash
iw dev wlan1 link | awk '/Connected to/{print $3}'
```

接続中のSSID:

```bash
iw dev wlan1 link | sed -n 's/^[[:space:]]*SSID: //p'
```

現在の周波数:

```bash
iw dev wlan1 link | awk '/freq:/{print $2 " MHz"}'
```

デフォルトルートで使用中のインターフェース:

```bash
ip route show default | awk '/default/{print $5}'
```

Wi-Fi接続情報をまとめて確認:

```bash
printf '%s\n' '=== Device ===' &&
nmcli device status &&
printf '%s\n' '=== Link ===' &&
iw dev wlan1 link &&
printf '%s\n' '=== Address ===' &&
ip -br addr show wlan1 &&
printf '%s\n' '=== Route ===' &&
ip route
```

## 注意事項

- `ip link set ... down`による変更は一時的です。
- `nmcli connection modify`は保存された接続プロファイルを変更します。
- `device`はインターフェースの現在状態、`connection`はNetworkManagerの設定プロファイルです。
- SSH接続中に使用中のインターフェースを停止すると、接続が切断されます。
- インターフェース名は`wlan0`、`wlp2s0`、`wlx...`など環境によって異なります。
- BSSID固定中は別のアクセスポイントへのローミングが制限されます。
- 実行前に対象インターフェース名と接続プロファイル名を確認してください。

Claude の共有範囲まとめ(claude.ai / デスクトップ / ターミナル / Web)

> 調査日: 2026-09-29
> 出典: Anthropic 公式ドキュメント(末尾の参考リンク)。

---

## 基本の考え方

分ける軸は「Web / デスクトップ / ターミナル」ではなく、**どこに保存されるか**。

1. **アカウント(クラウド)に保存** → どの端末からでも見える
2. **PC のローカル(`~/.claude/` 配下)に保存** → そのPCの中ならターミナルとデスクトップで共有される。別のPCには同期されない
3. **Git リポジトリに保存** → push / pull で共有される

---

## ① claude.ai チャット

| 項目 | Web / デスクトップ(Chat) / モバイル | Claude Code |
|---|---|---|
| チャット履歴 | ✅ 同期 | ❌ 見えない |
| Projects(チャット用)、メモリ、カスタム指示、スタイル | ✅ 同期 | ❌ 読み込まれない |
| コネクタ(claude.ai/customize/connectors で追加) | ✅ 同期 | ✅ 同じアカウントでログインすれば使える |


- チャットと Claude Code は別の製品として扱われる。チャットの内容や claude.ai のメモリは Claude Code に引き継がれない。

---

## ② Claude Code のセッション

| 種類 | 保存場所 | 他の環境から見えるか |
|---|---|---|
| ターミナル(CLI) | そのPCの `~/.claude/projects/...jsonl` | 同じPCなら `claude --resume` や `/resume` で再開できる。別のPCからは基本的に見えない |
| デスクトップ版 Code タブ(ローカル) | そのPC | ほかのPCや Web からは見えない |
| Claude Code on the web(クラウド) | Anthropic のクラウド | ✅ Web(claude.ai/code)、モバイル、デスクトップから見える。`claude --teleport` でターミナルに取り込める |
| Remote Control | ローカルで動いているセッションのまま | ローカルセッションをスマホやブラウザから操作する仕組み。PCの電源が切れたりスリープしたりすると止まる |


- ローカルセッションを別の端末から扱いたいとき → **クラウドセッション** にするか **Remote Control** を使う

---

## ③ 設定・メモリ・スキル・MCP(Claude Code)

| 項目 | 場所 | 同じPC内(CLI ⇔ デスクトップ) | 別のPC |
|---|---|---|---|
| ユーザー用 CLAUDE.md、settings.json | `~/.claude/` | ✅ 共有 | ❌ 同期なし(自分でコピーする) |
| 自動メモリ(auto memory) | `~/.claude/projects//memory/` | ✅ 共有 | ❌ 同期なし |
| ユーザー用スキル | `~/.claude/skills/` | ✅ 共有 | ❌ 同期なし |
| ユーザー/ローカル用 MCP | `~/.claude.json` | ✅ 共有 | ❌ 同期なし |
| プロジェクト用 CLAUDE.md、`.claude/settings.json`、`.claude/skills/`、`.mcp.json` | リポジトリ | ✅ 共有 | ✅ Git 経由で共有 |
| `settings.local.json`、`CLAUDE.local.md` | リポジトリ(Git の管理外) | ✅ 共有 | ❌ 同期なし |

---

## 実務上のポイント

- デスクトップ版の Code タブも、CLI と同じ `~/.claude` を使う。同じPCなら、メモリ、スキル、設定は共通。
- **どこでも使いたいスキルや指示はリポジトリ側(`.claude/skills/`、`CLAUDE.md`)に置く**。別のPCでもクラウドセッションでも、clone すれば同じように使える。
- クラウドセッションはリポジトリを clone して動くため、ローカルにしかない `~/.claude` の自動メモリやユーザー用スキルは読み込まれない。

---

## 参考

- [Sessions](https://code.claude.com/docs/en/sessions.md)
- [Claude Code on the web](https://code.claude.com/docs/en/claude-code-on-the-web.md)
- [Remote Control](https://code.claude.com/docs/en/remote-control.md)
- [Desktop](https://code.claude.com/docs/en/desktop.md)
- [Memory](https://code.claude.com/docs/en/memory.md)
- [Settings](https://code.claude.com/docs/en/settings.md)
- [MCP](https://code.claude.com/docs/en/mcp-quickstart.md)

人気の投稿