無標題文檔

Clear Linux 下 KVM 硬件直通配置

前言

Clear Linux 是针对 Intel 平台的滚动 Linux 发行版。它有很多优势,我个人目前主要用来针对老机型(四代酷睿平台)的裸机运行派台,并主要用来跑虚拟机。

由于 Clear Linux 是过于强调精简的发行版,因此配置方面需要额外的精力,所在这里针对 KVM 虚拟机的配置做个记录。

BIOS 配置

针对硬件直通这块,首先需要 CPU 的支持,四代平台支持 VT-D 功能的不多,主要集中在 i5、i7 的 CPU。个人购买过四代 i3 的 CPU 发现并不支持硬件直通,所以又退款换货非常的折腾。

了解了支持的 CPU 以后,然后在 BIOS 中对应的开启虚拟化以及 VT-D,这里就不表。

内核配置

和其他的发行版不同,Clear Linux 的引导器是 Intel 自己研发的 clr-boot-manager。内核的参数文件具体的文件路径在 /etc/kernel/cmdline.d/ 这个目录中,然后对应的示例文件 iommu.conf:

intel_iommu=on iommu=pt vfio_iommu_type1.allow_unsafe_interrupts=1 vfio-pci.ids=<id>,<id>

这个 ID 是 PCI ID,对应的可以使用 lspci -nn 获得,例如列出网卡的 PCI ID:

$ lspci -nn | grep -i Ether
00:19.0 Ethernet controller [0200]: Intel Corporation Ethernet Connection I217-V [8086:153b] (rev 04)
02:00.0 Ethernet controller [0200]: Intel Corporation I210 Gigabit Network Connection [8086:1533] (rev 03)

同时,需要注意的是 IOMMU Group 分组是否在一个组中(这个可能需要 PCI 设备的支持),可以使用以下简单的 Shell 脚本查看(来自 Arch 的 Wiki):

#!/bin/bash
shopt -s nullglob
for g in `find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V`; do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;

然后,使用 clr-boot-manager update 生成启动配置,然后 reboot 重启后查看 cat /proc/cmdline 内核引导参数是否已经生效。

Qemu 配置

查看 Qemu 下 PCI 的设备列表,例如

$  virsh nodedev-list | grep pci
pci_0000_00_00_0
pci_0000_00_02_0
pci_0000_00_03_0
pci_0000_00_14_0
pci_0000_00_16_0
pci_0000_00_19_0
pci_0000_00_1a_0
pci_0000_00_1c_0
pci_0000_00_1c_3
pci_0000_00_1d_0
pci_0000_00_1f_0
pci_0000_00_1f_2
pci_0000_00_1f_3
pci_0000_02_00_0

那么根据对并上面

$ lspci -nn | grep -i Ether
00:19.0 Ethernet controller [0200]: Intel Corporation Ethernet Connection I217-V [8086:153b] (rev 04)
02:00.0 Ethernet controller [0200]: Intel Corporation I210 Gigabit Network Connection [8086:1533] (rev 03)

两块网卡的 ID 分别为 pci_0000_00_19_0 和 pci_0000_02_00_0 ,然后我们 dump 出配置来

$ virsh nodedev-dumpxml pci_0000_00_19_0
<device>
  <name>pci_0000_00_19_0</name>
  <path>/sys/devices/pci0000:00/0000:00:19.0</path>
  <parent>computer</parent>
  <driver>
    <name>vfio-pci</name>
  </driver>
  <capability type='pci'>
    <class>0x020000</class>
    <domain>0</domain>
    <bus>0</bus>
    <slot>25</slot>
    <function>0</function>
    <product id='0x153b'>Ethernet Connection I217-V</product>
    <vendor id='0x8086'>Intel Corporation</vendor>
    <iommuGroup number='4'>
      <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
    </iommuGroup>
  </capability>
</device>

例如以上就可以 dump 出具体 PCI 信息的来,可以比较直观的看到 product id 以及生产商 vendor id 等信息。这里需要的几个参数分别是 domainbusslot、以及 function

我们分别记录下来,然后填写到以下的 xml 片段中,例如上面对应的数值就是

<hostdev mode='subsystem' type='pci' managed='yes'>
  <driver name='vfio'/>
  <source>
    <address domain='0' bus='0' slot='25' function='0'/>
  </source>
</hostdev>

可以直接使用十进制数值,因为 virsh edit 在编辑保存的时候会自动计算其原始的十六进制数值。

验证

使用 virsh edit 编辑对应的虚拟机配置,例如 virsh edit <my-machine> 。在编辑器中将上述 的 xml 粘贴入 devices 这个 xml 块中,保存关机然后在启动虚拟机即可生效。

在启动虚拟机以后,例如上述的网卡直通可以使用 ip a 等命令查看虚拟机有无识别到对应的物理网卡。如果一切顺利,那么就可以使用对应的网络配置程序来配置对应网卡的网络信息,这里不在复述。

常见问题

  1. 查看 IOMMU Group 中的设备是否分别在不同的组中,如果多个设备在同个组中,则需要额外的操作(参见 Arch Wiki 的内容);
  2. 如果物理机设备被直通出去,那么就无法使用该设备以及设备树下的子设备。例如,如果直通 USB 控制器给虚拟机,那么这个控制器下的键盘、鼠标都只能在虚拟机下使用;
  3. 直通的内核模块应该优先于其对应的物理设备驱动,否则会造成冲突造成无法直通,因此可以考虑搭配内核 blacklist 使用。

最后,如果服务器是 Intel 平台的,强烈建议尝试下 Clear Linux 你会爱上它的!

参考信息

正确配置 WSL2 的宿主机文件权限

在 Windows 平台通过 Docker Desktop 部署 Syncthing 的时候发现文件全部被重新同步了,究其原因是因为 Windows 下的文件系统权限 meta 信息没有带过来。

Docker Desktop 支持在 WSL2 下运行 Docker,也就是说可以使用以前同样的配置去解决 WSL 的宿主机(也就是 Windows 系统)的文件权限问题。

找个 PowerShell 打开 docker-deskop 的 WSL2 虚拟机终端

wsl -d docker-desktop

然后找到文件 /etc/wsl.conf ,建议保险起见先备份原有的配置。增加或修改对应的配置如下:

[automount]
enabled = true
root = /mnt/host
options = "metadata,umask=22,fmask=111"
mountFsTab = true

[filesystem]
umask = 022

然后重启 Docker Desktop 就可以了。PS,有其他 WSL2 访问宿主机碰到类似文件的权限问题也可以这样子处理。

- eof -

FreeBSD 下更新 PowerEdge H700 阵列卡的固件

经过一段时间的使用以后,NAS 的情况基本的稳定,同时将系统迁移到了 FreeBSD(主要是为了使用 ZFS)。不得不说,FreeBSD 下对于硬件阵列卡的支持是非常棒的,例如 PowerEdge H700 就有原生工具 mfiutil 支持再也可以不用那逆天的 MegaCli 命令行了

Screen Shots

偶然看到 PowerEdge H700 的固件持续更新到了 2015 年,而我查看了下目前的固件版本是 2012 年的。更新的固件主要修复了很多问题,应该说是比较稳定的了,于是考虑升级下(反正闲着也是闲着)。

看了下 mfiutil 的文档是支持 flash 固件的,但是官方提供的 BIN 包是针对 Linux 的。查找了下解决方案,发现有个类似的可以参考。主要步骤是先解压缩官方 BIN 包:

[root@centos ~]# ./SAS-RAID_Firmware_9FVJ2_LN_12.10.7-0001_A13.BIN --extract /tmp/
[root@centos ~]# ll /tmp/payload/FW4651I.rom

然后提取到 .rom 这个文件,例如,我这边的 ROM 文件名是 FW4651A.rom 。然后将这个文件扔到 FreeBSD 下,用 root 身份进行更新:

mfiutil flash FW4651A.rom

更新的过程比较顺利,内核会有相应的硬件更新提示信息,建议在执行完毕以后 reboot 下机器。

Screen Shots

然后,再次查看固件版本,就可以发现已经升级到最新了。最后,提供下这个版本的 ROM 文件(谨慎使用)

- eof -

分享下自己的家庭网络拓扑和结构

上次对于树莓派搭建的家庭网络可能说了个大概,其实根据每个家庭的需求不同,网络的拓扑其实也会有些调整。下面从应用的切面角度分享下目前家庭的网络拓扑情况,这个是个大概的图:

Network

旁路由

家里的路由器性能其实不差,但考虑其实很多的工作(网关、代理、端口转发、等等)如果在路由器上处理,往往路由器的性能会打个折扣,同时也会影响稳定性。

同时,其实路由器上配置多了以后,对于以后更换路由器重新配置也是件比较麻烦的事情。所以,我使用了树莓派分担了部分路由器的任务,主要是些网络寻址以及服务发现等相关的服务,例如 DNS、DHCP 以及防火墙等。

DNS 这块主要使用 DNSMasq,做了很多使用这个应用应该做的事情,例如「境外网络加速」、对接 Consul 作为内部的无痛服务发现、网络内容过滤(去广告)等功能,同时为了加块解析速度本地加大了缓存。

后面考虑由于 斐讯 N1 综合性价比比树莓派高出很多,因此会考虑这部份的服务将往 N1 的硬件上迁移。同时,树莓派打算用来做 4G 的网关,搭配 UPS 这样子家庭网络就不会断网了。

监控

监控使用了 Prometheus 以及 Grafana 同时独立管理,具体的可以参看这里

应用层

应用层主要使用了虚拟机,系统方面主要是 CentOS 以及 Manjaro 以及 Debian 还有几台 FreeBSD。主要应用场景分别是用来做 CI、以及数据抓取(爬虫)以及其他些比较费时的操作。

虚拟机的寻址主要使用 Consul 搭配 DNSMasq 完成,写个 go 小程序用来注册以及健康检查。其中台虚拟机还对接了统一的通知服务,例如收发邮件以及短信。

数据层

数据层相对比较简单,使用了两台物理机:分别是台联想的 i7 四代小主机、16g 的内存(性能不差因此拿来开虚拟机用);以及还有台相对比较弱的奔腾机接了 Raid1 阵列柜,专门用来做数据存储和同步。后面会考虑使用黑群晖,将这部份硬件的可靠性强化下。

物理机

以上

在 Xorg 中配置苹果的蓝牙键盘

目前同时有台 MacBook Pro 以及 Thinkpad X1,所以想同时使用苹果的蓝牙键盘链接,碰到了键位映射的问题,所以记录下。这次折腾的主要原因是 Thinkpad 的左下角功能键的键位和苹果键盘是不一致,如图:

Apple Keyboard

最主要是对比 Thinkpad 的 Win(Meta) 键和 Alt 和苹果蓝牙键盘的 Apple 和 Alt 是相反的,如果同时使用会有转换的过程,因此需要转换下键位。

硬件方面链接蓝牙的过程就不复述了,Arch Wiki 中有很详细的说明。我使用的是 bluetoothctl 连接硬件,同时使用 BlueMan 作为 GUI 的前端。同时将 BlueMan 加入到 i3wm 的启动脚本中,能够做到自动链接,方便。

键盘链接成功以后,使用 xinput list 查看对应的 device id:

$ xinput list 
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ Synaptics TM3072-003                        id=11    [slave  pointer  (2)]
⎜   ↳ Logitech M570                               id=14    [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                       id=12    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=9    [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                      id=10    [slave  keyboard (3)]
    ↳ Integrated Camera: Integrated C             id=13    [slave  keyboard (3)]
    ↳ Apple Inc. Magic Keyboard                   id=15    [slave  keyboard (3)]

其中,能够看到苹果的蓝牙键盘的 device id 是 15,需要暂时记下这个值。然后使用

$ setxkbmap -option altwin:swap_alt_win -device $DEVICE_ID

就可以测试 Win 键和 Alt 键是否对调成功。顺便说一句,对应的还有个命令可以将 Caps Lock 利用起来:

$ setxkbmap -option ctrl:nocaps -device $DEVICE_ID

这样子 Caps Lock 就映射到 Ctrl 键了。具体更多的设置可以在这里 查看(我是 Arch Wiki 的搬运工 😄)。

这样子还有点不方便的地方,就是每次链接蓝牙键盘的时候都要跑下这个命令,于是还是考虑到使用 udev 脚本去自动化。下面是我的 udev 脚本,可以供参考:

ACTION=="bind", SUBSYSTEM=="hid*", DRIVER=="*apple*", RUN+="/usr/bin/sudo -i -u <user> /<path>/key-mapping.sh"

然后还需要考虑到插入 USB 键盘的情况,这再多加一条规则:

ACTION=="bind", SUBSYSTEM=="usb", ENV{ID_VENDOR}=="Apple*", RUN+="/usr/bin/sudo -i -u <user>  /<path>/key-mapping.sh"

其中,key-mapping.sh 是复制下上面命令的脚本。

然后,将这个命令保存到个 rules 文件中,例如我的文件命名是 90-bluetooth-keyboard-mapping.rules 然后放到 /etc/udev/rules.d

最后,重启 udev 规则 sudo udevadm control -R 即可。

- eof -

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章