前段时间把Linux系统升级到22.04,第一次遇到设置里找不到WIFI开启按钮的情况。在网上搜索信息发现是因为没有WIFI驱动,下载对应的驱动就解决了。 这两天又出现相同的情况,但是这一次好像是因为Windows 休眠/快速启动,导致WIFI驱动没有被正确加载,当然这是顺利解决问题之后下的判断。在上网搜索信息、排查问题源头的过程中,其实看到了很多可能的原因,对于我这种对硬件和系统没有什么深入了解的初学者来说,如何在各种信息中搞清楚原因、锁定一个简单有效的解决方案其实并没有那么简单。我看到有的帖子说是内核的问题,给我吓坏了,之前我就因为内核装得不对,重装了Linux系统。我心想着,这次我也没干啥呀,我绝对没有下载什么我不了解的东西,或者同意我不了解的选项。还有帖子直接重装了Windows系统,又进行了一系列操作,给我吓坏了。我的Windows系统虽然最近不怎么用,但是里面存放着我的来时路(不懂存储不懂分类三个没用的文件混一个可能有用的三个可能有用的混一个不知道什么时候真的会用到的又臭又长长长完全无法备份的数据),重装Windows,不可能重装的。 这一次解决问题之顺利,让我想总结一下我的解决过程。以及最重要的,我避开了哪些我之前踩过的坑。不敢想,在我又菜又莽的时期,我真的会莽上一条看起来很专业但是也不一定对的路,也算是一个辛酸debug成长经验总结吧。(不是教程
搞清楚你是谁
A thousand devices, a thousand glitches.
系统
1 2 3 4 5 6 7 8 9 10 11 12 13 adai@ZHAN:~$ cat /etc/os-release PRETTY_NAME="Ubuntu 22.04.5 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.5 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy
内核
1 2 adai@ZHAN:~$ uname -a Linux ZHAN 6.8.0-101-generic #101~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Feb 11 13:19:54 UTC x86_64 x86_64 x86_64 GNU/Linux
如何搞清楚你的电脑系统、硬件等一系列相关的信息?
事实上,看系统的版本信息和内核信息是一个基本操作啦。但是我在第一次模仿着输入指令,找到对应字符串,到我真正理解为什么这样做,中间其实隔了很久。不一样的是什么呢?上面两个示例展示了查看信息的两条路径,查看文件和借助命令。
1.通过文件看系统信息。 要知道:一切皆文件。查看你的根目录:cd /,每个目录都有其特定的用途,里面存放着你需要知道的几乎所有信息(不要问我那极小部分没有的信息是什么,我不知道,我这样说只是因为我不敢说得很绝对) 2.通过命令看系统信息。要知道:你想要的功能,你想了解的信息,很有可能有人制作了更便捷的工具。
根目录下一些文件夹
比如经常会看到的bin/或者usr/bin,里面存放着所有用户都能使用的、最基本的系统命令。bin/和usr/bin在有的系统上存储着完全一样的文件,比如我的。 可以通过ls查看:
1 2 adai@ZHAN:~$ ls -l /bin rwxrwxrwx 1 root root 7 2月 1 22:15 /bin -> usr/bin
从结果来看,bin/是指向usr/bin的符号链接。 也可以通过diff查看
1 adai@ZHAN:~$ diff <(ls /bin) <(ls /usr/bin)
如果没有输出意味着,没有区别。 也可以用diff比较具体两个文件的内容是否有区别,也可以写脚本一一比较两个相同名称文件内容有没有区别。
为什么还要保留/bin这个符号链接呢?主要是为了向后兼容。
/dev 这里存放着硬件设备有关的特殊文件。 例如,看你的CPU有几个核:
1 2 adai@ZHAN:~$ ls /dev/cpu 0 1 10 11 12 13 14 15 2 3 4 5 6 7 8 9
读取特定寄存器的值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 adai@ZHAN:/dev/cpu/0$ sudo rdmsr -a 0x198 1f8900000400 1f0e00001d00 1f8900001d00 1f0e00001d00 1f0e00001d00 1f8900001d00 200300001d00 1fb100001d00 1fb100001500 200300001500 1f6000001500 1f3700001500 200300001400 200300001400 202c00001400 1f8900001400
这个命令读取所有 CPU 核心的 IA32_PERF_STATUS 寄存器(地址 0x198),这个寄存器记录了 CPU 的当前性能状态。<—地址是怎么知道的?手册/源码。(但是我是从AI那里获得这个信息的…)
如何从源码中找到那一行定义?
先找到可能的头文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 adai@ZHAN:/dev/cpu/0$ sudo find / -name "msr*.h" find: ‘/proc/4416/task/4416/net’: Invalid argument find: ‘/proc/4416/net’: Invalid argument /usr/include/x86_64-linux-gnu/asm/msr.h /usr/src/linux-hwe-6.8-headers-6.8.0-101/arch/x86/include/asm/msr-trace.h /usr/src/linux-hwe-6.8-headers-6.8.0-101/arch/x86/include/asm/shared/msr.h /usr/src/linux-hwe-6.8-headers-6.8.0-101/arch/x86/include/asm/msr.h /usr/src/linux-hwe-6.8-headers-6.8.0-101/arch/x86/include/asm/msr-index.h /usr/src/linux-hwe-6.8-headers-6.8.0-101/arch/x86/include/uapi/asm/msr.h /usr/src/linux-hwe-6.8-headers-6.8.0-100/arch/x86/include/asm/msr-trace.h /usr/src/linux-hwe-6.8-headers-6.8.0-100/arch/x86/include/asm/shared/msr.h /usr/src/linux-hwe-6.8-headers-6.8.0-100/arch/x86/include/asm/msr.h /usr/src/linux-hwe-6.8-headers-6.8.0-100/arch/x86/include/asm/msr-index.h /usr/src/linux-hwe-6.8-headers-6.8.0-100/arch/x86/include/uapi/asm/msr.h find: ‘/run/user/1000/gvfs’: Permission denied find: ‘/run/user/1000/doc’: Permission denied
再在头文件中找到那一行定义
1 2 3 4 5 6 7 adai@ZHAN:/dev/cpu/0$ grep -r "MSR_IA32_PERF" /usr/src/linux-hwe-6.8-headers-6.8.0-101/arch/x86/include/asm/msr-index.h #define MSR_IA32_PERFCTR0 0x000000c1 #define MSR_IA32_PERFCTR1 0x000000c2 #define MSR_IA32_PERF_CAPABILITIES 0x00000345 #define MSR_IA32_PERF_STATUS 0x00000198 #define MSR_IA32_PERF_CTL 0x00000199 adai@ZHAN:/dev/cpu/0$
源文件的定义就是0x198。
/etc 到了前面看到过的文件夹了,这里面存放的是系统配置文件。事实上,我有一些疑惑,系统到底是什么?看一下/etc里有什么 好复杂,先放一放。
一些有用的命令
搞清楚你现在怎么样
Report by machine.
报错信息,包括ERROR FATAL WARNING(如果直接显示了)
日志 但是我这一次遇到的问题没有显式的报错信息。所以在一开始,我来描述遇到的问题,只能这样说:啊,我突然看不到我的WIFI图标了,之前还是正常的,我也不知道这几天做了什么特殊的操作,我一直都在正常使用着电脑。恰好我知道我的系统和内核版本,这会有帮助吗? 拿着这种信息去互联网上找解决方法很容易找不到对应的解决办法,这只是一个外在的症状表现,就像头疼的原因有很多,只知道头疼这个症状很难开有效的药,我们还需要更细致的诊断,最好能让计算机“告诉”我们问题出现在了哪里。 幸运的是,如果程序没有被正确执行,而不是以一种错误的方式执行,在某处一定会有错误报告。日志!
我仿照 https://bbs.archlinux.org/viewtopic.php?id=297679 发帖人的问题描述,对问题进行了进一步的诊断。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 # dmesg | grep iwlwifi [ 2.981990] iwlwifi 0000:00:14.3: enabling device (0000 -> 0002) [ 3.282839] iwlwifi 0000:00:14.3: CSR_RESET = 0x11 [ 3.282842] iwlwifi 0000:00:14.3: Host monitor block 0x0 vector 0x0 [ 3.282940] iwlwifi 0000:00:14.3: value [iter 0]: 0xbf1d0030 [ 3.283421] iwlwifi 0000:00:14.3: value [iter 1]: 0xbf1d0430 [ 3.283505] iwlwifi 0000:00:14.3: value [iter 2]: 0xbf1d0430 [ 3.283591] iwlwifi 0000:00:14.3: value [iter 3]: 0xbf1d0430 [ 3.283670] iwlwifi 0000:00:14.3: value [iter 4]: 0xbf1d0030 [ 3.283778] iwlwifi 0000:00:14.3: value [iter 5]: 0xbf1d0430 [ 3.283881] iwlwifi 0000:00:14.3: value [iter 6]: 0xbf1d0030 [ 3.283984] iwlwifi 0000:00:14.3: value [iter 7]: 0xbf1d0030 [ 3.284087] iwlwifi 0000:00:14.3: value [iter 8]: 0xbf1d0430 [ 3.284189] iwlwifi 0000:00:14.3: value [iter 9]: 0xbf1d0030 [ 3.284292] iwlwifi 0000:00:14.3: value [iter 10]: 0xbf1d0430 [ 3.284394] iwlwifi 0000:00:14.3: value [iter 11]: 0xbf1d0430 [ 3.284499] iwlwifi 0000:00:14.3: value [iter 12]: 0xbf1d0030 [ 3.284600] iwlwifi 0000:00:14.3: value [iter 13]: 0xbf1d0430 [ 3.284704] iwlwifi 0000:00:14.3: value [iter 14]: 0xbf1d0030 [ 3.284704] iwlwifi 0000:00:14.3: Host monitor block 0x0 vector 0x1 [ 3.284807] iwlwifi 0000:00:14.3: value [iter 0]: 0x04006ec2 [ 3.284909] iwlwifi 0000:00:14.3: value [iter 1]: 0x04006ec2 [ 3.285013] iwlwifi 0000:00:14.3: value [iter 2]: 0x04006ec2 [ 3.285113] iwlwifi 0000:00:14.3: value [iter 3]: 0x04006ec2 [ 3.285215] iwlwifi 0000:00:14.3: value [iter 4]: 0x04006ec2 [ 3.285317] iwlwifi 0000:00:14.3: value [iter 5]: 0x04006ec2 [ 3.285419] iwlwifi 0000:00:14.3: value [iter 6]: 0x04006ec2 [ 3.285522] iwlwifi 0000:00:14.3: value [iter 7]: 0x04006ec2 [ 3.285624] iwlwifi 0000:00:14.3: value [iter 8]: 0x04006ec2 [ 3.285726] iwlwifi 0000:00:14.3: value [iter 9]: 0x04006ec2 [ 3.285829] iwlwifi 0000:00:14.3: value [iter 10]: 0x04006ec2 [ 3.285932] iwlwifi 0000:00:14.3: value [iter 11]: 0x04006ec2 [ 3.286035] iwlwifi 0000:00:14.3: value [iter 12]: 0x04006ec2 [ 3.286137] iwlwifi 0000:00:14.3: value [iter 13]: 0x04006ec2 [ 3.286240] iwlwifi 0000:00:14.3: value [iter 14]: 0x04006ec2 [ 3.286241] iwlwifi 0000:00:14.3: Host monitor block 0x0 vector 0x6 [ 3.286343] iwlwifi 0000:00:14.3: value [iter 0]: 0xb0043860 [ 3.286445] iwlwifi 0000:00:14.3: value [iter 1]: 0xa0043860 [ 3.286547] iwlwifi 0000:00:14.3: value [iter 2]: 0xa0043860 [ 3.286650] iwlwifi 0000:00:14.3: value [iter 3]: 0xf0043860 [ 3.286753] iwlwifi 0000:00:14.3: value [iter 4]: 0xa0043860 [ 3.286855] iwlwifi 0000:00:14.3: value [iter 5]: 0xb0043860 [ 3.286958] iwlwifi 0000:00:14.3: value [iter 6]: 0xb0043860 [ 3.287060] iwlwifi 0000:00:14.3: value [iter 7]: 0xa0043860 [ 3.287164] iwlwifi 0000:00:14.3: value [iter 8]: 0xb0043860 [ 3.287267] iwlwifi 0000:00:14.3: value [iter 9]: 0xa0043860 [ 3.287369] iwlwifi 0000:00:14.3: value [iter 10]: 0xa0043860 [ 3.287471] iwlwifi 0000:00:14.3: value [iter 11]: 0xb0043860 [ 3.287574] iwlwifi 0000:00:14.3: value [iter 12]: 0xa0043860 [ 3.287676] iwlwifi 0000:00:14.3: value [iter 13]: 0xa0043860 [ 3.287781] iwlwifi 0000:00:14.3: value [iter 14]: 0xb0043860 [ 3.287803] iwlwifi 0000:00:14.3: Host monitor block 0x22 vector 0x0 [ 3.287882] iwlwifi 0000:00:14.3: value [iter 0]: 0x59ccc019 [ 3.287904] iwlwifi 0000:00:14.3: probe with driver iwlwifi failed with error -110
(这不是我电脑当时的输出,但是传达的信息是一样的。)事实上,在试图解决一个陌生的问题时,很多操作都是抱着试一试的想法,当我输入这个命令时,我并不知道我能获得什么关键信息,但是这一次我很幸运,我发现了一个error。
然后我立即把这一行报错信息,输入到浏览器中,最终找到了一个优雅的解决方案 https://www.myguye.com/fix-iwlwifi-failed-with-error-110/ 你只需要手动重置一下设备就可以。
不到最后,不要动系统/内核
如果一定要动,一定要搞清楚你在尝试做什么,会产生什么影响,并且做好备份和重装系统的准备。
我在查询解决方案时,看到了这几个帖子:https://bbs.archlinux.org/viewtopic.php?pid=2062555#p2062555 https://bbs.archlinux.org/viewtopic.php?id=296091 https://bbs.archlinux.org/viewtopic.php?id=297679
It’s very similar to my problem, I think it’s a 6.9 kernel problem or linux firmware package.
我想我稍后会试试更早的内核版本,以确认这不是当前的内核/固件。我相信几个月前我可能有一个较旧的 Ubuntu 能成功运行。
SOLUTION. After a lot of reading adn trying the issue i has having it was because i had a WINDOWS before and the fast boot option in windows makes the wifi card stay in a state that that is not posible to reactivate from linux.
I had to reinstall windows.
Remove fastboot (In energy configuration)
Disable wifi from bios
Boot
Poweroff
Enable wifi
Install arch
And an experienced friend said the random occurance is due to kernel’s problem and havn’t been solved yet. Wondering what does “-110” refer to and how to fix it completely.
他们多次提到了内核原因,但是大多没有给出一个有效的解决办法。其中一个通过重装Windows系统解决,可是我不想重装。我也不敢动内核,因为上次就是因为Linux内核升级失败,不得不重装系统。如果我没有经历这件事,可能会想办法修复内核。幸好这让我谨慎了一些。
保持记录和感受
BUG is a friend~ BUG is a friend~~
关于DEBUG的辛酸,可以讲个三天三夜,但是这也好像是少有的让我不眠不休去做的事。因为解决不了,我没办法连WIFI啊!(bushi
事实上,它让我感受到了很多奇妙的瞬间。在我搜索三小时,找到三行代码,输入终端时,WIFI图标立刻就出现了。我知道我成功了,并且我成功避开了那些复杂布满荆棘的路,因为我在过去与之缠斗的过程中,已经获得了成长,我甚至有些感动。我看着WIFI图标在闪动,它开始连接网络,有一点不真实。所以我把它记录下来,成为历史。