From 33264f8cadec050c76f98d14552752bf470b35a0 Mon Sep 17 00:00:00 2001 From: bin456789 Date: Sun, 28 May 2023 00:52:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=20BIOS=20=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E9=87=8D=E8=A3=85=E5=88=B0=20Windows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Autounattend.xml | 20 +----- README.md | 18 ++++-- trans.sh | 156 ++++++++++++++++++++++++++++++++++------------- 3 files changed, 129 insertions(+), 65 deletions(-) diff --git a/Autounattend.xml b/Autounattend.xml index b0b7b52..9ce0583 100644 --- a/Autounattend.xml +++ b/Autounattend.xml @@ -15,20 +15,6 @@ 0 false - - 1 - 1 - FAT32 - - - 2 - 2 - - - 3 - 3 - NTFS - @@ -46,7 +32,7 @@ OnError 0 - 3 + %installto_partitionid% @@ -113,11 +99,11 @@ 2 - xcopy D:\resize.bat C:\Windows\Temp\ + C:\resize.bat 3 - C:\Windows\Temp\resize.bat + cmd /c "del C:\resize.bat" diff --git a/README.md b/README.md index 78cf485..0ceb8ff 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,14 @@ curl -O https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh bash reinstall.sh centos-7 (或其他系统) 安装 Windows: -bash reinstall.sh windows --iso=https://archive.org/download/xxx/zh-cn_windows_10_enterprise_ltsc_2021_x64_dvd_033b7312.iso --image-name='Windows 10 Enterprise LTSC 2021' (或其他系统) +bash reinstall.sh windows --iso=https://example.com/zh-cn_windows_10_enterprise_ltsc_2021_x64_dvd_033b7312.iso --image-name='Windows 10 Enterprise LTSC 2021' 重启: reboot ``` #### 支持重装到: ``` -centos-7/8/9 # centos 8/9 为 stream 版本 +centos-7/8/9 (centos 8/9 为 stream 版本) alma-8/9 rocky-8/9 fedora-36/37/38 @@ -37,13 +37,16 @@ windows (见下方注意事项) ``` #### Windows 注意事项: ``` -只支持 UEFI 引导的机器,已测试成功的系统有 7 10 11,其他系统不保证成功 +支持 x64 BIOS, x64 UEFI,测试成功的系统有 7 10 11 2022 +经测试不支持甲骨文云的 ARM 安装 Windows 需要以下参数 --iso iso 链接,不需要提前添加 virtio 驱动 ---image-name 系统全名,两边要有引号,例如: +--image-name 系统全名,不区分大小写,两边要有引号,例如: 'Windows 7 Ultimate' 'Windows 10 Enterprise LTSC 2021' 'Windows 11 Pro' + 'Windows Server 2022 SERVERDATACENTER' + ``` #### 内存要求: ``` @@ -61,4 +64,11 @@ windows 1G ``` root 123@@@ administrator 123@@@ +```` +#### todo: +``` +32位 Windows +测试 Xen +添加 Xen Windows 驱动 +使用 Cloud Images ```` \ No newline at end of file diff --git a/trans.sh b/trans.sh index 9dc6208..c4da092 100644 --- a/trans.sh +++ b/trans.sh @@ -136,14 +136,14 @@ partx -d /dev/$xda disk_size=$(blockdev --getsize64 /dev/$xda) disk_2t=$((2 * 1024 * 1024 * 1024 * 1024)) -# 对于红帽系是临时分区表,安装时除了 installer 分区,其他分区会重建为默认的大小 -# 对于ubuntu是最终分区表,因为 ubuntu 的安装器不能调整个别分区,只能重建整个分区表 -# {xda}*1 星号用于 nvme0n1p1 的字母 p +# xda*1 星号用于 nvme0n1p1 的字母 p if [ "$distro" = windows ]; then + add_community_repo + apk add ntfs-3g ntfs-3g-progs fuse virt-what wimlib rsync dos2unix + modprobe fuse if [ -d /sys/firmware/efi ]; then - add_community_repo - apk add dosfstools ntfs-3g ntfs-3g-progs fuse virt-what wimlib rsync efibootmgr - modprobe fuse + # efi + apk add dosfstools parted /dev/$xda -s -- \ mklabel gpt \ mkpart '" "' fat32 1MiB 1025MiB \ @@ -154,16 +154,24 @@ if [ "$distro" = windows ]; then set 2 msftres on \ set 3 msftdata on update_part /dev/$xda - mkfs.fat -F 32 -n efi /dev/${xda}*1 #1 efi - echo #2 msr - mkfs.ext4 -F -L os /dev/${xda}*3 #3 os - mkfs.ntfs -f -F -L installer /dev/${xda}*4 #4 installer + mkfs.fat -F 32 -n efi /dev/$xda*1 #1 efi + echo #2 msr + mkfs.ext4 -F -L os /dev/$xda*3 #3 os + mkfs.ntfs -f -F -L installer /dev/$xda*4 #4 installer else - echo "This script not support install windows on none-efi system" - sleep 1m - exec reboot + # bios + parted /dev/$xda -s -- \ + mklabel msdos \ + mkpart primary ntfs 1MiB -6GiB \ + mkpart primary ntfs -6GiB 100% \ + set 1 boot on + update_part /dev/$xda + mkfs.ext4 -F -L os /dev/$xda*1 #1 os + mkfs.ntfs -f -F -L installer /dev/$xda*2 #2 installer fi else + # 对于红帽系是临时分区表,安装时除了 installer 分区,其他分区会重建为默认的大小 + # 对于ubuntu是最终分区表,因为 ubuntu 的安装器不能调整个别分区,只能重建整个分区表 if [ -d /sys/firmware/efi ]; then # efi apk add dosfstools @@ -174,9 +182,9 @@ else mkpart '" "' ext4 -2GiB 100% \ set 1 boot on update_part /dev/$xda - mkfs.fat -F 32 -n efi /dev/${xda}*1 #1 efi - mkfs.ext4 -F -L os /dev/${xda}*2 #2 os - mkfs.ext4 -F -L installer /dev/${xda}*3 #3 installer + mkfs.fat -F 32 -n efi /dev/$xda*1 #1 efi + mkfs.ext4 -F -L os /dev/$xda*2 #2 os + mkfs.ext4 -F -L installer /dev/$xda*3 #3 installer elif [ "$disk_size" -ge "$disk_2t" ]; then # bios 2t parted /dev/$xda -s -- \ @@ -186,9 +194,9 @@ else mkpart '" "' ext4 -2GiB 100% \ set 1 bios_grub on update_part /dev/$xda - echo #1 bios_boot - mkfs.ext4 -F -L os /dev/${xda}*2 #2 os - mkfs.ext4 -F -L installer /dev/${xda}*3 #3 installer + echo #1 bios_boot + mkfs.ext4 -F -L os /dev/$xda*2 #2 os + mkfs.ext4 -F -L installer /dev/$xda*3 #3 installer else # bios parted /dev/$xda -s -- \ @@ -197,8 +205,8 @@ else mkpart primary ext4 -2GiB 100% \ set 1 boot on update_part /dev/$xda - mkfs.ext4 -F -L os /dev/${xda}*1 #1 os - mkfs.ext4 -F -L installer /dev/${xda}*2 #2 installer + mkfs.ext4 -F -L os /dev/$xda*1 #1 os + mkfs.ext4 -F -L installer /dev/$xda*2 #2 installer fi fi @@ -210,7 +218,9 @@ mount /dev/disk/by-label/os /os # 挂载其他分区 mkdir -p /os/boot/efi -mount /dev/disk/by-label/efi /os/boot/efi +if [ -d /sys/firmware/efi/ ]; then + mount /dev/disk/by-label/efi /os/boot/efi +fi mkdir -p /os/installer mount /dev/disk/by-label/installer /os/installer @@ -220,9 +230,8 @@ case "$basearch" in "aarch64") basearch_alt=arm64 ;; esac -# 目前只支持 efi # shellcheck disable=SC2154 -if [ "$distro" = "windows" ] && [ -d /sys/firmware/efi/ ]; then +if [ "$distro" = "windows" ]; then download $iso /os/windows.iso mkdir /iso mount /os/windows.iso /iso @@ -246,8 +255,7 @@ if [ "$distro" = "windows" ] && [ -d /sys/firmware/efi/ ]; then if [ $sys = w7 ]; then # https://github.com/virtio-win/virtio-win-pkg-scripts/issues/40 - # https://tcler.github.io/2022/01/24/virtio-win-for-windows-7/ - dir=archive-virtio/virtio-win-0.1.189-1 + dir=archive-virtio/virtio-win-0.1.173-9 else dir=stable-virtio fi @@ -256,25 +264,60 @@ if [ "$distro" = "windows" ] && [ -d /sys/firmware/efi/ ]; then mount /os/virtio-win.iso /virtio fi - # 复制启动文件到efi分区 - mkdir -p /os/boot/efi/sources/ - /bin/cp -rv /iso/boot* /iso/efi/ /os/boot/efi/ - /bin/cp -rv /iso/sources/boot.wim /os/boot/efi/sources/ - - # 复制全部文件到installer分区,除了 boot.wim - rsync -rv --exclude=/sources/boot.wim /iso/* /os/installer/ - - # 合并分区脚本 - download $confhome/resize.bat /os/installer/resize.bat + # efi: 复制boot开头的文件+efi目录到efi分区,复制iso全部文件(除了boot.wim)到installer分区 + # bios: 复制iso全部文件到installer分区 + if [ -d /sys/firmware/efi/ ]; then + mkdir -p /os/boot/efi/sources/ + /bin/cp -rv /iso/boot* /iso/efi/ /os/boot/efi/ + /bin/cp -rv /iso/sources/boot.wim /os/boot/efi/sources/ + rsync -rv --exclude=/sources/boot.wim /iso/* /os/installer/ + boot_wim=/os/boot/efi/sources/boot.wim + else + rsync -rv /iso/* /os/installer/ + boot_wim=/os/installer/sources/boot.wim + fi + install_wim=/os/installer/sources/install.wim # 修改应答文件 download $confhome/Autounattend.xml /tmp/Autounattend.xml - locale=$(wiminfo /os/boot/efi/sources/boot.wim | grep 'Default Language' | head -1 | awk '{print $NF}') - sed -i "s|%arch%|$basearch_alt|; s|%image_name%|$image_name|; s|%locale%|$locale|; s|%confhome%|$confhome|" /tmp/Autounattend.xml + locale=$(wiminfo $install_wim | grep 'Default Language' | head -1 | awk '{print $NF}') + sed -i "s|%arch%|$basearch_alt|; s|%image_name%|$image_name|; s|%locale%|$locale|" /tmp/Autounattend.xml + # 修改应答文件,分区配置 + line_num=$(grep -E -n '' /tmp/Autounattend.xml | cut -d: -f1) + if [ -d /sys/firmware/efi/ ]; then + sed -i "s|%installto_partitionid%|3|" /tmp/Autounattend.xml + cat < + 1 + 1 + FAT32 + + + 2 + 2 + + + 3 + 3 + NTFS + +EOF + else + sed -i "s|%installto_partitionid%|1|" /tmp/Autounattend.xml + cat < + 1 + 1 + NTFS + +EOF + fi + unix2dos /tmp/Autounattend.xml + # 挂载 boot.wim mkdir /wim - wimmountrw /os/boot/efi/sources/boot.wim 2 /wim/ + wimmountrw $boot_wim 2 /wim/ # virtio 驱动 if [ -d /virtio ]; then @@ -283,21 +326,46 @@ if [ "$distro" = "windows" ] && [ -d /sys/firmware/efi/ ]; then -ipath "*/$sys/$basearch_alt/*" \ -not -iname '*.pdb' \ -not -iname '*.doc' \ - -exec /bin/cp -r {} /wim/virtio/ \; + -exec /bin/cp -rf {} /wim/virtio/ \; fi # win7 要添加 bootx64.efi 到 efi 目录 [ $basearch = x86_64 ] && boot_efi=bootx64.efi || boot_efi=bootaa64.efi - if [ ! -e /os/boot/efi/efi/boot/$boot_efi ]; then + if [ -d /sys/firmware/efi/ ] && [ ! -e /os/boot/efi/efi/boot/$boot_efi ]; then mkdir -p /os/boot/efi/efi/boot/ cp /wim/Windows/Boot/EFI/bootmgfw.efi /os/boot/efi/efi/boot/$boot_efi fi - # 应答文件 + # 复制应答文件 cp /tmp/Autounattend.xml /wim/ + + # 提交修改 boot.wim wimunmount --commit /wim/ - efibootmgr -c -L "Windows Installer" -d /dev/$xda -p1 -l "\\EFI\\boot\\$boot_efi" + # windows 7 没有 invoke-webrequest + # installer分区盘符不一定是D盘 + # 所以复制 resize.bat 到 install.wim + image_name=$(wiminfo $install_wim | grep -ix "Name:[[:blank:]]*$image_name" | cut -d: -f2 | xargs) + wimmountrw $install_wim "$image_name" /wim/ + download $confhome/resize.bat /wim/resize.bat + wimunmount --commit /wim/ + + # 添加引导 + if [ -d /sys/firmware/efi/ ]; then + apk add efibootmgr + efibootmgr -c -L "Windows Installer" -d /dev/$xda -p1 -l "\\EFI\\boot\\$boot_efi" + else + # 或者用 ms-sys + apk add grub-bios + grub-install --boot-directory=/os/boot /dev/$xda + cat </os/boot/grub/grub.cfg + set timeout=5 + menuentry "reinstall" { + search --no-floppy --label --set=root installer + ntldr /bootmgr + } +EOF + fi exec reboot fi @@ -341,7 +409,7 @@ if [ "$distro" = "ubuntu" ]; then set timeout=5 menuentry "reinstall" { # https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1851311 - rmmod tpm + # rmmod tpm search --no-floppy --label --set=root installer loopback loop $iso_file linux (loop)/casper/vmlinuz iso-scan/filename=$iso_file autoinstall noprompt noeject cloud-config-url=$ks $extra_cmdline ---