iwlwifi
iwlwifi は Intel の現行の無線チップのための無線ドライバです。正常に機能させるには、カーネルの wifi スタックによるサポートと、カード固有のファームウェアが実行時にロードされていることが必要です。
カーネル
動作させるためにはカーネルコンフィグが必要です。ドライバは 802.11a/b/g/n/ac(デバイスによって異なります)をサポートしているので、IEEE 802.11 を有効にする必要があります。
IEEE 802.11
少なくとも cfg80211 (CONFIG_CFG80211) と mac80211 (CONFIG_MAC80211) を有効にしてください。詳細については Wi-Fi の記事の IEEE 802.11 の節を参照してください。
iwlwifi デバイスドライバ
Intel の現行の無線チップにはこのドライバを使用してください。次に示すとおり、モジュール <M>
として設定してください。加えて、DVM または MVM のうち正しいほうをファームウェアの表の Module の列を見て選択する必要があります。
Device Drivers --->
[*] Network device support --->
[*] Wireless LAN --->
[*] Intel devices
<M> Intel Wireless WiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi)
<M> Intel Wireless WiFi DVM Firmware support
<M> Intel Wireless WiFi MVM Firmware support
ドライバをモジュールとしてビルドする(
<M>
)のではなく、カーネルに組み込む(<*>
)場合は、ファームウェアもカーネルに組み込む必要があります。カーネルに組み込む場合の節を見てください。
カーネルコンフィグを変更した後は忘れずにカーネルを再ビルドしてください。
カーネルを再ビルドし、このカーネルで再起動したら、選択は次のように確認できます:
user $
zgrep 'IWLWIFI\|IWLDVM\|IWLMVM' /proc/config.gz
ファームウェア
この表にある通り、各デバイス毎に追加のファームウェアも必要です。現代的なファームウェアは sys-linux/linux-firmware パッケージでいつでも利用可能です。もし linux-firmware に存在しない場合は、デバイス個別の sys-firmware/iwlxxxx-*ucode パッケージで見つかるかもしれません。
Intel の上流の手順[1]では、すべての iwlwifi ucode をカーネルイメージに追加することを推奨しています。これは利便性を考えて推奨されていますが、カーネルを多少肥大化させるでしょう。
root #
emerge --ask sys-kernel/linux-firmware
カーネルに組み込む場合
ドライバをモジュールとしてビルドする(<M>
)のではなく、カーネルに組み込む(<*>
)場合は、ファームウェアもカーネルに組み込む必要があります。
Device Drivers --->
Generic Driver Options --->
Firmware loader --->
-*- Firmware loading facility
(iwlwifi-xxxx.ucode) Build named firmware blobs into the kernel binary
(/lib/firmware) Firmware blobs root directory
[ ] Enable the firmware sysfs fallback mechanism
iwlwifi-xxxx.ucode
を実際のファームウェア名に置き換えてください。FW_LOADER_USER_HELPER_FALLBACK にも注意してください。
追加可能: savedconfig
/lib/firmware に不要なものがインストールされるのを防ぐために、Linux ファームウェアの savedconfig
USE フラグを設定することができます。
例えば、 Intel® Centrino® Advanced-N 6205 が iwlwifi-6000g2a-ucode を必要としている一方で、他はすべてコメントアウト、あるいは削除できます。
iwlwifi-6000g2a-5.ucode
iwlwifi-6000g2a-6.ucode
次のファームウェアアップデート時にこれらの設定が失われないようにするには、バージョン番号を取り除く必要があります。
user $
cd /etc/portage/savedconfig/sys-kernel
root #
mv linux-firmware{-20200316,}
ネットワークデバイス名
このセクションの情報は古くなっています。更新された手順については Udev#省略可能: 予測可能なネットワークインターフェース名を無効化または上書きするを参照してください。
カーネルによって提供される eth0 や wlan0 のようなネットワークデバイス名は、通常は /lib/udev/rules.d/80-net-name-slot.rules での udev ルールによってシステムの起動時に変更されます (dmesg 参照)。
旧来の命名ルールを維持するには、/etc/udev/rules.d ディレクトリ内に、同じ名称のファイルを空で作成することで上書きします:
root #
touch /etc/udev/rules.d/80-net-name-slot.rules
テスト
新しいカーネルで再起動するかモジュールを読み込んだ後で、以下の方法を使ってデバイスが利用可能かテストできます:
- /sys ファイルシステムを使用する
- ip コマンドを使用する
- ifconfig コマンドを使用する
- iw コマンドを使用する
/sys ファイルシステム
/sys/class/net ディレクトリの内容を ls -al や(app-text/tree パッケージに入っている)tree コマンドで一覧表示させます:
user $
tree /sys/class/net
/sys/class/net/ ├── enp2s14 -> ../../devices/pci0000:00/0000:00:1e.0/0000:02:0e.0/net/enp2s14 ├── lo -> ../../devices/virtual/net/lo ├── sit0 -> ../../devices/virtual/net/sit0 └── wlp8s0 -> ../../devices/pci0000:00/0000:00:1c.0/0000:08:00.0/net/wlp8s0
ip コマンド
デバイス名を取得したりワイヤレスカードが認識されているか検証するには、以下の ip コマンドを実行します:
user $
ip addr
3: wlan0: ...
ifconfig コマンド
ifconfig コマンドは sys-apps/net-tools パッケージを通じて提供されています。まだ有効化されていないものやアクティブになっていないものも含め、認識されているすべてのネットワークカードのリストを表示するには ifconfig -a を使用してください:
user $
ifconfig -a
wlan0 ...
以下のようにして、ネットワークカードをアクティブにできます:
root #
ifconfig -v wlan0 up
SIOCSIFFLAGS: Operation not possible due to RF-kill WARNING: at least one error occurred. (-1)
この例では、(通常はベイの電力消費を抑え、また偶然ワイヤレスネットワークに接続してしまわないようにする目的で) radio frequency kill state がセットされているため、ワイヤレスカードの有効化は失敗しています。
iw コマンド
ワイヤレスネットワークカードのドライバーが nl80211 スタックをサポートしていれば、 net-wireless/iw パッケージで提供される iw コマンドで、認識されているワイヤレスカードを表示できます:
root #
iw dev
phy#0 Interface wlan0 ifindex 4 type managed
modprobe と modinfo
modprobe は何も出力しないはずです:
root #
modprobe iwlwifi
ドライバモジュールに関するほとんどの情報は modinfo iwlwifi から得られます
user $
modinfo iwlwifi
lspci
lspci は Kernel driver in use:
と Kernel modules:
の欄に iwlwifi
と表示するはずです:
root #
lspci -nnkv | sed -n '/Network/,/^$/p'
03:00.0 Network controller [0280]: Intel Corporation Centrino Advanced-N 6205 [Taylor Peak] [8086:0082] (rev 34) Subsystem: Intel Corporation Centrino Advanced-N 6205 AGN [8086:1321] Flags: bus master, fast devsel, latency 0, IRQ 33 Memory at f7d00000 (64-bit, non-prefetchable) [size=8K] Capabilities: [c8] Power Management version 3 Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+ Capabilities: [e0] Express Endpoint, MSI 00 Capabilities: [100] Advanced Error Reporting Capabilities: [140] Device Serial Number confidential Kernel driver in use: iwlwifi Kernel modules: iwlwifi
xx:xx.x
形式の識別名は dmesg からの特定の情報を grep するのに役立ちます。
dmesg
dmesg の出力を確認してください。03:00.0
を lspci から得られた識別名で読み替え、wlp
をネットワークインターフェース名で読み替えてください。
user $
dmesg | grep -i -E '03:00.0|wlp|iwl|80211'
[ 0.251986] pci 0000:03:00.0: [8086:0082] type 00 class 0x028000 [ 0.252146] pci 0000:03:00.0: reg 0x10: [mem 0xf7d00000-0xf7d01fff 64bit] [ 0.252863] pci 0000:03:00.0: PME# supported from D0 D3hot D3cold [ 3.621978] cfg80211: Loading compiled-in X.509 certificates for regulatory database [ 3.629362] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7' [ 3.634986] iwlwifi 0000:03:00.0: enabling device (0100 -> 0102) [ 3.635111] iwlwifi 0000:03:00.0: can't disable ASPM; OS doesn't have ASPM control [ 3.644480] iwlwifi 0000:03:00.0: loaded firmware version 18.168.6.1 op_mode iwldvm [ 3.659269] iwlwifi 0000:03:00.0: CONFIG_IWLWIFI_DEBUG disabled [ 3.659270] iwlwifi 0000:03:00.0: CONFIG_IWLWIFI_DEBUGFS disabled [ 3.659271] iwlwifi 0000:03:00.0: CONFIG_IWLWIFI_DEVICE_TRACING enabled [ 3.659273] iwlwifi 0000:03:00.0: Detected Intel(R) Centrino(R) Advanced-N 6205 AGN, REV=0xB0 [ 3.694543] ieee80211 phy0: Selected rate control algorithm 'iwl-agn-rs' [ 3.695812] iwlwifi 0000:03:00.0 wlp3s0: renamed from wlan0 [ 5.060307] iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0 [ 5.352853] iwlwifi 0000:03:00.0: Radio type=0x1-0x2-0x0 [ 5.431804] IPv6: ADDRCONF(NETDEV_UP): wlp3s0: link is not ready [ 8.908518] wlp3s0: authenticate with <my WLAN AP> [ 8.912238] wlp3s0: send auth to <my WLAN AP> (try 1/3) [ 9.016437] wlp3s0: send auth to <my WLAN AP> (try 2/3) [ 9.120455] wlp3s0: send auth to <my WLAN AP> (try 3/3) [ 9.125773] wlp3s0: authenticated [ 9.126019] wlp3s0: waiting for beacon from <my WLAN AP> [ 9.148418] wlp3s0: associate with <my WLAN AP> (try 1/3) [ 9.191232] wlp3s0: RX AssocResp from <my WLAN AP> (capab=0x1431 status=0 aid=2) [ 9.211860] wlp3s0: associated [ 9.242532] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready [ 9.249856] wlp3s0: Limiting TX power to 20 (20 - 0) dBm as advertised by <my WLAN AP>
トラブルシューティング
カーネルがロードされない
正しいカーネルがロードされているか確認してください。次のようにして行えます (IKCONFIG 機能が必要です):
user $
zgrep CONFIG_IWL /proc/config.gz
ファームウェアの問題
- 無線カードにファームウェアの読み込みが必要な場合、udevもしくはsystemdを使っているシステムに対して、バイナリを読み込むようにカーネルを設定することは必須事項です。カーネルの設定に関するさらなる詳細は、以下のGentoo forumsのスレッドを参照してください: FW_LOADER_USER_HELPER_FALLBACK.
無線が動作していない
- Intel Corporation Wireless 8260 (rev 3a) 書き込み制限のされたRSA semaphoreにアクセスできない
- Intel Wireless-AC 9560 iwlwifi not working kernel 5.4.0
- Linux kernel 5.6.0 iwlwifi bug
- Intel Corporation Wi-Fi 6 AX200 (rev 1a). pci_enable_msi failed - -38 という dmesg のメッセージが表示されて、正しいファームウェアが読み込まれているにもかかわらずカードが Input/output エラーを表示する場合は、Message Signaled Interrupts (MSI and MSI-X) カーネルオプション (CONFIG_PCI_MSI) の有効化を試してください
Device Drivers --->
[*] PCI support --->
[*] Network device support --->
[*] Message Signaled Interrupts (MSI and MSI-X)
インターネットに接続されていない
アクセスポイントに接続済みであるが、未だにどのサーバーもしくはインターネットにアクセスできない場合は、802.11nを無効化して、(もしくは)software encryptionを有効化することが良いかもしれません。iwlwifi
モジュールに11n_disable=1
または11n_disable=8
と(もしくは)swcrypto=1
のオプションを設定することができます。モジュールを読み込む時に自動的にオプションを適応するには、以下のように次のファイル(/etc/modprobe.d/iwlwifi.conf)を設定してください。
options iwlwifi 11n_disable=1 swcrypto=1
より新しいカーネルでは、5.3.7 で確認されていますが、11n_disable=1 を設定する (または 0x01 でマスクされる) と 802.11ac が無効化されてしまいます。これは最大スループット 54Mbit にデバイスを制限するでしょう。
カーネルログ中の "Microcode SW error detected. Restarting 0x0" メッセージ
root #
dmesg | grep iwlwifi
(... 省略 ...) [ 5711.326985] iwlwifi 0000:28:00.0: Microcode SW error detected. Restarting 0x0. [ 5711.326987] iwlwifi 0000:28:00.0: Start IWL Error Log Dump: [ 5711.326990] iwlwifi 0000:28:00.0: Transport status: 0x0000004A, valid: 6 [ 5711.326992] iwlwifi 0000:28:00.0: Loaded firmware version: 71.058653f6.0 ty-a0-gf-a0-71.ucode [ 5711.326993] iwlwifi 0000:28:00.0: 0x00000071 | NMI_INTERRUPT_UMAC_FATAL [ 5711.326995] iwlwifi 0000:28:00.0: 0x00008210 | trm_hw_status0 [ 5711.326998] iwlwifi 0000:28:00.0: 0x00000000 | trm_hw_status1 [ 5711.327001] iwlwifi 0000:28:00.0: 0x004DAEA2 | branchlink2 [ 5711.327003] iwlwifi 0000:28:00.0: 0x004D9974 | interruptlink1 [ 5711.327004] iwlwifi 0000:28:00.0: 0x004D9974 | interruptlink2 [ 5711.327006] iwlwifi 0000:28:00.0: 0x0000C314 | data1 [ 5711.327008] iwlwifi 0000:28:00.0: 0x00000010 | data2 [ 5711.327009] iwlwifi 0000:28:00.0: 0x00000000 | data3 (... 省略 ...) [ 5711.329587] iwlwifi 0000:28:00.0: ieee80211 phy0: Hardware restart was requested
これは、リセットされることになった WiFi アダプタのマイクロコントローラが、深刻なエラーに遭遇したことを示しています。その結果として、AP への接続が回復した後も、ネットワークに参加できなかったり、深刻な速度低下が発生することがあります。根本原因を特定するのは難しいかもしれません (プラットフォーム自身の無線ノイズ/バグのあるファームウェア/など) が、まず試してみるべきことのひとつは、iwlwifi モジュールの電源管理が無効化されていたとしても、WiFi アダプタ PCIe リンクが省電力モードにならないように設定することです。これは iwlmvm モジュールによって使用される power_scheme
の値を 1 (アクティブ) に変更することで行えます:
options iwlmvm power_scheme=1
https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi で提案されている追加の対策のうち、2.4GHz バンドでの 40 MHz チャネルの使用を無効化することも助けになるかもしれません:
options cfg80211 cfg80211_disable_40mhz_24ghz=Y
関連項目
- Handbook:AMD64/Networking/Wireless
- Wifi — describes the setup of a Wi-Fi (wireless) network device.
- Wpa_supplicant — Wi-Fi サプリカント
- Network management using DHCPCD — 完全なネットワークスタック管理のために dhcpcd を用いる方法を解説しています。
- Netifrc — Gentoo's default framework for configuring and managing network interfaces on systems running OpenRC.
- Troubleshooting — トラブルを解消したり Gentoo のセットアップの際の支障を解決したりするための技術やツールに関する情報を提供しています。
外部資料
- https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi
- https://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git
- https://cateee.net/lkddb/web-lkddb/IWLWIFI.html
- https://wiki.archlinux.org/index.php/Wireless_network_configuration#iwlwifi
- Fixing Intel Wi-Fi 6 AX200 latency and ping spikes in Linux