質問

質問

質問

CentOS 7でBroadcom 4352ワイヤレスアダプタを正常に使用しました。CentOS wikiでLinux用のBroadcom STAドライバをコンパイルする方法のガイドライン

3.10.0-693(7.4だと思いますか?)用のカーネルアップデートが出たため、ドライバをコンパイルできますが、動作させることはできません。インストール後、システムが停止します。

[root]# depmod $(uname -r)
[root]# sudo modprobe wl
[root]#

その後数秒間マウス入力が動作した後、すべてが停止しました。時計が変更されておらず、システムはあらゆる種類の入力の受信を停止し、電源を切る必要がありました。

wl.koファイルはここにあります:

$ ls -alZ /lib/modules/3.10.0-693.21.1.el7.x86_64/extra/wl.ko
-rw-r--r--. root root unconfined_u:object_r:modules_object_t:s0 /lib/modules/3.10.0-693.21.1.el7.x86_64/extra/wl.ko

再起動してもアダプターは起動しませんが、システムは停止しません。まるでアダプタがないかのように動作します。その後、端末を開いてmodprobe wlコマンドを実行すると、上記のように停止します。

何をすべきかわからないので、次のように試しました。

insmod /lib/modules/`uname -r`/extra/wl.ko

また、システムはすぐに停止します。

これらの停止イベントでは何も表示されません/var/log/messages。私が探しているものが正確に何であるかはわかりませんが、当時のログにはほとんど何もありません。

同様にインストールされたドライバを使用して古い(3.10.0-514)カーネルにロールバックすると、ワイヤレスネットワークを使用できます。一つあるここにドライバをインストールするには、ソースRPMを使用してください。しかし、私はこの単純な自己コンパイル方法を好み、この方法をデバッグする方法についていくつかのヒントが欲しいです。

似たようなことをするべきですかstrace modprobe wl > /tmp/modprobe_log


ドライバはどのようにインストールしますか?

これは重複する可能性がありますが、CentOS Wikiページの指示は余裕がないほど(各支店に別々のセクションを投稿する必要があるようです)、私がやっていることを明確にし、他の不幸な魂を助けることもできます。 , 7.4 カーネルの推奨事項は次のとおりです。

yum install kernel-devel kernel-headers gcc
tar xzf hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz
patch -p1 < wl-kmod-fix-ioctl-handling.patch
patch -p1 < wl-kmod-kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch
sed -i 's/ >= KERNEL_VERSION(3, 11, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ >= KERNEL_VERSION(3, 15, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ < KERNEL_VERSION(3, 18, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ >= KERNEL_VERSION(4, 0, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ < KERNEL_VERSION(4,2,0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
sed -i 's/ >= KERNEL_VERSION(4, 7, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
make -C /lib/modules/`uname -r`/build/ M=`pwd`
strip --strip-debug wl.ko
cp -vi wl.ko /lib/modules/`uname -r`/extra/

ファイルの作成/etc/modprobe.d/blacklist.conf:

blacklist bcm43xx
blacklist b43
blacklist b43legacy
blacklist bcma
blacklist brcmsmac
blacklist ssb
blacklist ndiswrapper

ファイルの作成/etc/sysconfig/modules/kmod-wl.modules

#!/bin/bash
for M in lib80211 cfg80211 wl; do
    modprobe $M &>/dev/null
done

chown root:root /etc/sysconfig/modules/kmod-wl.modules
chmod 744 /etc/sysconfig/modules/kmod-wl.modules

ああ、BroadcomでSTAドライバの場所を変更したようです。何年も更新ができなかったので、私は以前に持っていたものを使用しましたが、ここでダウンロード可能。このパッチは上記のCentOS Wikiページからダウンロードできます。

パッチとコンパイルの出力を見てみましょう。

$ patch -p1 < wl-kmod-fix-ioctl-handling.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 1467 (offset 17 lines).
patching file src/wl/sys/wl_linux.c
Hunk #1 succeeded at 1659 (offset 8 lines).

$ patch -p1 < wl-kmod-kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #6 succeeded at 1911 (offset 3 lines).
Hunk #7 succeeded at 2040 (offset 3 lines).
Hunk #8 succeeded at 2160 (offset 3 lines).
Hunk #9 succeeded at 2298 (offset 3 lines).
Hunk #10 succeeded at 2941 (offset 3 lines).

<sed commands ran with no errors>

$ make -C /lib/modules/`uname -r`/build/ M=`pwd`
make: Entering directory `/usr/src/kernels/3.10.0-693.21.1.el7.x86_64'
CFG80211 API is prefered for this kernel version
Using CFG80211 API
  LD      /usr/local/src/hybrid-wl/built-in.o
  CC [M]  /usr/local/src/hybrid-wl/src/shared/linux_osl.o
  CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_linux.o
  CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_iw.o
  CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.o
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1834:2: warning: initialization from incompatible pointer type [enabled by default]
  .get_station = wl_cfg80211_get_station,
  ^
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1834:2: warning: (near initialization for ‘wl_cfg80211_ops.get_station’) [enabled by default]
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_bss_connect_done’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2446:3: warning: passing argument 2 of ‘cfg80211_scan_done’ makes pointer from integer without a cast [enabled by default]
   cfg80211_scan_done(wl->scan_request, true);
   ^
In file included from /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:33:0:
include/net/cfg80211.h:4496:6: note: expected ‘struct cfg80211_scan_info *’ but argument is of type ‘int’
 void cfg80211_scan_done(struct cfg80211_scan_request *request,
      ^
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_cfg80211_down’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2976:3: warning: passing argument 2 of ‘cfg80211_scan_done’ makes pointer from integer without a cast [enabled by default]
   cfg80211_scan_done(wl->scan_request, true);
   ^
In file included from /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:33:0:
include/net/cfg80211.h:4496:6: note: expected ‘struct cfg80211_scan_info *’ but argument is of type ‘int’
 void cfg80211_scan_done(struct cfg80211_scan_request *request,
      ^
  LD [M]  /usr/local/src/hybrid-wl/wl.o
  Building modules, stage 2.
CFG80211 API is prefered for this kernel version
Using CFG80211 API
  MODPOST 1 modules
  CC      /usr/local/src/hybrid-wl/wl.mod.o
  LD [M]  /usr/local/src/hybrid-wl/wl.ko
make: Leaving directory `/usr/src/kernels/3.10.0-693.21.1.el7.x86_64'

ベストアンサー1

わかりませんが、Red Hatはリリース間で(他のリリースで)新しいカーネルバージョンで何かを変更することもできます。

7.2から7.3にアップデートするときにいくつかの問題が発生しました(カーネルバージョンはまだ1つですがバージョンは異なります):私たちが開発したドライバはコンパイルされていません(APIが変更されました)。私はRed Hat bugzillaトラッカーにこれについて尋ね、次の答えを得ました。

RedHatは、APIではなくABIのみを変更せず、そのまま維持することを保証するので、centosも同様です。マージされ、APIが変更されるたびに、この操作はユーザーに代わって処理されます。

つまり、ツリーの外部モジュールが新しいカーネルバージョンに対してコンパイルまたは動作しない場合、これはクライアント操作です。この回答はAPIに関するものですが、他の変更は誰が保証できるかを知っています。

いくつかのパッチは新しいカーネルバージョンでは採用されていないようです。または、この質問を投稿できます。赤い帽子バグジラ追跡装置。 (カーネル/モジュールの質問の場合)Red Hatトラッカーにリダイレクトされる可能性が高いため、Centosトラッカーで質問することはお勧めできません。


ソース情報速度(RPM-s)。これは環境をきれいに保つためのより好ましい方法です。または、ソースをインポートすることもできます。データ管理システムパッケージを使用すると、最新バージョンのカーネル用の新しいモジュールを構築することはできません。

おすすめ記事