Compare commits

..

4 Commits

Author SHA1 Message Date
14c314d2bc windows: 适配 massgrave 新镜像链接 2026-01-07 20:30:33 +08:00
6ebe902624 docs: 更新文档 2026-01-07 20:30:32 +08:00
83a85b9ccf windows: 使用更准确的 intel nic 驱动链接 2026-01-07 20:30:32 +08:00
c2d36ed176 fnos: 优化飞牛安装
- 支持 bios + gpt
- 支持 arm
2026-01-07 20:30:31 +08:00
3 changed files with 56 additions and 84 deletions

View File

@ -345,14 +345,14 @@ EOF
db_progress INFO netcfg/link_detect_progress db_progress INFO netcfg/link_detect_progress
else else
# alpine # alpine
# h3c 移动云电脑使用 udhcpc 会重复提示 sending select因此添加 timeout 强制结束进程 # h3c 移动云电脑使用 udhcpc 会重复提示 sending select无法获得 ipv6
# dhcpcd 会配置租约时间,过期会移除 IP但我们的没有在后台运行 dhcpcd ,因此用 udhcpc # dhcpcd 会配置租约时间,过期会移除 IP但我们的没有在后台运行 dhcpcd ,因此用 udhcpc
method=udhcpc method=udhcpc
case "$method" in case "$method" in
udhcpc) udhcpc)
timeout $DHCP_TIMEOUT udhcpc -i "$ethx" -f -q -n || true udhcpc -i "$ethx" -f -q -n || true
timeout $DHCP_TIMEOUT udhcpc6 -i "$ethx" -f -q -n || true udhcpc6 -i "$ethx" -f -q -n || true
sleep $DNS_FILE_TIMEOUT # 好像不用等待写入 dns但是以防万一 sleep $DNS_FILE_TIMEOUT # 好像不用等待写入 dns但是以防万一
;; ;;
dhcpcd) dhcpcd)

View File

@ -1089,7 +1089,7 @@ get_windows_iso_link() {
curl -L "$page_url" | curl -L "$page_url" |
tr -d '\n' | sed -e 's,<a ,\n<a ,g' -e 's,</a>,</a>\n,g' | # 使每个 <a></a> 占一行 tr -d '\n' | sed -e 's,<a ,\n<a ,g' -e 's,</a>,</a>\n,g' | # 使每个 <a></a> 占一行
grep -Ei '\.(iso|img)</a>$' | # 找出是 iso 或 img 的行 grep -Ei '\.(iso|img)</a>$' | # 找出是 iso 或 img 的行
sed -E 's,<a href="?([^" ]+)"?.+>(.+)</a>,\2 \1,' >$tmp/win.list # 提取文件名和链接 sed -E 's,<a href="([^"]+)".+>(.+)</a>,\2 \1,' >$tmp/win.list # 提取文件名和链接
# 如果不是 ltsc ,应该先去除 ltsc 链接,否则最终链接有 ltsc 的 # 如果不是 ltsc ,应该先去除 ltsc 链接,否则最终链接有 ltsc 的
# 例如查找 windows 10 iot enterprise会得到 # 例如查找 windows 10 iot enterprise会得到
@ -1146,9 +1146,7 @@ get_windows_iso_link_inner() {
regex=${regex// /_} regex=${regex// /_}
echo "looking for: $regex" >&2 echo "looking for: $regex" >&2
if line=$(grep -Ei "^$regex " "$tmp/win.list" | get_shortest_line_by_field 1 | grep .) && if iso=$(grep -Ei "^$regex " "$tmp/win.list" | get_shortest_line_by_field 1 | awk '{print $2}' | grep .); then
iso=$(awk '{print $2}' <<<"$line" | grep .); then
echo "Selected: $line" >&2
return return
fi fi
done done

118
trans.sh
View File

@ -414,31 +414,23 @@ extract_env_from_cmdline() {
} }
ensure_service_started() { ensure_service_started() {
local service=$1 service=$1
if ! rc-service -q "$service" start; then if ! rc-service -q $service status; then
for i in $(seq 10); do if ! retry 5 rc-service -q $service start; then
if [ "$service" = modloop ]; then
# 避免有时 modloop 下载不完整导致报错
# * Failed to verify signature of !
# mount: mounting /dev/loop0 on /.modloop failed: Invalid argument
rm -f /lib/modloop-lts /lib/modloop-virt
fi
if rc-service -q "$service" start; then
return
fi
sleep 5
done
error_and_exit "Failed to start $service." error_and_exit "Failed to start $service."
fi fi
fi
} }
ensure_service_stopped() { ensure_service_stopped() {
local service=$1 service=$1
if ! retry 10 5 rc-service -q "$service" stop; then if rc-service -q $service status; then
if ! retry 5 rc-service -q $service stop; then
error_and_exit "Failed to stop $service." error_and_exit "Failed to stop $service."
fi fi
fi
} }
mod_motd() { mod_motd() {
@ -2439,7 +2431,7 @@ get_disk_logic_sector_size() {
} }
is_4kn() { is_4kn() {
[ "$(blockdev --getss "/dev/$xda")" = 4096 ] [ "$(blockdev --getss "$1")" = 4096 ]
} }
is_xda_gt_2t() { is_xda_gt_2t() {
@ -3496,8 +3488,10 @@ EOF
! sh /can_use_cloud_kernel.sh "$xda" $(get_eths); then ! sh /can_use_cloud_kernel.sh "$xda" $(get_eths); then
kernel_package=$(echo "$kernel_package" | sed 's/-cloud//') kernel_package=$(echo "$kernel_package" | sed 's/-cloud//')
fi fi
# 如果镜像自带内核跟最佳内核是同一种且有更新
# 该方法包含了 apt-mark manual # 则 apt install 只会进行更新,不会将包设置成 manual
# 需要再运行 apt install 才会将包设置成 manual
chroot_apt_install $os_dir "$kernel_package"
chroot_apt_install $os_dir "$kernel_package" chroot_apt_install $os_dir "$kernel_package"
# 使用 autoremove 删除非最佳内核 # 使用 autoremove 删除非最佳内核
@ -4198,7 +4192,7 @@ chroot_dnf() {
} }
chroot_apt_update() { chroot_apt_update() {
local os_dir=$1 os_dir=$1
current_hash=$(cat $os_dir/etc/apt/sources.list $os_dir/etc/apt/sources.list.d/*.sources 2>/dev/null | md5sum) current_hash=$(cat $os_dir/etc/apt/sources.list $os_dir/etc/apt/sources.list.d/*.sources 2>/dev/null | md5sum)
if ! [ "$saved_hash" = "$current_hash" ]; then if ! [ "$saved_hash" = "$current_hash" ]; then
@ -4208,30 +4202,15 @@ chroot_apt_update() {
} }
chroot_apt_install() { chroot_apt_install() {
local os_dir=$1 os_dir=$1
shift shift
# 只安装未安装的软件包
# 避免更新浪费时间
local pkg='' pkgs=''
for pkg in "$@"; do
if chroot $os_dir dpkg -s "$pkg" >/dev/null 2>&1; then
# 如果已安装则标记为 manual防止被 autoremove 删除
chroot $os_dir apt-mark manual "$pkg"
else
pkgs="$pkgs $pkg"
fi
done
# 一次性安装,避免多次 update-initramfs
if [ -n "$pkgs" ]; then
chroot_apt_update $os_dir chroot_apt_update $os_dir
DEBIAN_FRONTEND=noninteractive chroot $os_dir apt-get install -y $pkgs DEBIAN_FRONTEND=noninteractive chroot $os_dir apt-get install -y "$@"
fi
} }
chroot_apt_remove() { chroot_apt_remove() {
local os_dir=$1 os_dir=$1
shift shift
# minimal 镜像 删除 grub-pc 时会安装 grub-efi-amd64 # minimal 镜像 删除 grub-pc 时会安装 grub-efi-amd64
@ -4254,7 +4233,7 @@ chroot_apt_remove() {
} }
chroot_apt_autoremove() { chroot_apt_autoremove() {
local os_dir=$1 os_dir=$1
change_confs() { change_confs() {
action=$1 action=$1
@ -4388,6 +4367,12 @@ install_fnos() {
# 挂载 proc sys dev # 挂载 proc sys dev
mount_pseudo_fs /os mount_pseudo_fs /os
# 更新 initrd官方安装器也有这一步
# 理论上要设置 1777 权限,但飞牛官方安装器安装后不是
mkdir -p $os_dir/var/tmp
chmod 1777 $os_dir/var/tmp
chroot $os_dir update-initramfs -u
# 更改密码 # 更改密码
if is_need_set_ssh_keys; then if is_need_set_ssh_keys; then
set_ssh_keys_and_del_password $os_dir set_ssh_keys_and_del_password $os_dir
@ -4401,31 +4386,6 @@ install_fnos() {
chroot $os_dir systemctl enable ssh chroot $os_dir systemctl enable ssh
fi fi
# fstab
{
# /
uuid=$(lsblk /dev/$xda*2 -no UUID)
echo "$fstab_line_os" | sed "s/%s/$uuid/"
# swapfile
# 官方安装器即使 swapfile 设为 0 也会有这行
echo "$fstab_line_swapfile"
# /boot/efi
if is_efi; then
uuid=$(lsblk /dev/$xda*1 -no UUID)
echo "$fstab_line_efi" | sed "s/%s/$uuid/"
fi
} >$os_dir/etc/fstab
# 更新 initrd官方安装器也有这一步
# 理论上 /var/tmp 要设置 1777 权限,但飞牛官方安装器安装后不是
# 需要先创建 /etc/fstab ,否则会有以下警告
# W: Couldn't identify type of root file system for fsck hook
mkdir -p $os_dir/var/tmp
chmod 1777 $os_dir/var/tmp
chroot $os_dir update-initramfs -u
# grub # grub
if is_efi; then if is_efi; then
chroot $os_dir grub-install --efi-directory=/boot/efi chroot $os_dir grub-install --efi-directory=/boot/efi
@ -4444,6 +4404,23 @@ install_fnos() {
chroot $os_dir update-grub chroot $os_dir update-grub
# fstab
{
# /
uuid=$(lsblk /dev/$xda*2 -no UUID)
echo "$fstab_line_os" | sed "s/%s/$uuid/"
# swapfile
# 官方安装器即使 swapfile 设为 0 也会有这行
echo "$fstab_line_swapfile"
# /boot/efi
if is_efi; then
uuid=$(lsblk /dev/$xda*1 -no UUID)
echo "$fstab_line_efi" | sed "s/%s/$uuid/"
fi
} >$os_dir/etc/fstab
# 网卡配置 # 网卡配置
create_cloud_init_network_config /net.cfg create_cloud_init_network_config /net.cfg
create_network_manager_config /net.cfg $os_dir create_network_manager_config /net.cfg $os_dir
@ -4803,13 +4780,10 @@ EOF
# 安装最佳内核 # 安装最佳内核
flavor=$(get_ubuntu_kernel_flavor) flavor=$(get_ubuntu_kernel_flavor)
echo "Use kernel flavor: $flavor" echo "Use kernel flavor: $flavor"
# 如果镜像自带内核跟最佳内核是同一种且有更新
# 题外话 # 则 apt install 只会进行更新,不会将包设置成 manual
# 如果某个包是 auto 状态且有更新 # 需要再运行 apt install 才会将包设置成 manual
# 则 apt install PKG 只会进行更新,不会将包设置成 manual chroot_apt_install $os_dir "linux-image-$flavor"
# 需要再次运行 apt install PKG 才会将包设置成 manual
# 该方法包含了 apt-mark manual
chroot_apt_install $os_dir "linux-image-$flavor" chroot_apt_install $os_dir "linux-image-$flavor"
# 使用 autoremove 删除多余内核 # 使用 autoremove 删除多余内核
@ -6861,7 +6835,7 @@ EOF
# 4kn EFI 分区最少要 260M # 4kn EFI 分区最少要 260M
# https://learn.microsoft.com/windows-hardware/manufacture/desktop/hard-drives-and-partitions # https://learn.microsoft.com/windows-hardware/manufacture/desktop/hard-drives-and-partitions
if is_4kn; then if is_4kn /dev/$xda; then
sed -i 's/is4kn=0/is4kn=1/i' $startnet_cmd sed -i 's/is4kn=0/is4kn=1/i' $startnet_cmd
fi fi