Hyper-V与VMware的区别与共存

Hyper-V

Hyper-V,代号Viridian,旧称Windows Server Virtualization,是Microsoft的本地虚拟机管理程序,它可以在运行x86-64位的Windows上创建虚拟机。从Windows 8开始,Hyper-V取代Windows Virtual PC作为Windows客户端版本的硬件虚拟化组件。可以配置运行Hyper-V的服务器计算机能够将单个虚拟机公开到一个或多个网络。Hyper-V是与Windows Server 2008一起首次发布,自Windows Server 2012和Windows 8以来一直无需额外付费。独立的Windows Hyper-V Server是免费的,但仅具有命令行接口。

省流:Hyper-V是微软自己系统的虚拟化工具

VMware

Vmware是一家提供云计算和硬件虚拟化的软件和服务的公司。

下列的Vmware部分代指Vmware Workstation
VMware Workstation是VMware公司销售的商业软件产品之一。该工作站软件包含一个用于英特尔x86兼容电脑的虚拟机套装,其允许用户同时创建和运行多个x86虚拟机。每个虚拟机可以运行其安装的操作系统,如(但不限于)Windows、Linux、BSD变生版本。用简单术语来描述就是,VMware Workstation允许一台真实的电脑在一个操作系统中同时开启并运行数个操作系统,其它VMware产品帮助在多个宿主电脑之间管理或移植VMware虚拟机。免费版本为VMware Workstation Player。
VMware Fusion是VMware针对Mac电脑推出的一款虚拟机软件。

省流:Vmware是针对商业化使用的虚拟化软件

Hyper-V VS VMware

Hyper-V的优势

  1. Windows 8及以上专业版自带,无需下载安装即可免费使用(开箱即用)
  2. 虚拟磁盘采用的是vhd/vhdx格式,可以直接挂载到Windows上读取文件(假如是Linux的话还是不可以的)
  3. 动态资源调度,可以动态调度内存和CPU,自动分配资源。
  4. 挂起速度快,检查点效率较高

VMware的优势

  1. 可以动态调整窗口大小(需要安装open-vm-tools)
  2. 可以宿主机和虚拟机复制粘贴文件
  3. 可以直通USB设备(U盘、网卡、蓝牙之类的)
  4. 可以通过vmware-tools调用GPU,DirectX11及以上版本可以调用主机显卡(Vulkan在VMware Workstation 17是支持的)
  5. 支持更多操作系统,可以一键安装

Hyper-V和VMware结构区别

借用知乎老哥的一张图

省流1:开了Hyper-V的Windows实际上的相当于是运行在Hyper-V中的虚拟化Windows,即Type1中的GuestOS VM。
省流2:使用VMware是在系统层上跑的虚拟化软件,实际上相当于Type2中的Hypervisor

所以开了Hyper-V后,Windows性能会有一定降低,而Vmware是运行在Host OS(宿主机系统)上的一个虚拟化软件,效率相对来说更高
(经过更新优化,现在Hyper-V性能降低感知不明显)

由于兼容性问题,两个Hypervisor层是不能共存的,这也就造成了Hyper-V系统和VMware不能同时使用。
于是VMware想了个招,将自己套在了Hyper-V中,再使用里面的资源虚拟化,这样就解决了Hyper-V和VMware共存的问题了。
(从Vmware15开始官方就解决了共存问题)
结构类似下图

由于现在Windows很多方便的功能如WSL(Linux 的 Windows 子系统),WSA(Android 的 Windows 子系统),Docker on desktop都需要用到Hyper-V技术,这也就让VMware嵌套一层Hyper-V变得无可厚非

更加详细的可以看Revercc’s Blog的内容

Hyper-V与VMware的共存

由于Hyper-V虚拟机再开启了Hyper-V的情况下,相对于VMware有更好的资源调度优势,运行需要高性能的应用时有一定优势,而VMware在用户界面、管理、体验上均优于Hyper-V,也成为平时使用的首选,可以经过设置在VMware和Hyper-V共享使用虚拟机
下列以Kali Linux为例
首先我们确保虚拟机的Secure Boot是关闭状态,并且磁盘格式为VHD格式,如果不是的话请用工具将其转化为VHD格式

Hyper-V Manager里面既可以实现VHD格式和VHDX格式的相互转换
记住这边的Firmware框起来的设置,后面会有用的

在转换之后记得将虚拟机的磁盘修改为VHD格式

在VMware新建虚拟机,并且选择挂载你刚刚转换的VHD磁盘


Version和Firmware Type要选对应的那个
如果是BIOS启动的话应该可以直接使用了,但是如果是UEFI要进行其他的设置
开机按F2进入Boot Manager

Enter setup->Configure boot options->Add boot option->选择你的磁盘和文件(找回上面你Hyper-V的图,一般为第一个)


找到你的EFI文件并且选择Commit changes and exit
再进入Configure boot options->Change boot order修改启动顺序,保存重启即可

然后两边都可以进入系统,两边都能正常使用了
在进入VMware后记得安装相关vmware-tools才能使用自动调节分辨率,调用GPU等一些相关功能

sudo apt update
sudo apt install open-vm-tools -y

开始快乐使用VMware的各种功能而又可以充分利用Hyper-V的高性能咯

如何快速搭建一个镜像源

引言

其实不少开源镜像站给出了他们的开源代码,例如清华大学镜像管理器tunasync中科大镜像Docker
当时思考了很久,没有使用他们的代码,主要是认为,没什么必要,做一个简单的源没必要那么复杂,于是自己仿照着写了个Demo

实现

Github-SZUmirrors
暂时来说,我们使用的仓库只有少部分几个,同步方式较为单一,pypi为bandersnatch同步,其余系统软件源为rsync同步,这里借用了ustcmirror-images的rsync镜像,其实就是一句rsync指令和一些配置了
守护进程采用service实现,能够开机启动,也能查看状态

流程如下

service(守护进程)->python(分配进程)->docker(工作单元)

这里还需要加上一些前端,一些数据库之类的同步信息,不过作为demo已经足够了,剩下的需要的交给各位自己完善了
TODO:增加Docker反代

注意

  1. bandersnatch同步python源时可以做一些设置,减小同步的大小(Python全部库同步下来要15T),下文范例为只同步100G以下包
[plugins]
enabled =
    size_project_metadata
[size_project_metadata]
max_package_size = 100G
  1. 要进行nginx调优,以提高负载量
    Nginx调优可以参考此文档
    具体可以进行百度,唯一难以解决的问题时https中tls握手造成的高负载和高延迟(响应速度慢)情况。
    下图为对比


    效率上有将近十倍的区别,延迟也显著提升,不过好在公布在外网的时候https握手可以由转发机实现,并且可以一次握手传输多个包(链接复用?)
  2. pypi可以给单独的域名指向pypi/web/simple方便访问,但是同时也要注意python只支持https形式访问
    虽然其他软件源http也行,但是https还是安全不少,性能却跟不上,也是恨头疼的一件事

APT源的工作原理

引言

最近在折腾自己学校的镜像源,看到差不多20T的硬盘都被塞满了,我是很好奇系统是如何管理这些文件的,于是顺便就研究下APT源的工作原理

原理

在Ubuntu/Debian等系统下,常见的应用安装方式为apt/apt-get
前者可以说是后者的升级版,提供了更友好的命令行界面,包含了apt-get和apt-cache等常用功能,本质上都是基于dpkg的高级包管理工具。
Ubuntu/Debian采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。由于网络环境的问题,我们可能无法正常访问官方的软件仓库,所以许多镜像服务器被建立,并且时刻保持与官方服务器的同步。在使用apt之前,我们一般都会进行换源处理【脚本】Linux换源汇总
换源主要是修改位于/etc/apt/source.list的源文件,这个文件记录了可获取软件包的镜像站的站点地址。
我们将在其中加入自己的镜像源地址,下列是一个案例

deb http://mirrors.szu.moe/ubuntu jammy main restricted
# deb-src http://mirrors.szu.moe/ubuntu jammy main restricted
deb http://mirrors.szu.moe/ubuntu jammy-updates main restricted
# deb-src http://mirrors.szu.moe/ubuntu jammy-updates main restricted
deb http://mirrors.szu.moe/ubuntu jammy universe
# deb-src http://mirrors.szu.moe/ubuntu jammy universe
deb http://mirrors.szu.moe/ubuntu jammy-updates universe
# deb-src http://mirrors.szu.moe/ubuntu jammy-updates universe
deb http://mirrors.szu.moe/ubuntu jammy multiverse
# deb-src http://mirrors.szu.moe/ubuntu jammy multiverse
deb http://mirrors.szu.moe/ubuntu jammy-updates multiverse
# deb-src http://mirrors.szu.moe/ubuntu jammy-updates multiverse
deb http://mirrors.szu.moe/ubuntu jammy-backports main restricted universe multiverse
# deb-src http://mirrors.szu.moe/ubuntu jammy-backports main restricted universe multiverse
deb http://mirrors.szu.moe/ubuntu jammy-security main restricted
# deb-src http://mirrors.szu.moe/ubuntu jammy-security main restricted
deb http://mirrors.szu.moe/ubuntu jammy-security universe
# deb-src http://mirrors.szu.moe/ubuntu jammy-security universe
deb http://mirrors.szu.moe/ubuntu jammy-security multiverse

镜像源地址遵循以下格式

DebType AddressType://Hostaddress/ubuntu Distribution Component1 Component2.....

其中各字段含义如下所示。
1. DebType表示Deb软件包类型,使用deb表示二进制软件包,使用deb-src表示源码包;
对于大部分用户来说,二进制软件包即可完成安装,二进制软件包会被安装在系统的默认目录下(usr/share和usr/bin)。而源码包需要自己编译安装,但可以自己指定安装位置。
源码可以通过apt-get source PackageName获得,以下是源码安装的一个例子(g2o)

cd g2o
mkdir build && cd build
cmake ..
make -j8 -DCMAKE_INSTALL_PREFIX=/usr/local/g2o/
sudo make install
  1. AddressType表示访问地址类型,常用类型有:http、https、ftp、file、cdrom、ssh等;
    目前一般镜像源支持前两个,ftp少部分支持。
  2. Distribution表示Ubuntu的各个发行版本,例如dapper、feisty;
    本样例中jammy代表Ubuntu 22.04 LTS版本的代号
    其中-security(安全相关)、-proposed(测试版)、-updates(更新相关)、-backports(向后移植/兼容)
  3. Component表示软件包组件类别,是由技术支持程度不同而划分的类别,可选择main、restricted、universe和multiverse中的一种或多种。
    main:完全的自由软件。
    restricted:不完全的自由软件。
    universe:ubuntu官方不提供支持与补丁,全靠社区支持。
    muitiverse:非自由软件,完全不提供支持和补丁。

软件源配置文件只是告知系统可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。若每安装一个软件包,就在服务器上寻找一遍,效率是很低的。因而镜像源提供了索引文件,以便本地主机查询apt update即更新索引文件

root@aurora-rsync:/home/aurora# apt update
Get:1 http://mirrors.szu.moe/ubuntu jammy InRelease [270 kB]
Hit:2 http://mirrors.szu.moe/ubuntu jammy-updates InRelease
Hit:3 http://mirrors.szu.moe/ubuntu jammy-backports InRelease
Hit:4 http://mirrors.szu.moe/ubuntu jammy-security InRelease
Fetched 270 kB in 1s (372 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
root@aurora-rsync:/home/aurora# cat /var/log/nginx/access.log
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy/InRelease HTTP/1.1" 200 270087 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-updates/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-backports/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"
192.168.239.252 - - [13/Mar/2023:03:03:54 +0800] "GET /ubuntu/dists/jammy-security/InRelease HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (2.4.8) non-interactive"

对于update,会根据源的相关设置访问/ubuntu/dists/(设置的Distribution)/InRelease的文件,这个也是一个索引,记录了有哪些相应平台的包存储在服务器上

 b96c0cfe911414e1b7f2df5c88844369          1192665 main/binary-amd64/Packages.gz
 84a735928def889314d9d28d0819425c          1068823 main/binary-arm64/Packages.gz
 6a1ab8e4d5aa235c81e2e036e01e9926           775999 main/binary-armhf/Packages.gz
 8d8471fdecfb661f6580df6096a53c6a           570121 main/binary-i386/Packages.gz
 3a43d2dda28cf2e7e1d885484a1ce249           732797 main/binary-ppc64el/Packages.gz
 8ac0edaecf66d4bd0631294a7908154b           690004 main/binary-riscv64/Packages.gz
 fb78c7c1b05b2dba72b8ec6d99bb6462           717683 main/binary-s390x/Packages.gz

系统会根据自己的平台下载相应的包索引,本平台为amd64,所以访问main/binary-amd64/Packages.gz下载
下列出的是其中的一部分,索引中包含如下信息
包名,优先级,类型,维护者,架构,源文件(source),版本号,依赖包,冲突性信息,包大小,文件的下载路径,MD5sum,SHA1,包描述,Xul-Appid—应用程序id,Bugs信息,Origin,Supported

......
Package: accountsservice
Architecture: amd64
Version: 22.07.5-2ubuntu1.3
Priority: optional
Section: gnome
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian freedesktop.org maintainers <pkg-freedesktop-maintainers@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 500
Depends: dbus (>= 1.9.18), libaccountsservice0 (= 22.07.5-2ubuntu1.3), libc6 (>= 2.34), libglib2.0-0 (>= 2.63.5), libpolkit-gobject-1-0 (>= 0.99)
Recommends: default-logind | logind
Suggests: gnome-control-center
Filename: pool/main/a/accountsservice/accountsservice_22.07.5-2ubuntu1.3_amd64.deb
Size: 69728
MD5sum: a2acf0a225e2c30ccb985a66a4dfb848
SHA1: 1c2b73bc5c72bc44cade5ef6fa444dbea1ea69ec
SHA256: f8ed006eb680e9d8a9b55af88b3786f6892d6d2764586ec4853cf954da119596
SHA512: 9496d225169db5524f7bf9c0fb1cbdfac3ab6261b4725ed56c282d5865678881c8841c539a5b87182306ed66dcc9225a15986083dc72cf7433a30bf601507cc7
Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/
Description: query and manipulate user account information
Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-core, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi
Description-md5: 8aeed0a03c7cd494f0c4b8d977483d7e
......

然后apt再将Packages.gz里面的信息以某种数据结构形式导入本地数据库以便快速查找,即完成了
“`apt update“`的一系列操作
其后的`apt install`会借助上述Depends信息自动安装相关依赖,而源码安装则需要自己配置依赖了,所以现在十分不推荐使用

题外话

二进制安装好像是最近(2016年)才开始流行的,可能是因为计算和存储能力有了阶段性提升。Python也采用的是二进制安装与编译安装相结合的方式,二进制安装会从源上下载一个whl后缀的文件,whl格式本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装。
二进制安装更加简单和快速,不需要用户花费时间和精力去编译源代码,处理编译过程中出现的错误和问题,考虑不同的编译器和命令,也不需要用户管理不同的依赖库。与之相对应的会占用服务器资源(编译源代码),以及存储不同平台的二进制文件。

奇思妙想?

根据上述结论,我们可以通过修改APT源中的Packages.gz文件,在其中添加/修改某些包地址,使其变成恶意文件,如果没有相关签名/校验环节,理论上我们可以完成一次供应链攻击。
所以一般来说要使用足够信任的源,具体实现有待测试。
Todo:APT源实现供应链攻击

【WSL】WSL2-Ubuntu安装CUDA

某一天,在摸鱼的时候被人拍了一下,叫我用Kali跑一下hashcat,因为hashcat可以调用CUDA(显卡)模块,加速爆破 虽然实际上,我的CPU跑起来也很快 file 但是,既然来了就研究一下。但是我又不想装多系统,那么就该想想怎么在WSL里面调用CUDA了。

Update: 其实做到最后我又重新做了一遍。原因在于,我的linux核心其实不支持CUDA。 GPU_CUDA_IN_WSL 在安装前,你需要确认一下你的内核版本,只有5.10.43.3以上的版本才是默认支持的

PS C:\Users\hz2016> wsl cat /proc/version
Linux version 5.10.16.3-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Fri Apr 2 22:23:49 UTC 2021

你需要打开下面的功能,并且把内核更新到最新版 file

  1. 安装Ubuntu的WSL版并换源

由于WSL版的Ubuntu不自带gcc,所以我们在安装CUDA前要自己装一个

apt-get install gcc -y
  1. 安装CUDA for WSL-Ubuntu

CUDA Toolkit官网下载 我安装的十CUDA Toolkit 11.6版本,选择的是Runfile(可执行文件)安装 别问为什么,只要知道我翻车很多次就是了。 file

wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda_11.6.2_510.47.03_linux.run
sudo sh cuda_11.6.2_510.47.03_linux.run

千万别点进去Options的Drives,别问我为什么问就是我在来了一次 file 安装完成

===========
= Summary =
===========

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-11.6/

Please make sure that
 -   PATH includes /usr/local/cuda-11.6/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-11.6/lib64, or, add /usr/local/cuda-11.6/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run cuda-uninstaller in /usr/local/cuda-11.6/bin
***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 510.00 is required for CUDA 11.6 functionality to work.
To install the driver using this installer, run the following command, replacing with the name of this run file:
    sudo .run --silent --driver 
  1. 添加PATH路径
export PATH=/usr/local/cuda-11.6/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.6/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
  1. 验证是否更新成功
root@hz2016-pc:~# nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_Mar__8_18:18:20_PST_2022
Cuda compilation tools, release 11.6, V11.6.124
Build cuda_11.6.r11.6/compiler.31057947_0
  1. 更新你的显卡驱动

A driver of version at least 510.00 is required for CUDA 11.6 functionality to work.

打开GPU-Z查看一下 file 发现自己是497.29版本的显卡驱动,于是更新一下 file

然后你就可以在你的WSL里面跑CUDA了~

  1. 安装OpenCL相关(翻车)
apt-get install beignet clinfo
apt-get install beignet-dev
apt-cache search opencl

运行clinfo测试一下

root@hz2016-pc:~# clinfo
······
clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU)  No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_ACCELERATOR)  No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_CUSTOM)  No devices found in platform
······

还是找不到GPU,翻了下文档,还是我想多了

OpenGL-CUDA Interop is not yet supported. Applications relying on OpenGL will not work.

要用GPU跑hashcat还是去win版跑吧 file 实测GPU跑比CPU跑快130倍