From 10a8699d1247c870d03c5b78b034be84124ded03 Mon Sep 17 00:00:00 2001 From: bin456789 Date: Fri, 5 Apr 2024 22:45:59 +0800 Subject: [PATCH] =?UTF-8?q?windows:=20=E6=94=AF=E6=8C=81=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=9F=A5=E6=89=BE=20iso=20=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 32 +++-- README.md | 44 ++++--- reinstall.sh | 355 ++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 397 insertions(+), 34 deletions(-) diff --git a/README.en.md b/README.en.md index 537e18a..d19f460 100644 --- a/README.en.md +++ b/README.en.md @@ -122,17 +122,25 @@ bash reinstall.sh netboot.xyz ```bash bash reinstall.sh windows \ - --iso 'https://drive.massgrave.dev/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso' \ + --image-name 'Windows 10 Enterprise LTSC 2021' \ + --iso 'https://drive.massgrave.dev/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso' +``` + +- Now supports automatically searching for Windows (including LTSC) and Windows Server ISO links. +- Need to set the language using `--lang`, default `en-us`. +- Search Source: + +```bash +bash reinstall.sh windows \ --image-name 'Windows 10 Enterprise LTSC 2021' + --lang zh-cn ``` ![Installing Windows](https://github.com/bin456789/reinstall/assets/7548515/07c1aea2-1ce3-4967-904f-aaf9d6eec3f7) -Parameters: +Parameters Description: -`--iso` Original image link - -`--image-name` Specify the image to install, case-insensitive, for example: +`--image-name` Specify the image to install, case-insensitive, Commonly used images include: ```text Windows 7 Ultimate @@ -153,11 +161,11 @@ Use `Dism++` File menu > Open Image File, select the iso to be installed to get - Hyper-V Server - Azure Stack HCI 2. The script will install the following drivers as needed: - - KVM ([Virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)) - - XEN ([XEN PV](https://xenproject.org/windows-pv-drivers/), [AWS PV](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/xen-drivers-overview.html)) - - AWS ([ENA Network Adapter](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/enhanced-networking-ena.html), [NVMe Storage Controller](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/aws-nvme-drivers.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)) - - Azure ([MANA Network Adapter](https://learn.microsoft.com/zh-cn/azure/virtual-network/accelerated-networking-mana-windows)) + - KVM ([Virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)) + - XEN ([XEN PV](https://xenproject.org/windows-pv-drivers/), [AWS PV](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/xen-drivers-overview.html)) + - AWS ([ENA Network Adapter](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/enhanced-networking-ena.html), [NVMe Storage Controller](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/aws-nvme-drivers.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)) + - Azure ([MANA Network Adapter](https://learn.microsoft.com/zh-cn/azure/virtual-network/accelerated-networking-mana-windows)) 3. Vista (Server 2008) and 32-bit systems may lack drivers. 4. For EFI machines without CSM enabled, Windows 7 (Server 2008 R2) cannot be installed. 5. If the machine has a static IP, the IP will be automatically set after installation. @@ -173,6 +181,8 @@ Use `Dism++` File menu > Open Image File, select the iso to be installed to get (Recommended, iso sourced from official channels, updated monthly, includes the latest patches) + + (Need to open it with a mobile User-Agent) @@ -184,8 +194,8 @@ Use `Dism++` File menu > Open Image File, select the iso to be installed to get | Debian | 384M | 512M | | Ubuntu | 1G | 512M | | CentOS / Alma / Rocky / Fedora | 1G | 512M | -| Alpine | 256M | - | | openSUSE | - | 512M | +| Alpine | 256M | - | | Arch | 512M | - | | Gentoo | 512M | - | | Windows 8.1 (Server 2012 R2) or below | 512M | - | diff --git a/README.md b/README.md index 6c38a14..0ea0f33 100644 --- a/README.md +++ b/README.md @@ -122,17 +122,25 @@ bash reinstall.sh netboot.xyz ```bash bash reinstall.sh windows \ - --iso 'https://drive.massgrave.dev/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso' \ + --image-name 'Windows 10 Enterprise LTSC 2021' \ + --iso 'https://drive.massgrave.dev/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso' +``` + +- 现在脚本支持自动查找 Windows (含 LTSC) 和 Windows Server iso 链接 +- 需设置语言 `--lang`,默认 `en-us` +- 查找源: + +```bash +bash reinstall.sh windows \ --image-name 'Windows 10 Enterprise LTSC 2021' + --lang zh-cn ``` ![Installing Windows](https://github.com/bin456789/reinstall/assets/7548515/07c1aea2-1ce3-4967-904f-aaf9d6eec3f7) -参数: +参数说明: -`--iso` 原版镜像链接 - -`--image-name` 指定要安装的映像,不区分大小写,例如: +`--image-name` 指定要安装的映像,不区分大小写,常用映像有: ```text Windows 7 Ultimate @@ -146,18 +154,18 @@ Windows Server 2022 SERVERDATACENTER ![image-name](https://github.com/bin456789/reinstall/assets/7548515/5aae0a9b-61e2-4f66-bb98-d470a6beaac2) 1. 支持的系统: - - Windows Vista 到 11 - - Windows Server 2008 到 2022,包括以下衍生版 - - Windows Server Essentials - - Windows Server Annual Channel - - Hyper-V Server - - Azure Stack HCI + - Windows Vista 到 11 + - Windows Server 2008 到 2022,包括以下衍生版 + - Windows Server Essentials + - Windows Server Annual Channel + - Hyper-V Server + - Azure Stack HCI 2. 脚本会按需安装以下驱动: - - KVM ([Virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)) - - XEN ([XEN PV](https://xenproject.org/windows-pv-drivers/)、[AWS PV](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/xen-drivers-overview.html)) - - AWS ([ENA 网卡](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/enhanced-networking-ena.html)、[NVME 存储控制器](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/aws-nvme-drivers.html)) - - GCP ([gVNIC 网卡](https://cloud.google.com/compute/docs/networking/using-gvnic)、[GGA 显卡](https://cloud.google.com/compute/docs/instances/enable-instance-virtual-display)) - - Azure ([MANA 网卡](https://learn.microsoft.com/zh-cn/azure/virtual-network/accelerated-networking-mana-windows)) + - KVM ([Virtio](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)) + - XEN ([XEN PV](https://xenproject.org/windows-pv-drivers/)、[AWS PV](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/xen-drivers-overview.html)) + - AWS ([ENA 网卡](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/enhanced-networking-ena.html)、[NVME 存储控制器](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/aws-nvme-drivers.html)) + - GCP ([gVNIC 网卡](https://cloud.google.com/compute/docs/networking/using-gvnic)、[GGA 显卡](https://cloud.google.com/compute/docs/instances/enable-instance-virtual-display)) + - Azure ([MANA 网卡](https://learn.microsoft.com/zh-cn/azure/virtual-network/accelerated-networking-mana-windows)) 3. Vista (Server 2008) 和 32 位系统可能会缺少驱动 4. 未开启 CSM 的 EFI 机器,无法安装 Windows 7 (Server 2008 R2) 5. 静态 IP 的机器,安装后会自动配置好 IP @@ -173,6 +181,8 @@ Windows Server 2022 SERVERDATACENTER (推荐,iso 来自官方,每月更新,包含最新补丁) + + (需用手机 User-Agent 打开) @@ -184,8 +194,8 @@ Windows Server 2022 SERVERDATACENTER | Debian | 384M | 512M | | Ubuntu | 1G | 512M | | CentOS / Alma / Rocky / Fedora | 1G | 512M | -| Alpine | 256M | - | | openSUSE | - | 512M | +| Alpine | 256M | - | | Arch | 512M | - | | Gentoo | 512M | - | | Windows 8.1 (Server 2012 R2) 或以下 | 512M | - | diff --git a/reinstall.sh b/reinstall.sh index 5b142c3..e78db60 100644 --- a/reinstall.sh +++ b/reinstall.sh @@ -329,6 +329,337 @@ is_virt() { $_is_virt } +# sr-latn-rs 到 sr-latn +en_us() { + echo "$lang" | awk -F- '{print $1"-"$2}' + + # zh-hk 可回落到 zh-tw + if [ "$lang" = zh-hk ]; then + echo zh-tw + fi +} + +# fr-ca 到 fr +us() { + # 葡萄牙准确对应 pp + if [ "$lang" = pt-pt ]; then + echo pp + return + fi + # 巴西准确对应 pt + if [ "$lang" = pt-br ]; then + echo pt + return + fi + + echo "$lang" | awk -F- '{print $2}' + + # hk 额外回落到 tw + if [ "$lang" = zh-hk ]; then + echo tw + fi +} + +# fr-ca 到 fr-fr +en_en() { + echo "$lang" | awk -F- '{print $1"-"$1}' + + # en-gb 额外回落到 en-us + if [ "$lang" = en-gb ]; then + echo en-us + fi +} + +# zh-cn 到 zh +en() { + # 巴西/葡萄牙回落到葡萄牙语 + if [ "$lang" = pt-br ] || [ "$lang" = pt-br ]; then + echo "pp" + return + fi + + echo "$lang" | awk -F- '{print $1}' +} + +english() { + case "$lang" in + ar-sa) echo Arabic ;; + bg-bg) echo Bulgarian ;; + cs-cz) echo Czech ;; + da-dk) echo Danish ;; + de-de) echo German ;; + el-gr) echo Greek ;; + en-gb) echo Eng_Intl ;; + en-us) echo English ;; + es-es) echo Spanish ;; + es-mx) echo Spanish_Latam ;; + et-ee) echo Estonian ;; + fi-fi) echo Finnish ;; + fr-ca) echo FrenchCanadian ;; + fr-fr) echo French ;; + he-il) echo Hebrew ;; + hr-hr) echo Croatian ;; + hu-hu) echo Hungarian ;; + it-it) echo Italian ;; + ja-jp) echo Japanese ;; + ko-kr) echo Korean ;; + lt-lt) echo Lithuanian ;; + lv-lv) echo Latvian ;; + nb-no) echo Norwegian ;; + nl-nl) echo Dutch ;; + pl-pl) echo Polish ;; + pt-pt) echo Portuguese ;; + pt-br) echo Brazilian ;; + ro-ro) echo Romanian ;; + ru-ru) echo Russian ;; + sk-sk) echo Slovak ;; + sl-si) echo Slovenian ;; + sr-latn | sr-latn-rs) echo Serbian_Latin ;; + sv-se) echo Swedish ;; + th-th) echo Thai ;; + tr-tr) echo Turkish ;; + uk-ua) echo Ukrainian ;; + zh-cn) echo ChnSimp ;; + zh-hk | zh-tw) echo ChnTrad ;; + esac +} + +parse_windows_image_name() { + set -- $image_name + + if ! [ "$1" = windows ]; then + return 1 + fi + shift + + if [ "$1" = server ]; then + server=server + shift + fi + version=$1 + shift + + if [ "$1" = r2 ]; then + version+=" r2" + shift + fi + + edition= + for i in "$@"; do + case "$i" in + # windows 10 enterprise n ltsc 2021 + k | n | kn) ;; + *) + if [ -n "$edition" ]; then + edition+=" " + fi + edition+="$1" + ;; + esac + shift + done +} + +is_have_arm_version() { + case "$version" in + 10) + case "$edition" in + pro | 'pro for workstations' | education | 'pro education' | enterprise) return ;; + 'iot enterprise') return ;; + 'iot enterprise ltsc 2021' | 'enterprise ltsc 2021') return ;; + esac + ;; + 11) + case "$edition" in + pro | 'pro for workstations' | education | 'pro education' | enterprise) return ;; + 'iot enterprise') return ;; + esac + ;; + esac + return 1 +} + +find_windows_iso() { + parse_windows_image_name || error_and_exit "--image-name wrong: $image_name" + if ! [ "$version" = 8.1 ] && [ -z "$edition" ]; then + error_and_exit "Edition is not set." + fi + if [ "$basearch" = 'aarch64' ] && ! is_have_arm_version; then + error_and_exit "No ARM iso for this Windows Version." + fi + + if [ -z "$lang" ]; then + lang=en-us + fi + langs="$lang $(en_us) $(us) $(en_en) $(en)" + langs=$(echo "$langs" | xargs -n 1 | awk '!seen[$0]++') + full_lang=$(english) + + case "$basearch" in + x86_64) arch_win=x64 ;; + aarch64) arch_win=arm64 ;; + esac + + get_windows_iso_links + get_windows_iso_link +} + +get_windows_iso_links() { + label_msdn=$( + if [ -n "$server" ]; then + case "$version" in + 2008 | '2008 r2') + case "$edition" in + serverweb | serverwebcore) echo _ ;; + serverstandard | serverstandardcore) echo _ ;; + serverenterprise | serverenterprisecore) echo _ ;; + serverdatacenter | serverdatacentercore) echo _ ;; + esac + ;; + '2012 r2' | 2016 | 2019 | 2022) + case "$edition" in + serverstandard | serverstandardcore) echo _ ;; + serverdatacenter | serverdatacentercore) echo _ ;; + esac + ;; + esac + else + case "$version" in + vista) + case "$edition" in + enterprise) echo _ ;; + homebasic | homepremium | business | ultimate) echo _ ;; + esac + ;; + 7) + case "$edition" in + professional) echo professional ;; + business | enterprise) echo enterprise ;; + homebasic | homepremium | ultimate) echo ultimate ;; + esac + ;; + 8.1) + case "$edition" in + '') echo _ ;; + pro) echo pro ;; + enterprise) echo enterprise ;; + esac + ;; + 10) + case "$edition" in + home | 'home single language') echo consumer ;; + pro | 'pro for workstations' | education | 'pro education' | enterprise) echo business ;; + 'iot enterprise') echo 'iot enterprise' ;; + 'enterprise 2015 ltsb' | 'enterprise 2016 ltsb') echo "$edition" ;; + 'enterprise ltsc 2019' | 'iot enterprise ltsc 2019' | 'iot enterprise ltsc 2021') echo "$edition" ;; + 'enterprise ltsc 2021') + # arm64 的 enterprise ltsc 2021 要下载 iot enterprise ltsc 2021 iso + case "$arch_win" in + arm64) echo 'iot enterprise ltsc 2021' ;; + x86 | x64) echo 'enterprise ltsc 2021' ;; + esac + ;; + esac + ;; + 11) + case "$edition" in + home | 'home single language') echo consumer ;; + pro | 'pro for workstations' | education | 'pro education' | enterprise) echo business ;; + 'iot enterprise') echo 'iot enterprise' ;; + esac + ;; + esac + fi + ) + + label_vlsc=$( + case "$version" in + 10 | 11) + case "$edition" in + pro | 'pro for workstations' | education | 'pro education' | enterprise) echo pro ;; + esac + ;; + esac + ) + + page=$( + if [ "$arch_win" = arm64 ]; then + echo arm + elif grep -Ewq 'ltsb|ltsc' <<<"$edition"; then + echo ltsc + elif [ "$server" = 'server' ]; then + echo server + else + case "$version" in + vista | 7 | 8.1 | 10 | 11) + echo "$version" + ;; + esac + fi + ) + page_url=https://massgrave.dev/windows_${page}_links.html + + info "Find windows iso" + echo "Version: $version" + echo "Edition: $edition" + echo "Label msdn: $label_msdn" + echo "Label vlsc: $label_vlsc" + echo "List: $page_url" + echo + + if [ -n "$page" ] && { [ -n "$label_msdn" ] || [ -n "$label_vlsc" ]; }; then + if [ "$label_msdn" = _ ]; then + label_msdn= + fi + if [ "$label_vlsc" = _ ]; then + label_vlsc= + fi + else + error_and_exit "Not support find this iso. Check --image-name or set --iso manually." + fi + + curl -L "$page_url" | grep -ioP 'https://.*?.iso' | awk -F/ '{print $NF}' >$tmp/win.list +} + +get_shortest_line() { + # awk '{print length($0), $0}' | sort -n | head -1 | awk '{print $2}' + awk '(NR == 1 || length($0) < length(shortest)) { shortest = $0 } END { print shortest }' +} + +get_windows_iso_link() { + regexs=() + + # msdn + for lang in $langs; do + regex= + for i in ${lang} windows ${server} ${version} ${label_msdn}; do + if [ -n "$i" ]; then + regex+="${i}_" + fi + done + regex+=".*${arch_win}.*.iso" + + regexs+=("$regex") + done + + # vlsc + regex="sw_dvd9_win_${label_vlsc}_${version}.*${arch_win}_${full_lang}.*.iso" + regexs+=("$regex") + + # 查找 + for regex in "${regexs[@]}"; do + regex=${regex// /_} + + echo "finding: $regex" >&2 + if file=$(grep -Eix "$regex" "$tmp/win.list" | get_shortest_line | grep .); then + iso="https://drive.massgrave.dev/$file" + return + fi + done + + error_and_exit "Could not find windows iso." +} + setos() { local step=$1 local distro=$2 @@ -548,6 +879,11 @@ setos() { } setos_windows() { + if [ -z "$iso" ]; then + echo "iso url is not set. Try to find it." + find_windows_iso + fi + test_url $iso 'iso|dos/mbr' eval "${step}_iso='$iso'" eval "${step}_image_name='$image_name'" @@ -705,8 +1041,8 @@ verify_os_args() { case "$distro" in dd) [ -n "$img" ] || error_and_exit "dd need --img" ;; windows) - if [ -z "$iso" ] || [ -z "$image_name" ]; then - error_and_exit "Install Windows need --iso and --image-name" + if [ -z "$image_name" ]; then + error_and_exit "Install Windows need --image-name." fi ;; esac @@ -881,7 +1217,7 @@ check_ram() { alpine | debian | dd) echo 256 ;; arch | gentoo | windows) echo 512 ;; centos | alma | rocky | fedora | ubuntu) echo 1024 ;; - opensuse) echo max ;; # 没有安装模式 + opensuse) echo -1 ;; # 没有安装模式 esac ) @@ -1977,7 +2313,7 @@ else fi # 整理参数 -if ! opts=$(getopt -n $0 -o "" --long debug,hold:,sleep:,iso:,image-name:,img:,ci,cloud-image -- "$@"); then +if ! opts=$(getopt -n $0 -o "" --long ci,debug,hold:,sleep:,iso:,image-name:,img:,lang: -- "$@"); then usage_and_exit fi @@ -1989,12 +2325,15 @@ while true; do set -x shift ;; - --ci | --cloud-image) + --ci) cloud_image=1 shift ;; --hold | --sleep) hold=$2 + if ! { [ "$hold" = 1 ] || [ "$hold" = 2 ]; }; then + error_and_exit "Invalid --hold value: $hold." + fi shift 2 ;; --img) @@ -2006,7 +2345,11 @@ while true; do shift 2 ;; --image-name) - image_name=$2 + image_name=$(echo "$2" | to_lower) + shift 2 + ;; + --lang) + lang=$(echo "$2" | to_lower) shift 2 ;; --)