OPENWRT编译之NUC6

环境配置说明

  • 适用硬件:Intel NUC(NUC6CAYH) 配 Mediatek MT7922(RZ616) 无线网卡
  • 编译系统:Ubuntu-20.04.5 LTS For WSL2
1
2
3
4
5
6
7
8
9
10
11
# 我的 Intel NUC(NUC6CAYH) 的硬件配置
CPU : Intel® Celeron® Processor J3455 (2M Cache, up to 2.30 GHz, 4C4T)
RAM : Samsung 4G x2 DDR3L-1866 1.35V SO-DIMM
ROM : Crucial BX200 240GB
ETH : Realtek r8169
5 G : Mediatek MT7922(RZ616)

# 安装编译工具
sudo apt update
sudo apt install build-essential clang flex g++ gawk gcc-multilib gettext \
git libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev

获取编译源码

  1. 注意:不要使用root用户编译,最好使用梯子来加速源码的下载速度
  2. 编译完成后把openwrt/bin/targets/x86/64/openwrt-x86-64-generic-ext4-combined-efi.img.gz解压后的img文件刷入U盘启动即可
  3. 可选lean版魔改源码替换官方源码:https://github.com/coolsnowwolf/lede
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 设置代理来加速源码下载,没有代理可跳过或根据需求设置,WSL2通过cat /etc/resolv.conf来查看Win下的代理IP
# export all_proxy="172.23.80.1:7890"

# 获取openwrt官方源码 https://github.com/openwrt/openwrt/archive/refs/tags/v22.03.2.tar.gz
mkdir openwrt && cd openwrt/
git clone https://github.com/openwrt/openwrt.git --depth=1 -b v22.03.2 ./

# 以后每次编译前建议执行以下三行命令更新源码
git pull
./scripts/feeds update -a
./scripts/feeds install -a

make defconfig # 测试编译环境
make menuconfig # 进入固件配置界面
make kernel_menuconfig # 进入内核配置界面
make download -j8 V=s # 下载所需源码,请尽量使用梯子
make -j1 V=s # 首次编译推荐用单线程

# 再次编译前建议使用make clean清理
make clean # 清除bin目录
make dirclean # 清除bin目录和交叉编译工具及工具链目录
make distclean # 清除所有相关的东西,包括下载的软件包,配置文件,feed内容等

添加新的设备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 在 openwrt/target/linux/x86/image/64.mk 文件后面添加如下:

define Device/nuc6cayh
$(call Device/generic)
DEVICE_VENDOR := Intel
DEVICE_MODEL := NUC6CAYH
DEVICE_PACKAGES += \
kmod-fuse kmod-fs-ext4 kmod-fs-squashfs kmod-usb-storage-uas r8169-firmware kmod-kvm-intel kmod-tun \
kmod-usb-core kmod-usb-ehci kmod-usb-ohci kmod-usb-uhci kmod-usb-xhci-hcd kmod-usb-net-rtl8152 \
usb-modeswitch kmod-usb-serial kmod-usb-serial-option kmod-usb-serial-wwan kmod-usb-net-qmi-wwan \
kmod-usb-net kmod-usb-net-cdc-ether kmod-usb-net-cdc-mbim kmod-usb-net-cdc-ncm kmod-usb-net-rndis \
kmod-mt76-core kmod-mt76-connac kmod-mt7921-common kmod-mt7921e wpad-openssl wireless-tools \
luci luci-theme-material luci-i18n-base-zh-cn luci-i18n-opkg-zh-cn luci-i18n-firewall-zh-cn \
luci-app-samba4 luci-i18n-samba4-zh-cn usbutils pciutils htop smstools3 iconv curl parted
endef
TARGET_DEVICES += nuc6cayh

# 添加完记得 `rm .config* && rm -rf tmp/` 清理缓存,然后可在如下位置选择添加的设备:
Target System (x86) ---> Subtarget (x86_64) ---> Target Profile (Intel NUC6CAYH) --->

# 如果需要编译所有内核模块可选择如下,如不生效记得如上清理缓存
Global build settings ---> Select all kernel module packages by default

驱动无线网卡

  1. MT7922与MT7921共用同一驱动,但驱动默认不包含MT7922的固件,需要自己拷贝到指定路径

  2. 7921只有E、U、S三种版本,E是PCIE的NGFF接口,U是USB的,S是SDIO集成到主板的,其他没别的分别

  3. /lib/firmware/mediatek/WIFI_RAM_CODE_MT7922_1.bin | /lib/firmware/mediatek/WIFI_MT7922_patch_mcu_1_1_hdr.bin

1
2
3
4
5
6
7
8
9
10
11
12
13
# 官方OPENWRT系统可通过如下来安装驱动,然后获取上面两个固件文件到/lib/firmware/mediatek路径下
opkg install kmod-mt76-core kmod-mt76-connac kmod-mt7921-common kmod-mt7921e wpad-openssl wireless-tools

# 自编译可修改 openwrt/package/kernel/mt76/Makefile 中453行如下两行来添加MT7922的固件
define KernelPackage/mt7921e/install
$(INSTALL_DIR) $(1)/lib/firmware/mediatek
cp \
$(PKG_BUILD_DIR)/firmware/WIFI_MT7961_patch_mcu_1_2_hdr.bin \
$(PKG_BUILD_DIR)/firmware/WIFI_RAM_CODE_MT7961_1.bin \
+ $(PKG_BUILD_DIR)/firmware/WIFI_MT7922_patch_mcu_1_1_hdr.bin \
+ $(PKG_BUILD_DIR)/firmware/WIFI_RAM_CODE_MT7922_1.bin \
$(1)/lib/firmware/mediatek
endef

自动配置无线

  1. 全局生效:openwrt/files 文件夹在构建的时候,会把files文件夹里的文件编译到固件的根目录,所有架构都会生效。

  2. 局部有效:openwrt/target/linux/x86/base-files/ 文件夹在构建的时候,会把base-files文件夹里的文件编译到固件的根目录,仅x86平台有效。

  3. openwrt/target/linux/x86/base-files/etc/config/ 中新建无线配置文件wireless来提供无线接入可不插网线来初始配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# openwrt/files/etc/config/wireless 或 openwrt/target/linux/x86/base-files/etc/config/wireless

config wifi-device 'radio0'
option type 'mac80211'
option path 'pci0000:00/0000:00:13.1/0000:02:00.0'
option channel '36'
option band '5g'
option htmode 'HE80'
option cell_density '0'

config wifi-iface 'default_radio0'
option device 'radio0'
option mode 'ap'
option encryption 'none'
option ssid 'Openwrt'
option network 'lan'

短信自动转发

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
# 我使用的是RM500Q模块,可安装smstools3来接收发送短信,iconv转码
opkg install smstools3 iconv curl

# 修改配置文件 /etc/smsd.conf 后可 /etc/init.d/smstools3 restart 重启服务
devices = GSM1
incoming = /var/spool/sms/incoming
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
sent = /var/spool/sms/sent
receive_before_send = no
autosplit = 3
logfile = 1
loglevel = 5
#eventhandler = /usr/bin/pushsms # 收到短信执行脚本

[GSM1]
init = AT+CPMS="ME","ME","ME"
device = /dev/ttyUSB3
incoming = yes
#pin = 0000
baudrate = 115200
check_network = no # 这个不加启动不了


# 如果收到短信则执行脚本/usr/bin/pushsms转发到微信,脚本内容如下:
#!/bin/sh
if [ "$1" == "RECEIVED" ]; then
FROM=$(grep "From:" $2)
TEXT=$(sed -e '1,/^$/ d' < "$2" | iconv -f UNICODEBIG -t UTF-8)
curl -d "token=531c964f2fbe4879be2f1a4bba2695d3&title=$FROM&content=$TEXT" -X POST http://www.pushplus.plus/send
fi

# 如下命令可单独查看接收的短信
echo $(sed -e '1,/^$/ d' < "/var/spool/sms/incoming/GSM1.PCMJai" | iconv -f UNICODEBIG -t UTF-8)

核显驱动报错

[ 64.622466] i915 0000:00:02.0: [drm] Failed to load DMC firmware i915/bxt_dmc_ver1_07.bin. Disabling runtime power management.

1
2
3
4
5
6
7
8
9
10
11
# 在源码的 openwrt/target/linux/x86/config-5.10 里面加入如下这些,然后编译
CONFIG_64BIT=y 64-bit kernel
CONFIG_DRM=y Device Drivers -> Graphics support -> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)
CONFIG_DRM_I915=y Device Drivers -> Graphics support -> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) -> Intel 8xx/9xx/G3x/G4x/HD Graphics
CONFIG_DRM_I915_GVT=y Device Drivers -> Graphics support -> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) -> Intel 8xx/9xx/G3x/G4x/HD Graphics -> Enable Intel GVT-g graphics virtualization host support
CONFIG_DUMMY_CONSOLE=y


# 修改的.config配置文件会更改至target/linux/x86/config-5.10,该目录不在git管理的忽略列表
# build_dir/target-x86_64_musl/linux-x86_64/linux-5.10.146/.config
make kernel_menuconfig

开启虚拟

  1. 在内核的字符配置界面 make kernel_menuconfig 根据下面参数来开启内核对KVM的相关支持

  2. 下面参数中符号 > 代表上下级菜单,符号 - 表示同级菜单下

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
KVM		:Virtualization > Kernel-based Virtual Machine (KVM) support
Intel :Virtualization > KVM for Intel (and compatible) processors support
AMD :Virtualization > KVM for AMD processors support
PCI直通 :Device Drivers > PCI support > PCI Stub driver 能够将pci设备跟目前绑定的驱动分离,暂时由PCI Stub driver接管,最后交给虚拟机。

#####################################################################
# 基本VIRTIO设置
CONFIG_VIRTIO Device Drivers -> Virtio drivers
CONFIG_VIRTIO_PCI Device Drivers -> Virtio drivers -> PCI driver for virtio devices
CONFIG_VIRTIO_PCI_LEGACY Device Drivers -> Virtio drivers -> PCI driver for virtio devices -- Support for legacy virtio draft 0.9.X and older devices
CONFIG_VIRTIO_BALLOON Device Drivers -> Virtio drivers -> Virtio balloon driver
CONFIG_VIRTIO_INPUT Device Drivers -> Virtio drivers -> Virtio input driver
CONFIG_VIRTIO_BLK Device Drivers -> Block devices -> Virtio block driver
CONFIG_VIRTIO_NET Device Drivers -> Network device support -> Virtio network driver
CONFIG_VIRTIO_CONSOLE Device Drivers -> Character devices -> Virtio console

# 其他VIRTIO设置
CONFIG_VIRTIO_VSOCKETS_COMMON Networking support > Networking options -> Virtual Socket protocol
CONFIG_VIRTIO_VSOCKETS Networking support -> Networking options -> Virtual Socket protocol -> virtio transport for Virtual Sockets
CONFIG_SCSI_VIRTIO Device Drivers -> SCSI device support -> SCSI low-level drivers -> virtio-scsi support
CONFIG_HW_RANDOM_VIRTIO Device Drivers -> Character devices -> Hardware Random Number Generator Core support -> VirtIO Random Number Generator support
CONFIG_DRM_VIRTIO_GPU Device Drivers -> Graphics support -> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) -> Virtio GPU driver

CONFIG_VIRTIO_FS File systems -> FUSE (Filesystem in Userspace) support -> Virtio Filesystem
CONFIG_CRYPTO_DEV_VIRTIO Cryptographic API > Hardware crypto devices > Virtio crypto driver
CONFIG_NET_9P_VIRTIO Networking support > Plan 9 Resource Sharing Support > 9P Virtio Transport
CONFIG_NET_9P_RDMA Device Drivers > InfiniBand support || Networking support > Plan 9 Resource Sharing Support > 9P Virtio Transport > 9P RDMA Transport

CONFIG_CAIF Networking support > CAIF support
CONFIG_CAIF_VIRTIO Device Drivers > Network device support > CAIF transport drivers -> CAIF virtio transport driver

CONFIG_VHOST_NET Device Drivers > VHOST drivers -> Host kernel accelerator for virtio net
CONFIG_VHOST_VSOCK Device Drivers -> VHOST drivers -> vhost virtio-vsock driver

# VFIO和IOMMU
CONFIG_VFIO Device Drivers -> VFIO Non-Privileged userspace driver framework
VIRTIO_MMIO Device Drivers > Virtio drivers > Platform bus driver for memory mapped virtio devices # 允许内存映射到virtio设备
CONFIG_VFIO_PCI Device Drivers > VFIO Non-Privileged Userspace driver framework > VFIO support for PCI devices
CONFIG_VFIO_MDEV Device Drivers > VFIO Non-Privileged Userspace driver framework > Mediated device driver framework
CONFIG_VFIO_MDEV_DEVICE Device Drivers > VFIO Non-Privileged Userspace driver framework > Mediated device driver framework > VFIO driver for Mediated devices

CONFIG_VFIO_IOMMU_TYPE1 Device Drivers > IOMMU Hardware Support - VFIO Non-Privileged Userspace driver framework
CONFIG_ACPI Power management and ACPI options -> ACPI (Advanced Configuration and Power Interface) Support
CONFIG_INTEL_IOMMU Device Drivers > IOMMU Hardware Support > Support for Intel IOMMU using DMA Remapping Devices
  1. QEMU运行其他系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# https://runchar.com:433/blog/index.php/archives/161/

opkg update
opkg install kmod-kvm-amd kmod-kvm-intel kmod-kvm-x86 kmod-tun qemu-arm-softmmu \
qemu-bridge-helper qemu-firmware-efi qemu-firmware-pxe qemu-firmware-seabios \
qemu-firmware-seavgabios qemu-ga qemu-img qemu-keymaps qemu-nbd qemu-x86_64-softmmu

Packages in utilities---virtualization category
qemu-arm-softmmu
qemu-bridge-helper
qemu-firmware-efi
qemu-firmware-pxe
qemu-firmware-seabios
qemu-firmware-seavgabios
qemu-ga
qemu-img
qemu-keymaps
qemu-nbd
qemu-x86_64-softmmu
virtio-console-helper