我是 ubunto 新手,想在 VM 中运行它,因此已成功安装了 multipass,并在 Hyper V 中运行了 ubunto VM。连接到 VM 时,系统要求我输入登录名和密码,是否有默认的?或者我可以从 multipass 命令行设置它们吗?我在文档中找不到任何信息。
我也尝试在命名的运行实例上使用 shell,但连接失败,并显示消息“ssh 连接失败:'无法解析主机名 primary.mshome.net(没有已知此主机。)”然后我尝试仅使用“multipass shell”命令创建一个实例。它创建了一个正在运行的主实例,结果相同。
欢迎提出任何建议
答案1
这可能有点晚了,但您可以从 multipass 登录实例,而无需输入用户名和密码。从那里,您可以设置密码,以便使用 Hyper V 登录。
首先找到您的实例的名称
multipass list
然后通过多通道登录实例
multipass shell <instance name>
接下来你可以为默认的 ubuntu 用户设置密码
sudo passwd ubuntu
现在,当您尝试使用 hyper v 登录时,只需使用ubuntu
用户名和您设置的密码即可。
答案2
对于 shell 连接问题,我建议您检查 Windows 中的 host.ics 文件 (C:\WINDOWS\System32\drivers\etc\hosts.ics)。如果您在那里发现重复的条目,请删除最后的条目并尝试重新连接。通常这可以解决问题,并且您会看到使用下一个命令再次显示实例的 IP:
multipass list
关于 ubuntu 密码,我认为通过 ssh 需要任何密码,但通过 Hyper-V 的“直接访问”则需要,正如您所说。可能无法使用密码登录,因为默认的 ubuntu 密码配置为“--disabled”。
答案3
结论
如果多通道 shell 无法正常工作,您可以通过 ssh 连接。
ssh ubuntu@vm-ip-address -i /var/snap/multipass/common/data/multipassd/ssh-keys/id_rsa
Multipass 实例默认没有可用的密码。
$ passwd --status ubuntu
ubuntu L 04/03/2021 0 99999 7 -1
L 表示密码锁定。
这是故意
如果您因某种原因失去了对虚拟机的访问权限(例如,搞乱了网络配置,我就遇到过这种情况:D)。
您可以使用默认的 ssh 私钥登录。您可以在以下位置找到私钥:
/var/snap/multipass/common/data/multipassd/ssh-keys/id_rsa
如果您通过 snap 安装它。
您也可以使用定位来找到它。
$ locate id_rsa | grep multipass
并使用 ssh 连接到虚拟机:
ssh ubuntu@vm-ip-address -i /var/snap/multipass/common/data/multipassd/ssh-keys/id_rsa
您可能需要将 ssh 密钥的所有权更改为您的用户帐户。我的当前设置为 root。
要找到虚拟机 IP 地址,这取决于后端。我使用的是 libvirt。
virsh net-dhcp-leases default
答案4
为了实现自动化,您可以将自己的 ssh 密钥安装到多通道 VM。这很有用,因为最近的 ubuntu 映像上禁用了密码验证。因此,在没有 ssh 密钥验证的情况下 ssh 到 VM 时,您将得到类似以下内容:
[email protected]: Permission denied (publickey).
以下是一句话:
cat ~/.ssh/yourssh.pub | multipass exec $vm_instance -- bash -c 'cat >> ~/.ssh/authorized_keys'
解释:
cat ~/.ssh/yourssh.pub
获取你最喜欢的 ssh 密钥的内容(如果你还没有密钥,可能需要创建一个),它将在下一个命令中通过 stdin 传输multipass exec $vm_instance -- bash -c
在虚拟机上执行 bash,前一个命令的标准输出cat
附加到 bash 的标准输入。-c
将在虚拟机内执行下一个命令cat >> ~/.ssh/authorized_keys
在虚拟机上执行的远程命令:它获取 stdin 的内容(管道 ssh 公钥)并附加到>>
本地~/.ssh/authorized_keys
,这是存储授权连接的密钥的文件。由于 sshd 已安装,因此该文件存在并且已具有 sshd 所需的正确权限和所有权。
测试一下:
ssh ubuntu@$ip_of_the_vm
并且(如果您的ssh-agent
或 ssh 相关配置运行良好)您就可以进入新的 VM 了!
想要更多自动化吗?
好了,走吧!云初始化这里有个技巧,而不是通过管道传输 ssh 公钥后VM 已创建,您可以请求multipass
处理它在创建时。而且它是可重复使用的。我不会在这里详细介绍所有额外的知识,如 yaml 语法和相关内容,但您可以开始:
编辑:最初发布的示例用于
/home/ubuntu/sshkey.pub
将密钥存储为本地文件。这会产生严重的副作用,即改变父文件夹的所有权,
root:root
这是非常错误的。multipass exec vm -- bash -c 'ls -ld $HOME' drwxr-xr-x 3 root root 4096 Jul 15 12:50 /home/ubuntu
创建一个 YAML 文件cloud-init.yaml
:
#cloud-config
# ^^ this is not a comment above, but a shebang like parser hint, keep it!
write_files:
# the content here is the verbatim one line full content of your yourssh.pub
# here a small fresh generated with:
# ssh-keygen -t ed25519 -C mykey@laptop -f ~/.ssh/yourssh
- content: |
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDsDOXWBOFIEoIctYaXxHAtTtfS3JHAijxHwkOb3IgoW mykey@laptop
# may you should keep an empty line above ^^
# the filename sshkey.pub will be created as root:root owner
path: /tmp/sshkey.pub
# yes, cloud-init has an ssh key management code too :-)
# here a simple append will also do the trick...
runcmd:
- cat /tmp/sshkey.pub >> /home/ubuntu/.ssh/authorized_keys
然后创建你的虚拟机:
multipass launch -n vm --cloud-init ./cloud-init.yaml
测试一下...并享受自动化的乐趣