Linux 驱动蓝牙

Linux 驱动蓝牙

搞了台新设备,设备带一个AX200网卡,又有Wi-Fi又有蓝牙,Wi-Fi直接免驱,蓝牙却无法驱动,经过研究搞定了这个事情,记录下。

安装驱动

  • 检查蓝牙服务
1
2
3
service bluetooth status
# 如果显示 masked 就输入下面的命令
systemctl unmask bluetooth.service
  1. 安装蓝牙控制套件
1
apt install bluez -y
  1. 获取蓝牙设备
1
2
bluetoothctl show
# 如果显示 No default controller available 则表示没有驱动起来
  1. 安装缺少的驱动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 查看蓝牙情况
dmesg | grep blue
# 我这里显示
# bluetooth hci0: Direct firmware load for intel/ibt-20-1-3.sfi failed with error -2
# 表示缺少 ibt-20-1-3.sfi 驱动文件

# 进入驱动文件夹
cd /lib/firmware/intel
# 下载缺失的驱动,如果你缺少的是别的驱动,则替换掉文件名即可
wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/intel/ibt-20-1-3.sfi
# 下载完毕后重启设备
reboot now
# 再次查看蓝牙设备
bluetoothctl show
# 此时应该已经有内容了
# root@vm:~# bluetoothctl show
# Controller **:**:**:**:**:** (public)
# Name: vm
# Alias: vm
# Class: 0x00000104
# Powered: yes
# Discoverable: no
# Pairable: yes
# UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
# UUID: A/V Remote Control (0000110e-0000-1000-8000-00805f9b34fb)
# UUID: PnP Information (00001200-0000-1000-8000-00805f9b34fb)
# UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
# UUID: Generic Access Profile (00001800-0000-1000-8000-00805f9b34fb)
# Modalias: usb:v1D6Bp0246d0532
# Discovering: no

设备控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 进入蓝牙控制 如果进入了,应该是这样的 [bluetooth]# 
bluetoothctl

# 开启扫描 屏幕上会出现一堆设备的 MAC 地址
scan on
# Discovery started
# [CHG] Controller E0:D4:E8:94:07:86 Discovering: yes
# [NEW] Device 54:21:C3:BC:77:1A 54-21-C3-BC-77-19
# [NEW] Device E9:33:F9:B9:6B:AF MX Keys
# [NEW] Device 48:AB:38:E9:67:89 48-AB-38-E9-67-84
# [NEW] Device F4:5C:89:AB:57:61 F4-5C-89-AB-57-66

# 关闭扫描
scan off

# 连接指定设备,屏幕上会出现不少内容,主要看
# 出现 Connection successful 则连接成功
connect E9:33:F9:B9:6B:AF

# 在蓝牙控制中 如果链接了蓝牙设备,或者断开了蓝牙设备都会有提示

# 有设备链接
# [CHG] Device E9:33:F9:B9:6B:AF Connected: yes
# [CHG] Device E9:33:F9:B9:6B:AF ServicesResolved: yes

# 有设备断开
# [CHG] Device E9:33:F9:B9:6B:DE ServicesResolved: no
# [CHG] Device E9:33:F9:B9:6B:DE Connected: no

PVE 硬盘相关

PVE 硬盘相关

休眠

PVE 硬盘不休眠的原因基本都是由于pvestatd一直在读取硬盘信息,导致不会休眠

所以问题就比较简单了

第一种方法 (比较粗暴,不推荐)

1
pvestatd stop

第二种方法

修改/etc/lvm/lvm.conf文件,开启 lvm 的 metadata 的缓存

1
2
3
4
# 开启
sed -i 's/use_lvmetad = 0/use_lvmetad = 1/g' /etc/lvm/lvm.conf
# 重启
pvestatd restart

如果开启的话,就会缓存 lvm 的信息,就不需要再读取硬盘获取了

第三种方法

修改/etc/lvm/lvm.conf文件,过滤不需要监控的盘

1
2
3
4
# 添加 "r|/dev/sd*|" 到 global_filter
global_filter = [ "r|/dev/zd.*|", "r|/dev/mapper/pve-.*|", "r|/dev/sd*|" ]
# 重启
pvestatd restart

通过以上方式允许硬盘休眠后,可以让硬盘立即休眠来测试下是否还会被唤醒

1
2
3
4
# 立即休眠
hdparm -y /dev/sdc
# 设置硬盘休眠时间为 5 分钟
hdparm -S 60 /dev/sdc

这里-S取值设定逻辑比较奇怪,本文列出部分常见取值供选:

30 = 2 min 30 sec

60 = 5 minutes

120 = 10 minutes

180 = 15 minutes

241 = 30 minutes

242 = 1 hour

243 = 1.5 hours

244 = 2 hours

持久化保存 休眠时间

不要添加到各种开机启动的脚本、crontab 中

编辑/etc/hdparm.conf就可以做到持久化保存休眠配置

第一种

在 command_line 处

1
2
3
command_line {
hdparm -S 60 /dev/disk/by-uuid/f6c52265-d89f-43a4-b03b-302c3dadb215
}

第二种

在 特定硬盘处

1
2
3
4
# 这里也可以改为 sdc 或者 /dev/disk/by-label/8TB,但是 UUID 最稳定
/dev/disk/by-uuid/91e32677-0656-45b8-bcf5-14acce39d9c2 {
spindown_time = 60
}

挂载硬盘 给 lxc

首先需要注意的是,创建 LXC 容器需要在创建时开启了特权模式,否则只能读取但无法写入数据。

假设 lxc id 是 202

使用 sd* 挂载设备 (不推荐)

1
2
3
4
5
6
# 停止
pct stop 202
# 挂载 sdc 到 /data
pct set 202 -mp0 /dev/sdc,mp=/data
# 开机
pct start 202

使用 UUID 挂载设备(推荐)

因为 /dev/sdb /dev/sdc 这种形式可能会随着插拔设备之类的发生变动,或改变顺序,而 UUID 则不会改变

1
2
3
4
5
6
7
8
# 停止
pct stop 202
# 获取设备 UUID
blkid /dev/sdc
# 挂载 sdc 到 /data
pct set 202 -mp0 /dev/disk/by-uuid/312e15c4-c8e8-4465-8099-2f1cf007fe92,mp=/data
# 开机
pct start 202

使用 overture DNS

使用 overture DNS

  1. 下载 overture 并解压

    https://github.com/shawn1m/overture/releases/ 下载并解压

  2. 编辑配置文件 config.json ,如果使用下面的配置记得删掉所有注释

    下载 gfwlist 和 china_ip_list

    1
    2
    wget https://cokebar.github.io/gfwlist2dnsmasq/gfwlist_domain.txt -O gfwlist_domain.txt
    wget https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt -O china_ip_list.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    {
    "BindAddress": ":53", // 绑定的端口
    "DebugHTTPAddress": "127.0.0.1:5555", // 可以通过 curl 127.0.0.1:5555/cache 查看缓存情况
    "PrimaryDNS": [ // 主DNS
    {
    "Name": "DNSPod",
    "Address": "119.29.29.29:53",
    "Protocol": "udp",
    "SOCKS5Address": "",
    "Timeout": 2,
    "EDNSClientSubnet": {
    "Policy": "disable",
    "ExternalIP": "",
    "NoCookie": true
    }
    },
    {
    "Name": "AliDNS",
    "Address": "223.5.5.5:53",
    "Protocol": "udp",
    "SOCKS5Address": "",
    "Timeout": 2,
    "EDNSClientSubnet": {
    "Policy": "disable",
    "ExternalIP": "",
    "NoCookie": true
    }
    }
    ],
    "AlternativeDNS": [ // 副 DNS
    {
    "Name": "OpenDNS",
    "Address": "208.67.222.222:443",
    "Protocol": "tcp",
    "SOCKS5Address": "",
    "Timeout": 4,
    "EDNSClientSubnet": {
    "Policy": "disable",
    "ExternalIP": "",
    "NoCookie": true
    }
    },
    {
    "Name": "CloudFlareDNS",
    "Address": "one.one.one.one:853@1.1.1.1",
    "Protocol": "tcp-tls",
    "SOCKS5Address": "",
    "Timeout": 4,
    "EDNSClientSubnet": {
    "Policy": "disable",
    "ExternalIP": "",
    "NoCookie": true
    }
    },
    {
    "Name": "GeekDNS",
    "Address": "ndns.233py.com:853",
    "Protocol": "tcp-tls",
    "SOCKS5Address": "",
    "Timeout": 2,
    "EDNSClientSubnet": {
    "Policy": "disable",
    "ExternalIP": "",
    "NoCookie": true
    }
    },
    {
    "Name": "RubyFish",
    "Address": "dns.rubyfish.cn:853",
    "Protocol": "tcp-tls",
    "SOCKS5Address": "",
    "Timeout": 2,
    "EDNSClientSubnet": {
    "Policy": "disable",
    "ExternalIP": "",
    "NoCookie": true
    }
    },
    {
    "Name": "BlahDNS",
    "Address": "dot-jp.blahdns.com:853",
    "Protocol": "tcp-tls",
    "SOCKS5Address": "",
    "Timeout": 2,
    "EDNSClientSubnet": {
    "Policy": "disable",
    "ExternalIP": "",
    "NoCookie": true
    }
    }
    ],
    "OnlyPrimaryDNS": false, // 是否仅使用 主DNS
    "IPv6UseAlternativeDNS": false, // IPv6 使用副 DNS
    "WhenPrimaryDNSAnswerNoneUse": "PrimaryDNS",
    "IPNetworkFile": {
    "Primary": "./china_ip_list.txt",
    "Alternative": ""
    },
    "DomainFile": {
    "Primary": "", // 强制使用主dns解析的域名列表
    "Alternative": "./gfwlist_domain.txt", // 强制使用副dns解析的列表
    "Matcher": "regex-list" // 使用 正则匹配
    },
    "HostsFile": "./hosts", // 自定义 hosts 绑定
    "MinimumTTL": 1200, // 最小缓存存留时间,0 关闭
    "DomainTTLFile": "./domain_ttl_sample", // 域名缓存时间列表
    "CacheSize": 1024, // 缓存大小,0关闭,建议开启
    "RejectQType": [
    255
    ]
    }
  3. 加执行权限

    1
    chmod +x /etc/overture-dns/overture-linux-amd64
  1. 执行

    1
    ./overture-linux-amd64

如何在 Ubuntu 18.04 中修改 DNS

如何在 Ubuntu 18.04 中修改 DNS

  1. 先安装 resolvconf

    1
    sudo apt install resolvconf
  2. 然后编辑配置文件

    编辑/etc/resolvconf/resolv.conf.d/head修改nameserver配置项,内容类似:

    1
    2
    nameserver 8.8.4.4
    nameserver 8.8.8.8
  3. 重启 reslovconf

    1
    sudo service resolvconf restart

设置 sudo 命令不需要密码

设置 sudo 命令不需要密码

1
2
3
4
5
6
# 编辑 sudo 命令权限文件
sudo visudo
# 在最后一行增加
# 要免密码的用户名 ALL=(ALL) NOPASSWD: ALL
# 例如
zhangsan ALL=(ALL) NOPASSWD: ALL