Linux 内核 BUG: Android 手机 USB 网络共享 故障
众所周知, 窝日常使用 ArchLinux 操作系统, 而 ArchLinux 是一个滚动发行版本, 也就是各个软件包更新很快.
然而, 突然发现, Android 手机的 USB 网络共享功能 BUG 了.
经过一通排查, 发现是 Linux 内核造成的 BUG. 哎, 没办法, 只能自己动手修改内核代码, 修复 BUG 了.
本文就来介绍这还算新鲜热乎的 Linux 内核 BUG !
这里是 穷人小水滴, 专注于 穷人友好型 低成本技术. (本文为 69 号作品. )
相关文章:
- 《流浪 Linux: 外置 USB SSD 安装 ArchLinux》 https://blog.csdn.net/secext2022/article/details/145413676
- 《流浪 ArchLinux 后续: 修复 fstrim USB SSD》 https://blog.csdn.net/secext2022/article/details/145813098
- 《低功耗低成本 PC (可更换内存条) 推荐 (笔记本, 小主机)》 https://blog.csdn.net/secext2022/article/details/146135064
参考资料:
- https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/net/usb/rndis_host.c?h=v6.12.23
- https://patchwork.kernel.org/project/netdevbpf/patch/20250311091035.2523903-1-lkundrak@v3.sk/
- https://bbs.archlinux.org/viewtopic.php?id=304892
- https://wiki.archlinux.org/title/Kernel/Arch_build_system
目录
- 1 BUG 分析 (故障描述)
- 1.1 Android udev 规则
- 1.2 内核 rndis_host 模块
- 2 解决方案: 自己编译 Linux 内核 (ArchLinux)
- 3 测试结果
- 4 总结与展望
1 BUG 分析 (故障描述)
使用 USB 数据线连接 Android 手机和 PC 主机, 然后在手机上启用 USB 网络共享 功能:
然后 PC 主机上就会出现一个 USB 网卡:
> ip link省略6: wwp5s0f3u2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether f2:a2:ef:01:02:03 brd ff:ff:ff:ff:ff:ffaltname wwxf2a2ef010203
嗯 ? 这什么情况 ?? wwp
开头的网卡是啥 ?
以前正常的时候, 出现的网卡是 enp
开头的, 就像:
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000link/ether 84:47:09:01:02:03 brd ff:ff:ff:ff:ff:ffaltname enx844709010203
内核版本:
> uname -a
Linux SC202501C7LA 6.14.2-zen1-1-zen #1 ZEN SMP PREEMPT_DYNAMIC Thu, 10 Apr 2025 18:43:47 +0000 x86_64 GNU/Linux
1.1 Android udev 规则
在 Linux 系统中, udev
用于处理硬件的热插拔. 会不会是这里出了问题 ?
> pacman -Ss android-udev
extra/android-udev 20250314-1 [已安装]Udev rules to connect Android devices to your linux box
> pacman -Ql android-udev
android-udev /usr/
android-udev /usr/lib/
android-udev /usr/lib/sysusers.d/
android-udev /usr/lib/sysusers.d/android-udev.conf
android-udev /usr/lib/udev/
android-udev /usr/lib/udev/rules.d/
android-udev /usr/lib/udev/rules.d/51-android.rules
其中 android-udev
软件包是关于 Android 设备的处理规则. 我们来看看 /usr/lib/udev/rules.d/51-android.rules
文件:
> cat /usr/lib/udev/rules.d/51-android.rules省略# XiaoMi
ATTR{idVendor}!="2717", GOTO="not_XiaoMi"省略# Redmi Note 3 (ff08=adb)
# Mi/Redmi (ff10=ptp ff18=ptp,adb ff40=mtp ff48=mtp,adb ff80=rndis ff88=rndis,adb)
# Mi Mix / A1 (ff18=ptp,adb ff28=storage,adb ff48=mtp,adb ff88=rndis,adb)
ATTR{idProduct}=="ff08", GOTO="adb"
ATTR{idProduct}=="ff18", GOTO="adbptp"
ATTR{idProduct}=="ff28", GOTO="adbmass"
ATTR{idProduct}=="ff40", GOTO="mtp"
ATTR{idProduct}=="ff48", GOTO="adbmtp"
ATTR{idProduct}=="ff88", GOTO="adbrndis"省略# ADB Debug and Tether mode
LABEL="adbrndis", ENV{adb_adb}="yes"
LABEL="rndis", ENV{adb_user}="yes", GOTO="android_usb_rule_match"省略# Symlink common code to reduce steps above
LABEL="android_usb_rule_match"
ENV{adb_adbcdc}=="yes", ENV{adb_adb}="yes", SYMLINK+="android_cdc", SYMLINK+="android_cdc%n"
ENV{adb_adbfast}=="yes", ENV{adb_adb}="yes", ENV{adb_fast}="yes"
ENV{adb_adbmass}=="yes", ENV{adb_mass}="yes"
ENV{adb_adbmtp}=="yes", ENV{adb_adb}="yes", ENV{adb_mtp}="yes"
ENV{adb_adbptp}=="yes", ENV{adb_adb}="yes", ENV{adb_ptp}="yes"
ENV{adb_adbmidi}=="yes", ENV{adb_adb}="yes", SYMLINK+="android_midi", SYMLINK+="android_midi0%n"
ENV{adb_adbuvc}=="yes", ENV{adb_adb}="yes", ENV{adb_uvc}="yes"
ENV{adb_adb}=="yes", ENV{adb_user}="yes", SYMLINK+="android_adb"
ENV{adb_fast}=="yes", SYMLINK+="android_fastboot"
ENV{adb_mass}=="yes", ENV{adb_mtp}="yes"
ENV{adb_ptp}=="yes", ENV{adb_user}="yes", ATTR{bDeviceClass}=="00|02|06|ef|ff", ENV{adb_mtp}="yes"
ENV{adb_mtp}=="yes", ENV{adb_user}="yes", SYMLINK+="libmtp-%k", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}="1"
可以看到, 处理 USB 网络共享的功能叫 rndis
.
监听 udev 事件, 同时在手机上操作开启 USB 网络共享功能:
> udevadm monitor --udev
monitor will print the received events for:
UDEV - the event which udev sends out after rule processingUDEV [18943.738720] unbind /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0 (usb)
UDEV [18943.739269] remove /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0 (usb)
UDEV [18943.859917] unbind /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2 (usb)
UDEV [18943.860471] remove /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2 (usb)
UDEV [18944.383830] add /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2 (usb)
UDEV [18944.384734] add /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0 (usb)
UDEV [18944.385587] add /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.1 (usb)
UDEV [18944.386854] bind /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.1 (usb)
UDEV [18944.391621] add /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0/net/wwp5s0f3u2 (net)
UDEV [18944.392288] add /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0/net/wwan0/queues/rx-0 (queues)
UDEV [18944.392434] add /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0/net/wwan0/queues/tx-0 (queues)
UDEV [18944.393351] bind /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0 (usb)
UDEV [18944.396446] bind /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2 (usb)
UDEV [18944.398125] move /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0/net/wwp5s0f3u2 (net)
其中关键事件:
add /devices/pci0000:00/0000:00:08.1/0000:05:00.3/usb1/1-2/1-2:1.0/net/wwp5s0f3u2 (net)
也就是内核通知添加了新设备 wwp5s0f3u2
.
1.2 内核 rndis_host 模块
udev 看起来好像没问题, 那问题可能在内核里面.
> lsmod | grep rndis
rndis_host 24576 0
cdc_ether 28672 1 rndis_host
usbnet 61440 2 rndis_host,cdc_ether
> modinfo rndis_host
filename: /lib/modules/6.14.2-zen1-1-zen/kernel/drivers/net/usb/rndis_host.ko.zst
license: GPL
description: USB Host side RNDIS driver
author: David Brownell
srcversion: 4DE15943675DBCB96800C5E
alias: usb:v*p*d*dc*dsc*dp*icEFisc04ip01in*
alias: usb:v*p*d*dc*dsc*dp*icE0isc01ip03in*
alias: usb:v*p*d*dc*dsc*dp*icEFisc01ip01in*
alias: usb:v*p*d*dc*dsc*dp*ic02isc02ipFFin*
alias: usb:v19D2p*d*dc*dsc*dp*ic02isc02ipFFin*
alias: usb:v19D2p*d*dc*dsc*dp*icE0isc01ip03in*
alias: usb:v238Bp*d*dc*dsc*dp*ic02isc02ipFFin*
alias: usb:v1630p0042d*dc*dsc*dp*ic02isc02ipFFin*
depends: cdc_ether,usbnet
intree: Y
name: rndis_host
retpoline: Y
vermagic: 6.14.2-zen1-1-zen SMP preempt mod_unload
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 09:05:FF:B2:1C:68:6D:FC:6A:6A:6E:E5:3E:B3:9E:4D:F3:4F:07:32
sig_hashalgo: sha512
signature: 30:65:02:31:00:D4:F7:6C:DD:03:F0:33:8C:82:39:BC:BD:FB:95:A8:8A:3B:71:1D:CB:06:97:34:5C:22:54:76:13:2C:04:49:0C:1D:11:F6:8B:C6:F5:81:3E:76:1E:F0:E1:AF:84:F8:2C:02:30:5E:28:6A:A4:90:18:65:24:7E:74:C4:70:C8:FA:25:1C:79:0A:8F:8E:69:17:CA:2A:EB:D7:08:23:DA:14:63:56:90:43:B3:03:3E:00:15:22:69:36:EF:58:F7:6B:95:3D
内核模块 rndis_host.ko
是对应的驱动程序.
再看看相应的 dmesg
日志:
> sudo dmesg省略[ 57.742480] usb 1-2: new high-speed USB device number 4 using xhci_hcd
[ 57.871721] usb 1-2: New USB device found, idVendor=2717, idProduct=ff80, bcdDevice= 4.19
[ 57.871727] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 57.871730] usb 1-2: Product: Redmi Note 9 Pro
[ 57.871732] usb 1-2: Manufacturer: Xiaomi
[ 57.871734] usb 1-2: SerialNumber: 87420001
[ 57.933653] usbcore: registered new interface driver cdc_ether
[ 57.941628] rndis_host 1-2:1.0 wwan0: register 'rndis_host' at usb-0000:05:00.3-2, Mobile Broadband RNDIS device, 16:f0:8c:01:02:03
[ 57.941663] usbcore: registered new interface driver rndis_host
[ 57.947399] rndis_host 1-2:1.0 wwp5s0f3u2: renamed from wwan0
嗯, 看起来, 在内核里面就直接把设备识别成了 wwan0
, 从而导致了后续的一系列故障.
在网上搜索相关资料, 也有不错的发现:
-
https://patchwork.kernel.org/project/netdevbpf/patch/20250311091035.2523903-1-lkundrak@v3.sk/
rndis_host: Flag RNDIS modems as WWAN devices
这是上个月的内核代码变更, 所以还新鲜热乎着呢.
-
https://bbs.archlinux.org/viewtopic.php?id=304892
USB tethering not working after updating to latest kernel
ArchLinux 用户论坛上也有人提出了相同的问题.
所以, 去看内核源代码吧: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/net/usb/rndis_host.c?h=v6.12.23
内核代码文件 drivers/net/usb/rndis_host.c
: (节选)
static const struct usb_device_id products [] = {
{/* 2Wire HomePortal 1000SW */USB_DEVICE_AND_INTERFACE_INFO(0x1630, 0x0042,USB_CLASS_COMM, 2 /* ACM */, 0x0ff),.driver_info = (unsigned long) &rndis_poll_status_info,
}, {/* Hytera Communications DMR radios' "Radio to PC Network" */USB_VENDOR_AND_INTERFACE_INFO(0x238b,USB_CLASS_COMM, 2 /* ACM */, 0x0ff),.driver_info = (unsigned long)&rndis_info,
}, {/* ZTE WWAN modules */USB_VENDOR_AND_INTERFACE_INFO(0x19d2,USB_CLASS_WIRELESS_CONTROLLER, 1, 3),.driver_info = (unsigned long)&zte_rndis_info,
}, {/* ZTE WWAN modules, ACM flavour */USB_VENDOR_AND_INTERFACE_INFO(0x19d2,USB_CLASS_COMM, 2 /* ACM */, 0x0ff),.driver_info = (unsigned long)&zte_rndis_info,
}, {/* RNDIS is MSFT's un-official variant of CDC ACM */USB_INTERFACE_INFO(USB_CLASS_COMM, 2 /* ACM */, 0x0ff),.driver_info = (unsigned long) &rndis_info,
}, {/* "ActiveSync" is an undocumented variant of RNDIS, used in WM5 */USB_INTERFACE_INFO(USB_CLASS_MISC, 1, 1),.driver_info = (unsigned long) &rndis_poll_status_info,
}, {/* RNDIS for tethering */USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3),.driver_info = (unsigned long) &rndis_info,
}, {/* Mobile Broadband Modem, seen in Novatel Verizon USB730L and* Telit FN990A (RNDIS)*/USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1),.driver_info = (unsigned long)&wwan_rndis_info,
},{ }, // END
};
MODULE_DEVICE_TABLE(usb, products);
这一段中的关键代码是:
USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1),.driver_info = (unsigned long)&wwan_rndis_info,
然后我们来对比:
static const struct driver_info rndis_info = {.description = "RNDIS device",.flags = FLAG_ETHER | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT,.bind = rndis_bind,.unbind = rndis_unbind,.status = rndis_status,.rx_fixup = rndis_rx_fixup,.tx_fixup = rndis_tx_fixup,
};// 省略static const struct driver_info wwan_rndis_info = {.description = "Mobile Broadband RNDIS device",.flags = FLAG_WWAN | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT,.bind = rndis_bind,.unbind = rndis_unbind,.status = rndis_status,.rx_fixup = rndis_rx_fixup,.tx_fixup = rndis_tx_fixup,
};
正常情况下, Android USB 网络共享的设备应该被识别为 rndis_info
. 而在上述内核驱动代码中, 错误 的被设置为 wwan_rndis_info
, 从而导致了后续的一系列故障.
比较这两个结构数据, 标志 (.flags
) 一个是 FLAG_ETHER
, 另一个是 FLAG_WWAN
.
正确的标志应该使用 FLAG_ETHER
, 才能使 USB 网络共享正常工作.
2 解决方案: 自己编译 Linux 内核 (ArchLinux)
好了, BUG 分析完了, 由于上游的一个 错误 的内核代码变更, 导致了后续的一系列故障.
如果等待 Linux 内核开发那边, 各种扯皮修复, 不知道要等到猴年马月. 所以, 只能自己手动修改内核代码, 并编译安装自定义内核了.
ArchLinux 编译内核的参考文档: https://wiki.archlinux.org/title/Kernel/Arch_build_system
-
(1) 安装编译内核所需的软件包:
sudo pacman -S devtools base-devel
-
(2) 创建一个目录, 并下载内核软件包相关代码:
> mkdir build > cd build > pkgctl repo clone --protocol=https linux-zen
-
(3) 下载完毕后, 对
PKGBUILD
文件进行这样的修改 (仅供参考):
> git diff -- PKGBUILD
diff --git a/PKGBUILD b/PKGBUILD
index 8e53813..a3ae8ed 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,9 +1,9 @@# Maintainer: Jan Alexander Steffens (heftig) <heftig@archlinux.org>-pkgbase=linux-zen
+pkgbase=linux-s2pkgver=6.14.2.zen1pkgrel=1
-pkgdesc='Linux ZEN'
+pkgdesc='Linux ZEN (s2)'url='https://github.com/zen-kernel/zen-kernel'arch=(x86_64)license=(GPL-2.0-only)
@@ -35,26 +35,20 @@ options=(_srcname=linux-${pkgver%.*}_srctag=v${pkgver%.*}-${pkgver##*.}source=(
- https://cdn.kernel.org/pub/linux/kernel/v${pkgver%%.*}.x/${_srcname}.tar.{xz,sign}
- $url/releases/download/$_srctag/linux-$_srctag.patch.zst{,.sig}
+ https://cdn.kernel.org/pub/linux/kernel/v${pkgver%%.*}.x/${_srcname}.tar.xz
+ $url/releases/download/$_srctag/linux-$_srctag.patch.zstconfig # the main kernel config file
-)
-validpgpkeys=(
- ABAF11C65A2970B130ABE3C479BE3E4300411886 # Linus Torvalds
- 647F28654894E3BD457199BE38DBBDC86092693E # Greg Kroah-Hartman
- 83BC8889351B5DEBBB68416EB8AC08600F108CDF # Jan Alexander Steffens (heftig)
+ fix_rndis_host_1.patch)# https://www.kernel.org/pub/linux/kernel/v6.x/sha256sums.ascsha256sums=('c5c682a354ea3190139357a57d34a79e5c37221ace823a938e10116b577a2e1b'
- 'SKIP''433091be5e04cb49a1c1a8d8b6a3220413fea3b897d998fe10973c14933abd27'
- 'SKIP'
- 'f33a574662f1d4f266a2faa96404240e71e84438dba05528a66449db1e23ec85')
+ 'f33a574662f1d4f266a2faa96404240e71e84438dba05528a66449db1e23ec85'
+ 'SKIP')b2sums=('ebba8a341d180887bbe125b23a3ac54ca7439eded877930f7b7df9a5ed3378701523e0cde972b520eaedf7f24d70d4d8db62db103e21943abeb35f9c1c91e4a7'
- 'SKIP''0420f497ba3c577b212ebb3b70b416033c252b37704cc19252672ca0b58b5ec0d994736dab3f652dfc283740b49f877164559c3697e2b6f14db0a49fcbaa25a0'
- 'SKIP'
- '7cd00b32197dfc9a98356c2c913ce85f0e3adebd2aeba95af7e5cf2815b02890652494eb946f307ebde48df99b8a4e0dd47fe11c9d3a2aea1ec92e8e64c1233b')
+ '7cd00b32197dfc9a98356c2c913ce85f0e3adebd2aeba95af7e5cf2815b02890652494eb946f307ebde48df99b8a4e0dd47fe11c9d3a2aea1ec92e8e64c1233b'
+ 'SKIP')export KBUILD_BUILD_HOST=archlinuxexport KBUILD_BUILD_USER=$pkgbase
@@ -90,7 +84,6 @@ build() {cd $_srcnamemake allmake -C tools/bpf/bpftool vmlinux.h feature-clang-bpf-co-re=1
- make htmldocs}_package() {
@@ -248,7 +241,6 @@ _package-docs() {pkgname=("$pkgbase""$pkgbase-headers"
- "$pkgbase-docs")for _p in "${pkgname[@]}"; doeval "package_$_p() {
嗯, 把新的内核命名为 linux-s2
.
- (4) 添加一个 patch 文件
build/linux-zen/fix_rndis_host_1.patch
:
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c
index bb0bf14..dbbab3d 100644
--- a/drivers/net/usb/rndis_host.c
+++ b/drivers/net/usb/rndis_host.c
@@ -680,7 +680,7 @@ static const struct usb_device_id products [] = {* Telit FN990A (RNDIS)*/USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1),
- .driver_info = (unsigned long)&wwan_rndis_info,
+ .driver_info = (unsigned long) &rndis_info,},{ }, // END};
没错, 只需修改一行代码 !
-
(5) 编译内核:
makepkg -s
编译完成后获得 2 个新的软件包:
> ls -l
总计 360736
-rw-r--r-- 1 s2 s2 282735 4月13日 09:31 config
-rw-r--r-- 1 s2 s2 438 4月13日 15:07 fix_rndis_host_1.patch
-rw-r--r-- 1 s2 s2 149412128 4月13日 09:44 linux-6.14.2.tar.xz
-rw-r--r-- 1 s2 s2 151359465 4月13日 16:10 linux-s2-6.14.2.zen1-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 s2 s2 68156035 4月13日 16:10 linux-s2-headers-6.14.2.zen1-1-x86_64.pkg.tar.zst
-rw-r--r-- 1 s2 s2 157702 4月13日 10:21 linux-v6.14.2-zen1.patch.zst
drwxr-xr-x 1 s2 s2 48 4月13日 16:10 pkg/
-rw-r--r-- 1 s2 s2 7500 4月13日 15:13 PKGBUILD
drwxr-xr-x 1 s2 s2 222 4月13日 15:19 src/
安装软件包:
sudo pacman -U linux-s2-6.14.2.zen1-1-x86_64.pkg.tar.zst linux-s2-headers-6.14.2.zen1-1-x86_64.pkg.tar.zst
更新 GRUB 启动菜单:
sudo grub-mkconfig -o /boot/grub/grub.cfg
重启, 选择新内核.
3 测试结果
重启完毕:
> uname -a
Linux SC202501C7LA 6.14.2-zen1-1-s2 #1 ZEN SMP PREEMPT_DYNAMIC Sun, 13 Apr 2025 07:18:48 +0000 x86_64 GNU/Linux
好, 已经用上了新内核.
> ip link省略5: enp5s0f3u2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000link/ether ee:81:70:01:02:03 brd ff:ff:ff:ff:ff:ffaltname enxee8170010203
好 ! 成功识别手机 USB 共享的网卡.
再看看 dmesg
:
> sudo dmesg省略[ 6782.970347] usb 1-2: new high-speed USB device number 4 using xhci_hcd
[ 6783.101881] usb 1-2: New USB device found, idVendor=2717, idProduct=ff80, bcdDevice= 4.19
[ 6783.101891] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 6783.101894] usb 1-2: Product: Redmi Note 9 Pro
[ 6783.101897] usb 1-2: Manufacturer: Xiaomi
[ 6783.101899] usb 1-2: SerialNumber: 87420001
[ 6783.177283] usbcore: registered new interface driver cdc_ether
[ 6783.184703] rndis_host 1-2:1.0 usb0: register 'rndis_host' at usb-0000:05:00.3-2, RNDIS device, ee:81:70:01:02:03
[ 6783.184738] usbcore: registered new interface driver rndis_host
[ 6783.191161] rndis_host 1-2:1.0 enp5s0f3u2: renamed from usb0
好, 一切工作正常.
NetworkManager 也可以正常识别并配置网络.
BUG 修复成功.
4 总结与展望
Linux 系统虽然可能 BUG 比较多, 但是因为有源代码, 随便来个人 (比如 穷人小水滴) 就可以随时随地修 BUG.
这就是开源的好处 !
本文使用 CC-BY-SA 4.0 许可发布.
相关文章:
Linux 内核 BUG: Android 手机 USB 网络共享 故障
众所周知, 窝日常使用 ArchLinux 操作系统, 而 ArchLinux 是一个滚动发行版本, 也就是各个软件包更新很快. 然而, 突然发现, Android 手机的 USB 网络共享功能 BUG 了. 经过一通排查, 发现是 Linux 内核造成的 BUG. 哎, 没办法, 只能自己动手修改内核代码, 修复 BUG 了. 本文…...
程序化广告行业(82/89):解锁行业术语,开启专业交流之门
程序化广告行业(82/89):解锁行业术语,开启专业交流之门 在程序化广告这个充满活力与挑战的行业里,持续学习是我们不断进步的动力源泉。一直以来,我都期望能和大家一起深入探索这个领域,共同成长…...
Linux的网络配置的资料
目前有两种方式,network和NetworkManager。 network方式是在CentOS 6及更早版本中引入的配置方法,支持使用配置文件的方式管理网卡的配置。 NetworkManager是在CentOS 7及后续的版本中使用的配置方法,支持使用命令行和图形化界面的方式来管理…...
linux: 文件描述符fd
目录 1.C语言文件操作复习 2.底层的系统调用接口 3.文件描述符的分配规则 4.重定向 1.C语言文件操作复习 文件 内容 属性。所有对文件的操作有两部分:a.对内容的操作;b.对属性的操作。内容是数据,属性其实也是数据-存储文件,…...
每天学一个 Linux 命令(16):mkdir
每天学一个 Linux 命令(16):mkdir 命令简介 mkdir(Make Directory)是 Linux 和类 Unix 系统中用于创建新目录的基础命令。它允许用户快速创建单个目录、多级嵌套目录,并能灵活设置目录权限。 主要用途 创建单个目录:快速生成新的空目录。递归创建多级目录:自动生成缺…...
Java微服务注册中心深度解析:环境隔离、分级模型与Eureka/Nacos对比
在微服务架构体系中,注册中心如同神经系统般承担着服务发现与健康管理的核心职能。本文将从生产环境实践出发,系统剖析注册中心的环境隔离策略、分级部署模型,并通过Eureka与Nacos两大主流组件的全方位对比,帮助开发者构建高可用服…...
c++:new关键字
目录 基本语法 使用举例 应用场景 使用 new 时的注意事项 基本语法 Type* ptr new Type;Type 是你要创建的类型(可以是基本类型、结构体、类等) new Type 表示在堆上创建一个 Type 类型的对象 ptr 是一个指针,指向这个对象 使用举例 …...
理解 MCP 协议的数据传递:HTTP 之上的一层“壳子
以下是以 CSDN 博客的风格记录你对 MCP 协议数据传递的理解和发现,内容涵盖了 MCP 协议基于 HTTP 的本质、JSON-RPC 的“壳子”作用,以及为什么熟悉 HTTP 协议就足以理解 MCP 的数据传递。文章面向技术社区,结构清晰,适合分享。 理…...
word中的mathtype公式编辑时,大(中)括号会存在很大的空白
如下所示,公式编辑的时候发现总会多一个空白,怎么删也删不掉 这主要是公式的分隔符问题,选择:“格式”-“分隔符对齐”,选择第三个可以消除下面的空白 点击“确认”,效果如下所示:...
【Java】查看当前 Java 使用的垃圾回收器
一、查询 Code import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.util.Arrays; import java.util.List;public class GCTypeDetector {public static void main(String[] args) {List<GarbageCollectorMX…...
Linux编程c/c++程序
前言 我们Windows系统下的idea可以说是非常智能了,集成了各种开发工具,包括并不限于编辑器/编译器/调试器/自动化构建工具/版本控制工具……而在Linux系统中,每个组件之间是相互独立的,每个组件各司其职,共同协作完成…...
【前端网络请求入门】XMLHttpRequest与Fetch保姆级教程
新手学前端时,经常会被「如何让网页和服务器说话」难住。今天我们用最通俗的语言,把浏览器最常用的两种网络请求方式——XMLHttpRequest和Fetch讲清楚,还会带完整的代码示例,跟着敲一遍就能上手! 一、先搞懂「网络请求…...
redis单机安装
redis单机安装 下载地址 官网:https://redis.io/下载列表页面:https://download.redis.io/releases/ 说明 版本选择:redis-7.0.0.tar.gz下载地址:https://download.redis.io/releases/redis-7.0.0.tar.gz 安装前准备 在linu…...
从零手写RPC-version0
参考文档 https://github.com/he2121/MyRPCFromZero Version-0 0、写项目第一步,先添加远程仓库 先在 github 上新建仓库,然后将本地新建的项目推送到远程仓库中 由于网上很多教程,所以本节不再赘述(可以让 chatGPT给出一个完…...
MOM成功实施分享(八)汽车活塞生产制造MOM建设方案(第二部分)
在制造业数字化转型的浪潮中,方案对活塞积极探索,通过实施一系列数字化举措,在生产管理、供应链协同、质量控制等多个方面取得显著成效,为行业提供了优秀范例。 1.转型背景与目标:活塞在数字化转型前面临诸多挑战&…...
二、Android Studio环境安装
一、下载安装 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Studio 提供了一些应用构建器以及一个已针对 Android 应用进行优化的集成式开发环境 (IDE)。立即下载 Android Studio。https://developer.android.google.cn/studio?hlzh-c…...
构件与中间件技术:概念、复用、分类及标准全解析
以下是对构件与中间件技术相关内容更详细的介绍: 一、构件与中间件技术的概念 1.构件技术 定义:构件是具有特定功能、可独立部署和替换的软件模块,它遵循一定的规范和接口标准,能够在不同的软件系统中被复用。构件技术就是以构…...
亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结
亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结 作为还没入门的业余编程爱好者,奋战了2天,借助AI开发一款FLASK小工具,功能还在完善中(时间轴可以跟随关联图缩放,加了一个用C键控制…...
CSS 字体学习笔记
在网页设计中,字体的使用对于提升用户体验和页面美观性至关重要。CSS 提供了一系列字体属性,用于控制文本的显示效果。以下是对 CSS 字体属性的详细学习笔记。 一、字体系列(font-family) 1. 字体系列的分类 在 CSS 中…...
通过 spring ai 对接 deepseek ai 大模型通过向量数据库,完成 AI 写标书及构建知识库功能的设计与开发
AI写标书及知识库构建详细设计方案 一、系统架构设计 +-------------------+ +-------------------+ +-------------------+ | 用户交互层 | | AI服务层 | | 知识库存储层 | | (Web/API) |---->| (Spring AI) |---…...
cropperjs 2.0裁剪图片后转base64提示“Tainted canvases may not be exported”跨域问题的解决办法。
目录 为什么会有这边文章 辛酸历程,不看也罢 想解决问题,看这里就够了 问题已解决,后边还是废话 为什么会有这边文章 最近,做一个项目需要用在前端实现图片裁剪功能,毋庸置疑,cropperjs是不二选择。当在…...
2、JSX:魔法世界的通行证——用魔法符号编织动态界面
一、开篇:魔法符号的觉醒 "看呐,赫敏!这根魔杖(React组件)为何能自动绘制出动态界面?"年轻的巫师学徒罗恩指着闪烁的屏幕惊呼。 "这就是JSX魔法阵的威力,"邓布利多校长挥舞…...
八大排序算法
目录 八大排序算法排序算法的稳定性比较排序插入排序直接插入排序希尔排序希尔排序的时间复杂度计算 选择排序直接选择排序堆排序 交换排序冒泡排序快速排序递归hoare版本挖坑法lomuto前后指针 非递归 归并排序排序性能对比 非比较排序计数排序 比较排序算法总结 八大排序算法 …...
搭建一个Spring Boot聚合项目
1. 创建父项目 打开IntelliJ IDEA,选择 New Project。 在创建向导中选择 Maven,确保选中 Create from archetype,选择 org.apache.maven.archetypes:maven-archetype-quickstart。 填写项目信息: GroupId:com.exampl…...
Google A2A协议解析:构建分布式异构多Agent系统
一、A2A 是什么?有什么用? 1.1 A2A 是什么? A2A(Agent-to-Agent Protocol)是Google最新推出的一项开源协议,旨在为AI智能体(Agents)提供标准化的通信方式。它允许不同框架…...
【Android读书笔记】读书笔记记录
文章目录 一. Android开发艺术探索1. Activity的生命周期和启动模式1.1 生命周期全面分析 一. Android开发艺术探索 1. Activity的生命周期和启动模式 1.1 生命周期全面分析 onPause和onStop onPause后会快速调用onStop,极端条件下直接调用onResume 当用户打开新…...
支持selenium的chrome driver更新到135.0.7049.84
最近chrome释放新版本:135.0.7049.84 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only su…...
【玩泰山派】MISC(杂项)- 使用vscode远程连接泰山派进行开发
文章目录 前言流程1、安装、启动sshd2、配置一下允许root登录3、vscode中配置1、安装remote插件2、登录 **注意** 前言 有时候要在开发板中写一写代码,直接在终端中使用vim这种工具有时候也不是很方便。这里准备使用vscode去通过ssh远程连接泰山派去操作࿰…...
利用阿里云企业邮箱服务实现Python群发邮件
目录 一、阿里云企业邮箱群发邮件全流程实现 1. 准备工作与环境配置 2. 收件人列表管理 3. 邮件内容构建 4. 附件添加实现 5. 邮件发送核心逻辑 二、开发过程中遇到的问题与解决方案 1. 附件发送失败问题 2. 中文文件名乱码问题 3. 企业邮箱认证失败 三、完整工作流…...
中文编码,GB系列,UTF
图片来源:https://zhuanlan.zhihu.com/p/701690894 文章目录 ASCIIGB系列编码UTF编码 ASCII American Standard Code for Information Interchange 一个字节,但其实只用了一半: 128个字符 GB系列编码 “国标” 和ASCII是兼容的。 GB2312…...
车载以太网-TLS
文章目录 车载以太网与TLS的技术背景核心定位车载以太网TLS的技术架构车载TLS的核心安全机制TLS报文结构详解TLS工作机制密钥交换与计算流程标题完整握手流程(1-RTT)数据传输加密流程车载TLS的独特优化策略车载TLS的安全威胁相关标准车载以太网TLS(Transport Layer Security…...
【大英赛】大英赛准备笔记
听力 总结 提醒专注 一题一个听力时,听是重点 抓紧时间往后审题 比较容易的部分:secA & secD中的dictation,在大致审当前的基础上,分别利用这个时间提前看后面的secB√& summery secA 听之前应当大致审选项&#x…...
有序数组的平方
暴力排序 每个数平方以后排个序 class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int slow0,fast0;int nnums.size();while(fast<n){nums[slow]nums[fast]*nums[fast];fast;slow;}sort(nums.begin(),nums.end());return nums;} }…...
Python基于Django的房屋信息可视化及价格预测系统(附源码,文档说明)
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...
【5G-A学习】ISAC通信感知一体化学习小记
通信感知一体化(Integrated Sensing and Communication, ISAC)是一种将无线通信与环境感知功能深度融合的技术,通过共享硬件、频谱和信号处理流程,实现通信与感知的协同增效。其核心原理及无人机与飞鸟的识别方式如下:…...
深入解析@Validated注解:Spring 验证机制的核心工具
一、注解出处与核心定位 1. 注解来源 • 所属框架:Validated 是 Spring Framework 提供的注解(org.springframework.validation.annotation 包下)。 • 核心定位: 作为 Spring 对 JSR-380(Bean Validation 2.0&#…...
学生考勤管理系统(jsp+ssh+mysql5.x)含文档
学生考勤管理系统(jspsshmysql5.x)含万字详细文档 学生考勤管理系统是一个用于管理学生出勤和请假的系统,系统登录页面提供账号和密码输入框,用户可以选择角色进行登录。系统主菜单包括班级管理、用户管理、课程表管理和考勤情况…...
【响应式编程】Reactor 常用操作符与使用指南
文章目录 一、创建操作符1. just —— 创建包含指定元素的流2. fromIterable —— 从集合创建 Flux3. empty —— 创建空的 Flux 或 Mono4. fromArray —— 从数组创建 Flux5. fromStream —— 从 Java 8 Stream 创建 Flux6. create —— 使用 FluxSink 手动发射元素7. generat…...
为什么我们需要if __name__ == __main__:
[目录] 0.前言 1.什么是 __name__? 2.if __name__ __main__: 的作用 3.为何Windows更需if __name__ ?前言 if __name__ __main__: 是 Python 中一个非常重要的惯用法,尤其在使用 multiprocessing 模块或编写可导入的模块时。它的作用是区分…...
Week 1: Time Complexity, Rectangle Geometry
问题集 Square PastureBucket BrigadeBlocked BillboardBlocked Billboard IIWord ProcessorDo You Know Your ABCs?The Cow-SignalD3C - White Sheet 视频解析 Square Pasture Bucket Brigade Blocked Billboard Blocked Billboard II Word Processor Do You Know Your AB…...
论文学习:《通过基于元学习的图变换探索冷启动场景下的药物-靶标相互作用预测》
原文标题:Exploring drug-target interaction prediction on cold-start scenarios via meta-learning-based graph transformer 原文链接:https://www.sciencedirect.com/science/article/pii/S1046202324002470 药物-靶点相互作用(DTI&…...
STM32 HAL库 OLED驱动实现
一、概述 1.1 OLED 显示屏简介 OLED(Organic Light - Emitting Diode)即有机发光二极管,与传统的 LCD 显示屏相比,OLED 具有自发光、视角广、响应速度快、对比度高、功耗低等优点。在嵌入式系统中,OLED 显示屏常被用…...
UE5蓝图之间的通信------接口
一、创建蓝图接口 二、双击创建的蓝图接口,添加函数,并重命名新函数。 三、在一个蓝图(如玩家角色蓝图)中实现接口,如下图: 步骤一:点击类设置 步骤二:在细节面板已经实现的接口中…...
封装Tcp Socket
封装Tcp Socket 0. 前言1. Socket.hpp2. 简单的使用介绍 0. 前言 本文中用到的Log.hpp在笔者的历史文章中都有涉及,这里就不再粘贴源码了,学习地址如下:https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…...
深入解析 Android 图形系统:Canvas、Skia、OpenGL 与 SurfaceFlinger 的协作
在 Android 应用开发中,流畅的 UI 渲染是用户体验的核心。但你是否好奇,一个简单的 View 是如何从代码中的 onDraw() 方法一步步变成屏幕上的像素的?本文将从底层图形系统的视角,解析 Android 中 Canvas、Skia、OpenGL ES 和 Surf…...
LeetCode每日一题4.13
1922. 统计好数字的数目 问题 问题分析 题目要求我们找到长度为 n 且满足特定条件(偶数下标处为偶数,奇数下标处为质数)的数字字符串的总数,并对 (10^9 7) 取余。 思路 1.枚举 生成所有可能的数字字符串:对于长度…...
Java学习——day29(并发控制高级工具与设计模式)
文章目录 1. 并发控制高级工具简介1.1 CountDownLatch1.2 CyclicBarrier1.3 Semaphore1.4 并发设计模式 2. 扩展生产者—消费者示例2.1 示例代码 3. 代码详解3.1 主类 ExtendedProducerConsumerDemo3.2 Buffer 类3.3 Producer 类3.4 Consumer 类 4. 编译与运行结果4.1 编译4.2 …...
使用FormData格式上传图片
为什么要使用FormData格式上传图片 1. 为什么使用 FormData? FormData 是一种专门用于构建表单数据的对象,它能够以 multipart/form-data 格式发送数据,这是文件上传的标准格式。以下是使用 FormData 的主要原因: 简单易用 直…...
Tkinter表格与列表框应用
在图形用户界面(GUI)开发中,表格和列表框是常用的控件,用于显示和管理大量的数据。Tkinter提供了Listbox控件来显示简单的列表数据,而对于更复杂的表格数据,可以使用Treeview控件(属于ttk模块)来实现。这一章将介绍如何使用Listbox和Treeview来显示和操作数据,帮助您处…...
【Excel】数据透视表月度数据排序不正确
【问题】 插入数据透视表后,月度列显示的日期,是按照文本格式排序的,显然与实际月份排序并不相符。 【目的】 按照从1月份到12月份进行自然月度排序。 【方法】 步骤一: 在任意一处,输入“1月”-“12月”&#…...