元 Windows ユーザからすると、日々 Linux を使っていると想いもよらないトラブルに見舞われたりすることがたま〜にあります。
たとえば最近あった例ですが、突然昨日まで使えていた無線 LAN が使えなくなった現象がありました。
原因は前日に設定した Docker+SQL-Server の影響であることは明らかでした。
- Docker インストール時のカーネルモジュール干渉: Docker のインストールや、それに伴う OS のアップデート/カーネルの更新時に、無線 LAN アダプターのカーネルモジュール(ドライバー)が破損したり、ロードに失敗するようになった。
- アダプターの一時的なロード失敗: Docker の影響でネットワーク設定が混乱した際、無線 LAN のドライバーが一時的にメモリからアンロードされた後、再ロードに失敗した。
あなたもアプリなどをインストールした後に無線 LAN が使えなくなる。という現象があれば次の方法を試してみてください。
🛠️ 無線 LAN 接続回復のための手順
迷いながらやったので、ダラダラとした内容になってしまいましたがあなたの環境に関係ないものは無視してくださいね。
まずは「消えたインターフェースをシステムに再認識させる」ことを目標に作業を進めます。
1. カーネルモジュールの再ロード(ドライバーの再読み込み)
無線 LAN アダプターのドライバーを強制的に再ロードしてみます。
無線 LAN アダプターのチップ名を確認する:
lspci -knn | grep Net -A3- このコマンドの出力で、“Wireless” または “Network controller” と書かれた行を探し、その行の最後または下の行にある
Kernel driver in use:の後に表示されているドライバー名(例:iwlwifi,b43,rtlwifiなど)を確認します。
例えばこんな感じです。:
lspci -knn | grep Net -A3
03:00.0 Network controller [0280]: Intel Corporation Wi-Fi 5(802.11ac) Wireless-AC 9x6x [Thunder Peak] [8086:2526] (rev 29) Subsystem: Intel Corporation Dual Band Wi-Fi 5 Wireless-AC 9260 160MHz 2x2 [8086:0014] Kernel modules:
iwlwifi04:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] [1002:1638] (rev dc)私の環境では wifi ドライバーは
iwlwifiです。- このコマンドの出力で、“Wireless” または “Network controller” と書かれた行を探し、その行の最後または下の行にある
ドライバーのモジュールを再ロードする: 確認したドライバー名(例:
iwlwifi)を<driver_name>に置き換えて実行します。sudo modprobe -r <driver_name> # モジュールをメモリから削除 sudo modprobe <driver_name> # モジュールを再ロード- この実行後、再び
ip link showを実行して、wlan0やwlp*がリストに戻ってきたか確認します。
- この実行後、再び
2. 次の手段:システム設定の自動修復
もしドライバー名が特定できなかったり、再ロードで回復しなかった場合、システム全体をリフレッシュします。
ネットワークサービスを完全に再起動する:
sudo service NetworkManager restartシステムの完全な再起動: これが最も確実です。カーネルモジュールやサービスがすべてクリーンな状態で再ロードされます。
sudo reboot
再起動後、有線 LAN ケーブルを外し、無線 LAN で接続できるかお試してみてください。
多分これで直るはずだったんですが、まあ、私の場合はこれでは全然直らす迷走が始まります。
🛠️ 消えた無線 LAN インターフェースの回復手順
このドライバー(カーネルモジュール)を強制的にシステムから一旦削除し、再度読み込ませることで、システムが無線 LAN インターフェースを再認識するはずです。
1. ドライバーの再ロード(無線 LAN の再認識)
以下のコマンドを順番に実行する。
ドライバーをメモリから削除する:
sudo modprobe -r iwlwifi(エラーが出ても無視)
ドライバーを再度ロードする:
sudo modprobe iwlwifiインターフェースが戻ってきたか確認する:
ip link show- 確認点: このリストに、
wlan0やwlp*といった無線 LAN インターフェース名が戻ってきたか確認します。
- 確認点: このリストに、
2. 無線接続の再開
インターフェース名が戻ってきたら、NetworkManager を使って無線 LAN に接続できるか確認します。
無線 LAN アダプターを有効にする:
sudo ip link set <戻ってきたインターフェース名> up(例:
sudo ip link set wlan0 up)NetworkManager を再起動する:
sudo service NetworkManager restart
この手順で、無線 LAN 接続が回復するはず…..
user@pc:~$ sudo modprobe iwlwifi
user@pc:~$ ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp2s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 04:7b:cb:43:83:58 brd ff:ff:ff:ff:ff:ff
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 42:12:dc:d2:b6:d8 brd ff:ff:ff:ff:ff:ff
4: vethbedd349@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT group default link/ether 56:7a:8a:91:97:22 brd ff:ff:ff:ff:ff:ff link-netnsid 0
残念ながら、iwlwifi ドライバーを再ロード(sudo modprobe -r と sudo modprobe iwlwifi)した後も、無線 LAN インターフェース(wlan0 や wlp*)はまだリストに戻りません。
ip link show の結果には、依然として無線 LAN アダプターが表示されていませんでした。
1: lo:(ループバック)2: enp2s0f1:(有線 LAN)3: docker0:(Docker ブリッジ)4: vethbedd349@if2:(Docker 関連)
🚨 じゃあ次の対策:カーネルログの確認とシステム再起動
ドライバーの再ロードがうまくいかなかった原因は、ドライバー自体のファイルが壊れているか、カーネルがドライバーをロードする際にエラーを検出しているかのどちらかである可能性が高いです。
以下の手順で、エラーログを確認し、最終的な手段としてシステムを再起動してみます。
🛠️ 無線 LAN 回復のための次の手順
1. カーネルログでエラーを確認する (診断)
ドライバーをロードした直後に何が起きたか、カーネルのログを確認します。
dmesg | tail
- この出力の中に、
iwlwifiやfirmware(ファームウェア)というキーワードを含むエラーや警告メッセージがないか確認してください。特に「firmware file not found」(ファームウェアファイルが見つからない)というエラーがあれば、ドライバーの動作に必要なファイルが不足していることになります。 早速実行してしたがエラーメッセージが出ていました。
エラーメッセージ
[ 1306.538440] iwlwifi 0000:03:00.0: probe with driver iwlwifi failed with error -110
iwlwifi: 私の Intel 製 Wi-Fi アダプターの Linux 用ドライバーです。failed with error -110: このエラーコード(-110)は、Linux カーネルでは通常、“Connection timed out” (接続タイムアウト) または “Timeout” を意味します。
結論:ファームウェアのロード失敗
このエラーは、ドライバーのiwlwifiがハードウェアにアクセスしようとしたり、動作に必要なファームウェア(F/W)をロードしようとしたりした際に、通信がタイムアウトしてハードウェアの初期化に失敗したことを示しています。
なぜ昨日まで動いていたのに?
この問題は、以下のいずれかの理由で発生した可能性が極めて高くなってきました。
- OS のカーネルアップデート: OS のアップデートや Docker 導入に伴うカーネルの更新で、古いカーネルに合った古いバージョンのファームウェアが使われてしまい、新しいドライバー(
iwlwifi)と合わなくなった。 - ファームウェアファイルの破損: 動作に必要な
iwlwifiのファームウェアファイルが破損したか、誤って削除された。
🛠️ 無線 LAN 接続回復のための修復手順
この問題を解決するには、最新かつ正しいバージョンのファームウェアをインストールし直す必要があります。現在、有線 LAN で接続できているため、以下の手順で修復が可能です。
1. 最新ファームウェアのインストール
ファームウェアは通常、linux-firmwareというパッケージに含まれています。これを再インストールすることで、不足または破損したファイルを修復します。
- Ubuntu/Mint/Debian 系:
# ファームウェアパッケージの再インストール(またはアップデート) sudo apt install --reinstall linux-firmware
2. カーネルモジュールの再ロード
ファームウェアのインストール後、モジュールを再度ロードして変更を反映させます。
- ドライバーをメモリから削除する:
sudo modprobe -r iwlwifi - ドライバーを再ロードする:
sudo modprobe iwlwifi
3. 最終的なシステムの再起動
カーネルレベルでの設定変更を完全に適用するため、システム全体を再起動します。
sudo reboot
再起動後、有線 LAN ケーブルを抜いた状態で、無線 LAN が認識され、接続できるようになるか確認してください。このエラーコードが解消されれば、無線接続は回復するはずですが。
ダメです。LAN ケーブルを抜いたら切断されてしまいますね
LAN ケーブルを抜くとすぐに切断されてしまう。つまり無線 LAN 接続がまだ回復していないということです。
これは、最後の修復手順でファームウェアの再インストールを行ったにも関わらず、何らかの理由でドライバーが無線 LAN アダプターの初期化に失敗している状態が続いていることを意味します。
仕方ないのでデバイスを強制的に再認識させるための最後の手段を試みます。(今度こそ本当に最後の手段)
🛠️ 無線 LAN 接続回復のための最終確認
1. 無線 LAN インターフェースの再確認
まず、有線 LAN ケーブルを挿した状態で以下のコマンドを実行し、wlan0 や wlp* といった無線 LAN アダプターの名前が依然として表示されていないことを確認します。
ip link show
- (おそらく、
lo、enp2s0f1、docker0などしか表示されていないはずです。)
2. ファームウェアのインストール状態の確認
ファームウェアが正しくインストールされたか確認します。Intel Wi-Fi 5 (9260) に必要なファームウェアファイルがあるか見ます。
ls /lib/firmware | grep iwlwifi-9260
- 確認点: このコマンドで、
iwlwifi-9260で始まるファイルがリストアップされれば、ファームウェアは存在しています。
3. ハードウェアのリセット(システムの電源を切る)
ドライバーの初期化失敗(エラーコード -110)は、アダプター自体がフリーズしている可能性も示唆しています。これはソフトウェアのリセットだけでは治らないことがあります。
- システムを完全にシャットダウンします。
sudo shutdown -h now - 電源を抜く: Linux が完全に停止したら、PC の電源コードを物理的に抜き(またはバッテリーを取り外し)、数秒間待ってから再度電源を入れます。
- (これは、アダプターへの電力供給を完全にリセットし、ハードウェアの状態を初期化するためです。)
- 再起動: PC を起動し、Linux が立ち上がるまで待ちます。
4. 最終接続確認
システムが立ち上がったら、有線 LAN ケーブルを繋がずに、ターミナルで以下のコマンドを実行し、無線 LAN インターフェースが戻っているか確認してください。
この過程を経てやっと無線 LAN が復活しました。
無線 LAN が無事認識できているかコマンドを打ち込んで確認。
ip link show
無事 wlan0 や wlp* がリストに戻ってました。
めちゃくちゃアナログですが、この電源リセットが、ソフトウェア的なエラーを解決する上で、最後の効果的な手段となりました。
以上、長くなってしまいましたが、上から下まで同じように操作したら多分うまくいくと思いますよ。
ではでは。