diff --git a/README.en.md b/README.en.md
index 1f22d74..895bed4 100644
--- a/README.en.md
+++ b/README.en.md
@@ -112,8 +112,9 @@ certutil -urlcache -f -split https://gitlab.com/bin456789/reinstall/-/raw/main/r
**All features** can be used on both Linux and Windows.
-- on Linux, execute `bash reinstall.sh`
-- on Windows, execute `.\reinstall.bat`
+- on Linux, run `bash reinstall.sh ...`
+- on Windows, first run `cmd`, then run `.\reinstall.bat ...`
+ - If the link in the parameter contains special characters, it should be enclosed in `""`, not `''`.
### Feature 1: Install
Linux
@@ -128,7 +129,7 @@ certutil -urlcache -f -split https://gitlab.com/bin456789/reinstall/-/raw/main/r
bash reinstall.sh anolis 7|8|23
opencloudos 8|9|23
rocky 8|9
- redhat 8|9 --img='http://xxx.com/xxx.qcow2'
+ redhat 8|9 --img="http://xxx.com/xxx.qcow2"
oracle 8|9
almalinux 8|9
centos 9|10
@@ -197,7 +198,7 @@ bash reinstall.sh ubuntu --installer
- When deploy a Linux image, will **NOT** modify any contents of the image.
```bash
-bash reinstall.sh dd --img https://example.com/xxx.xz
+bash reinstall.sh dd --img "https://example.com/xxx.xz"
```
#### Optional parameters
@@ -266,7 +267,7 @@ bash reinstall.sh netboot.xyz
```bash
bash reinstall.sh windows \
- --image-name 'Windows 11 Enterprise LTSC 2024' \
+ --image-name "Windows 11 Enterprise LTSC 2024" \
--lang zh-cn
```
@@ -323,8 +324,8 @@ zh-tw
```bash
bash reinstall.sh windows \
- --image-name 'Windows 11 Enterprise LTSC 2024' \
- --iso 'https://go.microsoft.com/fwlink/?linkid=2289029'
+ --image-name "Windows 11 Enterprise LTSC 2024" \
+ --iso "https://go.microsoft.com/fwlink/?linkid=2289029"
```
@@ -359,13 +360,13 @@ bash reinstall.sh windows \
- `--rdp-port PORT` Change RDP port
- `--ssh-port PORT` Change SSH port (for log observation during installation)
- `--web-port PORT` Change Web port (for log observation during installation)
-- `--add-driver-dir DIR` Adds an additional driver folder, specifying the folder where the .inf file is located.
+- `--add-driver-dir DIR` Adds additional driver, specifying the folder where the .inf file is located.
- The driver must be downloaded locally first.
- This parameter can be set multiple times to add different driver folders.
- The script will copy the entire folder, so no other files should be placed inside the folder.
- `--hold 2` Allow SSH connections for modifying the disk content before rebooting into the official Windows installation program, with the disk mounted at `/os`.
-#### The script will automatic download and install the following drivers as needed, without the need for manual addition
+#### The following drivers will automatic download and install as needed, without the need for manual addition
- Virtio ([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/resources/downloads/), [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))
diff --git a/README.md b/README.md
index 0c7b53d..b3a1c5d 100644
--- a/README.md
+++ b/README.md
@@ -112,8 +112,9 @@ certutil -urlcache -f -split https://gitlab.com/bin456789/reinstall/-/raw/main/r
**所有功能** 都可在 Linux / Windows 下运行
-- Linux 下运行 `bash reinstall.sh`
-- Windows 下运行 `.\reinstall.bat`
+- Linux 下运行 `bash reinstall.sh ...`
+- Windows 下先运行 `cmd`,再运行 `reinstall.bat ...`
+ - 如果参数中的链接包含特殊字符,要用 `""` 将链接包起来,不能用 `''`
### 功能 1: 安装
Linux
@@ -128,7 +129,7 @@ certutil -urlcache -f -split https://gitlab.com/bin456789/reinstall/-/raw/main/r
bash reinstall.sh anolis 7|8|23
opencloudos 8|9|23
rocky 8|9
- redhat 8|9 --img='http://xxx.com/xxx.qcow2'
+ redhat 8|9 --img="http://xxx.com/xxx.qcow2"
oracle 8|9
almalinux 8|9
centos 9|10
@@ -197,7 +198,7 @@ bash reinstall.sh ubuntu --installer
- DD Linux 镜像时,**不会**修改镜像的任何内容
```bash
-bash reinstall.sh dd --img https://example.com/xxx.xz
+bash reinstall.sh dd --img "https://example.com/xxx.xz"
```
#### 可选参数
@@ -266,7 +267,7 @@ bash reinstall.sh netboot.xyz
```bash
bash reinstall.sh windows \
- --image-name 'Windows 11 Enterprise LTSC 2024' \
+ --image-name "Windows 11 Enterprise LTSC 2024" \
--lang zh-cn
```
@@ -323,8 +324,8 @@ zh-tw
```bash
bash reinstall.sh windows \
- --image-name 'Windows 11 Enterprise LTSC 2024' \
- --iso 'https://go.microsoft.com/fwlink/?linkid=2289029'
+ --image-name "Windows 11 Enterprise LTSC 2024" \
+ --iso "https://go.microsoft.com/fwlink/?linkid=2289029"
```
@@ -359,13 +360,13 @@ bash reinstall.sh windows \
- `--rdp-port PORT` 更改 RDP 端口
- `--ssh-port PORT` 修改 SSH 端口(安装期间观察日志用)
- `--web-port PORT` 修改 Web 端口(安装期间观察日志用)
-- `--add-driver-dir DIR` 添加额外驱动文件夹,填写 .inf 所在的文件夹
+- `--add-driver-dir DIR` 添加额外驱动,填写 .inf 所在的文件夹
- 需先下载驱动到本地
- 可多次设置该参数以添加不同的驱动文件夹
- 脚本将复制整个文件夹,因此文件夹内不要放置其他文件
- `--hold 2` 在进入 Windows 官方安装程序之前,可以 SSH 登录修改硬盘内容,硬盘挂载在 `/os`
-#### 脚本会自动按需下载安装以下驱动,无需手动添加
+#### 以下驱动会自动按需下载安装,无需手动添加
- Virtio ([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/resources/downloads/)、[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))
diff --git a/initrd-network.sh b/initrd-network.sh
index dfaa125..f4b5a0e 100644
--- a/initrd-network.sh
+++ b/initrd-network.sh
@@ -204,13 +204,14 @@ test_by_wget() {
fi
# tcp 443 通了就算成功,不管 http 是不是 404
+ # grep -m1 快速返回
wget -T "$TEST_TIMEOUT" \
--bind-address="$src" \
--no-check-certificate \
--max-redirect 0 \
--tries 1 \
-O /dev/null \
- "$url" 2>&1 | grep -iq connected
+ "$url" 2>&1 | grep -iq -m1 connected
}
test_by_nc() {
diff --git a/reinstall.sh b/reinstall.sh
index 07eee6c..dbbfd17 100644
--- a/reinstall.sh
+++ b/reinstall.sh
@@ -48,7 +48,7 @@ usage_and_exit() {
Usage: $reinstall_____ anolis 7|8|23
opencloudos 8|9|23
rocky 8|9
- redhat 8|9 --img='http://xxx.com/xxx.qcow2'
+ redhat 8|9 --img="http://xxx.com/xxx.qcow2"
oracle 8|9
almalinux 8|9
centos 9|10
@@ -63,9 +63,9 @@ Usage: $reinstall_____ anolis 7|8|23
arch
gentoo
fnos
- dd --img='http://xxx.com/yyy.zzz' (raw image stores in raw/vhd/tar/gz/xz/zst)
- windows --image-name='windows xxx yyy' --lang=xx-yy
- windows --image-name='windows xxx yyy' --iso='http://xxx.com/xxx.iso'
+ dd --img="http://xxx.com/yyy.zzz" (raw image stores in raw/vhd/tar/gz/xz/zst)
+ windows --image-name="windows xxx yyy" --lang=xx-yy
+ windows --image-name="windows xxx yyy" --iso="http://xxx.com/xxx.iso"
netboot.xyz
Options: [--ssh-port PORT]
diff --git a/trans.sh b/trans.sh
index 10b0ac3..8bc42b9 100644
--- a/trans.sh
+++ b/trans.sh
@@ -198,8 +198,9 @@ update_part() {
sync
# partprobe
+ # 有分区挂载中会报 Resource busy 错误
if is_have_cmd partprobe; then
- partprobe /dev/$xda 2>/dev/null
+ partprobe /dev/$xda 2>/dev/null || true
fi
# partx
@@ -422,7 +423,7 @@ EOF
umount_all() {
dirs="/mnt /os /iso /wim /installer /nbd /nbd-boot /nbd-efi /root /nix"
regex=$(echo "$dirs" | sed 's, ,|,g')
- if mounts=$(mount | grep -Ew "$regex" | awk '{print $3}' | tac); then
+ if mounts=$(mount | grep -Ew "on $regex" | awk '{print $3}' | tac); then
for mount in $mounts; do
echo "umount $mount"
umount $mount
@@ -1642,6 +1643,16 @@ EOF
show_nixos_config
}
+add_fix_eth_name_systemd_service() {
+ os_dir=$1
+
+ # 无需执行 systemctl daemon-reload
+ # 因为 chroot 下执行会提示 Running in chroot, ignoring command 'daemon-reload'
+ download "$confhome/fix-eth-name.sh" "$os_dir/fix-eth-name.sh"
+ download "$confhome/fix-eth-name.service" "$os_dir/etc/systemd/system/fix-eth-name.service"
+ chroot "$os_dir" systemctl enable fix-eth-name
+}
+
basic_init() {
os_dir=$1
@@ -1691,13 +1702,8 @@ basic_init() {
# 下载 fix-eth-name.service
# 即使开了 net.ifnames=0 也需要
- # 因为 alpine 和目标系统的网卡顺序可能不同
-
- # 无需执行 systemctl daemon-reload
- # 因为 chroot 下执行会提示 Running in chroot, ignoring command 'daemon-reload'
- download "$confhome/fix-eth-name.sh" "$os_dir/fix-eth-name.sh"
- download "$confhome/fix-eth-name.service" "$os_dir/etc/systemd/system/fix-eth-name.service"
- chroot "$os_dir" systemctl enable fix-eth-name
+ # 因为 alpine live 和目标系统的网卡顺序可能不同
+ add_fix_eth_name_systemd_service $os_dir
}
install_arch_gentoo() {
@@ -1949,12 +1955,8 @@ EOF
# 删除网卡名匹配
sed -i '/^Name=/d' $os_dir/etc/systemd/network/10-cloud-init-eth*.network
- # 下载 fix-eth-name.service
- # chroot 下执行 systemctl daemon-reload
- # 会提示 Running in chroot, ignoring command 'daemon-reload'
- download "$confhome/fix-eth-name.sh" "$os_dir/fix-eth-name.sh"
- download "$confhome/fix-eth-name.service" "$os_dir/etc/systemd/system/fix-eth-name.service"
- chroot "$os_dir" systemctl enable fix-eth-name
+ # 修正网卡名
+ add_fix_eth_name_systemd_service $os_dir
# arch gentoo 网络配置是用 alpine cloud-init 生成的
# cloud-init 版本够新,因此无需修复 onlink 网关
@@ -1973,12 +1975,12 @@ EOF
# cmdline + 生成 grub.cfg
if [ -d $os_dir/etc/default/grub.d ]; then
- file=$os_dir/etc/default/grub.d/cmdline.conf
+ file=$os_dir/etc/default/grub.d/tty.cfg
else
file=$os_dir/etc/default/grub
fi
ttys_cmdline=$(get_ttys console=)
- echo GRUB_CMDLINE_LINUX=\"$ttys_cmdline\" >>$file
+ echo GRUB_CMDLINE_LINUX=\"\$GRUB_CMDLINE_LINUX $ttys_cmdline\" >>$file
chroot $os_dir grub-mkconfig -o /boot/grub/grub.cfg
# fstab
@@ -3359,8 +3361,11 @@ modify_os_on_disk() {
if ls -d /os/*/ | grep -i '/windows/' 2>/dev/null; then
# 重新挂载为读写、忽略大小写
umount /os
- apk add ntfs-3g
- mount.lowntfs-3g /dev/$part /os -o ignore_case
+ mount -t ntfs3 -o nocase /dev/$part /os
+ # 有休眠文件时无法挂载成读写,提醒用户并退出脚本
+ if mount | grep ' /os ' | grep -wq ro; then
+ error_and_exit "Can't mount windows partition /dev/$part as rw."
+ fi
modify_windows /os
return
fi
@@ -4724,7 +4729,7 @@ mount_part_for_iso_installer() {
info "Mount part for iso installer"
if [ "$distro" = windows ]; then
- mount_args="-t ntfs3"
+ mount_args="-t ntfs3 -o nocase"
else
mount_args=
fi