Answers:
任何真正的虚拟化都需要对CPU的低级访问,因此root必须安装它。安装完成后,您无需root用户即可运行它。您可能以非root用户身份(例如bochs)或适配器(例如wine)安装并运行模拟器。如果您有特定的Windows应用程序,则可以在wine下运行(也许)。
用户模式Linux是完全在用户空间中运行的Linux虚拟化解决方案-不需要root特权。
但是,它只能在Linux主机中运行Linux guest虚拟机,因此如果您要运行其他任何内容,则不合适。
要使用我的qemu的预编译图像/编译版本,请从此处下载它,然后将其解压缩:
tar -xvzf qemu_packed.tar.gz
您也可以从这里下载我的debian 8映像(1.6G):
tar -xvzf test01.qcow2.tar.gz
最后跑
./command.sh
您应该有一个正常工作的Debian 8(在文本模式下),并在主机客户机中的2222端口上打开了ssh端口。您可以使用用户“ root”和密码“ root”登录。
QEMU确实是一种解决方案,可以让我在没有root访问权的服务器上安装自己的linux映像。这非常有用,例如,我使用它来执行反向ssh而不显示我的主要用户密码,或者用于教育目的。但是确实,由于没有root帐户就无法使用KVM进行真正的虚拟化,因此您只能执行仿真,效率可能非常低(但是对于命令行操作,我从未真正看到过开销)。
qemu
这是我如何进行的描述。第一步是使qemu“可移植”,即在没有root访问权限的服务器上可用。为此,您有几种方法,我将尝试介绍它们,以便您可以选择自己喜欢的一种。
此解决方案可以非常快速地应用(基本上可以用1个命令来解决),但是由于我的脚本可能有错误/可能忘记了一些lib,因此手动下载所有二进制文件可能会很长。此方法的另一个优点是,您可以直接在服务器上以非root用户模式运行它。这个想法得到QEMU二进制文件在这里得到的.deb /的.rpm档案(从易,或从在线网站的主机.deb文件),提取它,使用检查库的依赖ldd
,并下载所有的.deb
那些依赖关系尚未存在于计算机上以提取它们(.so
文件)。因为它可能会很长且重复,所以我创建了一个小脚本,但是如果您很勇敢,则可以手动完成所有操作……这只需要时间。要使用它,请将此脚本保存在文件中create_qemu_binaries.sh
:
#!/usr/bin/env bash
mkdir qemu_extract
cd qemu_extract
echo "########## Downloading qemu... ##########"
apt-get download qemu-system-x86
echo "########## Extracting qemu... ##########"
dpkg -x qemu-system-*.deb .
mkdir -p qemu_packed/lib
cp usr/bin/qemu-system-x86_64 qemu_packed
echo "########## Copy libs... ##########"
ldd usr/bin/qemu-system-x86_64 | grep "=>" | grep -v "not found" | awk '{print "cp "$3" qemu_packed/lib/"}' | bash
mkdir not_found
cd not_found
echo "########## Get not found libs... ##########"
ldd ../usr/bin/qemu-system-x86_64 | grep "not found" | awk '{print $1}' > not_found.txt
echo "########## Download not found libs... ##########"
for lib in $(cat not_found.txt); do echo "=== Dealing with $lib ==="; apt-file search --regexp "/${lib}\$" | sed 's/:.*//' | xargs apt-get download; done
echo "########## Extracting not found libs... ##########"
ls *.deb | xargs -I{} dpkg -x "{}" .
echo "########## Copying not found libs... ##########"
find . | grep ".so" | xargs -I{} cp "{}" ../qemu_packed/lib
cd ..
echo "########## Getting pc-bios... ##########"
git clone https://github.com/qemu/qemu.git
cp -r qemu/pc-bios qemu_packed
echo "########## Finished !!! ##########"
echo "The output file should be in the folder qemu_extract/qemu_packed."
echo "Once you have a filesystem image, you can run it using:"
echo "$ LD_LIBRARY_PATH=$(pwd)/lib ./qemu-system-x86_64 -L pc-bios -no-kvm -m 256 -drive if=virtio,file=<your image>.qcow2,cache=none -display curses -k fr -redir tcp:22222::22"
echo "Don't forget to replace <your image>"
并使用以下命令运行它:
chmod +x create_qemu_binaries.sh
./create_qemu_binaries.sh
一切正常,最后在文件夹中应该有./qemu_extract/qemu_packed/
一个文件qemu-system-x86_64
(主二进制文件),一个文件夹lib
(需要使用的库qemu
)和一个文件夹pc-bios
(qemu
需要运行的一组文件)。然后qemu
,您可以使用运行(不要忘记用文件系统映像替换):
$ LD_LIBRARY_PATH=$(pwd)/lib ./qemu-system-x86_64 -L pc-bios -no-kvm -m 256 -drive if=virtio,file=<your image>.qcow2,cache=none -redir tcp:22222::22
请享用 !(如果该脚本对您不起作用,请随时询问我,我仅在两台计算机上对其进行了测试,redir
如果您不需要在主机和猜测之间进行ssh转发,则可以随意删除)
第一种方法需要具有root用户访问权限(或qemu
已安装)的计算机。首先qemu
使用类似的东西安装
sudo apt install qemu-system-x86
然后找到qemu的绝对路径:
$ which qemu-system-x86_64
/usr/bin/qemu-system-x86_64
然后,创建一个文件夹来放置它:
mkdir -p qemu_packed/lib
cd qemu_packed
cp /usr/bin/qemu-system-x86_64 qemu_packed
并获取与qemu链接的库列表:
ldd qemu_packed/qemu-system-x86_64 | awk '{print "cp "$3" qemu_packed/lib"}' | bash
现在,我们需要让qemu使用BIOS。该文件在您的系统上可用,但是我不知道为什么它们位于不同的文件夹中,因此我认为从来源中获取它们更容易:
git clone https://github.com/qemu/qemu.git
cp -r qemu/pc-bios qemu_packed
cd qemu_packed
现在,它应该可以工作了,您可以将这些文件复制到非根计算机上,并qemu
使用以下行运行(不要忘记替换映像):
$ LD_LIBRARY_PATH=$(pwd)/lib ./qemu-system-x86_64 -L pc-bios -no-kvm -m 256 -drive if=virtio,file=<your image>.qcow2,cache=none
您也可以编译源代码,但是如果您没有安装所有库,则避免使用有根计算机编译qemu可能很棘手。但是我想,如果以上两种方法不起作用,它会更可靠。然后,在编译完成后,获取可执行文件,并执行与上述相同的技巧来获取库(使用ldd
,所有库应该已经在计算机上)和pc-bios文件。再次,使用相同的命令运行它。
如果您不想使用预制的文件系统映像,只需使用上面的命令代替!,按照大量的教程进行操作即可qemu/qemu-system-x86_64
。注意:如果您还想使用qemu-img
非根目录创建映像,请按照上述相同的步骤进行!
请享用 !
注意:如果要使用curses显示屏以便在没有GUI的服务器上运行它,则应在引导选项中的映像中添加一行,以免它在以下位置打开帧缓冲区/etc/default/grub
:
GRUB_CMDLINE_LINUX_DEFAULT="vga=normal nofb nomodeset bochs_drm.fbdev=off"
(最重要的是最后一个,我不确定是否需要)。以及
GRUB_TERMINAL=console
GRUB_GFXPAYLOAD_LINUX=text
使grub保持文本模式。如果还不够,您可能还想在systemd中启用文本模式。