小型工控机-软路由配置拾遗

img

一. 前言

实现目标:

  • 路由器
  • 文件分享
  • 虚拟机

主要解决局域网内开发环境分散(如: 多设备, 多python环境, 多个MySQL), 移动端广告难以拦截, 多设备文件分享麻烦, 以及多设备控制过于麻烦等问题.

简而言之, 就是: 净化 - 统一.

1.1 硬件

img

硬件 品牌 规格 来源 价格
主机 卓凌 CPU: j4125(base: 2.0G, Max: 2.6G, TD: 10W, 被动散热, 内部无风扇); 4 * I 226(2.5G), 1 * mstat; 1 * stat; 1 * minipcie 拼夕夕 469
内存 三星 8G, ddr4/2400(1G/1颗粒) 淘宝 77
电源 百鼎 12V/3A, 带3C认证(持续fpu满载, 无可感发热), 有点过剩, 12 * 2即可满足 淘宝 13
硬盘 金储星 128G, msata 淘宝 53

考虑到可能需要运行多个虚拟机, 以及docker, 选了一个性能相对强的cpu, 对于单纯实现软路由, 可以选择更低功耗的cpu.

内存的选择, j4125英特尔® 赛扬® 处理器 J4125 (intel.cn), 虽然其文档称最大仅支持8G内存, 实际可以支持更大(16G, 甚至更大的?), 但是需要注意兼容性, 如颗粒/容量, 从很多反馈来看, 最好是1G/1颗粒规格, 否则可能无法正常使用.

简单测试了一下CPU:

项目 数据
四核满载频率 2.0G(pe, cpuz); 2.6G(win10, 实体机)
FPU最高温度 最高73度, 稳定在70度(室内温度23)
显卡 4K/60帧 支持
cpuz单核 160+, 这个是在pe下测试, 貌似有问题

软件不能很好读取CPU数据.

关于集成Wi-Fi, openwrt并没有特别好的支持各种无线网卡, 包括其衍生版本的系统, 大部分网卡都没有原生支持, 同时还需要考虑exsi对于网卡的支持, 就算支持, 也还需要考虑信号强度和稳定性, 折腾起来相对麻烦.

由于原来的无线路由是tplink的电子垃圾, 基本就只能充当无线连接的作用, 功耗基本可以忽略, 那么直接使用这个路由作为无线信号(AD)输出, 设置很简单, 直接将工控机上的lan口网线插在tplink路由的lan口上, 关闭dhcp即可, 相比于安装网卡, 这种方式更为简易实用.


1.2 软件

在开始前, 需要了解一些基础的信息. 最好具备一定的Linux, 虚拟机(VM), 终端, 网络等基础知识.

1.2.1 EXSI

了解可直接安装到您的物理服务器的, 可靠的裸机 Hypervisor. 通过直接访问并控制底层资源, VMware ESXi 可有效地对硬件进行分区, 以便整合应用并降低成本. 它是业界领先的高效体系架构, 在可靠性, 性能和支持方面树立了行业标杆.

什么是 ESXi | 裸机 Hypervisor | ESX | VMware | CN

1.2.2 iStoreOS

一个人人会用的路由存储系统

iStoreOS, 一个简单易用的系统
让你同时获得更好的 网络 & 存储 的体验

由于不愿意花时间折腾各种设置, 路由选择的是iStoreOS, 基于OpenWrt Wiki, 可以视为易用版openwrt, 为开源项目(据称不完全开源), 但是透明程度应该比爱快好那么一点, 毕竟爱快完全是商用产品.

1.2.2.1 dnsmasq

Dnsmasq provides network infrastructure for small networks: DNS, DHCP, router advertisement and network boot. It is designed to be lightweight and have a small footprint, suitable for resource constrained routers and firewalls. It has also been widely used for tethering on smartphones and portable hotspots, and to support virtual networking in virtualisation frameworks. Supported platforms include Linux (with glibc and uclibc), Android, *BSD, and Mac OS X. Dnsmasq is included in most Linux distributions and the ports systems of FreeBSD, OpenBSD and NetBSD.

Dnsmasq - network services for small networks.

1.3 网络

通俗易懂的IP地址, 子网掩码, 默认网关, DNS服务器_ip地址作用-CSDN博客

img

设置过程可能需要反复切换随机和固定ip.

img

需要注意的是, win11没有将网络设置完全整合在一起, 传统设置优先于uwp界面的设置.

1.3.1 子网掩码

子网掩码_百度百科 (baidu.com)

子网掩码(subnet mask)又叫网络掩码, 地址掩码, 子网络遮罩, 它用来指明一个IP地址的哪些位标识的是主机所在的子网, 以及哪些位标识的是主机的位掩码. 子网掩码不能单独存在, 它必须结合IP地址一起使用.

子网掩码是一个32位地址, 用于屏蔽IP地址的一部分以区别网络标识和主机标识, 并说明该IP地址是在局域网上, 还是在广域网上.

1.3.2 默认网关

缺省网关_百度百科 (baidu.com)

缺省网关( Default Gateway) 是子网外网连接的设备, 通常是一个路由器. 当一台计算机发送信息时, 根据发送信息的目标地址, 通过子网掩码来判定目标主机是否在本地子网中, 如果目标主机在本地子网中, 则直接发送即可. 如果目标不在本地子网中则将该信息送到缺省网关/路由器, 由路由器将其转发到其他网络中, 进一步寻找目标主机.

1.3.3 DHCP

什么是DHCP? 为什么要用DHCP? - 华为 (huawei.com)

在IP网络中, 每个连接Internet的设备都需要分配唯一的IP地址. DHCP使网络管理员能从中心结点监控和分配IP地址. 当某台计算机移到网络中的其它位置时, 能自动收到新的IP地址. DHCP实现的自动化分配IP地址不仅降低了配置和部署设备的时间, 同时也降低了发生配置错误的可能性. 另外DHCP服务器可以管理多个网段的配置信息, 当某个网段的配置发生变化时, 管理员只需要更新DHCP服务器上的相关配置即可, 实现了集中化管理.

总体来看, DHCP带来了如下优势:

  • 准确的IP配置: IP地址配置参数必须准确, 并且在处理" 192.168.XXX.XXX" 之类的输入时, 很容易出错. 另外印刷错误通常很难解决, 使用DHCP服务器可以最大程度地降低这种风险.
  • 减少IP地址冲突: 每个连接的设备都必须有一个IP地址. 但是, 每个地址只能使用一次, 重复的地址将导致无法连接一个或两个设备的冲突. 当手动分配地址时, 尤其是在存在大量仅定期连接的端点( 例如移动设备) 时, 可能会发生这种情况. DHCP的使用可确保每个地址仅使用一次.
  • IP地址管理的自动化: 如果没有DHCP, 网络管理员将需要手动分配和撤消地址. 跟踪哪个设备具有什么地址可能是徒劳的, 因为几乎无法理解设备何时需要访问网络以及何时需要离开网络. DHCP允许将其自动化和集中化, 因此网络专业人员可以从一个位置管理所有位置.
  • 高效的变更管理: DHCP的使用使更改地址, 范围或端点变得非常简单. 例如, 组织可能希望将其IP寻址方案从一个范围更改为另一个范围. DHCP服务器配置有新信息, 该信息将传播到新端点. 同样, 如果升级并更换了网络设备, 则不需要网络配置.

1.3.4 网卡工作模式

网卡具有如下的几种工作模式:

  • 广播模式( Broad Cast Model) : 它的物理地址( MAC) 地址是 0Xffffff 的帧为广播帧, 工作在广播模式的网卡接收广播帧.
  • 多播传送( MultiCast Model) : 多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收, 而组外主机却接收不到. 但是, 如果将网卡设置为多播传送模式, 它可以接收所有的多播传送帧, 而不论它是不是组内成员.
  • 直接模式( Direct Model) : 工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧.
  • 混杂模式( Promiscuous Model) : 工作在混杂模式下的网卡接收所有的流过网卡的帧, 信包捕获程序就是在这种模式下运行的.

网卡的缺省工作模式包含广播模式和直接模式, 即它只接收广播帧和发给自己的帧. 如果采用混杂模式, 一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的.

混杂模式就是接收所有经过网卡的数据包, 包括不是发给本机的包. 默认情况下网卡只把发给本机的包( 包括广播包) 传递给上层程序, 其它的包一律丢弃. 简单的讲,混杂模式就是指网卡能接受所有通过它的数据流, 不管是什么格式, 什么地址的. 当网卡处于这种" 混杂" 方式时, 该网卡具备" 广播地址" , 它对所有遇到的每一个数据帧都 产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包.


二. 配置

各个软件的安装细节这里就不一一赘述了, 以下主要是记录一下遭遇的一些问题.

下面的各软件均基于Linux, 需要具备一定的Linux命令基础.

2.1 EXSI

需要注意的是磁盘占用, 默认状态下, 将占用大概120G, 磁盘容量不足, 将完全占用. 即安装完成, exsi将显示存储不可用(NA).

注意默认是不开启ssh.

img

安装时, shift + O进入设置(8192, 8G = 1024 * 8)

img

安装好之后, exsi系统大概占用3 -4G硬盘, 空载大概占用1.2G内存.

2.1.1 网卡

精髓 一文带你了解VMware vSphere 网络, vSwitch, 端口组! - 知乎 (zhihu.com)

配置网络设置 (vmware.com)

img

img

需要注意, 每个虚拟交换机(vswitch)都需要物理网卡的支持.

img

vmkernel, 可以添加新的静态ip, 同样可以访问exsi的管理页面.

在安装好exsi后, 需要记录一下网卡的mac地址和顺序位置(软件内的编号顺序可能和物理硬件的顺序不一样, 可以通过插拔的连接状态来判断哪个口对于哪个id), 后面需要用到.


img

硬件直通, 顾名思义, 这是为了降低/消除硬件虚拟化对于I/O性能影响而推出的技术, 为了管理exsi, 留下一个接口不设置直通(建议保留这个管理口, 不然路由搞瘫了就麻烦了, 虽然这个口同样可以直通).

理论上直通的网卡将无法连接exsi, 这意味着使用直通网卡无法直接进入exsi的管理界面, 但实际上通过直通网卡接口也是可以访问exsi管理页面的.

img

能够检索到的内容基本上都是在胡说八道, 不然就是说一半, 另一半含糊其辞, 更有各种绕的(一定程度因为不同设备和软件的原因).

更令人遗憾的是, 作为软路由玩家大本营的恩山论坛居然对这个问题找不到一个能说明白的帖子.

很多关于网络配置的帖子和文章, 都是把人带到坑里的.

img

由于关乎路由器部分的设置, 这里不做详述, 具体的细节见后续的istoreos章节.

img

exsi中针对网卡的设置, 只改动一个地方, 其他的不要乱动(默认即可).

2.1.2 虚拟机

img

添加直通之后, 在虚拟机设置添加设备.

img

需要注意引导项的设置, 必须在创建虚拟机的过程中设置, 后续再修改可能导致虚拟机无法正常加载.

img

保留内存必须为4的整数倍(MB).

img

除此之外还需要设置开机项, 这里仅开启istoreos.

img

默认状态下ssh是不随机开启的.

img

2.1.3 常用命令

一些常用的终端命令用于管理虚拟机, 主要用于开关机.

vim-cmd vmsvc/getallvms #读取所有的虚拟机

Vmid       Name                            File                           Guest OS       Version   Annotation
4      iStoreOS        [datastore1] iStoreOS/iStoreOS.vmx             ubuntu64Guest      vmx-21
6      Ubuntu_Server   [datastore1] Ubuntu_Server/Ubuntu_Server.vmx   ubuntu64Guest      vmx-21
7      Win8.1          [datastore1] Win8.1/Win8.1.vmx                 windows8_64Guest   vmx-21

[root@localhost:~] vim-cmd vmsvc/power.getstate 6 # 读取虚拟机开启状态
Retrieved runtime info
Powered off

vim-cmd vmsvc/power.on Vmid # 启动虚拟机

vim-cmd vmsvc/power.reset 3 # 重启虚拟机

2.2 iStoreOS

exsi的键盘输入有一些小问题, 部分键可能无效, 切换不同的输入法即可.

img

root@iStoreOS:/etc/config# cat network

config interface 'loopback'
        option device 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fd1e:b48b:946c::/48'

config interface 'wan'
        option proto 'pppoe'
        option username '....'
        option password '.....'
        option device 'eth3' # 改成自定义的位置

config interface 'wan6'
        option device 'eth3'   # 改成自定义的位置
        option proto 'dhcpv6'

config device
        option name 'br-lan'
        option type 'bridge'
        list ports 'eth0'
        list ports 'eth2'
        list ports 'eth1'

config interface 'lan'
        option proto 'static'
        option ipaddr '192.168.2.10' # 管理istore的地址, 默认为192.168.100.1
        option netmask '255.255.255.0'
        option ip6assign '60'
        option defaultroute '0'
        option device 'br-lan'

安装好之后注意当前插拔的网线所处位置, 假如出现没有网络的情况拔出网线插到其他网口即可.

同时需要注意当istoreos启动后, 其内部的dhcp会接管网络开始动态分发ip地址, 一开始为了管理exsi设置的静态网络要改成动态获取ip.

img

默认情况下, wan口使用的是虚拟网卡.

img

img

也可以改lan口使用虚拟网卡(即管理口也是普通的接口, 只是没有直通给istoreos而已), 改动时, 更改后istoreos有30秒的倒计时, 等待网线拔出插入新的口, 假如不插入网线, itsoreos会自动撤销操作(这一定程度避免某些错误操作导致无法正常使用网络的情况).

当一定程度熟悉了istoreos后可以做最后一步操作, 即启用桥接.

将lan口的设备改成这个桥接设备.

img

img

实际上这个基本不用手动操作, istoreos会根据插入网线的情况, 自动设置, 假如已经手动进行部分设置, 这部分设置可能会被istoreos整合在一起, 假如没有自动配置, 手动配置一下即可.

四个网口全部处于连接状态, 3个lan口, 1个wan口, 3个直通, 1个虚拟网口(eth0).

img

img

剔除掉1个wan口, 另外两个直通lan口均可以管理各个设备.

至此, all in one的网络配置完成.

2.2.1 磁盘

默认状态下, 安装istoreos时, 分配的磁盘, 除了系统占用部分被启用之外, 剩余空间尚未初始化.

Linux下没有Windows的盘符概念, 可以将之视为一个整体, 使用就切出一块, 格式化, 即可使用.

在首页磁盘信息将磁盘格式化 - 挂载.

img

这部分的磁盘挂载后, 可以直接被docker和文件分享使用.

假如没有挂在磁盘, 会出现可以看到smb文件分享, 但是无法存放文件或者访问出错的情况.

2.2.2 文件分享

文件分享, 使用的是smb协议.

img

默认不使用root用户作为分享账户, 需要先创建一个新用户.

img

磁盘还没挂载, 创建分享并不会出现错误, 也能创建成功.

img

直接使用首页的快速配置设置即可.

2.2.3 广告拦截

istoreos集成了dnsmasq, 可以直接利用这个工具来实现广告拦截.

img

root@iStoreOS:/# cd /etc/
root@iStoreOS:/etc# ls
dnsmasq.conf          istore                passwd-               ssl

dnsmasq.conf , 即为配置文件所在

anti-AD | 致力于成为中文区命中率最高的广告过滤列表

使用此站点分享的文件

# wget 不需要额外的安装

wget https://anti-ad.net/anti-ad-for-dnsmasq.conf -O dnsmasq.conf

# 下载文件同时覆盖

# 返回主目录

/etc/init.d/dnsmasq restart # 重启服务

# 出现这个错误是正常的
# udhcpc: no lease, failing

重启时会出现上述的错误, 但这是正常的

[SOLVED] Dnsmasq restart shows DHCP error - Installing and Using OpenWrt / Network and Wireless Configuration - OpenWrt Forum

That is intended behaviour, maybe just a tad chatty. The dnsmasq initscript does a DHCP request on its own, to check that there if no other DHCP server on your network segment, before starting the dæmon. This is done to prevent rogue DHCP servers, which would be a real problem.

还有这个同样可以实现广告的拦截

img

以及hosts(网络配置的文件基本都存放在etc目录之下)

img

暂不清楚哪种的执行效率更高.

以上均是基于host来拦截的, 这种方式在移动端不会像在PC端表现这么好(移动端的站点的广告host变动快), 没有试过adguard会不会好一点.

2.2.4 静态地址管理

为了方便区分不同的设备, 建议IP段进行分层.

img

各个设备之间需要相互访问, 为每个设备分配固定的ip地址.

img

img

当绑定mac地址和ip后, 注意查看DHCP的分配是否还在进行, 假如还活跃说明设置不成功, 特别是Ubuntu.

2.2.5 常用命令

ifup wan #  连接宽带

ifdown wan # 断开宽带

2.3 Ubuntu

安装的是Ubuntu服务器版本, 没有图形桌面环境.


在安装的过程中, 在help可以打开shell进行一些操作.

img

img

这个步骤假如这样设置, 会一直报错, 先暂时保持默认不做更改.

img

ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

安装完成之后, 将源地址改成清华源.

# 默认注释了源码镜像以提高 apt update 速度, 如有需要可自行取消注释
deb https://mirrors4.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors4.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors4.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors4.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors4.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors4.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源, 不建议启用
# deb https://mirrors4.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors4.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 复制一份
sudo vi /etc/apt/sources.list # 复制清华源进来
# 全部删除: 按esc后, 然后dG, 先按下d, 然后按下shit + g

sudo apt-get update # 更新软件列表

sudo apt-get upgrade # 更新软件

sudo apt-get install axel # 安装多线程下载工具

img

Ubuntu22 新增一个特性, 安装完成后会出现重启相关服务的提示.

img

需要注意安装过程的静态网络设置, 设置一直提示错误, 这里的设置和常见的windows的静态ip设置不一样.

2.3.1 静态IP

默认下, 该目录只存在00-installer-config.yaml, 打开这个文件, 获得ens34这个id, 不同的设备可能不一样

cd /etc/netplan/

(base) walle@jarvis:/etc/netplan$ ls
00-installer-config.yaml  01-network-manager-all.yaml
(base) walle@jarvis:/etc/netplan$ cat 00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens34:
      dhcp4: true
  version: 2

创建01-network-manager-all.yaml, 写入相关的设置

sudo vi 01-network-manager-all.yaml
network:
    ethernets:
        ens34:                    ## network card name
            dhcp4: false
            addresses:
              - 192.168.2.102/24   ## set static IP
            routes:
              - to: default
                via: 192.168.2.10  ## gateway
            nameservers:
              addresses: [192.168.2.10, 114.114.114.114]
    version: 2

# 返回最上层, 执行重启
sudo netplan apply

2.3.2 磁盘管理

默认安装, 磁盘将不会完全分配.

(base) walle@jarvis:~$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              197M  1.1M  196M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   15G   14G  6.0M 100% /
tmpfs                              982M     0  982M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  130M  1.7G   8% /boot
/dev/sda1                          1.1G  6.1M  1.1G   1% /boot/efi
tmpfs                              197M  4.0K  197M   1% /run/user/1000

(base) walle@jarvis:~$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0  63.4M  1 loop /snap/core20/1974
loop1                       7:1    0 111.9M  1 loop /snap/lxd/24322
loop2                       7:2    0  53.3M  1 loop /snap/snapd/19457
loop3                       7:3    0  40.9M  1 loop /snap/snapd/20290
sda                         8:0    0    32G  0 disk
├─sda1                      8:1    0     1G  0 part /boot/efi
├─sda2                      8:2    0     2G  0 part /boot
└─sda3                      8:3    0  28.9G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0  14.5G  0 lvm  /
sr0                        11:0    1  1024M  0 rom

可以看到, 28G只分配了15G.

(base) walle@jarvis:~$ sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
# 100% 全部磁盘分配
[sudo] password for walle:
  Size of logical volume ubuntu-vg/ubuntu-lv changed from 14.47 GiB (3705 extents) to <28.95 GiB (7410 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.
(base) walle@jarvis:~$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0  63.4M  1 loop /snap/core20/1974
loop1                       7:1    0 111.9M  1 loop /snap/lxd/24322
loop2                       7:2    0  53.3M  1 loop /snap/snapd/19457
loop3                       7:3    0  40.9M  1 loop /snap/snapd/20290
sda                         8:0    0    32G  0 disk
├─sda1                      8:1    0     1G  0 part /boot/efi
├─sda2                      8:2    0     2G  0 part /boot
└─sda3                      8:3    0  28.9G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0  28.9G  0 lvm  /
sr0                        11:0    1  1024M  0 rom

# 注意, 上述的命令只是执行分配的动作, 实际还是没有变化
(base) walle@jarvis:~$ df -hl
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              197M  1.1M  196M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   15G   14G     0 100% /
tmpfs                              982M     0  982M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  130M  1.7G   8% /boot
/dev/sda1                          1.1G  6.1M  1.1G   1% /boot/efi
tmpfs                              197M  4.0K  197M   1% /run/user/1000

# 实际执行
(base) walle@jarvis:~$ sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
[sudo] password for walle:
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 7587840 (4k) blocks long.

# 可以看到磁盘被完全分配使用
(base) walle@jarvis:~$ df   -hl
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              197M  1.1M  196M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   29G   14G   14G  50% /
tmpfs                              982M     0  982M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  130M  1.7G   8% /boot
/dev/sda1                          1.1G  6.1M  1.1G   1% /boot/efi
tmpfs                              197M  4.0K  197M   1% /run/user/1000

2.3.3 Python

修改pip的源地址:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

anaconda的安装, 在清华的镜像站找到anaconda的下载链接.

axel -n 4 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh
bash Anaconda3-2023.09-0-Linux-x86_64.sh

img

安装过程, 在出现用户协议后, 直接按下q键退出, 这次安装不知道出现什么情况, enter回车到底再输入yes出现异常.

sudo vim ~/.bashrc

export PATH="/home/walle/anaconda3/bin:$PATH"
source ~/.bashrc # 启用

安装好之后, 添加路径到环境变量.

channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/

(base) walle@jarvis:~$ sudo vi ~/.condarc
[sudo] password for walle:
(base) walle@jarvis:~$ conda clean -i

anaconda的源地址改成清华源.

注意上述操作之后, 原来Ubuntu安装的python将被覆盖, 需要手动修改环境变量将原python调出来.

2.3.3.1 远程连接

使用vscode仅仅需要安装一个扩展即可

img

img

输入连接地址, vscode进入之后会自动安装和配置, 等待完成即可.

img

但是每次启动还需要输入密码, 就比较麻烦, 可以设置为无密码登录, 使用密钥登录.

img

打开git bash操作

ssh-keygen -t rsa

# 当提示输入密码时, 不要输入, 否则连接时还是会提示输入密码
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

# 将公钥拷贝到Ubuntu
ssh-copy-id -i id_rsa.pub walle@192.168.2.102

# 直接登录, 就不再需要密码, 不需要重启ssh

# 密钥存放于
(base) walle@jarvis:~$ cd ~/.ssh
(base) walle@jarvis:~/.ssh$ ls
authorized_keys

# 多设备登录
# 在指定的机器生成密钥, 添加到授权公钥文件就可以了

vi authorized_keys # 在末尾添加上去即可

2.3.4 MySQL

需要注意的是, MySQL的各种安装方式所产生的问题也各不相同, 在多篇文章中提及安装的差异.

这里直接使用apt命令安装:

sudo apt install mysql-server

安装过程没什么东西提示或者输入.

sudo systemctl start mysql.service # 启动服务

(base) walle@jarvis:~$ sudo ss -anp | grep mysql # 查看开启情况
u_str LISTEN 0      151                               /tmp/mysql.sock 35640
       * 0     users:(("mysqld",pid=2287,fd=25))

u_str LISTEN 0      70                    /var/run/mysqld/mysqlx.sock 35638
       * 0     users:(("mysqld",pid=2287,fd=22))

u_dgr ESTAB  0      0                                               * 35631
       * 19548 users:(("mysqld",pid=2287,fd=3))

tcp   LISTEN 0      70                                      127.0.0.1:33060
 0.0.0.0:*     users:(("mysqld",pid=2287,fd=21))

tcp   LISTEN 0      151                                     127.0.0.1:3306
 0.0.0.0:*     users:(("mysqld",pid=2287,fd=23))

service mysql restart

默认状态下

mysql # 直接进入mysql, 没有密码

mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 8.0.35-0ubuntu0.22.04.1 |
+-------------------------+
1 row in set (0.00 sec)

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | debian-sys-maint |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
5 rows in set (0.00 sec)

mysql> update user set host='%' where user = 'root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> alter user 'root'@'%' identified by '123'; # 这个报错很诡异, 重复执行可能没错
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'%'
mysql> select host,user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| localhost | debian-sys-maint |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
+-----------+------------------+
5 rows in set (0.00 sec)

mysql> alter user 'root'@'%' identified with 'caching_sha2_password' by '123'; # 也可能报错, 重复执行就没事
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit;

需要注意的是, 再次登录, 没用使用sudo, 出现以下错误.

(base) walle@jarvis:~$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

(base) walle@jarvis:~$ find -name mysql.sock # 没有这个文件
(base) walle@jarvis:~$ /etc/rc.d/init.d/mysqld  status
-bash: /etc/rc.d/init.d/mysqld: No such file or directory

(base) walle@jarvis:~$ more my.cnf |grep sock
more: cannot open my.cnf: No such file or directory

假如检索可以看到关于该问题的各种解决办法, 但是这些很多都是没有明确目的的尝试, 不同的情况下, 并不能解决问题.

img

实际处理很简单:

(base) walle@jarvis:~$ sudo vim /etc/mysql/my.cnf

# 插入 这部分内容
[mysqld]
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock

[sudo] password for walle:
(base) walle@jarvis:~$ service mysql restart # 重启MySQL

(base) walle@jarvis:~$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.35-0ubuntu0.22.04.1 (Ubuntu)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 8.0.35-0ubuntu0.22.04.1 |
+-------------------------+
1 row in set (0.00 sec)

远程连接还有个问题

img

还有一步需要解除限制

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# bind-address          = 127.0.0.1

注释掉绑定地址的设置, 保存重启MySQL即可.


@echo off
set dn=Info
set dn2=ShellFolder
set rp=HKEY_CURRENT_USER\Software\Classes\CLSID
reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration16XCS /f
reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Update /f
for /f "tokens=*" %%a in ('reg query "%rp%"') do (
for /f "tokens=*" %%l in ('reg query "%%a" /f "%dn%" /s /e ^|findstr /i "%dn%"') do (
  reg delete %%a /f
)
for /f "tokens=*" %%l in ('reg query "%%a" /f "%dn2%" /s /e ^|findstr /i "%dn2%"') do (
  reg delete %%a /f
)
)
exit

navicat的无限试用批处理(仅作为交流学习使用.)

三. 小结

img

通过ssh / 远程桌面, 即可以1设备调动整个局域网内的设备.

img

all in one !


补充信息 1: 微软账号 - 远程桌面

关于远程桌面, 在安全策略上win11由于做了很大的改变, 例如取消传统的密码(?), 强制pin(和物理机绑定的策略, 无法使用pin远程登录), 这对于登录远程桌面的操作也发生改变.

img

检索相关问题, 特么全胡说.

登录远程桌面的操作策略还是一样, 只是登录的内容发生改变.

默认状态下, win11 当前登录的微软账户的用户(管理员权限)已经自动添加到远程桌面用户上, 不需要额外的设置.

登录用户名: 微软账号(如: 123@outlook.com)

登录密码: 微软账号的登录密码(是微软网络账号密码, 不是机器的密码, 也不是pin码, pin码是无法用于远程登录的)

不需要撤销pin码, 不需要改成本地账户.


补充信息 2: 关于硬件的分配

由于只使用8G的内存, 需要分配好内存, 否则会出现因为exsi内存池不足导致启动虚拟机失败

设备 内存 保留内存
istoreos 1G 1G
ubuntu 1G 1G
win8.1(嵌入式) 2G 1G

除了win8.1之外, 其他两个设备均为Linux系统, 对于内存的需求并不高, 分配1G就足够了, win8.1 选用嵌入式版本, 理论上占用更低.


补充信息 3: 关于win8.1 嵌入式的激活

Download Windows Embedded 8.1 Industry Pro Evaluation from Official Microsoft Download Center

img

这个系统安装时需要输入密钥.

由于是嵌入式版本的系统, 激活稍微麻烦一点, 在线激活的密钥也不好找, 使用kms激活, 但是需要注意找到正确的key.

img

不要搞混这两组密钥.

slmgr.vbs -ipk NMMPB-38DD4-R2823-62W8D-VXKJB
slmgr.vbs -skms kms.srv.crsoo.com
slmgr.vbs -ato

激活之后, 可能系统没有完全响应, 依然无法设置登录头像, 个性化设置等, 重启一下系统即可.

不要打补丁, 假如完全安装系统推荐的补丁, 系统的占用会明显提升(磁盘占用增加8个G, 内存占用也会提升), 但是可能无法安装vm tool(需要系统安装特定的补丁)

这里将win8.1作为下载文件使用, 将下载文件指向istoreossmb分享文件位置, 以避免磁盘空间不足.

3.1 J4125指令集支持

补充信息, 注意这个坑, 完全没注意到这个问题, 由于avx, avx2的支持.

Ubuntu上安装mongodb时出现问题, 安装好之后无法正常启动

(base) lian@jarvis:~$ sudo service mongod status
× mongod.service - MongoDB Database Server
     Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
     Active: failed (Result: core-dump) since Tue 2024-04-09 10:11:09 UTC; 9s ago
       Docs: https://docs.mongodb.org/manual
    Process: 1567 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=dumped, signal=ILL)
   Main PID: 1567 (code=dumped, signal=ILL)
        CPU: 20ms

Apr 09 10:11:09 jarvis systemd[1]: Started MongoDB Database Server.
Apr 09 10:11:09 jarvis systemd[1]: mongod.service: Main process exited, code=dumped, status=4/ILL
Apr 09 10:11:09 jarvis systemd[1]: mongod.service: Failed with result 'core-dump'.

ubuntu - MongoDB error - Failed with result 'core-dump' - Super User

img

内核启动失败和mongodb需要的avx指令集支持有关.

相比AVX, AVX2在如下方面做了扩展.

  • 支持的整点SIMD数据宽度从128位扩展到256位. Sandy Bridge虽然已经将支持的SIMD数据宽度增加到了256位, 但仅仅增加了对256位的浮点SIMD支持, 整点SIMD数据的宽度还停留在128位上,
  • 增强广播, 置换指令支持的数据元素类型, 移位操作对各个数据元素可变移位数的支持, 跨距访存支持.

Intel Celeron J4125 Specs | TechPowerUp CPU Database

img

N100

Intel Processor N100 Specs | TechPowerUp CPU Database

img

cat /proc/cpuinfo | grep avx

安装在其他机器的虚拟机的ubuntu.

img

四. 总结

构成一台小型主机的要素:

  • 功耗, 关乎性能和散热(假如要塞进很小的空间, 无法容纳风扇)
  • 硬件虚拟化的兼容性, 例如能否得到exsi/pve, 或者其他的nas系统, 影音解码等的支持
  • 驱动的支持, 最起码在windows上可以正常安装齐驱动
  • 指令集的支持, 特别是希望部署科学计算相关的程序
  • 网卡的通用性(包括预置了WiFi模块的), 如在exsi可以直通, 这是很关键的一项
  • 额外扩展功能, 如bios通电开机, intel amt(远程控制)等

对于纯粹实现路由功能, 一些开发板多数能够胜任(如树莓派). 对于希望实现all in one需要考量的东西很多, 从内存是否支持双通道, cpu支持指令集, 网卡型号等等细节, 同时考虑到硬件的通用性还需要注意内存的支持(ddr4, ddr5), ssd固态支持的协议等诸多细节.