# WordPressサーバー構築・移行 作業履歴まとめ

作成日: 2026-07-17

## 環境の全体像


| 項目          | 内容                                                                                    |
| ----------- | ------------------------------------------------------------------------------------- |
| 新テストサーバー    | VM「noilalion」/ Ubuntu Server 26.04 LTS（KVM・virt-manager）                              |
| 新サーバーIP     | DHCP 192.168.1.127 → 固定 192.168.1.229 へ変更                                             |
| 旧テストサーバー    | VM「wordpress-KVM」/ 192.168.1.239（reserve-sys.net を運用していた）                             |
| バックアップ元（本番） | [www.alion88.com（WPvividで取得、137MBのzip）](http://www.alion88.com（WPvividで取得、137MBのzip）) |
| 目標URL       | [http://reserve-sys.net:7235](http://reserve-sys.net:7235)                            |
|             |                                                                                       |


---

## 7月9日（木）— OSインストール 〔翻訳リクエスト〕

### やったこと

- Ubuntu Server 26.04 インストーラー各画面の翻訳を依頼しながらインストールを進行（インストール種別 / ネットワーク（ens3・DHCP 192.168.1.127）/ プロキシ / JPミラー / ディスクフォーマット確認 / プロファイル設定）
- 1回目インストール後に起動せず。「Boot failed: not a bootable disk / No bootable device」→ 原因調査の結果、インストールが完了前に再起動された可能性と判断し再インストール
- 再インストールが2回連続で同じ箇所（configuring apt → curtin command in-target）でクラッシュ → **原因確定: VMメモリが1024MiBしかなかった** → 4096MiBへ増設
- 3回目で「Installation complete!」→ 再起動 → ユーザー noilalion でログイン成功
- 方針決定: 「SSH・Webサーバ・FTP・DB(MariaDB)を設定してWordPressが動くようにする」
- SSH設定ファイルの編集・確認方法を確認、キーボードレイアウト設定（jp106エラー対処）
- Apache2 + PHP、MariaDB、vsftpd のインストール

### 使用したコマンド

**起動失敗の診断（KVMホスト側）**

**ログイン後の初期作業**


| コマンド                                     | 意味・目的                                                                                      |
| ---------------------------------------- | ------------------------------------------------------------------------------------------ |
| `sudo apt update && sudo apt upgrade -y` | パッケージ一覧を最新化（update）してから、インストール済みパッケージを一括更新（upgrade）。`-y` は確認へ自動で yes、`&&` は前のコマンド成功時のみ次を実行 |
| `sudo reboot`                            | サーバーを再起動                                                                                   |


**SSH設定の編集と確認**


| コマンド                                                             | 意味・目的                                                                                    |
| ---------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| `sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak`          | 編集前のバックアップ作成。壊しても戻せるようにする                                                                |
| `sudo nano /etc/ssh/sshd_config` `sudo vim /etc/ssh/sshd_config` | SSHサーバー設定ファイルをnano（端末用エディタ）で編集。Port / PermitRootLogin / PasswordAuthentication などを変更する場所 |
|                                                                  |                                                                                          |
| <code>sudo sshd -T &#124; grep -E 'port&vert;permitrootlogin'</code>                  | 上記から特定項目だけ絞り込み表示。`|`（パイプ）は前の出力を次のコマンドへ渡す、grepは文字列検索                                      |
| `sudo systemctl restart ssh`                                     | SSHサービスを再起動して設定を反映                                                                       |
| `systemctl status ssh`                                           | サービスの稼働状態確認。`active (running)` なら正常                                                      |


**キーボードレイアウト（jp106エラー対処）**


| コマンド                                           | 意味・目的                                                   |
| ---------------------------------------------- | ------------------------------------------------------- |
| `localectl list-keymaps | grep -i jp`          | 利用可能なキーマップ一覧から日本語系を検索（`-i` は大文字小文字を区別しない）               |
| `sudo localectl set-keymap jp`                 | コンソールのキー配列を日本語に設定（→ 最小構成のためデータがなくエラーになった）               |
| `sudo dpkg-reconfigure keyboard-configuration` | Ubuntu標準の対話形式でキーボードを再設定（Generic 105-key → Japanese を選択） |
| `sudo setupcon`                                | 設定したキーボード構成をコンソールに即時反映                                  |
| `sudo apt install kbd console-data -y`         | キーマップのデータファイルをインストール（localectlを使う場合の代替策）                |


**LAMP + FTP のインストール**


| コマンド                                                                                                         | 意味・目的                                                                  |
| ------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
| `sudo apt install apache2 -y`                                                                                | Webサーバー Apache2 のインストール                                                |
| `sudo apt install php php-mysql libapache2-mod-php php-curl php-gd php-xml php-mbstring php-zip php-intl -y` | PHP本体と、WordPressに必要な拡張モジュール一式（DB接続・画像処理・XML・文字列処理など）をまとめてインストール        |
| `sudo systemctl enable --now apache2`                                                                        | サービスの自動起動を有効化（enable）し、今すぐ起動（--now）もする                                 |
| `sudo apt install mariadb-server -y`                                                                         | データベース MariaDB のインストール                                                 |
| `sudo mysql_secure_installation`                                                                             | MariaDBの初期セキュリティ設定（rootパスワード設定、匿名ユーザー削除、testDB削除などを対話形式で実施）            |
| `sudo apt install vsftpd -y`                                                                                 | FTPサーバー vsftpd のインストール                                                 |
| `sudo nano /etc/vsftpd.conf`                                                                                 | FTP設定の編集。`write_enable=YES`（アップロード許可）、`local_umask=022`（作成ファイルの権限）を有効化 |
| `systemctl is-active apache2 mariadb vsftpd`                                                                 | 3つのサービスがすべて `active` かを一括確認                                            |


---

## 7月10日（金）— WordPress設置 

### やったこと

- WordPress本体をダウンロードして /var/www/html へ配置（サブディレクトリ問題を rsync で解消）、所有者・権限を設定
- Windowsから [http://10.10.10.2](http://10.10.10.2) でタイムアウト → 実IPは **192.168.1.127**（ブリッジ接続）と判明、「It works!」表示確認
- 「データベース接続確立エラー」→ DB未作成が原因。DB・ユーザー作成時のエラー（1396 / 1045）も解決

### 使用したコマンド

**WordPress本体の設置**


| コマンド                                                    | 意味・目的                                                                                |
| ------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| `cd /tmp`                                               | 作業ディレクトリを /tmp（一時領域）へ移動                                                              |
| `curl -LO https://ja.wordpress.org/latest-ja.tar.gz`    | 日本語版WordPress最新版をダウンロード。`-L` はリダイレクト追従、`-O` は元のファイル名で保存                              |
| `tar xzf latest-ja.tar.gz`                              | tar.gz圧縮ファイルの展開（x=展開, z=gzip解凍, f=ファイル指定）                                            |
| `sudo rsync -a /var/www/html/wordpress/ /var/www/html/` | wordpressフォルダの**中身だけ**を1階層上へコピー。`-a` は権限・時刻を保ったまま。**末尾の `/` が重要**（付けないとフォルダごとコピーされる） |
| `sudo rm -rf /var/www/html/wordpress`                   | 移動し終えた元フォルダを削除（r=再帰的、f=確認なし）                                                         |
|                                                         |                                                                                      |
| `sudo chown -R www-data:www-data /var/www/html`         | 所有者をApacheの実行ユーザー（www-data）に一括変更（`-R` は配下すべて）。WordPressの自動更新やアップロードに必要               |
|                                                         |                                                                                      |
|                                                         |                                                                                      |
| `sudo a2enmod rewrite`                                  | ApacheのURL書き換えモジュールを有効化（WordPressのパーマリンクに必要）                                         |
| `sudo nano /etc/apache2/apache2.conf`                   | `<Directory /var/www/>` 内の `AllowOverride None` → `All` に変更（.htaccess を有効にする）        |
| `sudo systemctl restart apache2`                        | Apacheを再起動して設定反映                                                                     |


**データベース作成（sudo mysql 内で実行したSQL）**

```sql
-- WordPress用データベースを文字コードutf8mb4で作成
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 接続用ユーザーを作成（localhostからのみ接続可）
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'パスワード';
-- そのユーザーにwordpressデータベースへの全権限を付与
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost';
-- 権限変更を即時反映
FLUSH PRIVILEGES;
-- 既存ユーザーのパスワードを設定し直す（ERROR 1396＝ユーザー既存 のとき使用）
ALTER USER 'wordpress'@'localhost' IDENTIFIED BY 'パスワード';
```

**確認・診断系**


| コマンド                                             | 意味・目的                                                     |
| ------------------------------------------------ | --------------------------------------------------------- |
| `sudo mysql`                                     | MariaDBに管理者として接続（socket認証なのでパスワード不要）                      |
| `sudo mysql -e "SHOW DATABASES;"`                | ログインせずSQLを1発実行（`-e`）。DB一覧を表示                              |
| `mysql -u wordpress -p wordpress -e "SELECT 1;"` | wordpressユーザーで接続テスト。`1` が返れば認証成功（ERROR 1045ならパスワード不一致）    |
| `curl -I http://localhost`                       | 自分自身のWebサーバーへHTTPリクエストし、ヘッダだけ表示（`-I`）。`200 OK` ならApache正常 |
| `ping -c 3 10.10.10.2`                           | 疎通確認。`-c 3` は3回だけ送信                                       |
| `sudo ufw status`                                | ファイアウォール（ufw）の状態確認。`inactive` なら未使用                       |
| `ip a`                                           | NICに付いているIPアドレスの確認（address の略）                            |


---

## 7月13日（月）— バックアップ転送とWPvivid復元 〔翻訳リクエスト〕

### やったこと

- /var/www/html へ直接アップロードできず（Permission denied）→ **ホームに転送 → sudo mv で移動**方式で解決
- WPvividバックアップ（137MB）をスキャン→復元
- 復元後ログイン不可 → 元サイト由来の **SiteGuard のひらがなCAPTCHA** が原因と特定、対処法を整理

### 使用したコマンド


| コマンド                                                                                             | 意味・目的                                                                                       |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- |
| `sudo tail -20 /var/log/auth.log`                                                                | 認証ログの末尾20行を表示。SSH/SFTPのログイン失敗原因（ユーザー名間違い・パスワード間違い）が記録される。今回「invalid user noilalon」でタイプミスを発見 |
| `ls -lh /home/noilalion/`                                                                        | ファイル一覧を詳細表示。`-l` は権限・所有者・サイズ表示、`-h` はサイズを読みやすい単位（M/G）に                                      |
| `sudo mkdir -p /var/www/html/wp-content/wpvividbackups`                                          | ディレクトリ作成。`-p` は途中の階層もまとめて作成＆既存でもエラーにしない                                                     |
| `sudo mv /home/noilalion/www.alion88.com_wpvivid-*.zip /var/www/html/wp-content/wpvividbackups/` | ホームに置いたバックアップzipを移動。`*` はワイルドカード（パターン一致）                                                    |
| `sudo chown -R www-data:www-data /var/www/html/wp-content/wpvividbackups`                        | 移動したファイルの所有者をApacheユーザーに変更（WPvividが読めるように）                                                  |
| `ls /var/www/html/wp-content/plugins/`                                                           | インストール済みプラグインのフォルダ一覧を確認                                                                     |
| `sudo mv .../plugins/siteguard .../plugins/siteguard_disabled`                                   | **フォルダ名を変えるだけでプラグインを強制無効化**できる。管理画面に入れないときの定番テクニック                                          |




## 7月14日（火）— URL移行の調査と着手 〔翻訳リクエスト / URLの変更と引っ越し方法の調査 / 起動できない問題〕

### やったこと

- URL変更方法を調査: **シリアライズデータは単純なSQL置換で壊れる → WP-CLI の search-replace が最も安全**という結論
- [www.alion88.com](http://www.alion88.com) → 192.168.1.127、さらに 192.168.1.127 → **reserve-sys.net:7235** への置換手順を整理
- WP-CLIインストールで Permission denied → ホームディレクトリでダウンロードして解決
- Apacheのポート7235対応、reserve-sys.net のDNS調査（旧IPを向いたまま／会社管理と判明）
- mysqldump のバックアップが Access denied → sudo（socket認証）で解決
- VMのIPを 192.168.1.229 へ変更する方針に。夕方から netplan での固定IP設定に着手（別チャット「起動できない問題」）

### 使用したコマンド

**WP-CLI のインストール**


| コマンド                                                                                | 意味・目的                                                                    |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| `cd ~`                                                                              | ホームディレクトリへ移動（`~` はホームの意味）。※ /var/www/html は www-data 所有でcurlが書き込めず失敗したため |
| `curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar` | WP-CLI本体（phar=PHP実行アーカイブ）をダウンロード                                         |
| `chmod +x wp-cli.phar`                                                              | 実行権限を付与（+x = executable）                                                 |
| `sudo mv wp-cli.phar /usr/local/bin/wp`                                             | PATHの通った場所へ移動し `wp` コマンドとして使えるようにする                                      |
| `wp --info`                                                                         | インストール確認。PHPバージョン等が表示されれば成功                                              |


**URL一括置換（WP-CLI）**


| コマンド                                                     | 意味・目的                                                                                                                         |
| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `wp search-replace '旧URL' '新URL' --dry-run --allow-root` | DB内のURLを一括置換する**予行演習**。`--dry-run` は実際には変更せず件数だけ表示。`--allow-root` はroot実行の許可。シリアライズデータ（文字数情報付きの設定データ）も正しく処理してくれるのがSQL直接置換との違い |
| `wp search-replace '旧URL' '新URL' --allow-root`           | 本実行（--dry-run を外す）                                                                                                            |
| `wp search-replace ... --all-tables`                     | 接頭辞が違うテーブルも含め**全テーブルを対象**に置換                                                                                                  |
| `sudo -u www-data wp search-replace ...`                 | www-dataユーザーとして実行する形式（--allow-root の代わり）                                                                                      |


**Apacheのポート設定**


| コマンド                                                      | 意味・目的                                                                                       |
| --------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| `sudo nano /etc/apache2/ports.conf`                       | 待ち受けポート設定。`Listen 7235` を追加（80も残すとLAN内確認に便利）                                                |
| `sudo nano /etc/apache2/sites-available/000-default.conf` | サイト定義（VirtualHost）の編集。`<VirtualHost *:80 *:7235>` にする、または7235用ブロックを追加                       |
| `sudo apache2ctl configtest`                              | Apache設定の構文チェック。`Syntax OK` が出てから再起動する                                                      |
| `sudo systemctl restart apache2`                          | 再起動して反映                                                                                     |
| `sudo ss -tlnp | grep 7235`                               | 待ち受け（LISTEN）中のポート一覧から7235を確認。t=TCP, l=LISTENのみ, n=番号表示, p=プロセス名表示。**sudoなしだとプロセス名が出ない**ので注意 |


**DNS・名前解決の調査**


| コマンド                                                         | 意味・目的                                                      |
| ------------------------------------------------------------ | ---------------------------------------------------------- |
| `nslookup reserve-sys.net`                                   | ドメイン名がDNS上でどのIPに解決されるか確認 → 旧IP 114.179.115.78 が返った         |
| `curl -s https://ifconfig.me`                                | 自分の回線のグローバルIPを表示（`-s` は進捗表示を消す）→ 36.54.216.213 でDNSと不一致と判明 |
| `sudo nano /etc/hosts` に `192.168.1.127 reserve-sys.net` を追記 | **hostsファイル**＝DNSより優先されるPC内の名前解決表。テスト用にドメイン名を新VMへ向ける       |


---

## 7月15日（水）— 固定IP化と旧サーバー(.239)の復旧 〔起動できない問題〕

### やったこと

- netplan try が ovs-cleanup タイムアウトで revert → 直接 apply / 再起動方針に変更
- **NIC名の誤りが判明**（設定は enp1s0、実際は ens3）→ YAML修正、cloud-init のネットワーク管理を無効化
- 固定IP 192.168.1.229 化を確定
- 192.168.1.229 でアクセスすると reserve-sys.net へリダイレクト → DBの siteurl/home 書き換え手順を確認
- **旧サーバー wordpress-KVM（192.168.1.239）が「接続拒否」** → Listen 80 がコメントアウト＋vhost未有効が原因と特定し復旧。最後の関門はブラウザの301キャッシュ（シークレットウィンドウで解決）
- 画像が表示されない → 記事内URLが旧ドメインのまま → search-replace の手順を整理

### 使用したコマンド

**netplan（固定IP設定）**


| コマンド                                                                                                 | 意味・目的                                                                             |
| ---------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| `ls /etc/netplan/`                                                                                   | netplan設定ファイル名の確認（50-cloud-init.yaml 等）                                           |
| `sudo nano /etc/netplan/50-cloud-init.yaml`                                                          | ネットワーク設定YAMLの編集（下記参照）                                                             |
| `sudo chmod 600 /etc/netplan/50-cloud-init.yaml`                                                     | 権限をroot専用（600=所有者のみ読書き）に。「Permissions too open」警告の解消                              |
| `sudo netplan try`                                                                                   | 設定を試験適用。120秒以内にEnterで確定、しなければ自動で元に戻る（revert）。今回はovs-cleanupのタイムアウトで失敗しがちだった       |
| `sudo netplan apply`                                                                                 | 設定を即時適用（tryを使わない直接反映。コンソール作業なら切断リスクなし）                                            |
| `ip a` / `ip route`                                                                                  | 適用結果の確認。`ip a` で `dynamic` 表示が消えていれば固定IP化成功。`ip route` でデフォルトゲートウェイ確認             |
| `echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg` | cloud-initによる**ネットワーク設定の上書きを無効化**（再起動でYAMLが戻されるのを防ぐ）。`tee` はsudo権限でファイルに書き込むための定番 |


```yaml
# /etc/netplan/50-cloud-init.yaml の最終形（NIC名は ip a で確認した ens3 を使うこと）
network:
  version: 2
  ethernets:
    ens3:
      dhcp4: false            # DHCPをやめて固定IPに
      addresses:
        - 192.168.1.229/24    # このVMのIPアドレス
      routes:
        - to: default
          via: 192.168.1.1    # デフォルトゲートウェイ（7/16に192.168.1.48へ変更）
      nameservers:
        addresses: [192.168.1.1, 8.8.8.8]   # DNSサーバー
```

**WordPressのURL（DB直接修正、sudo mariadb 内のSQL）**

```sql
USE wordpress;                          -- 対象DBを選択
-- 現在のサイトURL設定を確認
SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl', 'home');
-- サイトURLを書き換え（siteurl=WordPress本体のURL、home=サイト表示用URL）
UPDATE wp_options SET option_value = 'http://192.168.1.229' WHERE option_name IN ('siteurl', 'home');
EXIT;
```

**wp-config.php の場所と設定の確認**


| コマンド                                                              | 意味・目的                                                         |
| ----------------------------------------------------------------- | ------------------------------------------------------------- |
| `sudo find /var/www -name wp-config.php 2>/dev/null`              | /var/www 配下からファイル名で検索。`2>/dev/null` はエラー出力（権限なし表示等）を捨てて見やすくする |
| `sudo grep -E "DB_NAME|table_prefix" /var/www/html/wp-config.php` | 設定ファイルからDB名とテーブル接頭辞の行だけ抽出（`-E` は拡張正規表現、`|` はOR）               |



|     |
| --- |


**画像URL修正（旧サーバー側で整理した手順）**

```bash
wp search-replace 'http://reserve-sys.net' 'http://192.168.1.239' --all-tables --dry-run
wp search-replace 'http://reserve-sys.net:7235' 'http://192.168.1.239' --all-tables --dry-run
wp search-replace 'https://reserve-sys.net' 'http://192.168.1.239' --all-tables --dry-run
# 件数を確認したら --dry-run を外して本実行
```

---

## 7月16日（木）— reserve-sys.net:7235 での接続確立とタイムゾーン 〔ログインページへのアクセス不可の原因〕

### やったこと

- reserve-sys.net:7235 につながらない原因調査 → DBの siteurl/home は最終形（reserve-sys.net:7235）なので触らず、**名前解決と経路側を直す方針**に
- 実構成が判明: **ルーターのポートマッピングが「7235=www」＝外部7235→内部80転送**で、7235待受のApacheと不一致。ルーター側 7235=7235 か Apache側80 のどちらかに合わせる
- サーバーのゲートウェイを **192.168.1.48** に設定（ポート転送しているルーター経由で応答を返すため）
- access.log で wp-admin への 200 応答を確認 → **reserve-sys.net:7235 での接続・管理画面ログイン成立**
- OS / Apache / PHP(8.5) のタイムゾーンを Asia/Tokyo に統一

### 使用したコマンド

**接続診断**


| コマンド                        | 意味・目的                                                        |
| --------------------------- | ------------------------------------------------------------ |
| `sudo ss -tlnp | grep 7235` | Apacheがポート7235でLISTENしているか確認（`*:7235` なら全IPで待受中）             |
| `ping reserve-sys.net`      | 名前解決の結果確認。VMからは旧グローバルIP 114.179.115.78 が返る＝DNSは旧設定のまま、と確認できた |
|                             |                                                              |
| `ip route show`             | デフォルトゲートウェイの確認（`default via ...` の行）                         |


**ゲートウェイ変更（netplan、7/15のYAMLの routes 部分を修正）**

```yaml
      routes:
        - to: default
          via: 192.168.1.48    # ポート転送しているルーターに合わせる
      nameservers:
        addresses: [192.168.1.48, 8.8.8.8]
```

適用: `sudo netplan apply` → 確認: `ip route show`、`ping -c 3 192.168.1.48`（ルーター疎通）、`ping -c 3 8.8.8.8`（外部疎通）

**タイムゾーン設定**


| コマンド                                                                                            | 意味・目的                                                                       |
| ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `timedatectl`                                                                                   | 現在の日時・タイムゾーン設定を表示                                                           |
| `sudo timedatectl set-timezone Asia/Tokyo`                                                      | OSのタイムゾーンを日本時間に変更（即時反映・再起動不要）                                               |
| `timedatectl list-timezones | grep Tokyo`                                                       | 指定可能なタイムゾーン名の一覧から検索                                                         |
| `tail -5 /var/log/apache2/access.log`                                                           | アクセスログ末尾5行を表示。日時の `+0000`（UTC）か `+0900`（JST）かで反映状況を確認                       |
| `sudo systemctl restart apache2`                                                                | Apacheは起動時のタイムゾーンを保持し続けるため、再起動して反映                                          |
| `php -v` / `ls /etc/php/`                                                                       | PHPバージョンの確認 → **8.5** と判明（php.iniのパスに使う）                                    |
| `php -i | grep date.timezone`                                                                   | PHPの現在のタイムゾーン設定を確認（`UTC` のままだった）                                            |
| `php -r 'echo date_default_timezone_get(), " : ", date("Y-m-d H:i:s"), "\n";'`                  | PHPコードを1行実行（`-r`）して、タイムゾーン名と現在時刻を直接表示                                       |
| `php --ini`                                                                                     | 読み込まれている php.ini の場所を表示（CLI用とApache用は別ファイルな点に注意）                            |
| `echo "date.timezone = Asia/Tokyo" | sudo tee /etc/php/8.5/mods-available/timezone.ini`         | php.ini本体を編集せず**追加設定ファイル**を作成する方式（元ファイルを汚さないのでおすすめ）                         |
| `sudo phpenmod timezone`                                                                        | 作成した追加設定をCLI用・Apache用の両方へ一括で有効化                                             |
| `sudo sed -i 's|^;*date.timezone =.*|date.timezone = Asia/Tokyo|' /etc/php/8.5/apache2/php.ini` | エディタを開かず1発置換する代替方法。`sed -i` はファイルを直接書き換え、`^;*` は行頭のコメント記号があってもなくても対象にする正規表現 |


※ nano とは: ターミナル上で動くテキストエディタ（Windowsのメモ帳のCUI版）。保存=Ctrl+O→Enter、終了=Ctrl+X。代替は vi/vim、または上記の sed / tee のようにコマンドで完結させる方法。

---

