cloud-atlas-draft
  • README
  • 服务器
    • 内存
      • MLC - Intel内存延迟测试工具
    • IPMI
      • ipmitool使用tips
      • 服务器oob带外访问设置
      • ipmi操作和对应的sel日志记录
      • BMC故障导致kipmi0极高的CPU使用
      • HP服务器frimware问题导致ACPI缓存大小相关报错
      • server/ipmi/使用ipmitool在Linux平台配置IPMI
      • 系统日志IPMI message handler: BMC returned incorrect response
      • 串口管理程序conman
    • BIOS
      • 通过linux命令行修改服务器BIOS配置
      • 使用AMI SCELNX修改BIOS设置
      • Dell BIOS设置案例(关闭IR-SRV)
      • 在Linux中通过命令行修改BIOS
      • BIOS/UEFI和EDK
    • 传感器
      • 检查CPU温度
    • Open Compute
      • 服务器选型
  • 操作系统
    • Linux
      • 启动
        • RHEL7升级后磁盘设备label识别错误处理
        • 系统重启时间检查
      • 进程
        • 进程管理
          • 进程状态标志的含义
          • 运行队列中进程排查方法
          • ps命令tips
          • 杀掉多个进程的方法
          • 使用nice调整进程优先级
          • 检查进程的内存使用
          • 查看进程的线程方法
          • top命令使用tips
          • 显示最消耗cpu资源的进程
          • 检查进程运行在哪个CPU上
          • 检查进程启动时间
          • 检查进程使用网络端口
          • 控制台输出"INIT: Id "c0" respawning too fast: disabled for 5 minutes"
          • cron定时执行任务
        • SELinux
        • 线程
          • 进程和线程
          • 检查线程的方法
          • 内核线程
      • 日志
        • 日志文件管理
        • logrotate日志轮转工具
        • logwatch日志监视工具
        • mcelog系统硬件诊断日志搜集工具
        • systemd环境syslog-ng启动失败排查
        • syslog-ng部署和维护
        • tmp临时文件目录自动清理
        • 禁止日志打印到控制台
      • 内核
        • Linux资源管理
          • Cgroup快速起步
            • 如何限制进程使用的内存
            • Cgroup的CPU使用统计控制器
            • Cgroup v2简介
          • 在RHEL6中的Cgroups
            • RHEL6 Cgroups概述
            • RHEL6 使用控制组
          • 在RHEL7中的Cgroups
            • RHEL7 Cgroups概述
            • RHEL7 使用控制组
            • RHEL7 使用libcgroup工具
            • libvirtd日志报错virCgroupSetValueStr"No space left on device"
        • 网络
          • 多网卡bonding
            • Linux以太网Bonding驱动
            • 不断网在线修改bonding网卡MTU
          • 系统日志"TCP: time wait bucket table overflow"分析
          • Linux上禁用IPv6
          • 内核参数网络配置案例
          • SYN攻击、SYN cookie和其他
          • dmesg日志"TCP:unexpectedly shrunk window"
          • TCP拥塞控制
          • 通过BBR TCP拥塞控制算法加速Internet速度
          • 在Ubuntu 18上启用TCP BBR加速网络性能
          • ssh连接超时"Connection timed out"和内核tcp_syn_retries
        • 内核中日志模块和参数
          • 系统日志"__ratelimit: N callbacks suppressed"分析
        • cpu
          • CPU型号和分类
          • cpuinfo无法显示部分core
          • cpu_affinity
          • 中断和smp_affinity
          • 内核线程"migration"和CPU使用
          • 软中断
          • IRQ进程
          • 微代码Microcode
          • Linux 时钟管理
          • Intel Turbo Boost技术和intel_pstate
          • intel_pstate驱动详解
          • acpi-cpufreq主频设置
          • 修改ACPI事件:更改电源键默认操作
          • 笔记本suspended后数秒无故wake up问题排查("ACPI: Waking up from system sleep state S3")
          • 系统负载Load Averages的含义
          • 分析Intel CPU Machine Check Exception(MCE)
          • "NOHZ: local_softirq_pending 100"
          • "NETDEV WATCHDOG: slave0 (bnx2): transmit queue 5 timed out"内核Panic排查
          • Intel Skylake/Kaby Lake处理器系列简介
          • Intel Skylake/Kaby Lake处理器超线程bug及处理
          • dmidecode分析
          • "unchecked MSR access error"
          • AMD处理器ZEN一代之国产化海光
        • 内核调度
          • Linux内核调度基础知识
          • unthrottle_cfs_rq错误修复
        • 内核模块
          • 内核模块参数
          • 内核模式设置KMS
          • DKMS动态内核模块支持
          • dracut简介
        • 内存
          • 内存管理技术简介
            • 概述
          • 透明大页(Transparent Hugepages, THP)
            • 透明大页(Transparent Hugepage)
            • 在Red Hat Enterprise Linux 6/7中使用、监控和禁用透明大页
          • NUMA
            • NUMA node interleaving
            • 从UMA到NUMA
          • RDT
          • order 1内存页分配错误
          • 内核同页合并
          • 检查进程使用内存
          • 缓存清理(drop_caches)和内存压缩(compact_memory)
        • 存储
          • 块设备持久化命名
          • 块设备阻塞事件
          • kworker任务阻塞超过120秒
          • 热插拔磁盘识别
        • 内核跟踪排查
          • 为什么会发生segfault
          • 内核bug排查方法
          • 调试系统错误(Debugging System Faults)
          • 获取内核core dump
          • "Uhhuh. NMI received for unknown reason NN on CPU X"
          • kdump over nfs
          • kdump之后挂起启动而不重启
          • 获取XEN内核core dump
          • Core dump分析
          • 在core文件生成过程中压缩生成的core文件
          • 高Sys CPU的排查
          • debug呆滞的进程
          • 排查XEN服务器hang机core dump
          • vmcore分析案例:"kernel BUG at fs/buffer.c:1270"
          • 获取MySQL core
          • 在CentOS 5.11中编译crash
          • "Kernel panic - not syncing: stack-protector: Kernel stack is corrupted"
          • "hrtimer: interrupt took xxxx ns"和"NOHZ: local_softirq_pending 100"
          • "AER: Multiple Corrected error received"
          • top始终显示load 1
          • gdb和debuginfo
        • Kernel Panic案例
          • not syncing: Attempted to kill init! exitcode=0x00007f00
        • 性能
          • perf-tools性能工具
          • "perf samples too long"是什么?
          • Perf案例(译)
        • 补丁
          • ksplice, kpatch,kexec 技术简介
      • 设备管理
        • 随机数生成器RNG
        • udev
          • udev设备管理架构
        • pcie
          • 深入TLP:PCI exporess设备通讯原理
      • 存储
        • 磁盘
          • IO scheduler
          • 持久化块设备命名
          • parted磁盘工具
          • 磁盘分区4k对齐优化性能
          • Linux分区破坏的修复
          • 混合HDD/SDD的IO scheduler设置
          • 通过block_dump实时监测LinuxIO
          • 检查磁盘I/O负载
          • iotop监视磁盘访问
        • RAID
          • 在Linux中构建RAID
        • LVM
          • Linux卷管理
          • 扩展lvm卷
          • 缩小lvm卷
          • 在Gentoo上使用LVM
          • 执行pvcreate报错"Device /dev/XXX excluded by a filter."
        • 文件系统
          • Linux文件系统的未来
          • EXT文件系统
            • EXT文件系统文件数
            • EXT文件系统误删文件恢复
            • noatime参数挂载文件系统降低IO
            • 获取文件系统挂载的时间点
            • EXT3文件系统转换成EXT4
            • EXT4文件系统优化
            • EXT3文件系统报错"block bitmap and bg descriptor inconsistent"
            • EXT文件系统坏超级块恢复
            • EXT4根文件系统resize
            • EXT4文件系统dioread_nolock + nodelalloc 挂载选项异步写性能问题
            • disk label
            • 找出使用inode最多的文件目录
          • Btrfs文件系统
            • Btrfs文件系统快速起步
          • XFS文件系统
            • 重命名home目录提示"Device or resource busy"
            • xfs文件系统挂载参数
          • ZFS文件系统
            • ZFS dataset丢失排查
            • ZFS替换故障磁盘
            • ZFS高速IO缓存配置
          • FAT文件系统
            • 在Fedora中访问ExFAT文系统
          • 性能
            • iowait
        • 网络块设备(Network Block Device, nbd)
          • nbd概览
      • 网络
        • 网络协议
          • ARP
            • "arp incomplete"问题排查
        • iproute2
          • ip
        • 多网卡bonding
          • suse操作系统多网卡bonding
        • 可伸缩网络堆栈
          • RSS
        • 防火墙
          • Iptables
            • Iptables简易指南
            • CentOS设置HTTP访问iptables
          • Firewalld
            • 在CentOS7上添加防火墙端口允许访问
            • Firewalld丰富而直接的规则:设置Fedora/CentOS 7作为路由器
          • ufw
            • 使用ufw配置NAT masquerade
        • 交换机
          • 构建Linux三层交换机
          • USB over IP
          • Ethernet over USB
      • 备份
        • 使用tar备份完整Linux操作系统
        • 使用rsync备份完整Linux操作系统
      • 安全
        • 审核
          • 系统审核架构
          • 系统审计部署
          • 找出瞬间消失的TCP网络连接进程
          • 找出inode消耗原因
        • 防火墙
          • Linux防火墙简介
      • Red Hat
        • Fedora
          • 在MacBook Pro上实现Fedora和macOS双启动
          • 使用dnf对Fedora进行系统大版本升级
          • 升级到Fedora 27之后内核安装后不更新grub问题处理
          • Fedora x86_64操作系统兼容运行32位程序
          • 使用dnf安装源代码rpm
          • 在Fedora中使用BCM4360无线网卡
          • Fedora设置fcitx中文输入
          • GoldenDict和英中字典设置
          • 在Fedora中使用LXQt桌面
          • 定制LXQt桌面菜单(添加新应用启动)
          • 使用ImageMagick截屏
          • 在LXQt桌面平铺窗口
          • 在Fedora中切换桌面环境
          • 在Xfce桌面禁用alt+鼠标左键移动窗口功能
          • nVidia GT 750M显卡
          • 在Fedora中播放mp4视频
          • 在Fedora的chromium中播放flash
        • CentOS
        • 系统管理
          • CentOS/RHEL周期性自动清理/tmp目录
          • Linux操作系统登录超时设置
          • Grub 2 boot loader
            • Grub快速起步
            • 在grub2中切换默认启动内核
            • 修改grub2启动内核参数
            • 启动进入终端模式
            • EFI系统分区
          • OpenMLI
          • Systemd
            • 创建systemd服务单元
            • systemd修改主机名
            • systemd清理journal日志
            • systemd管理cpupower
            • systemd管理rc.local启动
            • 使用journalctl检查和维护systemd日志文件
            • 通过systemd设置禁止合上笔记本屏幕suspend
            • 合上笔记本屏幕时关闭屏幕
            • 通过systemd设置fedora系统hibernate休眠
            • systemd-logind高负载和内存泄漏问题排查
            • syslog-ng和systemd-journal远程日志存储
            • systemd-journal日志转发syslog
            • 在远程NFS存储上保存Linux系统日志
            • systemd-resolvd本地网络域名解析服务
            • 排查systemd-networkd配置问题
          • Network
            • CentOS7关闭IPv6
            • CentOS 7设置静态IP
            • NetworkManager命令行配置
            • 在NetworkManager管理的网络连接保持DHCP同时添加静态IP地址
            • 修改默认ens33网卡命名为传统eth0
        • rpm软件包管理
          • "无法获得metalink"错误
          • rpm使用tips
          • 检查和解压缩rpm包内容
          • 定时yum更新系统
          • 最小化安装后的yum安装
          • yum使用tips
          • 使用源代码RPMs
          • 使用dnf管理软件包
          • 转换AliOS到CentOS
          • 绝对不要删除keyutils-libs软件包
          • 无需安装的解压缩rpm文件
          • CentOS 5平台通过yum安装git
          • 跨OS平台构建rpm包
          • 升级CentOS 5系统的autoconf和automake工具
          • 通过yum-builddep安装所有从SRPM编译RPM包所依赖软件包
          • 执行"dnf upgrade"时报错"Error unpacking rpm package"处理
          • 执行"rpm -Uvh --force xxx.rpm --nodeps"返回错误码135
          • rpm命令报错"error: Failed to initialize NSS library"
          • 清理系统不使用的旧内核
        • RHEL/CentOS启动服务Tips
      • Debian
        • deb软件包管理
          • Debian最小化安装后的软件包安装建议
          • Debian安装源修改
          • Debian apt-get update出现软件包Hash Sum mismatch处理
          • 升级Debian 8 Jessie到Debian 9 Stretch
          • DEB和RPM安装包互相转换
      • Ubuntu
        • Ubuntu安装部署
          • 使用tar方式备份和恢复系统
          • 使用tar包手工安装多重启动的ubuntu
          • Ubuntu的Hardware Enablement(HWE)内核
          • "admin"账号已被Ubuntu保留无法使用
          • 在U盘上安装Ubuntu
          • Ubuntu 18.10安装NVIDIA驱动
          • 创建具有持久化存储的Live Ubuntu U盘
          • 安装XUbuntu
          • 在MacBook Pro上安装Ubuntu Server
          • 在MacBook Air上运行Ubuntu
          • 在MacBook Pro上运行ubuntu设置WIFI
          • apt upgrade之后提示"you may need to re-run your boot loader[grub]"
          • 设置apt通过代理安装软件
          • 选择最快的apt镜像网站
          • 升级Ubuntu系统到18.04 LTS Bionic Beaver
          • 避免Ubuntu内核升级
          • 使用.iso镜像或U盘作为APT软件仓库
          • 升级提示"packages have been kept back"
        • Ubuntu系统管理
          • 检查Ubuntu系统版本
          • sudo NOPASSWD不工作问题处理
          • Ubuntu启动字符模式
          • Ubuntu字符终端字体大小调整
          • Ly字符终端显示管理器
          • tessellimage进程
          • 网络
            • Ubuntu基本网络配置
            • 802.1x网络认证
      • Arch
        • Arch Linux包管理
        • Arch Linux本地化
        • 将Linux主机模拟成蓝牙键盘和鼠标
        • Arch Linux静态IP和动态IP配置
        • unblock wifi in rfkill
      • Kali
        • Kali Linux基础
        • 创建Kali镜像仓库
        • Kali Linux初始化
        • 通过VNC访问Kali Linux
        • 矫正Kali Linux时间
        • 定制Kali Linux桌面i3窗口管理器
        • 定制Kali Linux桌面fluxbox窗口管理器
        • 在Kali Linux中修改网卡Mac地址
        • 使用终端方式在Kali Linux中配置Wi-Fi网络
      • Gentoo
        • 在MacBook上安装Gentoo
        • Portage包管理
        • gcc-config错误处理一例
        • nVidia显卡
        • intel显卡
        • 混合显卡切换
        • 从KDE桌面转向Xfce桌面
        • 安装Xfce工作平台
        • 中文输入
        • 安装Broadcom无线网卡
        • 电源管理:suspend和hibernate
        • emerge包管理tips
      • SuSE
        • 在SuSE中安装软件包
        • 在SuSE中设置rc.local
      • Linux From Scratch(LFS)
        • 前言
        • 介绍
        • 准备
        • 构建临时系统
      • X window
        • 从ma上访问远程X window
        • 使用macOS的Homebrew X window远程访问Linux
        • 在macOS上使用homebrew-xorg
        • 向X window程序发送字符串
        • 配置Ubuntu平台VNC服务
        • lightdm图形登陆管理器
        • X无法启动'drmSetMaster failed'
        • noVNC:在浏览器中运行VNC
        • Xpra跨平台远程显示服务器
        • Linux的鼠标采样率
    • FreeBSD
      • FreeBSD介绍
      • FreeBSD安装
      • 在FreeBSD上安装软件:Packages和Ports
      • 在ThinkPad上运行FreeBSD
      • FreeBSD无线网络
      • 基于FreeBSD的防火墙pfSense
    • Windows
      • firewall
        • 在Event Viewer中查看Firewall和IPsec事件
      • Windows 10
        • 不同版本Windows 10区别
        • 清理Windows 10磁盘空间
        • 压缩NTFS驱动器
      • Windoes 2012
        • 在Windows Server 2012安装和卸载GUI
      • Windows 2016
        • 在Windows Server 2016 1709上安装OpenSSH
        • 在Windows服务器上安装Windows Subsystem For Linux(WSL)
        • 在Windows上运行OpenSSH
        • 在Windows上后台运行命令(类似Linux的nohup)
      • rdesktop
        • Mac平台远程桌面
      • IIS Web服务
        • 设置IIS下载.iso文件
      • DEBUG
        • 触发Windows Crash(获取memory dump)
        • Windows异常的debug方法简介
      • Windows脚本
        • Windows的无限循环脚本
  • 数据库
    • mysql
      • 安装和升级
        • CentOS 5安装MySQL 5.7
        • 创建MySQL数据库和授权
        • MySQL数据库密码安全策略返回错误"ERROR 1819"
        • 允许ROOT用户远程访问MySQL
      • 快速起步
        • mysql查询命令输出无表格线
        • mysql启动报错"Another MySQL daemon already running with the same unix socket."
        • 查询最近一小时的数据行
      • MySQL脚本
        • 在Shell脚本中使用mysql
        • 使用my.cnf作为mysql命令行配置
      • SQL
        • 查询结果排序
        • 修改表结构
        • 查询当天数据
        • 查询当前时间之前X分钟
      • 磁盘I/O
        • 什么时候MySQL执行IO
        • 如何解决MySQL IOWait过高问题
      • 索引
        • 检查MySQL表索引
      • 备份
        • 使用mysqldump备份和恢复MySQL数据库
      • 主从同步
        • 如何诊断同步备库延迟
        • MySQL多线程复制
      • 故障排查
        • MySQL Root用户密码重置
    • Oracle
      • ARM环境Oracle客户端
  • 网络
    • TCP/IP
      • TCP连接数检查
      • traceroute检查网络可达性
    • 链路聚合
      • LACP
        • LACP原理
        • LACP的ad_select参数
        • LACP数据包分析
        • bonding网卡链路down
    • 网络数据包分析
      • tcpdump
        • tcpdump
        • tcpdump实例介绍
        • tcpdump避免"packets dropped by kernel"
        • 分析跟踪失败的TCP连接和RST数据包(TCP重传率高)
        • tcpdump在启用TCP卸载功能的网卡上报告"checksum error"
        • 结合ping和tcpdump快速定位网络问题
      • wireshark
        • 使用wireshark分析TCP重传
        • 以普通用户身份运行wireshark
        • 在macOS中同时运行多个wireshark
      • ntop
        • ntop架构
        • 在CentOS 7上安装ntop
        • ntopng开源替代
      • 网络数据包分析工具
        • iftop网络流量(ip+port)分析工具
        • tcptrack网络流量(ip+port)分析工具
        • nethogs网络流量分析工具
      • Cisco
        • Overlay Transport Virtualization (OTV)
        • 交换机
          • 小型商业用交换机
            • Cisco SLM2008 8端口小型千兆交换机
          • 数据中心交换机
            • Cisco Nexus交换机延迟监控工具
        • 防火墙
          • Cisco防火墙DoS防护
      • 服务质量(QoS)
        • QoS技术简介
  • 存储
    • 服务器直连存储DAS
      • mpt2sas
        • LSI SAS2308控制芯片
        • mpt2sas驱动系统日志分析
        • mpt2sas系统日志"0x3003010a"和奇怪的sdm磁盘设备
        • mpt2sas故障排查
          • mpt2sas驱动报错案例
          • mpt2sas故障磁盘剔除
      • S.M.A.R.T.
      • 磁盘检测技术
        • 磁盘健康检查
    • GlusterFS
      • GlusterFS服务器端Quorum
    • Ceph
      • Ceph架构
        • Ceph统一存储解决架构
        • Ceph RADOS
      • Ceph硬件
        • Ceph个人存储硬件选择
      • Ceph部署
        • 在树莓派上部署Ceph集群
      • Ceph配置
      • Ceph操作
      • Ceph监控
      • Ceph和OpenStack
      • Ceph性能优化
        • Ceph性能分析
    • SPDK
      • spoold的cpu affinity
    • VDO
  • 服务技术
    • Sendmail
      • Sendmail队列异常处理
    • ssh
      • ssh密钥
      • ssh客户端配置
      • ssh-keygen生成新的SSH密钥
      • ssh指定私钥和生成无密码密钥
      • ssh端口转发
      • ssh多路传输multiplexing加速
      • 使用sslh在443端口提供多种协议服务
      • sshd服务不能加载主机key
      • sshfs远程访问服务器文件系统
      • https服务访问报错"fips_pkey_signature_test:test failure"
      • 属于多个用户组的用户ssh登陆仅显示主用户组问题
      • 加速ssh登陆
      • sshd服务多端口设置
      • ssh登陆报错"PTY allocation request failed on channel 0"
    • DNS
      • DNSmasq
        • DNSmasq快速起步
      • DNS over HTTPS
        • 一份DNS over HTTPS的卡通化介绍
    • Nginx
      • 在Mac OS X环境使用HomeBrew安装Nginx
      • 在CentOS 5环境手工安装Nginx
      • CentOS快速部署nginx+php
      • h5ai-时尚的HTTP服务器索引
      • 排查Nginx应用响应时间
      • 设置Django和Nginx uWSGI
      • Nginx uWSGI错误日志"(13: Permission denied) while reading upstream"
      • 设置Django和Nginx uWSGI的多站点
      • Docker容器迁移后uWSGI运行报错"ImportError: No module named datetime"
      • Nginx的root和alias
    • OpenResty
      • OpenResty安装
      • OpenResty快速起步
    • HAProxy
      • HAProxy和Nginx软件负载均衡对比
      • 在CentOS7中部署HAProxy
      • 使用HAProxy实现MySQL负载均衡
    • Varnish
      • 在Ubuntu上部署Varnish
      • 在Mac上部署Varnish
    • Proxy
      • Squid vs. Varnish vs. Nginx
      • Polipo:小巧的web代理服务器
      • 设置代理服务器和匿名上网
      • 在macOS上部署squid
    • FTP
      • vsftpd
    • NFS
      • CentOS 7 NFS设置
      • Ubuntu 16 NFS设置
      • NFS挂载超时排查
    • Samba
      • CentOS 7 Samba配置
    • NTP
      • NTP服务基础配置
      • 快速校准时间
      • ntpq错误"Request timed out"排查
      • ntp_gettime() returns code 5 (ERROR)
      • 在Ubuntu系统部署NTP服务
      • 命令行设置系统时间
    • aria2
      • 使用多协议多线程下载工具aria2
      • 使用aria2 WEB前端yaaw
    • 流媒体
      • OBS Studio广播
  • 消息队列
    • RabbitMQ
      • 安装RabbitMQ
      • AMQP简介
    • kafka
    • Redis
  • 安全
    • VPN
      • OpenConnect
        • 在Android上使用OpenConnect连接ocserv
        • 安装使用OpenConnect
        • 部署ocserv VPN服务器
        • 部署支持证书的OpenConnect VPN服务器(ocserv)
        • 在Ubuntu上部署OpenConnect VPN服务器(ocserv)
        • 修订ocserv端口
      • Shadowsocks
        • Shadowsocks原理
        • 部署Shadowsocks服务器
        • 在CentOS 7上部署ShadowSocks服务器
        • 安装shadowsocks客户端
    • 无线安全
      • Captive Portal
        • Captive Portal简介
        • 部署WiFiDog实现Captive Portal
      • Linux 802.1x网络认证
  • 虚拟化
    • Captive portal认证
    • Intel
      • VT-x
      • VT-d
        • Intel虚拟化技术Directed I/O架构
      • 内存虚拟化:扩展页表EPT
      • I/O虚拟化:SR-IOV
        • SR-IOV技术介绍
        • 在CentOS中部署SR-IOV
      • I/O虚拟化:数据直接I/O(DDIO)
      • 网络数据虚拟化:DPDK
        • 如何判断网卡是否支持DPDK技术
        • 在Linux中使用DPDK
        • 使用Open vSwith实现DPDK加速虚拟机网络性能
      • GPU虚拟化:GVT
    • kvm
      • kvm虚拟化架构
      • kvm嵌套虚拟化
        • CentOS7的嵌套虚拟化(nested virtualization)部署实践
      • qemu
        • QEMU的vt-d
        • vIOMMU架构
        • qemu监控指令
      • virtio
        • virtio规格
        • virtio guest端实现:PCI, virtio设备,virtio网络和virtqueue
        • Windows虚拟机virtio驱动版本
      • kvm快速起步
        • 一:基于内核的虚拟机(KVM)概览
        • 二:Redhat企业Linux安装KVM
        • 三:RHEL 7.2 配置KVM主机
        • 四:使用命令行启动第一个KVM实例
        • 五:使用Virt-Manger(VMM)部署KVM实例
        • 六:如何克隆一个KVM虚拟机并重置该虚拟机
        • 七:如何在线添加/更改虚拟磁盘
        • 八:如何在线添加/移除虚拟机的内存
        • 九:如何在线添加/移除虚拟机的vCPU
        • 十:更改libvirt虚拟机镜像存储路径
        • 十一:实现Linux KVM在线迁移
        • 十二:RHEL7 Pacemaker - 配置高可用KVM虚拟机
        • kvm快速起步实战
          • 在CentOS中部署KVM
          • 在Ubuntu中部署KVM
          • 访问VM控制台
          • 访问(修改)虚拟机镜像
          • 使用libguestfs+NBD远程访问磁盘镜像
          • KVM libvirt静态IP地址和端口映射
          • 在Gentoo中部署KVM
          • 使用Btrfs部署KVM
          • Clone KVM虚拟机实战
          • 动态调整KVM虚拟机内存和vcpu实战
          • 添加和动态调整虚拟机数据磁盘
          • 调整虚拟机btrfs文件系统大小
          • 添加和更新虚拟机设备
          • Linux KVM在线迁移实战
          • 高可用KVM虚拟机实战
          • 使用virsh删除运行的KVM VM
          • KVM虚拟机vnc远程访问鼠标偏移修复
      • kvm虚拟化部署和管理
        • kvm guest虚拟机时间管理
        • 通过QEMU guest agent和spice agent增强虚拟化
      • Ubuntu环境KVM
        • 安装
        • 网络
        • 创建虚拟机
      • kvm虚拟化存储
        • KVM虚拟机磁盘镜像修改指南(libguestfs:译+实践)
      • kvm性能
        • KVM性能调优实战
          • KVM性能优化架构简述
          • 性能监控工具
          • 多队列virtio-net
          • 使用virtio模式安装Windows
          • 在虚拟化中使用NUMA
        • KVM网络性能调优
          • KVM halt polling系统
        • kvm性能优化
        • kvm最佳实践(汇总)
        • 对于虚拟CPU的KVM性能限制
        • 大页内存技术
        • 透明大页内存技术
        • 大页内存和透明大页内存技术对比
        • Intel VT技术中的Preemption Timer
      • kvm热迁移
        • Ubuntu Guest操作系统热迁移vm内部进程OOM
        • virsh保存和恢复虚拟机状态
      • kvm DEBUG
        • kvm vcpu unhandled rdmsr/wrmsr
        • 在KVM中运行windows 10响应缓慢且CPU sys占用严重的解决方法
      • kvm测试
        • kvm单元测试
    • libvirt
      • 开发
        • 编译libvirt
          • 在CentOS 5环境中编译libvirt
          • 使用src rpm编译libvirt
          • libvirt调试排错
        • 使用Python开发Libvirt应用
          • 热迁移
      • hook
        • 通过libvirt hooks实现特定系统管理
      • Qemu
        • Qemu镜像
        • libvirt pvpanic
        • CentOS pvpanic实现和测试
        • Windows pvpanic实现
        • Windows pvpanic测试
        • 虚拟机core dump引发时间偏移和矫正方法
        • nemu - 面向云计算的轻量版QEMU
      • 设备
        • 虚拟机串口控制台
        • 检查块设备任务
      • Libvirt网络
        • libvirt网络架构
        • libvirt中的防火墙和网络过滤
        • libvirtd无法初始化ip6tables table 'filter'
      • Libvirt日志
        • libvirt日志
        • libvirtd.log日志显示"warning : qemuDomainObjTaint"
        • libvirtd.log日志显示"invalid argument: disk hdc does not currently have a source assigned"
      • NAT网络
      • 远程访问VNC
      • virsh使用
    • 虚拟网络
      • vxlan
        • vxlan概览
      • 故障排查
        • 使用tcpdump排查虚拟机网络不通
        • 虚拟机ping延迟问题排查
    • 性能
      • CPU steal
    • docker
      • Docker for Mac
        • Docker for Mac快速起步
      • Docker Engine
        • 安装
          • 在RedHat安装Docker
          • 在Docker中运行CentOS
          • 在Gentoo安装Docker
            • Docker内核支持参数说明
          • 在Ubuntu安装Docker
          • 在OS X安装Docker
        • Docker 存储
          • Docker应用程序数据
          • 调整dokcer容器可用磁盘空间
      • Docker Debugging
        • 系统日志:"new mount options do not match the existing superblock"
      • Docker开发指南(学习和实践)
        • 容器技术简介
        • 安装Docker
        • Docker快速起步
        • Docker启动容器报错"error response from daemon: secret store is not initialized"
        • 使用Docker快速部署不同版本CentOS容器
        • Docker容器启动时启动服务
        • 操作系统重启时自动启动Docker容器
        • 在Docker容器中部署Python virtualenv环境
        • 映射Docker容器内服务端口提供外部服务
        • Docker卷
        • Docker架构
        • 在开发中应用Docker
        • Docker编排(compose)
        • 运行docker ce
        • 导入和到处Docker容器(跨主机迁移)
        • 从主机视角找出Docker容器的进程
        • 检查Docker日志
        • 在Docker容器中执行命令
    • CoreOS
      • CoreOS架构
    • Kata Containers
    • xen
      • xen架构
        • Xen Hypervisor
        • Xen Hypervisor Debug
        • XenStore和xenstored
        • Xen网络概述
        • Xen内存调优
      • xen快速起步
        • xen动态添加或移除guest内存或CPU
        • xen动态添加usb设备到guest操作系统
      • xen网络
        • Amzaon VPC XEN SR-IOV性能
        • Xen多个VLANs的网络配置
      • xen存储
        • blktap块设备
        • 在Xen中挂载iso镜像文件
      • xen Debug
        • 配置XEN虚拟机Kernel core dump
        • xm list执行报错"int exceeds XML-RPC limits"
    • VMware
      • VMware虚拟机的计时
      • VMware Fusion使用指南
      • 在VMware Fusion虚拟机CentOS Guest中安装Vmware Tool
      • 在VMware Fusion虚拟机中安装macOS
      • 在VMware虚拟机中使用UEFI firmware
      • 在VMware Fusion中复制虚拟机
      • 备份VMware虚拟机
      • VMware headless模式运行虚拟机
      • VMware Fusion虚拟机磁盘空间爆满
      • VMware无法启动macOS APFS文件系统的Time Machine备份恢复
    • PowerVM
      • PowerVM介绍
    • Anbox
      • Anbox架构简介
      • 在Fedora中部署Anbox
    • Atomic
    • LXD
    • VirtualBox
      • VirtualBox使用Tips
    • bhyve
    • xhyve
      • OS X操作系统Hypervisor框架简介
      • 在OS X中部署xhyve
      • 在OS X中部署hyperkit
      • 在xhyve中运行RHEL/CentOS
      • 在xhyve中运行Debian/Ubuntu
      • 进入xhyve的docker虚拟机
    • Vagrant
      • 使用Vagrant部署开发测试环境
      • 使用Vagrant Package打包VirtualBox环境
      • 使用Vagrant部署kvm虚拟化(libVirt)
      • Vagrant Box管理
      • 使用Vagrant Snapshot创建快照备份
      • vagrant up下载镜像失败无法断点续传处理
      • vboxsf模块安装和挂载共享目录
    • 杂项
      • 如何检测虚拟或物理主机
      • 轻量级虚拟化
  • IaaS
    • MAAS
      • Intel SGX安全隔离技术
    • Amazon
      • EC2
        • 如何ssh登陆AWS的EC2实例
    • Microsoft
      • Azure
        • 在Azure上创建Linux虚拟机
    • Google
      • compute
    • Kubernetes
      • Kubernetes设计架构
      • Kubernetes快速起步
        • Hello Minikube
        • 检查kubernetes版本
      • Kubernetes故障排查
        • 排查Kubernetes集群容器重启原因
    • DC/OS
    • OpenStack
      • DevStack
        • DevStack开发环境
      • 安装指南
        • 环境
          • 安全
          • 主机网络
          • 网络时间协议
          • OpenStack软件包
          • SQL数据库
          • 消息队列
          • Memcached
      • Red Hat OpenStack
        • 架构
          • 组件
          • 架构案例
      • 华为OpenStack
    • oVirt
      • oVirt架构
      • oVirt存储管理
      • 部署oVirt
      • oVirt升级
      • oVirt的VNC密码设置
    • 腾讯云
      • 云API SDK
        • 腾讯云Python API SDK快速起步
    • 云存储
      • Dropbox
        • 在墙内如何使用Dropbox
  • 监控
    • IaaS类监控
      • skinken
      • sensu
  • 性能
    • web
      • Progressive JPEG
    • 网络
      • 网络性能优化
      • 网络工具
        • ping检查网络连通性
        • tcpreplay - 网络流量编辑和重放工具
        • netperf网络带宽测试
        • iperf网络测试
        • 使用iperf3测试网络带宽
        • ping时间戳
        • 使用sar显示网络流量
      • 网络故障排查
        • "IO error: Broken Pipe"是什么意思
    • 云计算
      • PerfKit Benchmarker
        • PerfKit Benchmaker快速起步
        • 配置PerfKit Benchmarker
        • PerfKit Benchmarker增加新的云服务商
        • 谷歌云gcp
        • 微软云azure
          • Azure起步
        • 腾讯云qcloud
          • QcloudApi起步
    • 实用工具
      • fio存储性能测试
        • fio快速起步
          • fio指南
            • fio编译和安装
      • iostat
      • tsar
      • linpack
      • dd测试磁盘性能
      • 通过sheel计算pi测试CPU性能
      • Unixbench性能测试工具
      • sysbench性能测试工具
      • SPEC CPU测试CPU性能
  • 开发
    • C
      • 编译
        • make程序时ld报错的DEBUG方法
        • gcc编译显示"cc1: warnings being treated as errors"处理方法
        • c语言中的单行注释和多行注释方法
        • 编译c程序调用Python
      • 网络
        • HTTP
          • 使用C实现一个简单的HTTP POST并处理相应
      • 打印输出
        • 重定向printf()到文件
    • Swift
      • 在Linux上安装swift 3
      • Swift服务器开发
    • Java
      • java的胡思乱想(白日梦)
        • [Java简单案例]](develop/java/java_daydream/java_simple_example.md)
        • Java输入输出
        • Java循环
        • Java数组
        • Java面向对象编程
      • 快速起步的一个例子:猜数字
      • jshell
      • groovy
        • 安装groovy
        • groovy简单语法
        • groovy字符串分隔
        • groovy时间处理
        • groovy对象比较
      • Java Trouble Shoot
        • Druid连接池"druid.pool.GetConnectionTimeoutException"
    • Go
      • Fedora环境下Go快速起步
      • macOS环境下Go快速起步
      • Go起步
      • Go测试库testify
    • iOS
      • iPhone 3GS:十年后经典再现
      • iOS6拟物化
      • iPhone 4S越狱、降级和其他
      • 新安装App提示"Verification Required"的解决
      • USIM卡
    • Android
      • 学习Android开发
        • Android应用是如何编译和运行的
        • Android开发环境
        • adb(Android Debug Bridge)和Android数据存储
        • 在Android模拟器上运行应用
        • 离线(手工)安装Android System Image
        • 配置Android模拟器使用硬件加速
      • Android起步
        • Android One和Android Go
        • Nexus 5系统升级
        • Root Android(Nexus 5)
        • Android文件传输
        • Android文件管理和apk安装
        • Android文件系统读写挂载
        • Android截屏和录屏
        • 在Google Play购买软件
        • Android开发环境准备
        • Jetbrains Idea快捷键
        • Gentoo Linux安装idea Jetbrains开发环境
        • 在Nexus上安装Android 7 Nougat
        • 在Nexus 6P上安装LineageOS 15.1
        • Nexus 6P工厂镜像恢复
        • Nexus 6P通过Full OTA镜像恢复
        • 修复Nexus 6P无限循环重启
        • 安装Elemental X内核
        • 使用MultiROM在Nexus 5上安装多操作系统
      • LineageOS
        • 构建hammerhead(Nexus 5)的LineageOS ROM
        • 构建marlin(Pixel XL)的LineageOS ROM
        • 在hammerhead(Nexus 5)上安装LineageOS
        • 在hammerhead(Nexus 5)构建Android Go
      • 我的Android设备
        • Nokia中端高可玩X7
        • Nexus 6P
        • 真正原生Android: Pixel系列
        • Pixel设置VoLTE
      • Android和Linux合体
        • 在Android中运行Linux
        • 在Android中部署ssh服务
        • 在Android上部署Linux开发环境
        • 容器模式在Linux中安装和运行Android Apps(APKs)
        • Anbox - 运行在Linux中的Android容器
          • 在Anbox容器中运行Android程序
      • BlueTooth
        • 通过蓝牙共享网络
      • NFC近场通讯
        • NFC技术概览
        • 日常生活NFC使用介绍
        • NFC开发基础
    • Raspberry Pi
      • 树莓派快速起步
      • 树莓派计算模块
      • 从USB存储启动树莓派
      • 树莓派4的USB接口问题汇总
      • 树莓派视频输出配置
      • 树莓派作为Cisco Console服务器
      • 树莓派Zero设置USB网络通讯(Ethernet Gadget)
      • 在树莓派Zero W上运行Kali Linux
    • Ubuntu Touch
      • 在Nexus 5上安装Ubuntu Touch系统
      • Ubuntu Touch使用tips
      • Ubuntu Touch手机设置802.1x无线网络
      • Ubuntu Touch运行sshd服务
      • Ubuntu Touch设置网络Proxy方法
      • 在Ubuntu Touch中运行Android程序
    • BlackBerry
      • 黑莓bb10系统运行微信
    • Meego和Sailfish
      • sfdroid:Sailfish/Android合体
      • sailfish和meego系统的第三方软件仓库
    • WebOS
      • Palm Veer共享移动internet
    • Python
      • Python开发风格
        • 开源Python项目结构
      • Python快速起步
        • pip包管理
        • 在古老的CentOS 5上安装Python 2.7以及virtualenv环境
        • 在CentOS 6上安装Python 2.7以及virtualenv环境
        • 在CentOS 7上安装Python 2.7以及virtualenv环境
        • Ubuntu环境安装virualenv和virtualenvwrapper
        • 在CentOS上安装Python3和virtualenv环境
        • 在macOS上安装Python3和virtualenv环境
        • 重建Python的virtualenv环境
        • pip升级Python软件包
        • 激活python解释器的自动完成功能
        • init.py文件
        • python编程风格
        • python中文本编码
        • 检查python对象类型
        • python处理文本
        • python中main函数作用
        • python日志
        • python日期
        • python变量写文件
        • python同时读取2个文件
        • python列表
        • python数组
        • python字典
        • Python的map函数
        • lambda语法糖:无需定义函数名的简便方法
        • python过滤字符
        • python百分比
        • python三元运算
        • python创建其他用户可写文件
        • python清空文件内容
        • python删除文件中某行
        • python列表字符串转浮点数
        • python多层嵌套字典KeyError
        • "PEP 8(E731): do not assign a lambda expression, use a def"
        • python的模块和包
        • python获取系统cpu数量
        • python nohup后台运行进程
        • 使用Graphviz模块绘制图形
        • python字典内容添加到列表
        • python site-packages简介
        • python去除字符串换行
        • Python程序Daemon化
        • Python函数返回多个值
        • Python执行外部命令subprocess
        • Python实现case/switch
        • Python使用环境变量
        • 将JSON字符串转换成Python字典
        • 本地变量分配前被引用报错"local variable 'XXX' referenced before assignment"
        • Python中对应于'null'的是什么?
        • 在Python分割字符串
        • 在Python中检查字符串是否被包含在另一个字符串中
        • 在Python中执行命令的利器"subprocess"
        • Python日志功能
        • Python处理XML
        • 安装阿里云对象存储OSS Python SDK和osscmd
        • 阿里云日志服务SLS python SDK和CLI
      • Python网络编程
        • Python WEB编程
          • 创建URL查询字符串
      • Python日志处理
        • Python日志基础
        • 在python日志中使用轮转和压缩
        • python处理systemd journal日志
      • Python文件系统
        • Python's Watchdog模块实现文件系统变化触发操作
      • Python网络开发模块Twisted
        • Twisted起步和FTP实现
      • Flask开发Web
        • 安装Flask开发环境
        • 基于Flask的Dashboard - Dash
      • DJongo开发Web
        • Django快速起步
          • 快速安装Django
          • Django项目代码架构风格
          • 使用MySQL作为Django数据库
          • 设置django的允许主机
          • 第一个Django应用
          • 离线安装Django
          • 完整uninstall一个Django app
          • 'module' object has no attribute 'views'
          • 使用django-tables2展示HTML表
          • django特定model保存记录时触发动作
          • django前端案例--Portal
          • django过滤当天发生事件
          • django实现select count(*) group by和order by
          • django缓存
        • Django DEBUG
          • "UnicodeDecodeError: 'ascii' codec can't decode byte"
        • 轻量级Django
          • Hello World
        • Django REST framework
          • Django REST framework概述
          • Django REST framework快速起步
          • 修改Django REST framework的默认title
          • Django REST framework序列化
          • Django REST framwork过滤
          • django REST Framework的时区,视图和模型刷新debug
        • Django Dashboard案例
          • 结合d3.js/reactive.js/leaflet实现Django Dashboard
        • django-dash控制台(废弃)
          • 本地运行django-dash demo
          • 使用django-dash快速构建控制台
        • 安装Django测试驱动开发环境
        • TTD(测试驱动):开发环境第一个测试
        • TTD(测试驱动):使用单元测试测试简单首页
      • Python学习案例
        • youtuble-dl下载视频网站内容
    • Ruby
      • Ruby快速起步
        • Fedora环境下Ruby快速起步
        • RubyGems安装和使用
    • JavaScript
      • jQuery
      • D3.js数据可视化
    • Node.js
      • Node.js快速起步
        • Node.js开发环境准备
        • Fedora环境下Node.js快速起步
        • Node.js开发WEB框架
        • 在Mac OS X下卸载Node.js
      • npm包管理
        • npm使用tips
        • svg2png
    • 浏览器
      • Firefox
        • 设置Firefox默认页面缩放比例zoom
        • Firefox的Dark风格设置(styelish)
        • Firefox自动代理切换
      • Chrome
        • 设置Chrome代理
      • Min
    • PHP
      • Nginx php-fpm配置优化Tips
    • Mac
      • 在mac上从iso镜像创建启动U盘
      • 从macOS Recovery中重新安装macOS
      • 从Time Machine备份中恢复Mac数据
      • 检测Time Machine备份的Mac OS X版本
      • 降级macOS
      • 在VMware虚拟机中运行Mavericks
      • 中文输入法
      • macOS内建的文本朗读(英语)
      • Mac平台使用VLC播放器的中文字幕显示
      • Mac平台最佳视频播放器iina
      • TextMate 2使用Tips
      • Sublime 3使用Tips
      • 在Mac OS X上安装Java多个版本
      • 使用MacBook键盘在移动设备输入
      • Mac网络
      • macOS上使用ftp
      • 从safari中导出打开的tab
      • bird进程
      • 在Mac上双启动方式安装Linux
      • 创建macOS启动安装U盘
      • 在Mac上使用Boot Camp Assistant安装Windows 10
      • rEFInd工具详解
      • 加速Time Machine备份速度
      • 在mac上输入特殊字符
      • Mac锁屏
      • Mac吸入式光驱强制弹出光盘
      • 为旧主机选择最快的Mac OS X版本
      • 通过Reset NVRAM来恢复触控板
      • Apple文件系统apfs
      • 苹果充电器指示灯闪烁无法充电
      • 通过SSHFS在Mac上远程开发Linux服务器程序
      • 在macOS上安装配置vsftpd
      • 清理macOS上的Purgeable磁盘空间
      • 调整macOS的apfs容器空间
      • 调整APFS文件系统出现"APFS Container Resize error code is 49153"
      • Mac OS X挂载NFS共享
      • MacOS快捷键
      • 从Time Machine中恢复隐藏文件
      • iTerm2中文显示问题处理
      • iTerm2黑暗模式
      • 安装使用GNU sed
      • 具有BouchBar的新款MacBook和Linux
      • 在Mac OS X中通过CLI命令行获取CPU信息
      • 不能运行"not from a verified developer"程序
      • Mac OS X Mavericks和iOS 6组合(体验最后的拟物化苹果生态)
      • 将iPad作为Mac的第二块屏幕(sidecar)
      • MacBook Pro 2018使用外接显示器
      • macOS安装冻结问题处理
      • macOS的磁盘工具First Aid功能
      • 查找macOS的IP地址
      • 升级macOS之后运行程序报错"missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcru"
      • 在Mac上使用checksum校验文件
    • shell
      • bash
        • bash快捷键
        • shell的特殊变量
        • 判断shell变量是否空字符串
        • 字符串比较错误提示"unary operator expected"
        • shell脚本中使用source和使用./cmd.sh区别
        • here document用法(cat << EOF)
        • 根据命令返回结果做if判断
        • 使用sudo在文件中添加内容
        • shell中的环境变量
        • shell函数tips
        • 生成随机数和随机字符串
        • shell中使用数组
        • shell中读取文件到bash数组
        • 列出所有cron定时任务
        • 在shell中计算
        • 在bash计算
        • shell中的break和continue指令
        • 读取文件逐行处理元素
        • 两个文件相减
        • 在shell中使用while循环
        • 在while循环中执行ssh中断循环的解决方法
        • shell中调用函数返回值的方法
        • shift的用法
        • 移除换行
        • 删除字符串最后n个字符
        • 删除一个文件的最后一行
        • 替换多个空格成为一个空格
        • ``符号和脚本进程
        • 同时赋值给多个变量
        • 在shell中比较小数的大小
        • sudo执行bash脚本报错"sudo: unable to execute"
        • 获取字符串最后几个字母
        • 对比目录文件异同
        • 文件对比
        • 判断字符串包含关系的方法
        • 检查字符串长度
        • "exec"指令的含义
        • 从函数返回
        • 检查变量是否是一个数值
        • shell中判断字符串null值
        • 删除文件名中包含"--"的文件
        • 使用nohup执行while循环
        • 修改nohup命令默认输出文件名"nohup.out"
        • 通过SSH远程写入文件
        • ping测试记录时间戳
        • 软链接和文件名
        • shell中字符串大写和小写转换
        • shell中处理json数据工具jq
        • shell检查主机是否alive
        • shell中检查服务器进程使用cpu
        • 获取网卡IP地址
        • 高效清理文件系统大量文件的方法
        • 找出系统端口监听服务进程
        • 判断文件是否为空
        • 执行rm,cp,mv命令出现"Argument list too long"报错的解决方法
        • 切分字符串赋值给多个变量
        • 计算字符串长度(字符数量)
        • 删除字符串的最后字符
        • 补全字符串
        • 检查数字是偶数还是奇数
        • 转换Linux uptime时间到易于理解的格式
      • zsh
        • oh-my-zsh
      • sed和awk
        • awk和shell之间的变量传递
        • 打印列中包含某个字符串的列
        • awk处理字符串搜索
        • sed举例
        • 如何避免sed -i破坏文件的软链接
        • sed替换行首和行尾
        • 使用sed修改配置文件到键值
        • Mac平台sed命令使用-i参数失败及解决方法
        • 删除文件的首行和尾行
        • 删除文件的最后一列
        • 累加所有行的每一列数值
      • 实用工具
        • sudo切换账号运行程序
        • 修改用户帐号名/uid/gid的工具usermod和groupmod
        • 脚本作为daemon运行
        • cut使用举例
        • sort排序
        • 对cpu施加负载
        • 多路复用终端管理器screen
        • 多路复用终端管理器"增强版"byobu
        • 随机输出文本文件中的行:shuf
        • 使用usermod禁用帐号
        • 使用tree展示目录结构树
        • 根据进程名pgrep和pkill
        • wget下载文件tips
        • HTTP协议利器curl
        • 命令执行超时检查工具timeout
        • 脚本使用ssh的密码认证工具sshpass
        • 并行执行ssh命令工具pssh
        • 命令输出处理工具xargs
        • 文件查找工具find
        • parallel利用多核CPU加速Linux命令
        • 命令速查表cheat
        • 语音合成工具espeak
        • 网络万能工具nc
        • 限制命令的io调度和权重
        • 配置修改工具augeas
        • 高效压缩工具xz
        • tar命令再认识
        • echo命令再认识
    • vim
      • vim快速起步
      • vim 跳转到函数、变量定义处
      • vim tips
      • vim树形导航插件NERDtree
      • vim编译配置"YouCompleteMe"
      • vim结合ctags作为开发平台
      • vim开发内核环境
      • 将Vim打造成Python开发平台
      • 使用vim作为c/c++ IDE
      • 使用vim作为c/c++ IDE(again)
      • 使用vim作为IDE
      • 在macOS平台使用vim作为IDE
      • vim大小写转换
      • 设置vim缩进和TAB
      • vim列编辑
      • vim并列视图编辑和查看同一文件(viewports)
      • 卸载macvim
    • 文档
      • dot
        • 使用Graphviz生成系统诊断图
      • GitBook
        • 使用GitBook撰写书籍
        • 如何在一台主机同时运行多个GitBook
        • GitBook评论插件
        • GitBook单章节展开插件
        • GitBook代码段添加文件名
        • GitBook多国语言
        • GitBook嵌入视频
      • MkDocs
        • 使用MkDocs撰写书籍
      • Hugo
        • 使用Hugo撰写文档
      • Hexo
        • 使用hexo撰写blog
        • 使用hexo theme tranquilpeak
      • Sphinx
        • 使用Sphinx构建Python程序文档
        • 使用Sphinx构建Django程序文档
        • sphinx中文文档在readthedocs编译PDF失败的处理
        • 结合plantuml使用sphinx撰写时序图文档
        • sphinx文档的代码展示
        • sphinx文档的footer定制
        • sphinx图片
        • 'redrawtime' exceeded, syntax highlighting disabled
      • MoinMoin
        • MoinMoin 2安装
        • MoinMoin 1安装
        • 配置Moin
        • Moin Themes
      • Office
        • 在Linux中使用Sozi制作PPT
        • Linux演示工具(PPT)
      • OmniGraffle
      • Sketch
    • 编程架构
      • 统一建模语言UML
        • 看懂UML类图和时序图
      • RESTful开发架构
        • RESTful简介
        • 理解RESTful架构
        • RESTful认证和权限机制浅析
    • 机械键盘
  • DevOps
    • 基础架构工程师视角的DevOps
    • 持续集成/交付/部署
      • 持续集成/交付/部署概述
    • Git
      • git代理配置
      • git分支的新建与合并
      • git的tag和branch
      • git pull覆盖本地文件(完全舍弃本地文件)
      • git合并时冲突放弃本地修改方法
      • git远程操作
      • git和dropbox冲突
      • 针对不同域名git push时使用指定SSH key
      • git忽略文件mode修改
      • git重新基于master开发分支
      • 合并多个commit
      • git色彩显示
      • 在不同git仓库代码使用不同用户名
      • [git合并冲突解决](devops/git/git _merge_fix_conflicts.md)
      • git checkout指定tag
      • 从git仓库中清理敏感信息(如密码))
      • git通过SSH Tunnel代理访问
      • git文件的执行属性
      • 修改git commit消息
    • Gerrit
    • Gitlab
      • 部署使用的ssh key
      • gitlab Wiki系统gollum
    • Gogs
    • Jenkins
    • Ansible
      • 起步
        • Ansible快速教程
        • 安装
        • 快速起步
        • 清单
        • 动态清单
        • Patterns
        • Ad-Hoc命令
      • Playbooks
        • Playbooks入门
        • 案例:升级CentOS操作系统
        • 案例:通过sudo安装rpm包
      • 模块
        • command - 在远程节点执行一个命令
        • shell - 在远程节点执行命令
      • Dashboard
        • Ansible Tower开源替代:semaphore
      • 问题排查
        • TAB键导致"Syntax Error while loading YAML"
        • paramiko主机认证报错
        • paramiko主机认证报错
        • playbook执行报错"requires the stdlib json or simplejson module"
      • Tips
        • Ansible模块shell,command
        • 如果软件包没有安装则执行命令
        • 不检查SSH主机fingerprint
        • 变量和引号
        • ansible性能优化
        • 使用ansible.cfg
        • 安装rpm报错"unfinished transactions remainin"
        • yum安装报错"Package XXX is not signed"
        • yum安装报错"No Package matching"
        • Ansible批量复制文件
    • Puppet
  • 大数据
    • Hadoop
      • 快速起步
        • 单机安装部署Hadoop
      • 故障排查
        • RHEL6环境下透明大页和Hadoop高CPU sys
    • Flink
      • flink流处理架构
    • Spark
      • 快速起步
        • 单机安装部署Spark
      • Spark机器学习
    • Elasticsearch
      • ESK简介
      • ESK快速安装
    • ZooKeeper
  • 机器学习
    • 斯坦福机器学习(CS229)
      • 机器学习介绍
      • 监督学习介绍
      • 无监督学习介绍
      • 单变量线性回归
      • 多变量线性回归
    • 单变量的线性回归
    • TensorFlow
      • 面向机器智能的TensorFlow
    • 机器翻译
      • moses
    • GPU计算
      • nVidia CUDA
      • AMD ROCm
    • Jetson Nano
      • vpi1-demos报错可忽略
  • 学习
    • 慕课(mooc)
      • 我的慕课
    • 天堂电影院
      • 使用VLC播放加密蓝光碟片
    • Kindle在,人未老
      • 重置Kindle Paperwhite
      • 使用calibre去除kindle DRM
      • 备份Kindle电子书
      • 电子书阅读软件
      • Kindle个人文档
      • 制作合适kindle的pdf:pdf切边和重排
      • 使用Kindle阅读pdf文档
    • GTD: Getting Things Done
  • 附录:个人工作室构建
    • MacBook双操作系统启动macOS+Linux
    • 使用Fedora作为开发平台
    • 无线网络设置
    • 帐号、ssh和sudo设置
    • 部署kvm虚拟化
    • 部署docker容器
    • 部署OpenStack
    • 远程开发Linux服务器程序
    • NFS设置和共享目录
    • Django开发设置
    • 部署Nginx+uwsgi运行Django
    • HAProxy端口转发
    • 使用wekan作为Trello类型的"看板"管理自己的工作
  • Who am I?
Powered by GitBook
On this page
  • 小结
  • 问题
  • debug
  • 直接使用wpa_supplicant
  • 改为纯手工设置 wpa_supplicant
  • 脚本启动
  • 尝试raspbian
  • 可能找到解决方法了
  • 参考

Was this helpful?

  1. 操作系统
  2. Linux
  3. Red Hat
  4. 系统管理
  5. Systemd

排查systemd-networkd配置问题

小结

树莓派连接公司wifi的问题困扰了我很久,最初是时好时不好,后来就是根本连接不上。配置完全相同情况下(百分百肯定账号及配置正确),在ThinkPad笔记本上工作正常,但是树莓派会奇怪地连接并不存在的 bssid=00:00:00:00:00:00 无线AP:

Nov 05 16:18:51 pi-worker2 wpa_supplicant[1932]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:27 pi-worker2 wpa_supplicant[1849]: wlan0: Trying to associate with SSID 'SSID-OFFICE'
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="SSID-OFFICE" auth_failures=1 duration=23 reason=CONN_FAILED

下面的排查过程很长,反复折腾走了很多弯路,但是实际上解决方法很简单:

  • 由于5G频段是一个受控频率,需要根据不同国家进行调整country code,否则无法连接。在 wpa_supplicant.conf 中需要明确指定 country=CN 参数(其他国家代码,如US可能也行)

  • ubuntu server使用netplan配置网络目前没有提供country参数,所以可以通过 iw reg set CN 命令动态设置。

  • 要持久化上述country配置,修改 /etc/default/crda 配置,将默认的

REGDOMAIN=

修改成

REGDOMAIN=CN

然后重启就可以看到5GHz的WiFi正常工作了。

以下是我一周多折腾的笔记,仅供参考

问题

我在使用Ubuntu for Raspberry Pi 2020.4.1时候,采用服务器版本,所以默认的网络配置是采用netplan。netplan可以使用NetworkManager作为后端,也可以使用systemd-networkd作为后端。为了减少服务组件,我采用 netplan 调用默认的 systemd-networkd 来配置无线网络。

我有2个树莓派,安装操作系统一致,并且采用了相同的 netplan 配置,即在 /etc/netplan 目录下创建2个配置文件:

  • 01-netcfg.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      optional: true
      dhcp4: no
      dhcp6: no
      addresses: [192.168.6.15/24, ]
      gateway4: 192.168.6.9
      nameservers:
        addresses: [192.168.6.1,192.168.6.2 ]
  • 02-wifi.yaml

network:
  version: 2
  renderer: networkd
  wifis:
    wlan0:
      optional: true
      dhcp4: yes
      dhcp6: no
      macaddress: xx:xx:xx:xx:xx:xx
      access-points:
        "SSID-HOME":
          password: "home-passwd"
        "SSID-OFFICE":
          auth:
            key-management: eap
            identity: "office-id"
            password: "office-passwd"

执行配置生效:

netplan apply

没有报错,但是非常奇怪,重启系统之后,只有有线网络IP配置正确,无线网络始终没有激活。

# ifconfig wlan0
wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# ip addr
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
  • 检查 systemd-networkd 服务状态::

# systemctl status systemd-networkd
● systemd-networkd.service - Network Service
     Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-11-03 21:47:04 CST; 11h ago
TriggeredBy: ● systemd-networkd.socket
       Docs: man:systemd-networkd.service(8)
   Main PID: 1600 (systemd-network)
     Status: "Processing requests..."
      Tasks: 1 (limit: 9257)
     CGroup: /system.slice/systemd-networkd.service
             └─1600 /lib/systemd/systemd-networkd

Nov 03 21:47:04 pi-worker1 systemd[1]: Starting Network Service...
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: Enumeration completed
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: Link DOWN
Nov 03 21:47:04 pi-worker1 systemd[1]: Started Network Service.
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: Link UP
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: IPv6 successfully enabled
Nov 03 21:47:05 pi-worker1 systemd-networkd[1600]: eth0: IPv6 successfully enabled
Nov 03 21:47:05 pi-worker1 systemd-networkd[1600]: eth0: Link UP
Nov 03 21:47:10 pi-worker1 systemd-networkd[1600]: eth0: Gained carrier
Nov 03 21:47:11 pi-worker1 systemd-networkd[1600]: eth0: Gained IPv6LL

这里可以看到 eth0 Gained carrier 但是 waln0 没有链接成功。

  • 检查 networkctl list 输出如下::

IDX LINK  TYPE     OPERATIONAL SETUP      
  1 lo    loopback carrier     unmanaged  
  2 eth0  ether    routable    configured 
  3 wlan0 wlan     no-carrier  configuring
  • 检查 networkctl status -a 输出如下::

● 1: lo                                                         
             Link File: /usr/lib/systemd/network/99-default.link
          Network File: n/a                                     
                  Type: loopback                                
                 State: carrier (unmanaged)        
                   MTU: 65536                                   
  Queue Length (Tx/Rx): 1/1                                     
               Address: 127.0.0.1                               
                        ::1                                     

● 2: eth0                                                                     
             Link File: /usr/lib/systemd/network/99-default.link              
          Network File: /run/systemd/network/10-netplan-eth0.network          
                  Type: ether                                                 
                 State: routable (configured)       
                  Path: platform-fd580000.ethernet                            
                Driver: bcmgenet                                              
            HW Address: dc:a6:32:c5:48:9c (Raspberry Pi Trading Ltd)          
                   MTU: 1500 (min: 68, max: 1500)                             
  Queue Length (Tx/Rx): 5/5                                                   
      Auto negotiation: yes                                                   
                 Speed: 1Gbps                                                 
                Duplex: full                                                  
                  Port: mii                                                   
               Address: 192.168.6.15                                          
                        fe80::dea6:32ff:fec5:489c                             
               Gateway: 192.168.6.9 (Wistron Infocomm (Zhongshan) Corporation)
                   DNS: 30.11.17.1                                            
                        30.17.16.1                                            
                        30.17.16.2                                            

Nov 03 21:47:05 pi-worker1 systemd-networkd[1600]: eth0: IPv6 successfully enabled
Nov 03 21:47:05 pi-worker1 systemd-networkd[1600]: eth0: Link UP
Nov 03 21:47:10 pi-worker1 systemd-networkd[1600]: eth0: Gained carrier
Nov 03 21:47:11 pi-worker1 systemd-networkd[1600]: eth0: Gained IPv6LL

● 3: wlan0                                                                        
             Link File: /run/systemd/network/10-netplan-wlan0.link                
          Network File: /run/systemd/network/10-netplan-wlan0.network             
                  Type: wlan                                                      
                 State: no-carrier (configuring)               
                  Path: platform-fe300000.mmcnr                                   
                Driver: brcmfmac                                                  
            HW Address: xx:xx:xx:xx:xx:xx (LG Electronics (Mobile Communications))
  HW Permanent Address: dc:a6:32:c5:48:9d (Raspberry Pi Trading Ltd)              
                   MTU: 1500 (min: 68, max: 1500)                                 
  Queue Length (Tx/Rx): 1/1                                                       

Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: Link DOWN
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: Link UP
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: IPv6 successfully enabled

可以看到 wlan0 接口状态不正确: State: no-carrier (configuring)

为何这个无线网卡始终处于配置状态呢?

debug

要排查 systemd-networkd 问题,可以开启日志debug模式,添加一个 /etc/systemd/system/systemd-networkd.service.d/override.conf 内容如下::

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

然后执行journalctl 的 -u 参数指定服务单元,并加上 -f 进行tail::

journalctl -u systemd-networkd.service -f

然后执行一次 netplan apply 就可以查看日志:

Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: Bus bus-api-network: changing state UNSET → OPENING
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: Bus bus-api-network: changing state OPENING → AUTHENTICATING
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: timestamp of '/etc/systemd/network' changed
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: timestamp of '/run/systemd/network' changed
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: No virtualization found in DMI
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: No virtualization found in CPUID
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: Virtualization XEN not found, /proc/xen does not exist
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: No virtualization found in /proc/device-tree/*
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: UML virtualization not found in /proc/cpuinfo.
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: This platform does not support /proc/sysinfo
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: Found VM virtualization none
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: /usr/lib/systemd/network/80-container-host0.network: Conditions in the file do not match the system environment, skipping.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: New device has no master, continuing without
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Flags change: +MULTICAST +BROADCAST
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link 3 added
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: udev initialized link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Saved original MTU: 1500
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: New device has no master, continuing without
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Flags change: +UP +LOWER_UP +RUNNING +MULTICAST +BROADCAST
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Link 2 added
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: udev initialized link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Saved original MTU: 1500
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: New device has no master, continuing without
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Flags change: +LOOPBACK +UP +LOWER_UP +RUNNING
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Link 1 added
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: udev initialized link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Saved original MTU: 65536
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering foreign address: fe80::dea6:32ff:fec5:489c/64 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Gained IPv6LL
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering foreign address: ::1/128 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering foreign address: 192.168.6.15/24 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering foreign address: 127.0.0.1/8 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: ff00::/8, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: local, proto: boot, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: fe80::dea6:32ff:fec5:489c/128, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: ::1/128, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: fe80::/64, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: main, proto: kernel, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: ::1/128, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: main, proto: kernel, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: 192.168.6.255/32, src: n/a, gw: n/a, prefsrc: 192.168.6.15, scope: link, table: local, proto: kernel, type: broadcast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: 192.168.6.15/32, src: n/a, gw: n/a, prefsrc: 192.168.6.15, scope: host, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: 192.168.6.0/32, src: n/a, gw: n/a, prefsrc: 192.168.6.15, scope: link, table: local, proto: kernel, type: broadcast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: 127.255.255.255/32, src: n/a, gw: n/a, prefsrc: 127.0.0.1, scope: link, table: local, proto: kernel, type: broadcast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: 127.0.0.1/32, src: n/a, gw: n/a, prefsrc: 127.0.0.1, scope: host, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: 127.0.0.0/8, src: n/a, gw: n/a, prefsrc: 127.0.0.1, scope: host, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: 127.0.0.0/32, src: n/a, gw: n/a, prefsrc: 127.0.0.1, scope: link, table: local, proto: kernel, type: broadcast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: 192.168.6.0/24, src: n/a, gw: n/a, prefsrc: 192.168.6.15, scope: link, table: main, proto: kernel, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: n/a, src: n/a, gw: 192.168.6.9, prefsrc: n/a, scope: global, table: main, proto: static, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received rule message with invalid family 129, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received rule message with invalid family 128, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Enumeration completed
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Bus bus-api-network: changing state AUTHENTICATING → HELLO
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=method_call sender=n/a destination=org.freedesktop.DBus path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=Hello cookie=1 reply_cookie=0 signature=n/a error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=method_call sender=n/a destination=org.freedesktop.DBus path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=RequestName cookie=2 reply_cookie=0 signature=su error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=method_call sender=n/a destination=org.freedesktop.DBus path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=AddMatch cookie=3 reply_cookie=0 signature=s error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=4 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=5 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_31 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=6 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=7 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=8 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=9 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Flags change: +UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=10 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=method_return sender=org.freedesktop.DBus destination=:1.32 path=n/a interface=n/a member=n/a cookie=1 reply_cookie=1 signature=s error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Bus bus-api-network: changing state HELLO → RUNNING
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=signal sender=org.freedesktop.DBus.Local destination=n/a path=/org/freedesktop/DBus/Local interface=org.freedesktop.DBus.Local member=Connected cookie=4294967295 reply_cookie=0 signature=n/a error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=signal sender=org.freedesktop.DBus destination=:1.32 path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=NameAcquired cookie=2 reply_cookie=0 signature=s error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=signal sender=org.freedesktop.DBus destination=:1.32 path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=NameAcquired cookie=3 reply_cookie=0 signature=s error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=method_return sender=org.freedesktop.DBus destination=:1.32 path=n/a interface=n/a member=n/a cookie=4 reply_cookie=2 signature=u error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Successfully acquired requested service name.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=method_return sender=org.freedesktop.DBus destination=:1.32 path=n/a interface=n/a member=n/a cookie=5 reply_cookie=3 signature=n/a error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Match type='signal',sender='org.freedesktop.login1',path='/org/freedesktop/login1',interface='org.freedesktop.login1.Manager',member='PrepareForSleep' successfully installed.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Flags change: -UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=11 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link DOWN
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link state is up-to-date
Nov 05 11:45:09 pi-worker1 systemd[1]: Started Network Service.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: found matching network '/run/systemd/network/10-netplan-wlan0.network'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/wlan0/disable_ipv6' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: IPv6 successfully enabled
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/wlan0/proxy_ndp' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/wlan0/use_tempaddr' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/wlan0/accept_ra' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Setting address genmode for link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Link state is up-to-date
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: found matching network '/run/systemd/network/10-netplan-eth0.network'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/eth0/disable_ipv6' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: IPv6 successfully enabled
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/eth0/proxy_ndp' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/eth0/use_tempaddr' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/eth0/accept_ra' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: LLDP: Started LLDP client
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Started LLDP.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Setting address genmode for link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Link state is up-to-date
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: State changed: pending -> unmanaged
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_31 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=12 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Setting address genmode done.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: State changed: pending -> configuring
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=13 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Bringing link up
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Flags change: +UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=14 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: LLDP: Started LLDP client
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Started LLDP.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Setting address genmode done.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Discovering IPv6 routers
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: NDISC: Started IPv6 Router Solicitation client
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: State changed: pending -> configuring
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=15 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Setting addresses
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering updated address: 192.168.6.15/24 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Addresses set
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Configuring route: dst: n/a, src: n/a, gw: 192.168.6.9, prefsrc: n/a, scope: global, table: main, proto: static, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Setting routes
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Routes set
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: State changed: configuring -> configured
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=16 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:10 pi-worker1 systemd-networkd[5061]: NDISC: Sent Router Solicitation, next solicitation in 4s
Nov 05 11:45:14 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:14 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:14 pi-worker1 systemd-networkd[5061]: NDISC: Sent Router Solicitation, next solicitation in 8s
Nov 05 11:45:21 pi-worker1 systemd-networkd[5061]: NDISC: No RA received before link confirmation timeout
Nov 05 11:45:21 pi-worker1 systemd-networkd[5061]: NDISC: Invoking callback for 'timeout' event.
Nov 05 11:45:23 pi-worker1 systemd-networkd[5061]: NDISC: Sent Router Solicitation, next solicitation in 17s
Nov 05 11:45:40 pi-worker1 systemd-networkd[5061]: NDISC: Sent Router Solicitation, next solicitation in 34s

上述日志中有

Nov 05 11:45:21 pi-worker1 systemd-networkd[5061]: NDISC: No RA received before link confirmation timeout
Nov 05 11:45:21 pi-worker1 systemd-networkd[5061]: NDISC: Invoking callback for 'timeout' event.

不过,我加了这个配置无效

accept-ra: yes

我发现系统日志中有

[Thu Nov  5 11:45:10 2020] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[Thu Nov  5 14:55:12 2020] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[Thu Nov  5 15:30:03 2020] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled

我使用 iwconfig 检查可以看到

wlan0     IEEE 802.11  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on

不过,使用iwlist尝试扫描:

iwlist wlan0 scan

提示错误

wlan0     Interface doesn't support scanning : Device or resource busy

这是什么原因,我对比了另一个正常的树莓派,执行上述 iwlist wlan0 scan 是完全正常的,可以输出所有扫描到的SSID。我使用了 rfkill list 检查,可以看到这个无线网卡并没有被软件或硬件关闭

0: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no

经过尝试,原来是wlan0没有UP导致上述 iwlist scan失败,即使看上去 ifconfig wlan0 显示UP,也可能没有UP起来。所以重新激活一次wlan0

ifconfig wlan0 down
ifconfig wlan0 up

然后就可以执行 iwlist wlan0 scan 命令了。

我后来发现,还是要检查网络连接认证,通过命令

systemctl status netplan-wpa-wlan0.service

检查发现是认证错误

● netplan-wpa-wlan0.service - WPA supplicant for netplan wlan0
     Loaded: loaded (/run/systemd/system/netplan-wpa-wlan0.service; enabled-runtime; vendor preset: enabled)
     Active: active (running) since Thu 2020-11-05 16:17:34 CST; 2min 7s ago
   Main PID: 1932 (wpa_supplicant)
      Tasks: 1 (limit: 9257)
     CGroup: /system.slice/netplan-wpa-wlan0.service
             └─1932 /sbin/wpa_supplicant -c /run/netplan/wpa-wlan0.conf -iwlan0

Nov 05 16:18:51 pi-worker2 wpa_supplicant[1932]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:27 pi-worker2 wpa_supplicant[1849]: wlan0: Trying to associate with SSID 'SSID-OFFICE'
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="SSID-OFFICE" auth_failures=1 duration=23 reason=CONN_FAILED

搜索关键字 wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16 可以看到

network:
  version: 2
  renderer: networkd
  wifis:
    wlan0:
      optional: true
      dhcp4: yes
      dhcp6: no
      macaddress: xx:xx:xx:xx:xx:xx
      access-points:
        "SSID-HOME":
          password: "home-passwd"
        "SSID-OFFICE":
          bssid: "xx:xx:xx:xx:xx:xx"
          auth:
            key-management: eap
            identity: "office-id"
            password: "office-passwd"

这样生成的wpa配置文件中有了BSSID参数。

注意,只有树莓派3B+和4B才支持 5GHz WiFi,所以,如果你使用的是早期产品,例如树莓派Zero W,就无法连接5GHz无线路由器。

wpa_supplicant -B -c /etc/wpa_supplicant/wpa_supplicant.conf -D nl80211 -dd -f /var/log/wpa.log -i wlo1 -t

这种方式可以留下详细的debug日志。

直接使用wpa_supplicant

我准备直接使用wpa_supplicant来连接,所以使用 netplan 生成的配置 /run/netplan/wpa-wlan0.conf

ctrl_interface=/run/wpa_supplicant

network={
  ssid="SSID-OFFICE"
  key_mgmt=WPA-EAP
  eap=PEAP
  identity="office-id"
  password="office-passwd"
  phase1="peaplabel=0"
  phase2="auth=MSCHAPV2"
}
network={
  ssid="SSID-HOME"
  key_mgmt=WPA-PSK
  psk="home-passwd"
}
wpa_supplicant -D wext -c /run/netplan/wpa-wlan0.conf -i wlan0

输出显示

Successfully initialized wpa_supplicant
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
wlan0: Trying to associate with YY:YY:YY:YY:YY:YY (SSID='SSID-OFFICE' freq=5220 MHz)
Failed to add supported operating classes IE
wlan0: Authentication with YY:YY:YY:YY:YY:YY timed out.
wlan0: CTRL-EVENT-DISCONNECTED bssid=YY:YY:YY:YY:YY:YY reason=3 locally_generated=1
ioctl[SIOCSIWSCAN]: Resource temporarily unavailable
wlan0: CTRL-EVENT-SCAN-FAILED ret=-1 retry=1
wlan0: Trying to associate with XX:XX:XX:XX:XX:XX (SSID='SSID-OFFICE' freq=5320 MHz)
Failed to add supported operating classes IE
wlan0: Authentication with XX:XX:XX:XX:XX:XX timed out.
wlan0: CTRL-EVENT-DISCONNECTED bssid=XX:XX:XX:XX:XX:XX reason=3 locally_generated=1
ioctl[SIOCSIWSCAN]: Resource temporarily unavailable
wlan0: CTRL-EVENT-SCAN-FAILED ret=-1 retry=1
ioctl[SIOCSIWSCAN]: Resource temporarily unavailable
wlan0: CTRL-EVENT-SCAN-FAILED ret=-1 retry=1

可以看到实际上wpa_supplicant尝试连接到 SSID-OFFICE ,并且会尝试不同的BSSID(也就是无线路由器的不同mac地址)

等等,为何会有 ioctl 参数错误?

ioctl[SIOCSIWENCODEEXT]: Invalid argument
wpa_supplicant -D nl80211 -c /run/netplan/wpa-wlan0.conf -i wlan0

后来我查了arch linux资料,原来wpa_supplicant有两种驱动,默认是使用 nl80211 ,只有这个驱动无法支持的硬件才需要使用已经停止开发的 wext 驱动。所以,如果强制指定 -D wext 就是会有上述报错,可以忽略。

提示信息

Successfully initialized wpa_supplicant
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16

比较奇怪,我连接的bssid怎么都是 00:00:00:00:00:00 ,但是我按下ctrl-c时候输出信息

nl80211: deinit ifname=p2p-dev-wlan0 disabled_11b_rates=0
p2p-dev-wlan0: CTRL-EVENT-TERMINATING 
wlan0: CTRL-EVENT-DISCONNECTED bssid=80:a2:35:45:83:28 reason=3 locally_generated=1
nl80211: deinit ifname=wlan0 disabled_11b_rates=0
wlan0: CTRL-EVENT-TERMINATING

改为纯手工设置 wpa_supplicant

  • 移除 /etc/netplan/02-wifi.yaml ,然后执行一次 netplan apply 可以看到现在 ifconfig 已经不再包含无线网卡 wlan0

  • 检查rfkill是否block了无线网卡

rfkill list

显示正常

0: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no
  • 检查无线网卡 iwconfig 输出:

wlan0     IEEE 802.11  ESSID:off/any  
          Mode:Managed  Frequency:5.32 GHz  Access Point: Not-Associated   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on

lo        no wireless extensions.

eth0      no wireless extensions.
  • 使用 ifconfig 命令启用无线网卡

sudo ifconfig wlan0 up
  • 扫描周边无线网络

iwlist wlan0 scan | grep ESSID

我找到archlinux的wiki文档,指出有些硬件不支持驱动会有类似错误。例如,我前面看到

wlan0: Authentication with XX:XX:XX:XX:XX:XX timed out.

文档说明:

On some (especially old) hardware, wpa_supplicant may fail with the following error:

Successfully initialized wpa_supplicant
nl80211: Driver does not support authentication/association or connect commands
wlan0: Failed to initialize driver interface

This indicates that the standard nl80211 driver does not support the given hardware. The deprecated wext driver might still support the device:

(判断错误)我怀疑我复制树莓派firmware文件覆盖ubuntu的firmware来支持USB移动硬盘启动破坏了firmware加载。但是我测试了从正常的树莓派主机上(没有使用USB存储)复制.dat和.elf文件到异常服务器上,重启系统无线依然无法工作。

脚本启动

  • 配置文件 /etc/wpa_supplicant/wpa_supplicant-office.conf:

ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
  ssid="SSID-OFFICE"
  key_mgmt=WPA-EAP
  eap=PEAP
  phase1="peaplabel=0"
  phase2="auth=MSCHAPV2"
  identity="user_name"
  password="user_password"
}
  • 执行脚本 start_wifi:

sudo ifconfig wlan0 down
sleep 1
sudo ifconfig wlan0 up
sudo wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-office.conf -i wlan0 &
sleep 5
sudo dhcpcd wlan0

在异常的树莓派主机上执行上述脚本,显示信息

Successfully initialized wpa_supplicant
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
wlan0: Trying to associate with SSID 'SSID-OFFICE'

我对比了一台正常的ThinckPad笔记本脚本执行启动脚本,显示信息则

Successfully initialized wpa_supplicant
wlp3s0: SME: Trying to authenticate with xx:yy:zz:aa:bb:cc (SSID='SSID-OFFICE' freq=5280 MHz)
wlp3s0: Trying to associate with xx:yy:zz:aa:bb:cc (SSID='SSID-OFFICE' freq=5280 MHz)
wlp3s0: Associated with xx:yy:zz:aa:bb:cc
wlp3s0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
wlp3s0: CTRL-EVENT-EAP-STARTED EAP authentication started
wlp3s0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=13 -> NAK
wlp3s0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=25
wlp3s0: CTRL-EVENT-EAP-METHOD EAP vendor 0 method 25 (PEAP) selected
wlp3s0: CTRL-EVENT-EAP-PEER-CERT depth=1 subject='......' hash=......
wlp3s0: CTRL-EVENT-EAP-PEER-CERT depth=0 subject='......' hash=......
wlp3s0: CTRL-EVENT-EAP-PEER-ALT depth=0 EMAIL:XXXXX Radius
EAP-MSCHAPV2: Authentication succeeded
EAP-TLV: TLV Result - Success - EAP-TLV/Phase2 Completed
wlp3s0: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
wlp3s0: PMKSA-CACHE-ADDED xx:yy:zz:aa:bb:cc 0
wlp3s0: WPA: Key negotiation completed with xx:yy:zz:aa:bb:cc [PTK=CCMP GTK=CCMP]
wlp3s0: CTRL-EVENT-CONNECTED - Connection to xx:yy:zz:aa:bb:cc completed [id=0 id_str=]

这里我观察到出现比较奇怪的是,树莓派运行的wpa_supplicant尝试连接到 'SSID-OFFICE' 现实的 bssid 是 00:00:00:00:00:00 ,这明显不是正常的无线AP的MAC地址,正常应该连接的是 xx:yy:zz:aa:bb:cc

have found the root cause -- and surprisingly it's wifi-HDMI interference of RPI4.

Though I have known about this issue, I believed it's not my case, because:

  • I was able to connect to another wifi (mobile hotspot)

  • my resolution was only 1920x1080

When I lowered screen resolution to 1600x1200, wifi started to work with both of my networks.

上述Intel手册需要仔细阅读一下,似乎USB 3.0影响无线接收器的性能(如果靠得很近的话),我觉得这个问题确实是硬件设计问题,包括前面提到的HDMI解析度,或许就是频率影响

hdmi_group=2
hdmi_mode=51

似乎有一个安全模式:

hdmi_safe=1

安全模式相当于启动时最大的HDMI兼容:

hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
config_hdmi_boost=4
hdmi_group=2
hdmi_mode=4
disable_overscan=0
overscan_left=24
overscan_right=24
overscan_top=24
overscan_bottom=24

但是我设置了 hdmi_mode=51 或者 hdmi_safe=1 都没有解决这个问题

尝试raspbian

我尝试通过TF卡启动到raspbian系统中,使用同样的启动脚本来启动,发现还是出现相同的报错信息。并且这次我是没有外接USB设备,仅仅使用TF卡。我要不要在raspbian中也使用 hdmi_safe=1 呢?

实际测试下来还是失败,看来这个问题和直接外接SSD存储没有关系,但是确实和树莓派系统更新有关。

可能找到解决方法了

我在树莓派4上通过Raspberry OS官方系统启动,只使用TF卡不使用外接SSD移动硬盘,排除了USB3.0影响因素,所以导致问题的原因应该是wpa_supplicant配置问题。

由于我发现执行 sudo wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-office.conf -i wlan0 命令提示信息显示 wpa_suuplicant 尝试连接MAC地址 bssid=00:00:00:00:00:00 ,这明显是错误的不存在MAC,所以我尝试在 wpa_supplicant-office.conf 配置中添加指定 bssid 参数,类似如下

...
  ssid="SSID-OFFICE"
  bssid=xx:yy:zz:aa:bb:cc
...

但是发现此时报错

Successfully initialized wpa_supplicant
wlan0: Failed to initiate sched scan
wlan0: Failed to initiate sched scan
...

经过多次对比参数,我发现原来不能同时指定 ssid= 和 bssid= ,同时设置上述两个参数就会导致无法发起iwlist scan。所以,把上述 ssid="SSID-OFFICE" 注释掉就能够正常运行。

我测试了如果不指定这个 country=US ,就会导致wpa_supplicant启动时候显示 wlan0: Failed to initiate sched scan ,使用了这个参数就能正常发起扫描。看起来,应该是某次升级过 wpa_supplicant 版本导致默认的country失效了,就会去连接 00:00:00:00:00:00 ,但是如果你强制同时指定 ssid 和 bssid ,也会导致 wlan0: Failed to initiate sched scan 。

  • gb (United Kingdom)

  • fr (France)

  • de (Germany)

  • us (United States)

  • se (Sweden)

经过验证,指定 bssid= 参数可以正常启动wpa_supplicant客户端,然后完成连接认证。存在的问题是,会反复出现EAP认证,显示认证成功,然后又断开重新认证成功。不过,反复多次以后,终于不再断开,也就完成认证,稳定连接,最终就能够完成无线认证并通过dhcpcd获得IP地址。

总之,最终的 wpa_supplicant-office.conf 如下:

ctrl_interface=/var/run/wpa_supplicant
#update_config=1
#ap_scan=1
country=US
network={
#  ssid="alibaba-inc"
  bssid=xx:yy:zz:aa:bb:cc
  key_mgmt=WPA-EAP
  eap=PEAP
  phase1="peaplabel=0"
  phase2="auth=MSCHAPV2"
  identity="user_name"
  password="user_password"
}

折腾了好几天,终于能够完成无线连接。

不过,我在设置netplan中没有找到设置 country 的参数,例如配置 02-wifi.yaml 配置

network:
  version: 2
  renderer: networkd
  wifis:
    wlan0:
      optional: true
      dhcp4: yes
      dhcp6: no
      accept-ra: yes
      macaddress: 11:22:33:zz:yy:xx
      access-points:
        "SSID-HOME":
          password: "user_password"
        "":
          bssid: xx:yy:zz:aa:bb:cc
          band: 5GHz
          channel: 149
          auth:
            key-management: eap
            method: peap
            phase2-auth: MSCHAPV2
            identity: "user_name"
            password: "user_password"

但是 netplan apply 生成的配置 /run/netplan/wpa-wlan0.conf 内容并没有country参数

ctrl_interface=/run/wpa_supplicant

network={
  ssid=""
  bssid=xx:yy:zz:aa:bb:cc
  key_mgmt=WPA-EAP
  eap=PEAP
  identity="user_name"
  password="user_password"
  phase2="auth=MSCHAPV2"
}

journalctl -u netplan-wpa-wlan0.service 还是看到如下报错

Nov 13 15:56:48 pi-worker2 wpa_supplicant[2520]: Successfully initialized wpa_supplicant
Nov 13 15:57:05 pi-worker2 wpa_supplicant[2520]: wlan0: Failed to initiate sched scan
Nov 13 15:57:12 pi-worker2 wpa_supplicant[2520]: wlan0: Failed to initiate sched scan
...
sudo apt update
sudo apt install network-manager wireless-tools
sudo iw reg set CN

然后就能够正常连接。

要持久化上述country配置,修改 /etc/default/crda 配置,将默认的

REGDOMAIN=

修改成

REGDOMAIN=CN

然后重启就可以看到5GHz的WiFi正常工作了。

OMG 这真是一个折磨人的故障问题,我估计我断断续续花了一周时间才解决这个问题。

参考

Previoussystemd-resolvd本地网络域名解析服务NextNetwork

Last updated 4 years ago

Was this helpful?

提到了通过禁止DHCPv6但是设置 IPv6AcceptRA=true 来解决这个报错。看起来在办公网络DHCP并没有提供RA,参考

参考 提到 accept-ra (bool) 意思是接受路由器公告(Accept Router Advertisement)是内核配置IPv6。当激活是接受路由器公告,禁用是就不响应路由器公告。

我发现有实际上办公室有多个Access Point使用了相同的SSID,根据 是可以指定AP的MAC地址的,也就是设置bssid参数,则在 02-wifi.yaml 添加

提供了一个非常好的debug方式:

我尝试采用 的建议方法

提到上述报错是正常的。不过,我参考 ,看起来是 -D 参数导致的,如果使用 -D nl80211 就不再报 ioctl[SIOCSIWENCODEEXT]: Invalid argument 错误

在 找到了相同的案例,提示信息是:

在 提到了和我相同的困扰,也是树莓派4,重启后随机会连接不了wifi。

在 提到了用户发现将任何设备插入到某个USB3接口上,就会导致无线无法连接2.4GHz Wifi网络,但是5.0 GHz无线网络工作正常。

似乎这个问题和USB3的HDMI解析问题有关 ,据说这是一个已知的问题 。

在这个帖子中,GithubUser5462用户说明的问题和我一样,也是在USB 3接口上连接外接移动硬盘(他使用的是My Passport WD 2TB外接HDD,而我使用的是My Passprot WD 1TB外接SSD)。另外在 有所讨论。

在树莓派论坛已经讨论了这个问题

我参考前面有人说的修改HDMI分辨率,参考 在 /boot/firmware/config.txt 中添加2行:

另外,还有一个非常奇特的参数必须在wpa_supplicant.conf中指定,就是 country=US ,这个参数是表明无线使用的国家,因为每个国家的2,4GHz使用了不同的通道 (参考 ) 。有可能你需要根据你的路由器来设置这个参数(或者可以在配置中指定channel?)

提供了country解释:

The Country Code should be set the for the country in which you are using your Pi. Common codes include :

不过,既然已经知道是 country 导致的问题,我进一步搜索找到了 ,关键点就是country code,因为5GHz是一个受控频率,需要根据不同国家进行调整country code,否则无法连接。临时的解决方法就是使用 wireless-tools 工具设置:

eth network stuck at routable (configuring)#8686
Networkd DHCPv6 client do not start if no RA #13770
netplan reference
How can I connect to a specific BSSID?
wpa_supplicant: Failed to initiate AP scan
wpa_supplicant not connecting
Raspberry Pi Wireless Network Setup
[SOLVED] wpa_supplicant ioctl[SIOCSIWENCODEEXT]
RPI4 cannot connect to WIFI - status_code=16
CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
USB3 and 2.4 GHz Wifi #1430
USB 3.0* Radio Frequency Interference on 2.4 GHz Devices
Pi4, USB3, and Wireless 2.4Ghz interference
Problems adding a USB 3.0 SSD to PI4
Video options in config.txt
List_of_WLAN_channels
Raspbian - wpa_supplicant.conf Country meaning
Setup WiFi on a Pi Manually using wpa_supplicant.conf
ISO/IEC alpha2 code
Help: Unable to connect to 5G Wifi on raspberry pi 4 using ubuntu server 18.04
eth network stuck at routable (configuring) #8686
networkctl – Query the Status of Network Links in Linux
systemd-networkd