在 M1 Mac 中安装 x86 的 Windows

今天在我的 M1 MacBook Air 上运行了 x86 版本的 Windows 7。在这里做个简单的记录。

安装步骤

  1. 下载并安装 UTM

    首先,访问 UTM 官方网站 下载 UTM 应用。按照提示安装到你的 Mac 上。

  2. 准备好一个 Windows x86 ISO 文件

    需要注意的是,不是所有的 x86 都能在 UTM 上运行。

    我就尝试了好几个 win 10/7 的镜像,都是可以安装,但是到最后运行的时候都会报错。

    你需要在官网上确认,他们测试过必然能跑的镜像:https://mac.getutm.app/gallery/

    image-20230516午後80223847

    进入 Windows 7 的内容:

    可以找到 Requirements 部分的内容,写的非常清楚,需要的是这样的一个镜像:

    en_windows_7_ultimate_with_sp1_x64_dvd_u_677332.iso

    对应的 hash 值是 36ae90defbad9d9539e649b193ae573b77a71c83.

    image-20230516午後80308966

    在很多地方都能下载到,例如 我在这里下载的:en_windows_7_ultimate_with_sp1_x64_dvd_u_677332

  3. 导入镜像

    image-20230516午後80624660

    选择第二个“emulate”:

    image-20230516午後80647255

    一路往下操作就好:

    Screenshot 1

  4. 安装完成后就可以简单使用了:

    Screenshot 6

  5. 虽然官网上有与宿主机 Mac 共享文件夹的功能,安装这个软件即可: SPICE guest tools

    Screenshot 7

    但我始终没能成功。

    我最后的解决办法是在宿主机 Mac 上用 Python 起临时服务器解决的:

    python3 -m http.server 9000
    

    image-20230516午後81129229

    在虚拟机内访问 Mac 的 ip:9000 即可:

    Screenshot 8

遇到的问题

  1. 安装某些软件提示 NSIS ErrorError launching installer:

    image-20230516午後81358552

    一般是下载网上的软件,保存的路径上有中文导致的。因为系统是纯英文的,对中文支持不太好。

    简单把文件挪到桌面就可以跳过这个问题了。

  2. 无法安装 chrome 和 edge。

    换过不下 10 个版本的离线版 chrome 和 edge,都提示有问题。

    这时候还是得靠 360 极速浏览器。

    但要注意的是,还是挺耗资源的。我看系统监控里的 cpu 常常 100%。

  3. 中文语言包

    除了装 win7,我还装了 xp。但是 xp 的中文支持不行。

    Screenshot 10

    我单独下了个语言包:http://download.microsoft.com/download/WindowsXPEmbedded/Update/2002/NT5XP/EN-US/LANGCHS.exe

    但是装好以后就启动不了的,也就不折腾了。所以有需要的同学注意一下。

总结

UTM 是一个基于 QEMU 的虚拟机,同时也具备模拟器的功能。虚拟化和模拟的主要区别在于它们处理硬件和软件的方式。

虚拟化是在物理硬件上创建虚拟硬件的过程,然后在这些虚拟硬件上运行操作系统和应用程序。虚拟机可以运行与宿主机不同的操作系统。例如,在一台运行 macOS 的 Mac 上,你可以使用虚拟化软件运行 Windows 或 Linux。

模拟器则是用来模拟不同的硬件平台,它可以在一种硬件架构上模拟另一种硬件架构。例如,你可以在一台 ARM 架构的 Mac(如 M1 Mac)上使用模拟器运行 x86 架构的 Windows。

因此,我们在 M1 Mac 上使用 UTM 运行 x86 的 Windows,UTM 需要通过模拟来实现这种硬件架构的转换。这个过程需要大量的计算资源,因此会感觉 Windows 比较卡,尤其是在运行 chrome 等这种占用内存很大的软件。我目前虚拟机里的 CPU常常会飙到 100%。

虚拟化和模拟都有各自的优点和缺点。虚拟化在性能上比模拟更优秀,但需要与宿主机相同的硬件架构。模拟则可以在不同的硬件架构之间进行转换,但会牺牲一些性能。

目前 UTM 也可以在 iOS 上运行。改天我再记录相关的操作。

https://docs.getutm.app/guides/windows/#downloads

https://github.com/aria2/aria2/releases/tag/release-1.36.0

参考资料


在 Mac/Win/Linux 上查询文件的 MD5 值

Windows

在 CMD 里使用原生命令 CertUtil 即可验证 md5 值:

CertUtil -hashfile 文件路径 MD5

例如:

CertUtil -hashfile C:\Users\username\Downloads\myfile.txt MD5

Mac

md5 文件路径

例如:

md5 "/Users/username/Downloads/My Folder/myfile.txt"

Linux

md5sum 目标文件

例如:

md5sum "/Users/username/Downloads/My Folder/myfile.txt"

git 回滚/撤销 操作

git 有三种回滚场景:

  • 工作区回滚(未 git add
  • 暂存区回滚(已 git addgit commit
  • 版本库回滚(已 git commit

在这里都做个记录。

1. 工作区回滚

工作区就是尚未 git add 的内容、当前可见的目录和文件。例如:

image-20230506午後05904150

回滚很简单:

git checkout -- [文件名] 			//撤销指定文件的修改

git checkout .                //撤销所有文件改动

2. 暂存区回滚

暂存区就是已经 git add进去,尚未 git commit 的内容。例如:

image-20230506午後10608132

git rm --cache [文件名] //撤销暂存区指定文件回到工作区

git reset -- [文件名]   //撤销暂存区指定文件回到工作区

git reset [HEAD]       // 撤销暂存区所有文件回到工作区,HEAD可以省略

3. 版本库回滚

版本库:就是.git中保存的版本仓库,也就是已经commit过的那些记录。

git log --pretty=oneline  // 查看最近几次commit的commit_id

可以用 git revert 或者 git reset 进行操作:

git revert HEAD           // 撤销最近的一个提交
git revert <commit_id>    // 撤销指定的版本,该操作将自动保存为一次commit

或:

git reset HEAD benchmarks.rb
git reset --soft xxx
git reset --hard xxx

两者主要区别是:

  • git revert是用一次新的commit来回滚之前的commit
  • git reset是直接删除指定的commit
  • git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容

参考资料


为 MacOS 随机定时设定 Bing 壁纸

这是一个 github 上的项目,挺简单实用的,用命令行下载 bing 的壁纸替换为 Mac 的壁纸。虽然不够优雅但胜在简单,记录过来。出处:https://github.com/xiqishow/bing_wallpaper

#!/usr/bin/env bash

#创建壁纸目录
echo $
if [[ $1 = "-n" ]]
then
    osascript -e "display notification \"开始更换壁纸\" with title \"定时换壁纸\""
fi

mkdir -p ~/bing-wallpapers/
cd ~/bing-wallpapers/
#请求一个随机数(bing只能返回0到7)
index_seed="$(jot -r 1 0 7)"
#请求bing服务获得最新一张壁纸(下载UHD壁纸)
rurl_esult="$(curl --location --request GET 'http://www.bing.com/HPImageArchive.aspx?idx='$index_seed'&n=5&format=js' --header 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'  | grep -o '"url":"[^"]*"'  | sed -e 's/"url":"/https:\/\/cn.bing.com/' | sed -e 's/"//' | sed -e 's/1920x1080/UHD/g')"
#下载壁纸
rm -f wallpapler*.jpg
#随机文件名,否则无法更换壁纸
file_seed="$(date +%s)"
curl $rurl_esult -o wallpapler_$file_seed.jpg > /dev/null
#设置壁纸路径
localpath="/Users/$USER/bing-wallpapers/wallpapler_$file_seed.jpg"
#设置壁纸
# osascript -e "tell application \"Finder\" to set desktop picture to POSIX file \"$localpath\""
osascript -e "tell application \"System Events\" to set picture of (reference to every desktop) to \"$localpath\""

#提示壁纸设置成功
if [[ $1 = "-n" ]]
then
    osascript -e "display notification \"壁纸更换成功\" with title \"定时换壁纸\""
fi

保存为一个文件(假设为 w.sh),chmod +x w.sh

运行如下脚本(设置为定时任务,每5分钟1 次):

#!/usr/bin/env bash

cFolder="$(pwd)"
echo "*/5 * * * * $cFolder/w.sh  > /dev/null 2>&1" | crontab

参考资料