据我了解,通常允许多个 SFTP 连接。我想问一下,即使在VM(虚拟机)中也可以这样做吗?换句话说,我想在同一台虚拟机中建立多个SFTP连接。
请注意,虚拟机的用途是允许访问位于集群中的研究团队的存储空间。
据我了解,通常允许多个 SFTP 连接。我想问一下,即使在VM(虚拟机)中也可以这样做吗?换句话说,我想在同一台虚拟机中建立多个SFTP连接。
请注意,虚拟机的用途是允许访问位于集群中的研究团队的存储空间。
以下是我在终端内所做的三个示例(第三个有 sudo):
at now + 5 minutes
(交互式:)
at> shutdown --poweroff now
echo "sbin/shutdown -h now" | at 14:50
echo "/sbin/shutdown -h 16:22" | at now
在每种情况下,我都可以验证使用该命令安排的一次性作业atq
,但该shutdown --show
命令显示“无计划关闭”。
系统应at
在睡眠后运行的预定时间关闭。
这是在 CentOS 9 Stream 来宾虚拟机上。该用户已添加到 sudo 用户组,可以使用类似 的命令启动关闭shutdown now
。那么,与一次性at
工作有什么区别呢?
配置:
我想将操作系统中的squashfs 剥离出来,并在我的Mac 上模拟的amd64 虚拟机上启动它。我成功提取了 Ubuntu 操作系统。我安装了 squashfs 并将内容复制到我使用 dd 创建的 img 文件中。我在 Mac 上复制了映像,但当我尝试启动虚拟机时显示“无可启动设备”。
以下是我使用的命令,来自支持的 Linux 虚拟机
mount -t squashfs -o loop /path/to/filesystem.squashfs /sqshfs/mount/point
我创建了一个空映像并制作了一个 ext4 fs
dd if=/dev/zeroes of=image.img bs=1M count=15000
mkfs.ext4 image.img
安装它并复制文件
mount -t auto image.img /img/mount/point
cp -r /sqshfs/mount/point/* /img/mount/point
现在在图像上我有这个文件夹
total 112
drwxr-xr-x 2 root root 4096 Jan 10 02:37 bin
drwxr-xr-x 3 root root 4096 Jan 10 02:37 boot
drwxr-xr-x 4 root root 4096 Jan 10 02:37 dev
drwxr-xr-x 147 root root 12288 Jan 10 02:37 etc
drwxr-xr-x 3 root root 4096 Jan 10 02:37 home
lrwxrwxrwx 1 root root 33 Jan 10 02:37 initrd.img -> boot/initrd.img-5.4.0-150-generic
lrwxrwxrwx 1 root root 33 Jan 10 02:37 initrd.img.old -> boot/initrd.img-5.4.0-148-generic
drwxr-xr-x 23 root root 4096 Jan 10 02:37 lib
drwxr-xr-x 2 root root 4096 Jan 10 02:37 lib64
drwx------ 2 root root 16384 Jan 10 02:36 lost+found
drwxr-xr-x 2 root root 4096 Jan 10 02:37 media
drwxr-xr-x 2 root root 4096 Jan 10 02:37 mnt
drwxr-xr-x 5 root root 4096 Jan 10 02:37 opt
drwxr-xr-x 2 root root 4096 Jan 10 02:37 proc
drwx------ 3 root root 4096 Jan 10 02:37 root
drwxr-xr-x 2 root root 4096 Jan 10 02:37 run
drwxr-xr-x 2 root root 12288 Jan 10 02:37 sbin
drwxr-xr-x 2 root root 4096 Jan 10 02:37 snap
drwxr-xr-x 2 root root 4096 Jan 10 02:37 srv
drwxr-xr-x 2 root root 4096 Jan 10 02:37 sys
drwxr-xr-t 2 root root 4096 Jan 10 02:37 tmp
drwxr-xr-x 11 root root 4096 Jan 10 02:38 usr
drwxr-xr-x 15 root root 4096 Jan 10 02:38 var
lrwxrwxrwx 1 root root 30 Jan 10 02:38 vmlinuz -> boot/vmlinuz-5.4.0-150-generic
lrwxrwxrwx 1 root root 30 Jan 10 02:38 vmlinuz.old -> boot/vmlinuz-5.4.0-148-generic
在qcow2中转换img
qemu-img convert -f raw -O qcow2 -c image.img image.qcow2
并配置QEMU如下
qemu-system-x86_64 \
-name TEST \
-cpu qemu64-v1 \
-smp cpus=4,sockets=1,cores=4,threads=1 \
-machine pc-q35-7.2,vmport=off,i8042=off,hpet=off \
-accel tcg,thread=multi,tb-size=1024 \
-m 4096 \
-drive file=/Users/steve/VMs/image.qcow2 \
-boot menu=on
当我尝试启动虚拟机时,显示“无可启动设备”。我是 abt QEMU 的新手,我知道这个配置遗漏了一些东西,但它至少应该尝试引导内核。图形用户界面?
据我所知,建议禁用 VM 映像的写入时复制,以避免 BTRFS 性能下降。然而,没有人建议不要使用qcow2
磁盘映像格式,尽管它是写磁盘上的副本。
这背后的原因是什么?BTRFS的CoW和CoW在技术上有什么区别qcow2
?
一个用户帐户A
可以运行启用了 kvm 的 qemu VM,并带有选项-enable-kvm
。
但用户A
无权访问/dev/kvm
. 相关用户组及/dev/kvm
权限如下。
$ id
uid=1004(A) gid=1004(A) groups=1004(A),100(users)
$ stat /dev/kvm
File: /dev/kvm
Size: 0 Blocks: 0 IO Block: 4096 character special file
Device: 0,5 Inode: 714 Links: 1 Device type: 10,232
Access: (0660/crw-rw----) Uid: ( 0/ root) Gid: ( 104/ kvm)
根据[SOLVED] Qemu with KVM 失败、权限被拒绝等帖子,用户需要有权/dev/kvm
使用启用 kvm 的 qemu 虚拟机。这通常是通过将用户放入组中来完成的kvm
。
为什么用户A
能够将 qemu VM 与 KVM 一起使用?
系统信息:
我正在按照Fedora wiki 上的指南将 GNOME Boxes 虚拟机从 Fedora 迁移到 Guix 。
在 Fedora 工作站上:
$ virsh list --all
Id Name State
-------------------------------
- win10 shut off
$ cd ~
$ virsh dumpxml win10 >win10.xml
$ mv .local/share/gnome-boxes/images/win10 win10
然后,我将win10
和移动win10.xml
到新计算机的主目录。在 Guix 系统上:
$ guix install gnome-boxes
$ cd ~
$ mv win10 .local/share/gnome-boxes/images/win10
$ guix install libvirt
$ virsh create win10.xml
error: Failed to create domain from win10.xml
error: Cannot check QEMU binary /usr/bin/qemu-system-x86_64: No such file or directory
qemu-system-x84_64
位于不同的地方:
$ type qemu-system-x86_64
qemu-system-x86_64 is /run/current-system/profile/bin/qemu-system-x86_64
那么,如何完成虚拟机的导入呢?
我正在尝试在虚拟机中运行一个简单的单文件 C 程序。其实就是fork bomb c程序:
#include <stdio.h>
#include <sys/types.h>
int main()
{
while(1)
{
fork();
}
return 0;
}
我想这样做是为了检查这个虚拟机对系统上运行的另一个虚拟机有多大影响。
我想知道在 VM 中执行此操作的最简单方法是什么,如果可能的话,可以避免下载、编译和构建整个 Ubuntu/其他 Linux VM。我经常使用 Unikernels 来做这些事情,但是我知道的大多数都不支持 fork() 系统调用。
Qemu 虚拟机连接局域网主要有两种方式:type=user
或type=tap
. 该user
模式将私有网络中的虚拟机完全隔离,通过 sNAT 托管主网络堆栈。使用tap
比较复杂,需要一个virtualbridge
成为master一个物理接口(eth0
)和虚拟接口(tap0
)。这tap0
就像一个管道,用于从外部世界和主机流向 VM 的数据。我花了很多时间试图调节tap0
主机端接口上的网络流量iptables
/nftables
例如将所有 http 请求重定向到某个内部 ip 地址,但没有成功。所有的建议、论坛和 wiki 都推荐了大量的解决方案,但这些解决方案都行不通,主要原因是:来自 VM guest 的数据包永远不会到达主机内核网络堆栈。如果 IP 主机地址不是他们的目标,他们会在网桥级别选择自己的方式,并且不满足任何数据包过滤器链调整的任何防火墙规则。您可以简单地通过将主机全局策略设置为 (with host XYtables) 来尝试DROP
,您可以看到:主机网络完全失效,但来宾可以继续通过网络发送和接收数据包。
好吧,问题是:有没有其他方法,如何将 VM 来宾虚拟连接到主机虚拟网络接口?为了更好地理解图表如下:
General virtual connections for host/VM guest
+---------------------------------------------+
| +-----------------------------+ |
| | iptables host kernel | |
| | nftables network stack | |
| +-------+---------------------+ |
| | |
| +-------+---------+ +-----------+ |
---eth0--+ virtual | | VM | |
| | bridge +-tap-eth0 guest | |
---eth1--+ br0 | | | |
| +-----------------+ +-----------+ |
+---------------------------------------------+
Host became a router for VM guest
+-------------------------------------+
| +----------------+ +---------+ |
---eth0--> host kernel | | VM | |
| | <-vppp guest | |
---eth1--> network stack | | | |
| +----------------+ +---------+ |
+-------------------------------------+
要解决我的问题,必须找到一种方法来控制(例如使用 nftables)虚拟网桥本身的流量,或者如何通过虚拟线路将 VM 来宾网络接口连接到主机的虚拟网络接口。类似于 PPPoE 网络。
但最终和最明确的方法是向 Qemu 用户模式网络添加更多参数,以便能够强制将某些端口(服务)重定向到选定的目标地址,包括主机环回。是的,我向 Qemu 团队表达了这样的愿望,并得到了答复:这不是最重要的功能。
在我的电脑上,我有 2 个独立的 GPU。我一直在使用 VFIO 将第二个 GPU 传递给 Windows VM 以处理某些程序。现在我想将功能更强大的第一个 GPU 传递给 Windows VM 以玩一些游戏。(如果需要,我可以创建第二个 Windows VM,这不是问题)。
我已经用脚本检查了第一个 GPU 是否有自己的 IOMMU 组,它确实有。
问题是,当我正常启动或通过第二个 GPU 时,Gnome DE 和 gdm3 启动没有问题,但当我通过第一个 GPU 时却没有。
显示器会根据传递的 GPU 打开/关闭。
我试过重启 gdm3、kill gnome-shell
、重启,但似乎对 DE 没有任何影响。GDM3不知何故启动了,但它只是得到了密码并返回到用户选择菜单。
脚本的输出:(不包括不必要的东西,只有 2 个 GPU)
IOMMU Group 12:
00:15.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD/ATI] SB700/SB800/SB900 PCI to PCI bridge (PCIE port 0) [1002:43a0]
05:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Cedar [Radeon HD 5000/6000/7350/8350 Series] [1002:68f9]
05:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Cedar HDMI Audio [Radeon HD 5400/6300/7300 Series] [1002:aa68]
IOMMU Group 14:
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Baffin [Radeon RX 460/560D / Pro 450/455/460/555/555X/560/560X] [1002:67ef] (rev cf)
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Baffin HDMI/DP Audio [Radeon RX 550 640SP / RX 560/560X] [1002:aae0]
journalctl -u gdm
当它开始时(无直通):
Feb 11 17:29:53 Alienus-PC systemd[1]: Starting GNOME Display Manager...
Feb 11 17:29:54 Alienus-PC systemd[1]: Started GNOME Display Manager.
Feb 11 17:29:57 Alienus-PC gdm-autologin][1490]: gkr-pam: no password is available for user
Feb 11 17:30:00 Alienus-PC gdm-autologin][1490]: pam_unix(gdm-autologin:session): session opened for user alienus by (uid=0)
journalctl -u gdm
当它不启动时(第一个 GPU passthough):
Feb 11 17:25:58 Alienus-PC systemd[1]: Starting GNOME Display Manager...
Feb 11 17:25:58 Alienus-PC systemd[1]: Started GNOME Display Manager.
Feb 11 17:25:58 Alienus-PC gdm-autologin][2650]: gkr-pam: no password is available for user
Feb 11 17:25:58 Alienus-PC gdm-autologin][2650]: pam_unix(gdm-autologin:session): session opened for user alienus by (uid=0)
Feb 11 17:25:58 Alienus-PC gdm-autologin][2650]: gkr-pam: couldn't unlock the login keyring.
Feb 11 17:25:59 Alienus-PC gdm-autologin][2650]: pam_unix(gdm-autologin:session): session closed for user alienus
Feb 11 17:25:59 Alienus-PC gdm3[1359]: GdmDisplay: Session never registered, failing
Feb 11 17:25:59 Alienus-PC gdm-launch-environment][2659]: pam_unix(gdm-launch-environment:session): session opened for user gdm by (uid=0)
Feb 11 17:25:59 Alienus-PC gdm-launch-environment][2659]: pam_unix(gdm-launch-environment:session): session closed for user gdm
Feb 11 17:25:59 Alienus-PC gdm3[1359]: Child process -2688 was already dead.
journalctl -u gdm
启用调试(/etc/gdm3/custom.conf
,第一个 GPU 直通):https://paste.ubuntu.com/p/cSsDpBynyM/
(输出大约 52k 个字符,我不能在这里发布)
系统规格:
Ubuntu 20.04.5
内核 5.15.0-60-通用
中央处理器AMD FX 6100
第一个 GPU AMD RX 460 4G
第二个 GPU AMD Radeon 5450
简而言之: 我的名为 CONAN01 的虚拟机没有在 gnome-boxes 中启动,我收到/看到不同的错误并且不知道它们背后的真正问题是什么:
错误一:
从 Gnome 桌面环境启动 gnome-boxes 并单击我的虚拟机 CONAN01 启动它时,我收到一条弹出消息,其中包含打开错误日志的选项,在此错误日志中我可以看到最后几行,状态:
2022-06-15 09:39:22.707+0000: Domain id=1 is tainted: host-cpu
char device redirected to /dev/pts/0 (label charserial0)
2022-06-15T09:39:22.800582Z qemu-system-x86_64: warning: This family of AMD CPU doesn't support hyperthreading(2)
Please configure -smp options properly or try enabling topoext feature.
2022-06-15T10:30:56.757942Z qemu-system-x86_64: terminating on signal 15 from pid 3544 (/lib/systemd/systemd)
错误二:
当使用终端启动 gnome-boxes 然后使用鼠标单击并运行我的虚拟机 CONAN01 时,我收到以下错误:
侏儒盒子
gnome-boxes 启动时的错误输出:
(gnome-boxes:709111): Gtk-WARNING **: 22:02:27.216: GtkFlowBox with a model will ignore sort and filter functions
(gnome-boxes:709111): Gtk-WARNING **: 22:02:27.217: GtkListBox with a model will ignore sort and filter functions
(gnome-boxes:709111): GLib-GObject-WARNING **: 22:02:28.067: ../../../gobject/gsignal.c:2715: handler '2888' of instance '0x562fb55b44e0' is not blocked
虚拟机 CONAN01 启动时的错误输出:
(gnome-boxes:709111): Boxes-WARNING **: 22:02:32.045: machine.vala:605: Failed to start CONAN01: Unable to start domain: internal error: /usr/lib/qemu/qemu-bridge-helper --use-vnet --br=virbr0 --fd=31: failed to communicate with bridge helper: Transport endpoint is not connected
stderr=failed to create tun device: Operation not permitted
错误三:
当执行 gnome-boxes – CLI 通过执行必要的命令进行检查时,我收到以下信息:
gnome-boxes --checks
信息输出:
(gnome-boxes:717997): Boxes-WARNING **: 22:50:30.599: util-app.vala:376: Failed to execute child process ?restorecon? (No such file or directory)
• The CPU is capable of virtualization: yes
• The KVM module is loaded: yes
• Libvirt KVM guest available: yes
• Boxes storage pool available: no
/root/.local/share/gnome-boxes/images is known to libvirt as GNOME Boxes’s storage pool but this directory does not exist
• The SELinux context is default: no
Report bugs to <http://gitlab.gnome.org/gnome/gnome-boxes/issues>.
Boxes home page: <https://wiki.gnome.org/Apps/Boxes>.
尽管使用必要的命令更改了存储池的位置,但显示 XML 的输出 – 配置没有更改,virsh 和 gnome-boxes 仍然认为旧位置有效,我打算更改“/home/myusername/ .local/share/gnome-boxes/images”:
virsh pool-info gnome-boxes
Name: gnome-boxes
UUID: edb0bf37-df0f-4295-a3cf-0ced96970de0
State: running
Persistent: yes
Autostart: yes
Capacity: 907,44 GiB
Allocation: 531,49 GiB
Available: 375,95 GiB
virsh pool-dumpxml gnome-boxes
<pool type='dir'>
<name>gnome-boxes</name>
<uuid>edb0bf37-df0f-4295-a3cf-0ced96970de0</uuid>
<capacity unit='bytes'>974357393408</capacity>
<allocation unit='bytes'>570679726080</allocation>
<available unit='bytes'>403677667328</available>
<source>
</source>
<target>
<path>/root/.local/share/gnome-boxes/images</path>
<permissions>
<mode>0744</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>
sudo virsh pool-edit gnome-boxes
virsh pool-dumpxml gnome-boxes
<pool type='dir'>
<name>gnome-boxes</name>
<uuid>edb0bf37-df0f-4295-a3cf-0ced96970de0</uuid>
<capacity unit='bytes'>974357393408</capacity>
<allocation unit='bytes'>570679726080</allocation>
<available unit='bytes'>403677667328</available>
<source>
</source>
<target>
<path>/root/.local/share/gnome-boxes/images</path>
<permissions>
<mode>0744</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>