Python虚拟机需要CPU来执行字节码吗?字节码是否转换为机器码,然后CPU参与该过程?
我正在尝试在虚拟环境中调试 rootkit。从逆向我知道它使用超级简单的CPU计时检查,看起来像这样(来源pafish):
static inline unsigned long long rdtsc_diff_vmexit() {
unsigned long long ret, ret2;
unsigned eax, edx;
__asm__ volatile("rdtsc" : "=a" (eax), "=d" (edx));
ret = ((unsigned long long)eax) | (((unsigned long long)edx) << 32);
/* vm exit forced here. it uses: eax = 0; cpuid; */
__asm__ volatile("cpuid" : /* no output */ : "a"(0x00));
/**/
__asm__ volatile("rdtsc" : "=a" (eax), "=d" (edx));
ret2 = ((unsigned long long)eax) | (((unsigned long long)edx) << 32);
return ret2 - …Run Code Online (Sandbox Code Playgroud) 我已经在我的计算机上安装了 mininet,现在我想用 mininet 运行 python 脚本。我应该怎样做呢?
如果我只使用python3 star.py,我会收到一个错误:
Traceback (most recent call last):
File "star.py", line 2, in <module>
from mininet.cli import CLI
ModuleNotFoundError: No module named 'mininet'
Run Code Online (Sandbox Code Playgroud)
如果我尝试sudo mn python3 star.py,那么我会得到
Usage: mn [options]
(type mn -h for details)
The mn utility creates Mininet network from the command line. It can create
parametrized topologies, invoke the Mininet CLI, and run tests.
Options:
-h, --help show this help message and exit
Run Code Online (Sandbox Code Playgroud)
如果我尝试sudo mn然后python …
我正在写一个关于 qemu 内部结构的开源文档,所以如果你帮助我,你就是在帮助 Qemu 项目的发展
我找到的最接近的答案是:在哪些条件下 ioctl KVM_RUN 返回?
这是在 KVM 上运行的单个 CPU 的线程循环:
static void *qemu_kvm_cpu_thread_fn(void *arg)
{
CPUState *cpu = arg;
int r;
rcu_register_thread();
qemu_mutex_lock_iothread();
qemu_thread_get_self(cpu->thread);
cpu->thread_id = qemu_get_thread_id();
cpu->can_do_io = 1;
current_cpu = cpu;
r = kvm_init_vcpu(cpu);
if (r < 0) {
error_report("kvm_init_vcpu failed: %s", strerror(-r));
exit(1);
}
kvm_init_cpu_signals(cpu);
/* signal CPU creation */
cpu->created = true;
qemu_cond_signal(&qemu_cpu_cond);
qemu_guest_random_seed_thread_part2(cpu->random_seed);
do {
if (cpu_can_run(cpu)) {
r = kvm_cpu_exec(cpu);
if (r == EXCP_DEBUG) {
cpu_handle_guest_debug(cpu);
}
}
qemu_wait_io_event(cpu); …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 WSL2 Ubuntu ping 我的 Ubuntu 虚拟机。反之亦然,也会发生同样的 ping 问题。两个ubuntu版本都是20.04.1。但我可以从本地 Windows ping Ubuntu VM。
从 Windows 到 Ubuntu 虚拟机
从 WSL2 Ubuntu 到 Ubuntu VM
我从这个答案中知道,可以使用 TravisCIlibvirt而不是 VirtualBox 在 TravisCI 上启动并运行 Vagrant Boxes。
GitHub Actions 也可以实现这一点吗?由于新的定价模型,我们将把所有内容从 TravisCI 上移走,因此我们还需要切换基于 Vagrant 的测试用例。
continuous-integration virtualbox virtual-machine vagrant github-actions
我正在尝试使用 NodeJS 和 VM 重现以太坊的智能合约流程。
我解决了一些问题,但也提出了一个新问题。
我的目标是在 NodeJS VM 实例执行后检索我加载并执行的字节码;
初始状态是我在虚拟机中作为字节码加载的智能合约代码。
我还进行了两个字节码调用。并被处决。
如何从该虚拟机实例中检索字节码中的新状态?
const vm = require('vm');
const v8 = require('v8');
v8.setFlagsFromString('--no-lazy');
if (Number.parseInt(process.versions.node.split('.')[0], 10) >= 12) {
v8.setFlagsFromString('--no-flush-bytecode'); // Thanks to A-Parser (@a-parser)
}
/**
* Generates v8 bytecode buffer.
* could be the compile for smart contract to compile the bytecode
* the bytecode will go on the blockchain so it can never change.
* The input could be a file with all the JavaScript
* @param {string} …Run Code Online (Sandbox Code Playgroud) 当我使用 Travis-CI 时,我需要在 LXD 和完整 VM 之间进行选择: https: //docs.travis-ci.com/user/reference/overview/。虽然链接页面描述了它们在具体用法中的功能,但我想问一下LXD在概念上与所谓的完整VM有何不同,以及它们与Docker相比如何?我假设 CI 测试应该在预装了 Linux 或其他操作系统的服务器上运行,并且我们不需要在服务器端运行 LXD 或 VM。所以我对在服务器上运行的 LXD 或 VM 的基本概念感到非常困惑。有任何澄清吗?
我有一个在端口运行的Python服务器28009:
python3 -m http.server 28009
Run Code Online (Sandbox Code Playgroud)
现在,在运行服务器后,我调用 QEMU 来转发端口28009:
qemu-system-aarch64 -nographic -machine virt,gic-version=max -m 512M -cpu max -smp 4 \
-netdev user,id=vnet,hostfwd=tcp::28009-:28009 -device virtio-net-pci,netdev=vnet \
-drive file=ubuntu-image.img,if=none,id=drive0,cache=writeback -device virtio-blk,drive=drive0,bootindex=0 \
-drive file=flash0.img,format=raw,if=pflash -drive file=flash1.img,format=raw,if=pflash
Run Code Online (Sandbox Code Playgroud)
它会产生一个错误:
qemu-system-aarch64: Could not set up host forwarding rule 'tcp::28009-:28009'
Run Code Online (Sandbox Code Playgroud)
同样,如果我首先运行上面的 QEMU 脚本,它会正常启动。然而,Python 服务器现在抛出一个错误:
Traceback (most recent call last):
File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/usr/lib/python3.6/http/server.py", line 1211, in <module>
test(HandlerClass=handler_class, port=args.port, …Run Code Online (Sandbox Code Playgroud) 嵌套 KVM 虚拟化的开销应该很小,但 VM 内的 Android 模拟器应该可用。
当我在 ubuntu 20.04 guest 虚拟机(在 ubuntu 20.04 主机上)内启动 Android 模拟器时,它警告我,我处于嵌套虚拟化中,因此速度会很慢。但它的速度低得令人痛苦,而不仅仅是缓慢。启动进入 Android 需要 10 分钟,是的,所有系统都是 x86_64,甚至是 android 映像。
我认为这与 OpenGL 有关,所以我在我的 virt-manager 上启用了 OpenGL 虚拟化,但速度仍然很慢。
我在有 16 个核心的 Ryzen 7 2700x 上尝试了同样的操作,我将所有核心都给了虚拟机,并将 AMD GPU 传递给了它,Android 模拟器也慢得令人痛苦。
为什么?
virtual-machine ×10
kvm ×3
c ×2
linux ×2
python ×2
qemu ×2
android ×1
bytecode ×1
cpu ×1
docker ×1
javascript ×1
linux-kernel ×1
lxd ×1
mininet ×1
networking ×1
node.js ×1
travis-ci ×1
ubuntu-20.04 ×1
vagrant ×1
virtualbox ×1
wsl-2 ×1