mirror of
https://github.com/bin456789/reinstall.git
synced 2025-01-31 10:58:06 +08:00
windows: win8 以上从 msi 获取 virtio 驱动
This commit is contained in:
parent
f886eec7cd
commit
7c98d6ae73
263
trans.sh
263
trans.sh
@ -1920,10 +1920,37 @@ EOF
|
|||||||
unix2dos $target
|
unix2dos $target
|
||||||
}
|
}
|
||||||
|
|
||||||
install_windows() {
|
# virt-what 要用最新版
|
||||||
apk add wimlib virt-what dmidecode pev
|
# vultr 1G High Frequency LAX 实际上是 kvm
|
||||||
|
# debian 11 virt-what 1.19 显示为 hyperv qemu
|
||||||
|
# debian 11 systemd-detect-virt 显示为 microsoft
|
||||||
|
# alpine virt-what 1.25 显示为 kvm
|
||||||
|
# 所以不要在原系统上判断具体虚拟化环境
|
||||||
|
|
||||||
|
# lscpu 也可查看虚拟化环境,但 alpine on lightsail 运行结果为 Microsoft
|
||||||
|
# 猜测 lscpu 只参考了 cpuid 没参考 dmi
|
||||||
|
# virt-what 可能会输出多行结果,因此用 grep
|
||||||
|
is_virt_contains() {
|
||||||
|
if [ -z "$_virt" ]; then
|
||||||
|
apk add virt-what
|
||||||
|
_virt=$(virt-what)
|
||||||
|
apk del virt-what
|
||||||
|
fi
|
||||||
|
echo "$_virt" | grep -Eiw "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
is_dmi_contains() {
|
||||||
|
if [ -z "$_dmi" ]; then
|
||||||
|
apk add dmidecode
|
||||||
|
_dmi=$(dmidecode)
|
||||||
|
apk del dmidecode
|
||||||
|
fi
|
||||||
|
echo "$_dmi" | grep -Eiw "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
install_windows() {
|
||||||
|
apk add wimlib pev
|
||||||
|
|
||||||
# shellcheck disable=SC2154
|
|
||||||
download $iso /os/windows.iso
|
download $iso /os/windows.iso
|
||||||
mkdir -p /iso
|
mkdir -p /iso
|
||||||
mount -o ro /os/windows.iso /iso
|
mount -o ro /os/windows.iso /iso
|
||||||
@ -1982,51 +2009,41 @@ install_windows() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# 变量名 使用场景
|
# 变量名 使用场景
|
||||||
# arch_uname arch命令/uname -m x86_64 aarch64
|
# arch_uname arch命令 / uname -m x86_64 aarch64
|
||||||
# arch_wim wiminfo x86 x86_64 ARM64
|
# arch_wim wiminfo x86 x86_64 ARM64
|
||||||
# arch virtio驱动/unattend.xml x86 amd64 arm64
|
# arch virtio iso / unattend.xml x86 amd64 arm64
|
||||||
# arch_xen xen驱动 x86 x64
|
# arch_xdd virtio msi / xen驱动 x86 x64
|
||||||
|
|
||||||
# 将 wim 的 arch 转为驱动和应答文件的 arch
|
# 将 wim 的 arch 转为驱动和应答文件的 arch
|
||||||
arch_wim=$(wiminfo $install_wim 1 | grep Architecture: | awk '{print $2}' | to_lower)
|
arch_wim=$(wiminfo $install_wim 1 | grep Architecture: | awk '{print $2}' | to_lower)
|
||||||
case "$arch_wim" in
|
case "$arch_wim" in
|
||||||
x86)
|
x86)
|
||||||
arch=x86
|
arch=x86
|
||||||
arch_xen=x86
|
arch_xdd=x86
|
||||||
;;
|
;;
|
||||||
x86_64)
|
x86_64)
|
||||||
arch=amd64
|
arch=amd64
|
||||||
arch_xen=x64
|
arch_xdd=x64
|
||||||
;;
|
;;
|
||||||
arm64)
|
arm64)
|
||||||
arch=arm64
|
arch=arm64
|
||||||
arch_xen= # xen 没有 arm64 驱动
|
arch_xdd= # xen 没有 arm64 驱动,# virtio 也没有 arm64 msi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# virt-what 要用最新版
|
# 驱动
|
||||||
# vultr 1G High Frequency LAX 实际上是 kvm
|
|
||||||
# debian 11 virt-what 1.19 显示为 hyperv qemu
|
|
||||||
# debian 11 systemd-detect-virt 显示为 microsoft
|
|
||||||
# alpine virt-what 1.25 显示为 kvm
|
|
||||||
# 所以不要在原系统上判断具体虚拟化环境
|
|
||||||
|
|
||||||
# lscpu 也可查看虚拟化环境,但 alpine on lightsail 运行结果为 Microsoft
|
|
||||||
# 猜测 lscpu 只参考了 cpuid 没参考 dmi
|
|
||||||
# 下载 virtio 驱动
|
|
||||||
# virt-what 可能会输出多行结果,因此用 grep
|
|
||||||
drv=/os/drivers
|
drv=/os/drivers
|
||||||
mkdir -p $drv
|
mkdir -p $drv
|
||||||
if virt-what | grep aws &&
|
|
||||||
virt-what | grep kvm &&
|
|
||||||
[ "$arch_wim" = x86_64 ]; then
|
|
||||||
# aws nitro
|
|
||||||
# 只有 x64 位驱动
|
|
||||||
# 可能不支持 vista
|
|
||||||
# 未打补丁的 win7 无法使用 sha256 签名的驱动
|
|
||||||
# https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/aws-nvme-drivers.html
|
|
||||||
# https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/enhanced-networking-ena.html
|
|
||||||
|
|
||||||
|
# aws nitro
|
||||||
|
# 可能不支持 vista
|
||||||
|
# https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/aws-nvme-drivers.html
|
||||||
|
# https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/enhanced-networking-ena.html
|
||||||
|
if is_virt_contains aws &&
|
||||||
|
is_virt_contains kvm &&
|
||||||
|
[ "$arch_wim" = x86_64 ]; then
|
||||||
|
|
||||||
|
# 未打补丁的 win7 无法使用 sha256 签名的驱动
|
||||||
nvme_ver=$(
|
nvme_ver=$(
|
||||||
case "$nt_ver" in
|
case "$nt_ver" in
|
||||||
6.0 | 6.1) echo 1.3.2 ;; # sha1 签名
|
6.0 | 6.1) echo 1.3.2 ;; # sha1 签名
|
||||||
@ -2048,13 +2065,14 @@ install_windows() {
|
|||||||
|
|
||||||
unzip -o -d $drv/aws/ $drv/AWSNVMe.zip
|
unzip -o -d $drv/aws/ $drv/AWSNVMe.zip
|
||||||
unzip -o -d $drv/aws/ $drv/AwsEnaNetworkDriver.zip
|
unzip -o -d $drv/aws/ $drv/AwsEnaNetworkDriver.zip
|
||||||
|
fi
|
||||||
|
|
||||||
elif virt-what | grep xen &&
|
# aws xen
|
||||||
|
# 可能不支持 vista
|
||||||
|
# https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/xen-drivers-overview.html
|
||||||
|
if is_virt_contains xen &&
|
||||||
[ "$arch_wim" = x86_64 ]; then
|
[ "$arch_wim" = x86_64 ]; then
|
||||||
# aws xen
|
|
||||||
# 只有 64 位驱动
|
|
||||||
# 可能不支持 vista
|
|
||||||
# https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/xen-drivers-overview.html
|
|
||||||
apk add msitools
|
apk add msitools
|
||||||
|
|
||||||
aws_pv_ver=$(
|
aws_pv_ver=$(
|
||||||
@ -2071,27 +2089,31 @@ install_windows() {
|
|||||||
msiextract $drv/AWSPVDriverSetup.msi -C $drv
|
msiextract $drv/AWSPVDriverSetup.msi -C $drv
|
||||||
mkdir -p $drv/aws/
|
mkdir -p $drv/aws/
|
||||||
cp -rf $drv/.Drivers/* $drv/aws/
|
cp -rf $drv/.Drivers/* $drv/aws/
|
||||||
|
fi
|
||||||
|
|
||||||
|
# xen
|
||||||
|
# 没签名,暂时用aws的驱动代替
|
||||||
|
# https://lore.kernel.org/xen-devel/E1qKMmq-00035B-SS@xenbits.xenproject.org/
|
||||||
|
# https://xenbits.xenproject.org/pvdrivers/win/
|
||||||
|
# 在 aws t2 上测试,安装 xenbus 会蓝屏,装了其他7个驱动后,能进系统但没网络
|
||||||
|
# 但 aws 应该用aws官方xen驱动,所以测试仅供参考
|
||||||
|
if false &&
|
||||||
|
is_virt_contains xen &&
|
||||||
|
{ [ "$arch_wim" = x86 ] || [ "$arch_wim" = x86_64 ]; }; then
|
||||||
|
|
||||||
elif false && virt-what | grep xen &&
|
|
||||||
[ "$arch_wim" != arm64 ]; then
|
|
||||||
# xen
|
|
||||||
# 有 x86 x64,没arm64驱动
|
|
||||||
# 没签名,暂时用aws的驱动代替
|
|
||||||
# https://lore.kernel.org/xen-devel/E1qKMmq-00035B-SS@xenbits.xenproject.org/
|
|
||||||
# https://xenbits.xenproject.org/pvdrivers/win/
|
|
||||||
# 在 aws t2 上测试,安装 xenbus 会蓝屏,装了其他7个驱动后,能进系统但没网络
|
|
||||||
# 但 aws 应该用aws官方xen驱动,所以测试仅供参考
|
|
||||||
parts='xenbus xencons xenhid xeniface xennet xenvbd xenvif xenvkbd'
|
parts='xenbus xencons xenhid xeniface xennet xenvbd xenvif xenvkbd'
|
||||||
mkdir -p $drv/xen/
|
mkdir -p $drv/xen/
|
||||||
for part in $parts; do
|
for part in $parts; do
|
||||||
download https://xenbits.xenproject.org/pvdrivers/win/$part.tar $drv/$part.tar
|
download https://xenbits.xenproject.org/pvdrivers/win/$part.tar $drv/$part.tar
|
||||||
tar -xf $drv/$part.tar -C $drv/xen/
|
tar -xf $drv/$part.tar -C $drv/xen/
|
||||||
done
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
elif virt-what | grep kvm; then
|
# kvm (排除 aws)
|
||||||
# virtio
|
# x86 x86_64 arm64 都有
|
||||||
# x86 x64 arm64 都有
|
# https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/
|
||||||
# https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/
|
if is_virt_contains kvm &&
|
||||||
|
! is_virt_contains aws; then
|
||||||
|
|
||||||
# 没有 vista 文件夹
|
# 没有 vista 文件夹
|
||||||
case "$nt_ver" in
|
case "$nt_ver" in
|
||||||
@ -2105,37 +2127,98 @@ install_windows() {
|
|||||||
# https://github.com/virtio-win/virtio-win-pkg-scripts/issues/40
|
# https://github.com/virtio-win/virtio-win-pkg-scripts/issues/40
|
||||||
# https://github.com/virtio-win/virtio-win-pkg-scripts/issues/61
|
# https://github.com/virtio-win/virtio-win-pkg-scripts/issues/61
|
||||||
case "$nt_ver" in
|
case "$nt_ver" in
|
||||||
6.0 | 6.1) dir=archive-virtio/virtio-win-0.1.173-9 ;; # vista | w7 | 2k8 | 2k8R2
|
6.0 | 6.1) dir=archive-virtio/virtio-win-0.1.173-9 ;; # vista|w7|2k8|2k8R2
|
||||||
6.2 | 6.3) dir=archive-virtio/virtio-win-0.1.215-1 ;; # win8 | w8.1 | 2k12 | 2k12R2
|
6.2 | 6.3) dir=archive-virtio/virtio-win-0.1.215-1 ;; # w8|w8.1|2k12|2k12R2
|
||||||
*) dir=stable-virtio ;;
|
*) dir=stable-virtio ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
download https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/$dir/virtio-win.iso $drv/virtio-win.iso
|
# vista|w7|2k8|2k8R2|arm64 要从 iso 获取驱动
|
||||||
mkdir -p $drv/virtio
|
if [ "$nt_ver" = 6.0 ] || [ "$nt_ver" = 6.1 ] || [ "$arch_wim" = arm64 ]; then
|
||||||
mount -o ro $drv/virtio-win.iso $drv/virtio
|
virtio_source=iso
|
||||||
|
else
|
||||||
apk add dmidecode
|
virtio_source=msi
|
||||||
dmi=$(dmidecode)
|
|
||||||
|
|
||||||
if echo "$dmi" | grep -Eiw "Google Compute Engine|GoogleCloud"; then
|
|
||||||
gce_repo=https://packages.cloud.google.com/yuck
|
|
||||||
download $gce_repo/repos/google-compute-engine-stable/index /tmp/gce.json
|
|
||||||
# gga 好像只是用于调节后台vnc分辨率
|
|
||||||
for name in gvnic gga; do
|
|
||||||
mkdir -p $drv/gce/$name
|
|
||||||
link=$(grep -o "/pool/.*-google-compute-engine-driver-$name\.goo" /tmp/gce.json)
|
|
||||||
wget $gce_repo$link -O- | tar -xzf- -C $drv/gce/$name
|
|
||||||
done
|
|
||||||
|
|
||||||
# 没有 win6.0 文件夹
|
|
||||||
sys_gce=win$nt_ver
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
elif [ "$(dmidecode -s chassis-asset-tag)" = "7783-7084-3265-9085-8269-3286-77" ] &&
|
baseurl=https://fedorapeople.org/groups/virt/virtio-win/direct-downloads
|
||||||
[ "$arch_wim" != arm64 ]; then
|
|
||||||
# azure
|
if [ "$virtio_source" = iso ]; then
|
||||||
# 有 x86 x64,没 arm64
|
download $baseurl/$dir/virtio-win.iso $drv/virtio.iso
|
||||||
# https://learn.microsoft.com/azure/virtual-network/accelerated-networking-mana-windows
|
mkdir -p $drv/virtio
|
||||||
|
mount -o ro $drv/virtio.iso $drv/virtio
|
||||||
|
else
|
||||||
|
# coreutils 的 cp mv rm 才有 -v 参数
|
||||||
|
apk add 7zip file coreutils
|
||||||
|
download $baseurl/$dir/virtio-win-gt-$arch_xdd.msi $drv/virtio.msi
|
||||||
|
match="FILE_*_${sys}_${arch}*"
|
||||||
|
7z x $drv/virtio.msi -o$drv/virtio -i!$match -y -bb1
|
||||||
|
|
||||||
|
(
|
||||||
|
cd $drv/virtio
|
||||||
|
# 为没有后缀名的文件添加后缀名
|
||||||
|
echo "Recognizing file extension..."
|
||||||
|
for file in *"${sys}_${arch}"; do
|
||||||
|
recognized=false
|
||||||
|
maybe_exts=$(file -b --extension "$file")
|
||||||
|
|
||||||
|
# exe/sys -> sys
|
||||||
|
# exe/com -> exe
|
||||||
|
# dll/cpl/tlb/ocx/acm/ax/ime -> dll
|
||||||
|
for ext in sys exe dll; do
|
||||||
|
if echo $maybe_exts | grep -qw $ext; then
|
||||||
|
recognized=true
|
||||||
|
mv -v "$file" "$file.$ext"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 如果识别不了后缀名,就删除此文件
|
||||||
|
# 因为用不了,免得占用空间
|
||||||
|
if ! $recognized; then
|
||||||
|
rm -fv "$file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 将
|
||||||
|
# FILE_netkvm_netkvmco_w8.1_amd64.dll
|
||||||
|
# FILE_netkvm_w8.1_amd64.cat
|
||||||
|
# 改名为
|
||||||
|
# netkvmco.dll
|
||||||
|
# netkvm.cat
|
||||||
|
echo "Renaming files..."
|
||||||
|
for file in *; do
|
||||||
|
new_file=$(echo "$file" | sed "s|FILE_||; s|_${sys}_${arch}||; s|.*_||")
|
||||||
|
mv -v "$file" "$new_file"
|
||||||
|
done
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# gcp
|
||||||
|
if { is_dmi_contains "Google Compute Engine" || is_dmi_contains "GoogleCloud"; } &&
|
||||||
|
{ [ "$arch_wim" = x86 ] || [ "$arch_wim" = x86_64 ]; }; then
|
||||||
|
|
||||||
|
gce_repo=https://packages.cloud.google.com/yuck
|
||||||
|
download $gce_repo/repos/google-compute-engine-stable/index /tmp/gce.json
|
||||||
|
# gga 好像只是用于调节后台vnc分辨率
|
||||||
|
for name in gvnic gga; do
|
||||||
|
mkdir -p $drv/gce/$name
|
||||||
|
link=$(grep -o "/pool/.*-google-compute-engine-driver-$name\.goo" /tmp/gce.json)
|
||||||
|
wget $gce_repo$link -O- | tar -xzf- -C $drv/gce/$name
|
||||||
|
|
||||||
|
# 没有 win6.0 文件夹
|
||||||
|
# TODO: 测试是否可用
|
||||||
|
if false; then
|
||||||
|
mkdir -p $drv/gce/$name/win6.0/
|
||||||
|
cp -r $drv/gce/$name/win6.1/* $drv/gce/$name/win6.0/
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# azure
|
||||||
|
# https://learn.microsoft.com/azure/virtual-network/accelerated-networking-mana-windows
|
||||||
|
if is_dmi_contains "7783-7084-3265-9085-8269-3286-77" &&
|
||||||
|
{ [ "$arch_wim" = x86 ] || [ "$arch_wim" = x86_64 ]; }; then
|
||||||
|
|
||||||
download https://aka.ms/manawindowsdrivers $drv/azure.zip
|
download https://aka.ms/manawindowsdrivers $drv/azure.zip
|
||||||
unzip $drv/azure.zip -d $drv/azure/
|
unzip $drv/azure.zip -d $drv/azure/
|
||||||
fi
|
fi
|
||||||
@ -2188,20 +2271,28 @@ install_windows() {
|
|||||||
# 添加驱动
|
# 添加驱动
|
||||||
mkdir -p /wim/drivers
|
mkdir -p /wim/drivers
|
||||||
[ -d $drv/virtio ] && {
|
[ -d $drv/virtio ] && {
|
||||||
if [ "$nt_ver" = 6.0 ]; then
|
if [ "$virtio_source" = iso ]; then
|
||||||
# 气球驱动有问题
|
# iso
|
||||||
cp_drivers $drv/virtio -ipath "*/$sys/$arch/*" -not -ipath "*/balloon/*"
|
if [ "$nt_ver" = 6.0 ]; then
|
||||||
|
# win7 气球驱动有问题
|
||||||
|
cp_drivers $drv/virtio -ipath "*/$sys/$arch/*" -not -ipath "*/balloon/*"
|
||||||
|
else
|
||||||
|
cp_drivers $drv/virtio -ipath "*/$sys/$arch/*"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
cp_drivers $drv/virtio -ipath "*/$sys/$arch/*"
|
# msi
|
||||||
|
# 虽然 win7 气球驱动有问题,但 msi 里面没有 win7 驱动
|
||||||
|
# 因此不用额外处理
|
||||||
|
cp_drivers $drv/virtio
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
[ -d $drv/aws ] && cp_drivers $drv/aws
|
[ -d $drv/aws ] && cp_drivers $drv/aws
|
||||||
[ -d $drv/xen ] && cp_drivers $drv/xen -ipath "*/$arch_xen/*"
|
[ -d $drv/xen ] && cp_drivers $drv/xen -ipath "*/$arch_xdd/*"
|
||||||
[ -d $drv/azure ] && cp_drivers $drv/azure
|
[ -d $drv/azure ] && cp_drivers $drv/azure
|
||||||
[ -d $drv/gce ] && {
|
[ -d $drv/gce ] && {
|
||||||
[ "$arch_wim" = x86 ] && gvnic_suffix=-32 || gvnic_suffix=
|
[ "$arch_wim" = x86 ] && gvnic_suffix=-32 || gvnic_suffix=
|
||||||
cp_drivers $drv/gce/gvnic -ipath "*/$sys_gce$gvnic_suffix/*"
|
cp_drivers $drv/gce/gvnic -ipath "*/win$nt_ver$gvnic_suffix/*"
|
||||||
cp_drivers $drv/gce/gga -ipath "*/$sys_gce/*"
|
cp_drivers $drv/gce/gga -ipath "*/win$nt_ver/*"
|
||||||
}
|
}
|
||||||
|
|
||||||
# win7 要添加 bootx64.efi 到 efi 目录
|
# win7 要添加 bootx64.efi 到 efi 目录
|
||||||
@ -2322,18 +2413,16 @@ install_redhat_ubuntu() {
|
|||||||
if [ "$distro" = "ubuntu" ]; then
|
if [ "$distro" = "ubuntu" ]; then
|
||||||
download $iso /os/installer/ubuntu.iso
|
download $iso /os/installer/ubuntu.iso
|
||||||
|
|
||||||
apk add dmidecode
|
|
||||||
dmi=$(dmidecode)
|
|
||||||
# https://github.com/systemd/systemd/blob/main/src/basic/virt.c
|
# https://github.com/systemd/systemd/blob/main/src/basic/virt.c
|
||||||
# https://github.com/canonical/cloud-init/blob/main/tools/ds-identify
|
# https://github.com/canonical/cloud-init/blob/main/tools/ds-identify
|
||||||
# http://git.annexia.org/?p=virt-what.git;a=blob;f=virt-what.in;hb=HEAD
|
# http://git.annexia.org/?p=virt-what.git;a=blob;f=virt-what.in;hb=HEAD
|
||||||
if echo "$dmi" | grep -Eiw "amazon|ec2"; then
|
if is_dmi_contains "amazon" || is_dmi_contains "ec2"; then
|
||||||
kernel=aws
|
kernel=aws
|
||||||
elif echo "$dmi" | grep -Eiw "Google Compute Engine|GoogleCloud"; then
|
elif is_dmi_contains "Google Compute Engine" || is_dmi_contains "GoogleCloud"; then
|
||||||
kernel=gcp
|
kernel=gcp
|
||||||
elif echo "$dmi" | grep -Eiw "OracleCloud"; then
|
elif is_dmi_contains "OracleCloud"; then
|
||||||
kernel=oracle
|
kernel=oracle
|
||||||
elif echo "$dmi" | grep -Eiw "7783-7084-3265-9085-8269-3286-77"; then
|
elif is_dmi_contains "7783-7084-3265-9085-8269-3286-77"; then
|
||||||
kernel=azure
|
kernel=azure
|
||||||
else
|
else
|
||||||
kernel=generic
|
kernel=generic
|
||||||
|
Loading…
x
Reference in New Issue
Block a user