diff --git a/README.en.md b/README.en.md index 3c7c95d..3fc4a81 100644 --- a/README.en.md +++ b/README.en.md @@ -261,7 +261,7 @@ Use `Dism++` File menu > Open Image File, select the iso to be installed to get #### The script will install the following drivers as needed -- KVM ([Virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)) +- KVM ([Virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/), [Alibaba Cloud](https://www.alibabacloud.com/help/ecs/user-guide/update-red-hat-virtio-drivers-of-windows-instances)) - XEN ([XEN](https://xenproject.org/windows-pv-drivers/), [Citrix](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Upgrading_PV_drivers.html#win2008-citrix-upgrade), [AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/xen-drivers-overview.html)) - AWS ([ENA Network Adapter](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ena-driver-releases-windows.html), [NVMe Storage Controller](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nvme-driver-version-history.html)) - GCP ([gVNIC Network Adapter](https://cloud.google.com/compute/docs/networking/using-gvnic), [GGA Graphics](https://cloud.google.com/compute/docs/instances/enable-instance-virtual-display)) diff --git a/README.md b/README.md index ccdd652..d389807 100644 --- a/README.md +++ b/README.md @@ -261,7 +261,7 @@ Windows Server 2022 SERVERDATACENTER #### 脚本会按需安装以下驱动 -- KVM ([Virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)) +- KVM ([Virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)、[阿里云](https://www.alibabacloud.com/help/ecs/user-guide/update-red-hat-virtio-drivers-of-windows-instances)) - XEN ([XEN](https://xenproject.org/windows-pv-drivers/)、[Citrix](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Upgrading_PV_drivers.html#win2008-citrix-upgrade)、[AWS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/xen-drivers-overview.html)) - AWS ([ENA 网卡](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ena-driver-releases-windows.html)、[NVME 存储控制器](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nvme-driver-version-history.html)) - GCP ([gVNIC 网卡](https://cloud.google.com/compute/docs/networking/using-gvnic)、[GGA 显卡](https://cloud.google.com/compute/docs/instances/enable-instance-virtual-display)) diff --git a/trans.sh b/trans.sh index e5341a1..a351581 100644 --- a/trans.sh +++ b/trans.sh @@ -365,18 +365,37 @@ clear_previous() { # mount /1/file2 /2 } -get_virt_to() { - if [ -z "$_virt" ]; then +cache_dmi_and_virt() { + if [ -z "$_dmi" ] || [ -z "$_virt" ]; then + # virt-what 自动安装 dmidecode apk add virt-what - _virt="$(virt-what)" + _virt=$(virt-what) + _dmi=$(dmidecode | grep -E '(Manufacturer|Asset Tag|Vendor): ' | awk -F': ' '{print $2}') apk del virt-what fi - eval "$1='$_virt'" } is_virt() { - get_virt_to virt - [ -n "$virt" ] + cache_dmi_and_virt + [ -n "$_virt" ] +} + +is_virt_contains() { + cache_dmi_and_virt + echo "$_virt" | grep -Eiwq "$1" +} + +is_dmi_contains() { + # Manufacturer: Alibaba Cloud + # Manufacturer: Tencent Cloud + # Manufacturer: Huawei Cloud + # Asset Tag: OracleCloud.com + # Vendor: Amazon EC2 + # Manufacturer: Amazon EC2 + # Asset Tag: Amazon EC2 + cache_dmi_and_virt + echo "$_dmi" | grep -Eiwq "$1" +} } get_ra_to() { @@ -3306,23 +3325,6 @@ EOF # 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" -} get_aws_repo() { if is_in_china >&2; then @@ -3378,6 +3380,36 @@ get_server_name_by_build_ver() { fi } +is_nt_ver_ge() { + local orig sorted + orig=$(printf '%s\n' "$1" "$nt_ver") + sorted=$(echo "$orig" | sort -V) + [ "$orig" = "$sorted" ] +} + +get_cloud_vendor() { + # busybox blkid 不显示 sr0 的 UUID + apk add lsblk + + # http://git.annexia.org/?p=virt-what.git;a=blob;f=virt-what.in;hb=HEAD + # virt-what 可识别厂商 aws google_cloud alibaba_cloud alibaba_cloud-ebm + if is_dmi_contains "Amazon EC2" || is_virt_contains aws; then + echo aws + elif is_dmi_contains "Google Compute Engine" || is_dmi_contains "GoogleCloud" || is_virt_contains google_cloud; then + echo gcp + elif is_dmi_contains "OracleCloud"; then + echo oracle + elif is_dmi_contains "7783-7084-3265-9085-8269-3286-77"; then + echo azure + elif lsblk -o UUID,LABEL | grep -i 9796-932E | grep -iq config-2; then + echo ibm + elif is_dmi_contains 'Huawei Cloud'; then + echo huawei + elif is_dmi_contains 'Alibaba Cloud'; then + echo aliyun + fi +} + install_windows() { apk add wimlib @@ -3493,6 +3525,7 @@ install_windows() { # arch_wim wiminfo x86 x86_64 ARM64 # arch virtio iso / unattend.xml x86 amd64 arm64 # arch_xdd virtio msi / xen驱动 x86 x64 + # arch_dd 华为云驱动 32 64 # 将 wim 的 arch 转为驱动和应答文件的 arch arch_wim=$(get_selected_image_prop Architecture | to_lower) @@ -3500,30 +3533,74 @@ install_windows() { x86) arch=x86 arch_xdd=x86 + arch_dd=32 ;; x86_64) arch=amd64 arch_xdd=x64 + arch_dd=64 ;; arm64) arch=arm64 arch_xdd= # xen 没有 arm64 驱动,# virtio 也没有 arm64 msi + arch_dd= # 华为云没有 arm64 驱动 ;; esac - # 驱动 - drv=/os/drivers - mkdir -p $drv + add_drivers() { + drv=/os/drivers + mkdir -p "$drv" # 驱动下载临时文件夹 + mkdir -p "/wim/drivers" # boot.wim 驱动文件夹 + + vendor="$(get_cloud_vendor)" + + # 虚拟化驱动/通用驱动 + if is_virt_contains kvm; then + # kvm + if [ "$vendor" = aliyun ] && is_nt_ver_ge 6.1 && [ "$arch_wim" = x86_64 ]; then + add_driver_aliyun_kvm + # 未测试是否需要专用驱动 + elif false && [ "$vendor" = huawei ] && is_nt_ver_ge 6.0 && { [ "$arch_wim" = x86 ] || [ "$arch_wim" = x86_64 ]; }; then + add_driver_huawei_kvm + else + # 兜底 + add_driver_generic_kvm + fi + elif is_virt_contains xen; then + # xen + # generic_xen 兜底,但未签名,暂停使用 + if is_nt_ver_ge 6.1 && [ "$arch_wim" = x86_64 ]; then + add_driver_aws_xen + elif is_nt_ver_ge 6.0 && { [ "$arch_wim" = x86 ] || [ "$arch_wim" = x86_64 ]; }; then + add_driver_citrix_xen + fi + fi + + # 厂商驱动 + case "$vendor" in + aws) + if is_nt_ver_ge 6.1 && { [ "$arch_wim" = x86_64 ] || [ "$arch_wim" = arm64 ]; }; then + add_driver_aws + fi + ;; + azure) + # inf 不限版本,未测试 + if [ "$arch_wim" = x86 ] || [ "$arch_wim" = x86_64 ]; then + add_driver_azure + fi + ;; + gcp) + # inf 不限版本,6.0 能装但用不了 + # x86 x86_64 arm64 都有 + add_driver_gcp + ;; + esac + } # aws nitro - # 不支持 vista # https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/aws-nvme-drivers.html # https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/enhanced-networking-ena.html - if is_virt_contains aws && - is_virt_contains kvm && - { [ "$arch_wim" = x86_64 ] || [ "$arch_wim" = arm64 ]; } && - ! [ "$nt_ver" = 6.0 ]; then - + add_driver_aws() { # 未打补丁的 win7 无法使用 sha256 签名的驱动 nvme_ver=$( case "$nt_ver" in @@ -3548,14 +3625,12 @@ install_windows() { unzip -o -d $drv/aws/ $drv/AWSNVMe.zip unzip -o -d $drv/aws/ $drv/AwsEnaNetworkDriver.zip - fi + + cp_drivers $drv/aws + } # citrix xen - # 仅支持 vista - if is_virt_contains xen && - { [ "$arch_wim" = x86 ] || [ "$arch_wim" = x86_64 ]; } && - [ "$nt_ver" = 6.0 ]; then - + add_driver_citrix_xen() { apk add 7zip download https://s3.amazonaws.com/ec2-downloads-windows/Drivers/Citrix-Win_PV.zip $drv/Citrix-Win_PV.zip unzip -o -d $drv $drv/Citrix-Win_PV.zip @@ -3566,15 +3641,11 @@ install_windows() { # 排除 $PLUGINSDIR $TEMP exclude='$*' 7z x $drv/Citrix_xensetup.exe -o$drv/aws/ -ao$override -x!$exclude - fi + } # aws xen - # 不支持 vista # https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/xen-drivers-overview.html - if is_virt_contains xen && - [ "$arch_wim" = x86_64 ] && - ! [ "$nt_ver" = 6.0 ]; then - + add_driver_aws_xen() { apk add msitools aws_pv_ver=$( @@ -3591,7 +3662,9 @@ install_windows() { msiextract $drv/AWSPVDriverSetup.msi -C $drv mkdir -p $drv/aws/ cp -rf $drv/.Drivers/* $drv/aws/ - fi + + cp_drivers $drv/xen -ipath "*/$arch_xdd/*" + } # xen # 没签名,暂时用aws的驱动代替 @@ -3599,24 +3672,18 @@ install_windows() { # 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 - + add_driver_generic_xen() { parts='xenbus xencons xenhid xeniface xennet xenvbd xenvif xenvkbd' mkdir -p $drv/xen/ for part in $parts; do download https://xenbits.xenproject.org/pvdrivers/win/$part.tar $drv/$part.tar tar -xf $drv/$part.tar -C $drv/xen/ done - fi + } - # kvm (排除 aws) - # x86 x86_64 arm64 都有 + # kvm # https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/ - if is_virt_contains kvm && - ! is_virt_contains aws; then - + add_driver_generic_kvm() { # 要区分 win10 / win11 驱动,虽然他们的 NT 版本号都是 10.0,但驱动文件有区别 # https://github.com/virtio-win/kvm-guest-drivers-windows/commit/9af43da9e16e2d4bf4ea4663cdc4f29275fff48f # vista >>> 2k8 @@ -3655,6 +3722,13 @@ install_windows() { download $baseurl/$dir/virtio-win.iso $drv/virtio.iso mkdir -p $drv/virtio mount -o ro $drv/virtio.iso $drv/virtio + + if [ "$nt_ver" = 6.0 ] || [ "$nt_ver" = 6.1 ]; then + # vista/7 气球驱动有问题 + cp_drivers $drv/virtio -ipath "*/$virtio_sys/$arch/*" -not -ipath "*/balloon/*" + else + cp_drivers $drv/virtio -ipath "*/$virtio_sys/$arch/*" + fi else # coreutils 的 cp mv rm 才有 -v 参数 apk add 7zip file coreutils @@ -3662,9 +3736,9 @@ install_windows() { match="FILE_*_${virtio_sys}_${arch}*" 7z x $drv/virtio.msi -o$drv/virtio -i!$match -y -bb1 + # 为没有后缀名的文件添加后缀名 ( cd $drv/virtio - # 为没有后缀名的文件添加后缀名 echo "Recognizing file extension..." for file in *"${virtio_sys}_${arch}"; do recognized=false @@ -3700,13 +3774,60 @@ install_windows() { mv -v "$file" "$new_file" done ) + # 虽然 vista/7 气球驱动有问题,但 msi 里面没有 vista/7 驱动 + # 因此不用额外处理 + cp_drivers $drv/virtio fi - fi + } + + add_driver_huawei_kvm() { + huawei_sys=$( + case "$(echo "$product_ver" | to_lower)" in + vista) echo Vista2008 ;; + 7) echo 7 ;; + 8) [ "$arch_wim" = x86 ] && echo 7 || echo 2012 ;; # 没有 win8 32/64 + 8.1) [ "$arch_wim" = x86 ] && echo 7 || echo 2012_R2 ;; # 没有 win8.1 32/64 + 10 | 11) echo 10 ;; + 2008) echo Vista2008 ;; + '2008 r2') echo 2008_R2 ;; + 2012) [ "$arch_wim" = x86 ] && echo 2008_R2 || echo 2012 ;; # 没有 2012 32 + '2012 r2') echo 2012_R2 ;; + 2016 | 2019 | 202*) echo 2016 ;; + esac + ) + + download https://ecs-instance-driver.obs.cn-north-1.myhuaweicloud.com/vmtools-windows.zip $drv/vmtools-windows.zip + unzip -o -d $drv $drv/vmtools-windows.zip + mkdir -p $drv/huawei + mount -o ro $drv/vmtools-windows.iso $drv/huawei + + cp_drivers $drv/huawei -ipath "*/upgrade/windows ${huawei_sys}_${arch_dd}/drivers/*" + } + + add_driver_aliyun_kvm() { + aliyun_sys=$( + case "$(echo "$product_ver" | to_lower)" in + 7) echo 7 ;; + 8 | 8.1) echo 8 ;; + 10 | 11) echo 10 ;; + '2008 r2') echo 7 ;; + 2012 | '2012 r2') echo 8 ;; + 2016 | 2019 | 202*) echo 10 ;; + esac + ) + + # 这是旧版 + # 未打补丁的 win7 无法使用新版驱动 (sha256 签名) + download https://windows-driver-cn-beijing.oss-cn-beijing.aliyuncs.com/virtio/210408.1454.1459_bin.zip $drv/aliyun.zip + unzip -o -d $drv/aliyun/ $drv/aliyun.zip + + # 注意文件夹是 win7 Win8 win10 大小写不一致 + cp_drivers $drv/aliyun -ipath "*/win${aliyun_sys}/${arch}/*" + } # gcp # x86 x86_64 arm64 都有 - if { is_dmi_contains "Google Compute Engine" || is_dmi_contains "GoogleCloud"; }; then - + add_driver_gcp() { gce_repo=https://packages.cloud.google.com/yuck download $gce_repo/repos/google-compute-engine-stable/index /tmp/gce.json for name in gvnic gga; do @@ -3730,16 +3851,19 @@ install_windows() { done fi done - fi + + [ "$arch_wim" = x86 ] && gvnic_suffix=-32 || gvnic_suffix= + cp_drivers $drv/gce/gvnic -ipath "*/win$nt_ver$gvnic_suffix/*" + cp_drivers $drv/gce/gga -ipath "*/win$nt_ver/*" + } # 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 - + add_driver_azure() { download https://aka.ms/manawindowsdrivers $drv/azure.zip unzip $drv/azure.zip -d $drv/azure/ - fi + cp_drivers $drv/azure + } # 修改应答文件 download $confhome/windows.xml /tmp/autounattend.xml @@ -3799,31 +3923,7 @@ install_windows() { } # 添加驱动 - mkdir -p /wim/drivers - [ -d $drv/virtio ] && { - if [ "$virtio_source" = iso ]; then - # iso - if [ "$nt_ver" = 6.0 ]; then - # win7 气球驱动有问题 - cp_drivers $drv/virtio -ipath "*/$virtio_sys/$arch/*" -not -ipath "*/balloon/*" - else - cp_drivers $drv/virtio -ipath "*/$virtio_sys/$arch/*" - fi - else - # msi - # 虽然 win7 气球驱动有问题,但 msi 里面没有 win7 驱动 - # 因此不用额外处理 - cp_drivers $drv/virtio - fi - } - [ -d $drv/aws ] && cp_drivers $drv/aws - [ -d $drv/xen ] && cp_drivers $drv/xen -ipath "*/$arch_xdd/*" - [ -d $drv/azure ] && cp_drivers $drv/azure - [ -d $drv/gce ] && { - [ "$arch_wim" = x86 ] && gvnic_suffix=-32 || gvnic_suffix= - cp_drivers $drv/gce/gvnic -ipath "*/win$nt_ver$gvnic_suffix/*" - cp_drivers $drv/gce/gga -ipath "*/win$nt_ver/*" - } + add_drivers # win7 要添加 bootx64.efi 到 efi 目录 [ $arch = amd64 ] && boot_efi=bootx64.efi || boot_efi=bootaa64.efi