ARM虚拟机安装OMV

news2024/11/19 13:44:58

OMV(OpenMediaVault)是基于 Debian GNU/Linux 的网络连接存储(network attached storage,NAS)解决方案。它包含 SSH、(S) FTP、SMB/CIFS、DAAP 媒体服务器、rsync、 BitTorrent 等很多种服务。它可用于 x86-64 和 ARM 平台。

在x86-64平台上,基于x86-64虚拟机安装OMV软件是相对容易的事情,例如使用VirtualBox创建一个x86-64虚拟机,参考官方的x86-64平台安装文档可以轻松搞定。但是基于ARM虚拟机则没有那么容易,因为在x86-64平台上,VirtualBox不支持创建ARM虚拟机,这时就需要用到QEMU了。

根据官方文档,在ARM平台上安装,需要Armbian镜像,这里选用通用的ARM64镜像,而不是用于特定ARM开发板例如树莓派等的镜像。

============================================================

操作流程(基于Ubuntu 24.04 LTS系统):

----------------------------------

安装QEMU:

sudo apt install qemu-system-arm

验证QEMU:

qemu-system-aarch64 -version

----------------------------

下载Armbian 24.2.1 Bookworm CLI(OMV不支持桌面环境,因此下载这个版本):

wget https://dl.armbian.com/uefi-arm64/archive/Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img.xz

解压Armbian镜像:

xz -kd Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img.xz

OMV系统盘和数据盘是分开的,并且要求系统盘可用空间大于4GB。

系统盘就是用Armbian镜像虚拟的硬盘,基本上已经没有多少可用空间了,因此需要先扩容。

给Armbian镜像增加8GB容量用于安装OMV等软件:

qemu-img resize Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img +8G

创建一个qcow2格式的虚拟硬盘作为OMV数据盘:

qemu-img create -f qcow2 omvdata.qcow2 16G

虚拟硬盘是动态分配大小的,因此创建完成后文件大小只有几百KB,不是8GB。

---------------------------

创建虚拟网桥和虚拟网卡:

sudo apt install iproute2(系统默认已经安装)

可选安装:brctl、tunctl、dhclient

sudo apt install bridge-utils

sudo apt install uml-utilities

sudo apt install isc-dhcp-client-ddns

创建虚拟网桥和虚拟网卡:

sudo ip link add br0 type bridge

sudo ip tuntap add dev tap0 mode tap

连接虚拟网桥和虚拟网卡:

sudo ip link set dev tap0 master br0

连接物理网卡(WiFi网卡需要配置4-address 模式支持WDS桥接)到虚拟网桥:

sudo iw dev wlx14cf92fe3d77 set 4addr on

sudo ip link set dev wlx14cf92fe3d77 master br0

启动虚拟网桥:

sudo ip link set dev br0 up

查看网桥连接的网卡:

sudo brctl show br0

清除物理网卡上的IP地址(同时也会清除路由):

sudo ip address flush wlx14cf92fe3d77 dynamic

使用DHCP方式给网桥分配IP(会自动配置网关和DNS):

sudo dhclient br0

或者给网桥配置静态IP,这种情况需要同时需要手动配置网关和DNS(否则无法连接外网):

sudo ip address flush wlx14cf92fe3d77 dynamic

sudo ip address add 192.168.2.99/24 dev br0

sudo ip route add default via 192.168.2.1 dev br0

sudo resolvectl dns br0 192.168.2.1 8.8.8.8

也可以使用brctl和tunctl命令配置网桥更简单:

sudo brctl addbr br0

sudo brctl stp br0 on

sudo tunctl -t tap0

sudo brctl addif br0 tap0

sudo iw dev wlx14cf92fe3d77 set 4addr on

sudo brctl addif br0 wlx14cf92fe3d77

sudo ip link set dev br0 up

sudo ip address flush wlx14cf92fe3d77 dynamic

sudo dhclient br0

使用无线网卡,桥接网络可能不稳定,DHCP获取IP时间也会长一些。如果连接中断,重新连接WiFi,检查网卡是否还连接网桥,重新配置IP地址。

网桥连接有线网卡会稳定一些:

sudo ip link add br0 type bridge

sudo ip tuntap add dev tap0 mode tap

sudo ip link set dev tap0 master br0

sudo ip link set dev enp4s0 master br0

sudo ip link set dev br0 up

也可以使用brctltunctl命令:

sudo brctl addbr br0

sudo brctl stp br0 on

sudo tunctl -t tap0

sudo brctl addif br0 tap0

sudo brctl addif br0 enp4s0

sudo ip link set dev br0 up

 

清除物理网卡上的IP(同时也清除路由),通过DHCP给网桥分配IP

sudo ip address flush enp4s0 dynamic

sudo dhclient br0

如果给网桥配置静态IP,需要同时配置默认路由和DNS(否则无法访问外网):

sudo ip address flush enp4s0 dynamic

sudo ip address add 192.168.2.99/24 dev br0

sudo ip route add default via 192.168.2.1 dev br0

sudo resolvectl dns br0 192.168.2.1 8.8.8.8

注:系统重启之后,这些虚拟网桥、虚拟网卡都没有了,需要再次配置。

配置好虚拟网桥和虚拟网卡之后,后面启动QEMU就可以使用这里配置的虚拟网卡tap0了。

-----------------------

启动Armbian系统,并使用上面准备好的镜像,数据盘和虚拟网卡:

sudo qemu-system-aarch64 -machine virt -cpu cortex-a57 -smp 8 -m 8G -nographic -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -drive file=Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img,if=virtio -drive file=omvdata.qcow2,if=virtio -net nic -net tap,ifname=tap0

需要注意的是,这里要指定BIOS,可以使用QEMU自带的BIOS,默认路径/usr/share/qemu-efi-aarch64/QEMU_EFI.fd。

如果在第一次启动之前就将系统镜像扩容,进入系统后根分区会自动扩容。如果根分区没有扩容,使用resize2fs命令扩容根分区:

resize2fs /dev/vda2

注:使用网桥比使用user网络或者user网络加端口转发启动QEMU,下面的操作要省事很多。

---------------------------------

以下操作在Armbian系统上执行:

第一次启动Armbian系统,根据提示创建root密码,并创建一个普通用户alpha:

配置完成后,系统已经自动分配了IP(跟网桥同一个网段,跟外网直通):

注:登录界面也可以看到IP地址(但这些IP信息可能是过时的),如果系统没有自动获取到IP,可以手动配置IP,并确保能ping通网桥IP,能连接外网。这时主机上root和新建的普通用户都可以通过ssh登录Armbian系统。

查看系统盘(vda)和数据盘(vdb)也都正常:

先安装两个工具软件:

sudo apt install vim

sudo apt install net-tools

查看系统的TCP端口,可以看到sshd服务已经打开:

netstat -antp

注:虽然sshd服务已经打开,但不要通过ssh连接安装OMV,否则可能安装不完整,安装完成后,进入OMV的web管理页面,左边栏目什么条目都没有。

安装OMV软件:

安装前的工作:

检查systemd-networkd.service,如果是指向/dev/null的符号连接,将其删除:

ls -al /etc/systemd/system/systemd-networkd.service

删除systemd-networkd.service文件:

rm /etc/systemd/system/systemd-networkd.service

修改armbian-ramlog.service服务文件:

vi /etc/systemd/system/sysinit.target.wants/armbian-ramlog.service

将默认的TimeoutStartSec=30sec

改为TimeoutStartSec=180sec

安装OMV keyring:

apt-get install --yes gnupg

wget --quiet --output-document=- https://packages.openmediavault.org/public/archive.key | gpg --dearmor --yes --output "/usr/share/keyrings/openmediavault-archive-keyring.gpg"

添加OMV官方的软件源:

cat <<EOF >> /etc/apt/sources.list.d/openmediavault.list

deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://packages.openmediavault.org/public sandworm main

# deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://downloads.sourceforge.net/project/openmediavault/packages sandworm main

## Uncomment the following line to add software from the proposed repository.

# deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://packages.openmediavault.org/public sandworm-proposed main

# deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://downloads.sourceforge.net/project/openmediavault/packages sandworm-proposed main

## This software is not part of OpenMediaVault, but is offered by third-party

## developers as a service to OpenMediaVault users.

# deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://packages.openmediavault.org/public sandworm partner

# deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://downloads.sourceforge.net/project/openmediavault/packages sandworm partner

EOF

OMV软件源也可以用清华大学的软件源:

cat <<EOF > /etc/apt/sources.list.d/openmediavault.list

deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/public sandworm main

deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/packages sandworm main

## Uncomment the following line to add software from the proposed repository.

# deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/public sandworm-proposed main

# deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/packages sandworm-proposed main

## This software is not part of OpenMediaVault, but is offered by third-party

## developers as a service to OpenMediaVault users.

# deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/public sandworm partner

# deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/packages sandworm partner

EOF

安装OMV软件包:

export LANG=C.UTF-8

export DEBIAN_FRONTEND=noninteractive

export APT_LISTCHANGES_FRONTEND=none

apt-get update

apt-get --yes --auto-remove --show-upgraded \

--allow-downgrades --allow-change-held-packages \

--no-install-recommends \

--option DPkg::Options::="--force-confdef" \

--option DPkg::Options::="--force-confold" \

install openmediavault

执行这个命令之后,开始从OMV源下载软件版安装。

软件下载和安装需要较长时间,耐心等待安装完毕。

安装失败问题解决:

Failed to preset unit, unit /etc/systemd/system/systemd-networkd.service is masked.

/usr/bin/deb-systemd-helper: error: systemctl preset failed on systemd-networkd.service: No such file or directory

dpkg: error processing package openmediavault (--configure):

installed openmediavault package post-installation script subprocess returned error exit status 1

Processing triggers for libc-bin (2.36-9+deb12u4) ...

Processing triggers for rsyslog (8.2302.0-1) ...

Processing triggers for man-db (2.11.2-2) ...

Processing triggers for dbus (1.14.10-1~deb12u1) ...

Processing triggers for initramfs-tools (0.142) ...

update-initramfs: Generating /boot/initrd.img-6.6.16-current-arm64

Processing triggers for php8.2-cli (8.2.18-1~deb12u1) ...

Processing triggers for php8.2-fpm (8.2.18-1~deb12u1) ...

Processing triggers for php8.2-cgi (8.2.18-1~deb12u1) ...

Errors were encountered while processing:

openmediavault

E: Sub-process /usr/bin/dpkg returned an error code (1)

失败原因是/etc/systemd/system/systemd-networkd.service文件是指向/dev/null的软连接:

root@uefi-arm64:~# ls -al /etc/systemd/system/systemd-networkd.service

lrwxrwxrwx 1 root root 9 Feb 13 18:45 /etc/systemd/system/systemd-networkd.service -> /dev/null

解决办法是删除该文件,然后执行修复安装:

rm /etc/systemd/system/systemd-networkd.service

apt install -f

也可以在安装之前先删除这个文件,这样就不会有这个问题了。

安装最后的update-initramfs步骤需要花较长时间:

update-initramfs: Generating /boot/initrd.img-6.6.16-current-arm64

启动失败问题解决:

重启之后,查看TCP端口,并没有发现web服务(workbench)的80端口。

回头检查启动过程的日志,可以发现nginx.service服务启动失败:

[FAILED] Failed to start nginx.serv…server and a reverse proxy server.

See 'systemctl status nginx.service' for details.

失败原因是/var/log/nginx/error.log文件不存在,实际上/var/log/nginx目录不存在。

再往前看,还有两个失败:

一个是 systemd-networkd-wait-online.service启动失败:

[ *] Job systemd-networkd-wait-online.se…ice/start running (49s / no limit)

[FAILED] Failed to start systemd-ne…Wait for Network to be Configured.

See 'systemctl status systemd-networkd-wait-online.service' for details.

这个失败可以忽略。

另外一个是armbian-ramlog.service启动失败:

[ 58.738034] systemd[1]: armbian-ramlog.service: Main process exited, code=killed, status=15/TERM

[ 59.154114] systemd[1]: armbian-ramlog.service: Failed with result 'timeout'.

[FAILED] Failed to start armbian-ra… Armbian memory supported logging.

See 'systemctl status armbian-ramlog.service' for details.

这个失败原因是启动超时。

armbian-ramlog.service服务负责创建和恢复/var/log/nginx目录和日志,启动失败导致nginx日志目录和文件无法创建。

检查服务安装情况:

dpkg -s "nginx" 2>/dev/null | awk -F": " '/^Status/ {print $2}'

dpkg -s "apache2" 2>/dev/null | awk -F": " '/^Status/ {print $2}'

dpkg -s "samba" 2>/dev/null | awk -F": " '/^Status/ {print $2}'

dpkg -s "cron-apt" 2>/dev/null | awk -F": " '/^Status/ {print $2}'

dpkg -s "proftpd-basic" 2>/dev/null | awk -F": " '/^Status/ {print $2}'

dpkg -s "lighttpd" 2>/dev/null | awk -F": " '/^Status/ {print $2}'

dpkg -s "unattended-upgrades" 2>/dev/null | awk -F": " '/^Status/ {print $2}'

这些服务需要在/var/log/目录创建子目录保存日志,而/var/log/目录的内容是保存在内存中的,是用zram内存区域虚拟的硬盘(Mounting /dev/zram1 as /var/log),重启之后数据丢失,需要重新创建子目录。/usr/lib/armbian/armbian-ramlog负责系统启动后自动创建这些子目录(以及从硬盘恢复日志数据),通过armbian-ramlog.service服务运行

解决办法:

armbian-ramlog.service服务启动需要一分多钟,默认30s无法完成启动,因此需要等待长一点时间(例如3分钟,如果改为0s,则不检测超时)。

修改armbian-ramlog.service服务文件:

vi /etc/systemd/system/sysinit.target.wants/armbian-ramlog.service

将默认TimeoutStartSec=30sec

改为TimeoutStartSec=180sec

保存后重启系统

armbian-ramlog.service服务启动时间也可以在安装OMV软件之前就修改

注:

如果在QEMU终端修改,默认vi窗口大小只有23行76列,看起来不舒服甚至显示错乱,可以通过stty命令修改终端大小,例如:

stty rows 36 cols 140

需要注意的是,窗口大小不要超过虚拟终端行列大小(主机上可以通用stty -a查看),不然vi窗口显示也会错乱。

打开OMV管理页面(workbench):

系统重启之后,在登录界面可以看到系统IP,以及OMV管理web的用户名和密码:

使用浏览器打开这个web页面:

可以使用IPv4地址:

也可以使用IPv6地址(需要将IPv6地址放在方括号内):

输入用户名和密码登录后,可以看到WEB管理页面:

配置普通用户ssh登录:

安装完OMV软件后,Armbian系统第一次启动时创建的普通用户不能ssh登录(在安装OMV之前是可以登录的)。

可以通过OMV管理界面,编辑用户信息,将用户加入_ssh组,保存并应用之后就可以了。

配置SMB服务:

配置SMB服务有几个主要的步骤:

1、使用OMV数据盘创建文件系统并挂载。

2、在上面挂载的文件系统上创建共享文件夹。

3、配置共享文件夹权限。

4、用前面创建的共享文件夹配置SMB/CIFS服务共享。

5、在用户管理页面,创建用户,给用户配置访问共享文件夹的权限。

6、通过系统创建的用户,需要使用smbpasswd命令将用户配置为samba用户。可以使用pdbedit -L命令查询samba用户列表。

打开存储器配置界面,创建EXT4文件系统,选择OMV数据盘(/dev/sdb),保存:

然后挂载该文件系统,保存并应用:

成功之后可以看到挂载的文件系统:

打开共享文件夹页面创建共享文件夹

配置好共享文件夹的名称、路径、权限,保存并应用:

成功后可以看到刚才创建的共享文件夹:

配置共享文件夹权限,给用户和用户组增加读写权限,保存并应用:

进入SMB/CIFS服务,配置共享:

选择刚才创建的共享文件夹,保存并应用:

成功之后,在SMB/CIFS共享页面,可以看到刚才创建的SMB共享文件夹:

可以在OMV系统上使用netstat -antp命令看到smbd服务端口139已经开启。

此时,在文件管理器输入smb://192.168.3.191可以打开SMB服务器,看到共享文件夹,但是无法访问该文件夹。

将用户添加到sambashare组,保存并应用:

但这个时候仍然无法打开共享文件夹,并且使用smbclient命令浏览共享文件夹也可能会失败:

smbclient --user=alpha -L 192.168.3.191

Password for [WORKGROUP\alpha]:

session setup failed: NT_STATUS_LOGON_FAILURE

系统创建的用户,无法通过WEB配置访问SMB服务,需要在系统上通过smbpasswd命令将用户配置为samba用户才可以:

sudo smbpasswd alpha

执行该命令后,用户可以正常打开OMV共享目录了。

通过OMV的用户管理创建的用户,按照上面的配置,直接可以访问SMB共享文件夹。

例如创建一个名为samba的用户,用户组为sambashare,保存并应用:

在用户权限管理页面,配置用户访问SMB共享文件夹的权限,保存并应用,就可以访问SMB共享文件夹了:

电脑打开smb://192.168.3.191访问共享文件夹:

连接在同一个网络手机也可以访问SMB共享文件夹,通过文件管理的网络邻居扫描网络邻居,可以找个OMV主机,使用前面配置的samba用户(alpha或者samba两个用户),就可以打开共享文件夹了。

========================================================

测试定位问题过程参考:

下载Armbian镜像(qemu-uboot-arm64镜像):

从https://www.armbian.com/download/入口,选择qemu,aarch64,就可以找到qemu-uboot-arm64镜像了。

下载Armbian Noble Minimal (U-boot bin):

https://github.com/armbian/os/releases/download/24.5.0-trunk.558/Armbian_24.5.0-trunk.558_Qemu-uboot-arm64_noble_current_6.6.30_minimal.u-boot.bin.xz

下载Armbian Noble Minimal (QCOW2):

https://github.com/armbian/os/releases/download/24.5.0-trunk.558/Armbian_24.5.0-trunk.558_Qemu-uboot-arm64_noble_current_6.6.30_minimal.img.qcow2.xz

下载uefi-arm64镜像:

从https://www.armbian.com/download/入口,选择ARM,aarch64,找到uefi-arm64镜像:

下载Armbian 24.2.1 Bookworm CLI(OMV不支持桌面环境,因此下载这个版本):

https://dl.armbian.com/uefi-arm64/archive/Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img.xz

或者

https://dl.armbian.com/uefi-arm64/archive/Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16_minimal.img.xz

启动Armbian系统(uefi-arm64镜像):

先解压Armbian镜像:

xz -kd Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img.xz

带GUI启动Armbian系统:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -smp 8 -m 8G-drive file=Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img,if=virtio -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd

运行命令后会显示QEMU窗口,将View菜单切换到serial0项可以看到系统输出:

不带GUI启动Armbian系统:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -smp 8 -m 8G -drive file=Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img,if=virtio -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -nographic

启动uefi-arm64镜像需要指定-bios参数,可以使用qemu安装的BIOS,默认路径/usr/share/qemu-efi-aarch64/QEMU_EFI.fd。

启动虚拟加上端口转发,以便可以在主机上访问虚拟机上的服务

qemu-system-aarch64 -machine virt -cpu cortex-a57 -smp 8 -m 8G -drive file=Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img,if=virtio -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -nographic -nic user,model=virtio-net-pci,hostfwd=tcp::20022-:22,hostfwd=tcp::20080-:80,hostfwd=tcp::20139-:139

增加数据盘:

先创建一个qcow2格式的虚拟硬盘:

qemu-img create -f qcow2 omvdata.qcow2 16G

把这个硬盘加到系统上:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -smp 8 -m 8G -drive file=Armbian_24.2.1_Uefi-arm64_bookworm_current_6.6.16.img,if=virtio -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -nographic -nic user,model=virtio-net-pci,hostfwd=tcp::20022-:22,hostfwd=tcp::20080-:80,hostfwd=tcp::20139-:139 -drive file=omvdata.qcow2,if=virtio

创建SMB共享目录,使用端口转发的方式不能访问在主机访问共享目录。

使用连接网桥的虚拟网卡启动系统:

sudo qemu-system-aarch64 -machine virt -cpu cortex-a57 -smp 8 -m 8G -drive file=Armbian_24.2.1_U

efi-arm64_bookworm_current_6.6.16.img,if=virtio -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -nographic -drive file=omvdata.qcow2,if=virtio -net nic -net tap,ifname=tap0

启动Armbian系统(qemu-uboot-arm64镜像):

TODO

===================================================================

参考:

Armbian(默认用户名/密码):https://docs.armbian.com/

OMV硬件要求:https://docs.openmediavault.org/en/stable/prerequisites.html

OMV安装指导:https://docs.openmediavault.org/en/stable/installation/index.html

OMV安装指导:https://docs.openmediavault.org/en/stable/installation/on_debian.html

OMV 版本:Releases — openmediavault 7.x.y documentation

OMV清华源:https://mirrors.tuna.tsinghua.edu.cn/help/openmediavault/

OMV 编译与安装:一起NAS吧!开源NAS系统Openmediavault 编译与安装过程 - 哔哩哔哩

修改vi窗口大小:https://superuser.com/questions/598877/vi-only-show-16-lines-how-to-show-full-screen

zRAM 内存压缩机制:https://cloud.tencent.com/developer/article/2335437

systemd和TimeoutStartSechttps://www.freedesktop.org/software/systemd/man/latest/systemd.service.html

虚拟网桥和虚拟网卡配置:Documentation/Networking - QEMU

虚拟网桥和虚拟网卡配置:https://blog.csdn.net/qq_38505969/article/details/129645659

虚拟网桥和虚拟网卡配置:https://unix.stackexchange.com/questions/714921/adding-a-physical-ethernet-interface-to-kvm-qemu-bridge

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1720659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小学数学出题器-Word插件-大珩助手

Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&#xff0c;从而打造出专业而精美的文档。 【新功能】小学数学出题器 1、实现了难度设定&#xff1b;…

[每周一更]-(第99期):MySQL的索引为什么用B+树?

文章目录 B树与B树的基本概念B树&#xff08;Balanced Tree&#xff09;B树&#xff08;B-Plus Tree&#xff09;对比 为什么MySQL选择B树1. **磁盘I/O效率**2. **更稳定的查询性能**3. **更高的空间利用率**4. **并发控制** 其他树结构的比较参考 索引是一种 数据结构&#x…

笔记-docker基于ubuntu22.04安装Jitsi Meet

背景 利用JitsiMeet打造一个可以在线会议的环境&#xff0c;根据躺的坑&#xff0c;做个记录 参考 JitsMeet部署安装说明 开始操作 环境 docker run -it --name ubuntu22.04 ubuntu:22.04 /bin/bash问题 1、安装 openjdk-11 apt install openjdk-11-jdk配置环境变量&…

Arduino RP2040 CDC虚拟串口通讯--普通串口不显示

这两天在用RP2040运行些程序&#xff0c;但发现一个问题&#xff0c;使用arduino IDE可以通过串口显示数据&#xff0c;但是其他串口工具不会显示数据&#xff0c;可以打开串口&#xff0c;排查一下午无果&#xff0c;相当头疼&#xff0c; 晚上搜索时发现这个介绍&#xff1a…

strcpy、strncpy、strcat、strncat、strcmp、strstr字符串函数的使用和模拟

strcpy的使用和模拟&#xff08;作用&#xff09; 将一个字符串的内容复制到另外一个字符串中代替掉。 strcpy的使用效果 #include <stdio.h> #include <string.h>int main () {char str1[]"Sample string";char str2[40];char str3[40];strcpy (str2…

使用pytorch搭建textCNN、BERT、transformer进行文本分类

首先展示数据处理后的类型&#xff1a; 第一列为文本&#xff0c;第二类为标注的标签&#xff0c;数据保存在xlsx的表格中&#xff0c;分为训练集和验证集。 textCNN 直接上整个工程代码&#xff1a; import pandas as pd import numpy as np import torch from torch.util…

Java排序算法汇总篇,八种排序算法

排序算法汇总: Java排序算法(一)&#xff1a;冒泡排序 Java排序算法(二)&#xff1a;选择排序 Java排序算法(三)&#xff1a;插入排序 Java排序算法(四)&#xff1a;快速排序 Java排序算法(五)&#xff1a;归并排序 Java排序算法(六)&#xff1a;希尔排序 Java排序算法(…

vm-bhyve网卡设定桥接故障解决@FreeBSD

问题 在使用vm-bhyve虚拟机管理软件的时候&#xff0c;使用vm无法绑定网卡igb0 vm switch add public igb0 报错&#xff1a;/usr/local/sbin/vm: ERROR: failed to add member igb0 to the virtual switch public 解决 于是准备用原生ifconfig命令来绑定&#xff0c;结果…

Pytorch的学习

1.基本数据&#xff1a;Tensor Tensor&#xff0c;即张量&#xff0c;是PyTorch中的基本操作对象&#xff0c;可以看做是包含单一数据类型元素的多维矩阵。从使用角度来看&#xff0c;Tensor与NumPy的ndarrays非常类似&#xff0c;相互之间也可以自由转换&#xff0c;只不过Te…

六一儿童节与AIGC:科技与童趣的奇妙融

随着人工智能生成内容&#xff08;AIGC&#xff09;技术的发展&#xff0c;越来越多的应用和网站专门为儿童提供学习、游戏和绘画方面的支持。这些平台不仅能够提高孩子们的学习兴趣&#xff0c;还能激发他们的创造力。在六一儿童节即将到来之际&#xff0c;让我们来介绍几款利…

Jmeter安装教程

1 Jmeter下载 Jmeter下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi&#xff0c;选择需要的版本点击下载 解压jmeter安装包 解压后的安装包如下&#xff1a; 2 配置Jmeter环境变量 进入环境变量配置页面&#xff1a;计算机->属性->高级系统设置-&…

javascript DOM 属性详解:读取、修改、移除

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、读取…

[Algorithm][动态规划][子序列问题][最长递增子序列的个数][最长数对链]详细讲解

目录 1.最长递增子序列的个数1.题目链接2.算法原理详解3.代码实现 2.最长数对链1.题目链接2.算法原理详解3.代码实现 1.最长递增子序列的个数 1.题目链接 最长递增子序列的个数 2.算法原理详解 注意&#xff1a;本题思路和思维方式及用到的方法很值得考究&#xff0c;个人感…

springboot 项目集成 knife4j

官方版本推荐 版本依赖 spring boot 2.3.12.RELEASE 和 knife4j 2.0.9 引入依赖 完整的pom.xml文件 <!-- https://mvnrepository.com/artifact/com.github.xiaoymin/knife4j-spring-boot-starter --> <dependency><groupId>com.github.xiaoymin</groupI…

C# 类型系统

1. 隐式类型 c#允许使用 var 声明变量&#xff0c;编译期会通过初始化语句右侧的表达式推断出变量的类型。 // i is compiled as an int var i 5;// s is compiled as a string var s "Hello";// a is compiled as int[] var a new[] { 0, 1, 2 };// expr is co…

人脸识别模型与人类视觉识别的对比——评估人脸识别模型存在偏见是否比人类的偏见大?

1. 概述 人脸识别系统是一个几十年来一直备受关注的研究领域。而且在过去的几年中。公司和政府一直在积极引入人脸识别系统&#xff0c;并且我们看到越来越多的机会可以看到人脸识别系统。例如&#xff0c;有的系统可以随便介绍&#xff0c;如搜索特定人的图像&#xff08;图像…

关系数据库:关系运算

文章目录 关系运算并&#xff08;Union&#xff09;差&#xff08;Difference&#xff09;交&#xff08;Intersection&#xff09;笛卡尔积&#xff08;Extended Cartesian Product&#xff09;投影&#xff08;projection&#xff09;选择&#xff08;Selection&#xff09;除…

[Linux]vsftp配置大全---超完整版

[Linux]vsftp配置大全---超完整版 以下文章介绍Liunx 环境下vsftpd的三种实现方法 一、前言 Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器&#xff0c;目前已经被许多大型站点所采用&#xff0c;如ftp.redhat.com,ftp.kde.org,ftp.gnome.org.等。…

switch语句

作用 让顺序执行的代码&#xff0c;产生分支。 基本语法 switch(变量) {//变量 常量 执行 case和 break之间的代码case 常量:满足条件执行的代码逻辑;break;case 常量:满足条件执行的代码逻辑;break;//case 可以有无数个default://如果上面case的条件都不满足 就会执行 def…

js四舍五入和计算精度问题处理

js四舍五入和计算精度问题处理 目录 js四舍五入和计算精度问题处理错误计算方法示例代码 js中加减乘除&#xff0c;部分数据会存在计算不准确。 错误计算 我使用的是big.js&#xff0c;基于big.js库封装了下工具方法&#xff0c;当然也可以用其他库&#xff0c;如mathjs/bignu…