fnos: 支持安装飞牛OS

fixes #256
This commit is contained in:
bin456789 2025-02-21 00:30:34 +08:00
parent 6263f994af
commit 1bc6cf090b
No known key found for this signature in database
GPG Key ID: EE301B386DE6C11B
4 changed files with 205 additions and 10 deletions

View File

@ -15,7 +15,7 @@ One-Click Script to Reinstall System [中文](README.md)
## Highlights
- One-click Linux installation: Supports 17 common distributions.
- One-click Linux installation: Supports 18 common distributions.
- One-click Windows installation: Uses the official ISO for installation instead of custom images. The script automatically retrieves the ISO link and installs `Virtio` and other drivers.
- Supports installation in any direction, i.e., `Linux to Linux`, `Linux to Windows`, `Windows to Windows`, `Windows to Linux`
- No need to input IP parameters; automatically recognizes dynamic and static IPs, supports `/32`, `/128`, `gateway outside subnet`, `IPv6 only`, `dual NIC` and other special network configurations
@ -31,7 +31,7 @@ The original system can be any system listed in the table.
The system requirements for the target system are as follows:
| Target System | Version | Memory | Disk |
| System | Version | Memory | Disk |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | --------- | -----------------|
| <img width="16" height="16" src="https://www.alpinelinux.org/alpine-logo.ico" /> Alpine | 3.18, 3.19, 3.20, 3.21 | 256 MB | 1 GB |
| <img width="16" height="16" src="https://www.debian.org/favicon.ico" /> Debian | 9, 10, 11, 12 | 256 MB | 1 ~ 1.5 GB ^ |
@ -47,6 +47,7 @@ The system requirements for the target system are as follows:
| <img width="16" height="16" src="https://github.com/user-attachments/assets/99a542b6-6482-4086-addf-f192c06fef73" /> NixOS | 24.11 | 512 MB | 5 GB |
| <img width="16" height="16" src="https://archlinux.org/static/favicon.png" /> Arch | Rolling | 512 MB | 5 GB |
| <img width="16" height="16" src="https://www.gentoo.org/assets/img/logo/gentoo-g.png" /> Gentoo | Rolling | 512 MB | 5 GB |
| <img width="16" height="16" src="https://www.fnnas.com/favicon.ico" /> 飞牛 fnOS | Beta | 512 MB | 12 GB |
| <img width="16" height="16" src="https://blogs.windows.com/wp-content/uploads/prod/2022/09/cropped-Windows11IconTransparent512-32x32.png" /> Windows (DD) | Any | 512 MB | Depends on image |
| <img width="16" height="16" src="https://blogs.windows.com/wp-content/uploads/prod/2022/09/cropped-Windows11IconTransparent512-32x32.png" /> Windows (ISO) | Vista, 7, 8.x (Server 2008 - 2012 R2) | 512 MB | 25 GB |
| <img width="16" height="16" src="https://blogs.windows.com/wp-content/uploads/prod/2022/09/cropped-Windows11IconTransparent512-32x32.png" /> Windows (ISO) | 10, 11 (Server 2016 - 2025) | 1 GB | 25 GB |
@ -141,6 +142,7 @@ bash reinstall.sh anolis 7|8|23
kali
arch
gentoo
fnos
```
#### Optional Parameters

View File

@ -15,7 +15,7 @@
## 亮点
- 一键安装 Linux支持 17 种常见发行版
- 一键安装 Linux支持 18 种常见发行版
- 一键安装 Windows使用官方 ISO 安装而非自制镜像,脚本会自动获取 ISO 链接、自动安装 Virtio 等驱动
- 支持任意方向重装,即 `Linux to Linux``Linux to Windows``Windows to Windows``Windows to Linux`
- 无需填写 IP 参数,自动识别动静态,支持 `/32``/128``网关不在子网范围内``纯 IPv6``双网卡` 等特殊网络
@ -31,7 +31,7 @@
目标系统的配置要求如下:
| 目标系统 | 版本 | 内存 | 硬盘 |
| 系统 | 版本 | 内存 | 硬盘 |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | --------- | ------------ |
| <img width="16" height="16" src="https://www.alpinelinux.org/alpine-logo.ico" /> Alpine | 3.18, 3.19, 3.20, 3.21 | 256 MB | 1 GB |
| <img width="16" height="16" src="https://www.debian.org/favicon.ico" /> Debian | 9, 10, 11, 12 | 256 MB | 1 ~ 1.5 GB ^ |
@ -47,6 +47,7 @@
| <img width="16" height="16" src="https://github.com/user-attachments/assets/99a542b6-6482-4086-addf-f192c06fef73" /> NixOS | 24.11 | 512 MB | 5 GB |
| <img width="16" height="16" src="https://archlinux.org/static/favicon.png" /> Arch | 滚动 | 512 MB | 5 GB |
| <img width="16" height="16" src="https://www.gentoo.org/assets/img/logo/gentoo-g.png" /> Gentoo | 滚动 | 512 MB | 5 GB |
| <img width="16" height="16" src="https://www.fnnas.com/favicon.ico" /> 飞牛 fnOS | 公测版 | 512 MB | 12 GB |
| <img width="16" height="16" src="https://blogs.windows.com/wp-content/uploads/prod/2022/09/cropped-Windows11IconTransparent512-32x32.png" /> Windows (DD) | 任何 | 512 MB | 取决于镜像 |
| <img width="16" height="16" src="https://blogs.windows.com/wp-content/uploads/prod/2022/09/cropped-Windows11IconTransparent512-32x32.png" /> Windows (ISO) | Vista, 7, 8.x (Server 2008 - 2012 R2) | 512 MB | 25 GB |
| <img width="16" height="16" src="https://blogs.windows.com/wp-content/uploads/prod/2022/09/cropped-Windows11IconTransparent512-32x32.png" /> Windows (ISO) | 10, 11 (Server 2016 - 2025) | 1 GB | 25 GB |
@ -141,6 +142,7 @@ bash reinstall.sh anolis 7|8|23
kali
arch
gentoo
fnos
```
#### 可选参数

View File

@ -62,6 +62,7 @@ Usage: $reinstall_____ anolis 7|8|23
kali
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'
@ -1454,6 +1455,30 @@ Continue with DD?
eval "${step}_img_type_warp='$img_type_warp'"
}
setos_fnos() {
if [ "$basearch" = aarch64 ]; then
error_and_exit "FNOS not supports ARM."
fi
# 系统盘大小
min=8
default=8
while true; do
IFS= read -r -p "Type System Partition Size in GB. Minimal $min GB. [$default]: " input
input=${input:-$default}
if ! { is_digit "$input" && [ "$input" -ge "$min" ]; }; then
error "Invalid Size. Please Try again."
else
eval "${step}_fnos_part_size=${input}G"
break
fi
done
iso=$(curl -L https://fnnas.com | grep -o 'https://[^"]*\.iso' | head -1)
test_url "$iso" 'iso'
eval "${step}_iso='$iso'"
}
setos_centos_almalinux_rocky_fedora() {
# el 10 需要 x86-64-v3
if [ "$basearch" = x86_64 ] &&
@ -1694,6 +1719,7 @@ verify_os_name() {
'kali' \
'arch' \
'gentoo' \
'fnos' \
'windows' \
'dd' \
'netboot.xyz'; do
@ -1952,7 +1978,7 @@ check_ram() {
alpine | debian | kali | dd) echo 256 ;;
arch | gentoo | nixos | windows) echo 512 ;;
redhat | centos | almalinux | rocky | fedora | oracle | ubuntu | anolis | opencloudos | openeuler) echo 1024 ;;
opensuse) echo -1 ;; # 没有安装模式
opensuse | fnos) echo -1 ;; # 没有安装模式
esac
)
@ -3701,15 +3727,14 @@ fi
# 密码
if ! is_netboot_xyz && [ -z "$password" ]; then
if is_use_dd; then
if is_use_dd || [ "$distro" = fnos ]; then
echo "
This password is only used for SSH access to view logs during the DD process.
This password is only used for SSH access to view logs during the installation.
Password of the image will NOT modify.
密码仅用于 DD 过程中通过 SSH 查看日志。
密码仅用于安装过程中通过 SSH 查看日志。
镜像的密码不会被修改。
"
fi
prompt_password
fi
@ -4140,7 +4165,7 @@ fi
info 'info'
echo "$distro $releasever"
if ! { is_netboot_xyz || is_use_dd; }; then
if ! { is_netboot_xyz || is_use_dd || [ "$distro" = fnos ]; }; then
if [ "$distro" = windows ]; then
username="administrator"
else
@ -4156,6 +4181,9 @@ elif is_alpine_live; then
echo 'Reboot to start Alpine Live OS.'
elif is_use_dd; then
echo 'Reboot to start DD.'
elif [ "$distro" = fnos ]; then
echo "Reboot to start the installation."
echo "After install, you need to config the system on http://SERVER_IP:5666 as soon as possible."
else
echo "Reboot to start the installation."
fi

163
trans.sh
View File

@ -2229,6 +2229,36 @@ create_part() {
mkfs.ntfs -f -F -L os /dev/$xda*1 #1 os
mkfs.ntfs -f -F -L installer /dev/$xda*2 #2 installer
fi
elif [ "$distro" = fnos ]; then
# 1. 官方安装器对系统盘大小的定义包含引导分区大小
# 2. 官方用的是 100M 而不是 100MiB
if is_efi; then
parted /dev/$xda -s -- \
mklabel gpt \
mkpart BOOT fat32 1MiB 100M \
mkpart SYSTEM ext4 100M ${fnos_part_size}iB \
mkpart TRIM ext4 ${fnos_part_size}iB 100% \
set 1 esp on
update_part
mkfs.fat /dev/$xda*1 #1 efi
echo #2 os 用目标系统的格式化工具
mkfs.ext4 -F /dev/$xda*3 #3 installer
else
# bios
# 官方安装器不支持 bios + >2t
parted /dev/$xda -s -- \
mklabel msdos \
mkpart primary 1MiB 100M \
mkpart primary 100M ${fnos_part_size}iB \
mkpart primary ${fnos_part_size}iB 100% \
set 2 boot on
update_part
echo #1 官方安装有这个分区
echo #2 os 用目标系统的格式化工具
mkfs.ext4 -F /dev/$xda*3 #3 installer
fi
elif is_use_cloud_image; then
installer_part_size="$(get_cloud_image_part_size)"
# 这几个系统不使用dd而是复制文件
@ -2383,9 +2413,24 @@ create_part() {
fi
}
umount_pseudo_fs() {
os_dir=$(realpath "$1")
dirs="/proc /sys /dev /run /sys/firmware/efi/efivars"
regex=$(echo "$dirs" | sed 's, ,|,g')
if mounts=$(mount | grep -Ew "on $os_dir($regex)" | awk '{print $3}' | tac); then
for mount in $mounts; do
echo "umount $mount"
umount $mount
done
fi
}
mount_pseudo_fs() {
os_dir=$1
mkdir -p $os_dir/proc/ $os_dir/sys/ $os_dir/dev/ $os_dir/run/
# https://wiki.archlinux.org/title/Chroot#Using_chroot
mount -t proc /proc $os_dir/proc/
mount -t sysfs /sys $os_dir/sys/
@ -3716,6 +3761,120 @@ EOF
fi
}
install_fnos() {
info "Install fnos"
os_dir=/os
# 官方安装调用流程
# /etc/init.d/run_install.sh > trim-install > trim-grub
# 挂载 installer iso
mkdir -p /installer /iso
mount /dev/$xda*3 /installer
download "$iso" /installer/fnos.iso
mount /installer/fnos.iso /iso
# 解压 initrd
apk add cpio
initrd_dir=/installer/initrd_dir
mkdir -p $initrd_dir
(
cd $initrd_dir
zcat /iso/install.amd/initrd.gz | cpio -idm
)
apk del cpio
# 格式化系统盘
mount_pseudo_fs $initrd_dir
chroot $initrd_dir mkfs.ext4 /dev/$xda*2
umount_pseudo_fs $initrd_dir
# 获取挂载参数
fstab_line_os=$(strings $initrd_dir/trim-install | grep -m1 '^UUID=%s / ')
fstab_line_efi=$(strings $initrd_dir/trim-install | grep -m1 '^UUID=%s /boot/efi ')
fstab_line_swapfile=$(strings $initrd_dir/trim-install | grep -m1 '^/swapfile none swap ')
# 挂载 /os
mkdir -p /os
mount /dev/$xda*2 /os
# 复制系统
info "Extract fnos"
apk add tar gzip pv
pv -f /iso/trimfs.tgz | tar zx -C /os --numeric-owner
apk del tar gzip pv
# 挂载 /os/boot/efi
if is_efi; then
mkdir -p /os/boot/efi
mount -o "$(echo "$fstab_line_efi" | awk '{print $4}')" /dev/$xda*1 /os/boot/efi
fi
# 挂载 proc sys dev
mount_pseudo_fs /os
# 卸载 iso installer
umount /iso
umount /installer
# 删除 installer 分区
apk add parted
parted -s /dev/$xda rm 3
apk del parted
update_part
# 更新 initrd
# chroot $os_dir update-initramfs -u
# 删除自带的 root 密码
# chroot $os_dir passwd -d root
# ssh root 登录,测试用
if false; then
echo "root:$(get_password_linux_sha512)" | chroot $os_dir chpasswd -e
allow_root_password_login $os_dir
chroot $os_dir systemctl enable ssh
fi
# grub
if is_efi; then
chroot $os_dir grub-install --efi-directory=/boot/efi
chroot $os_dir grub-install --efi-directory=/boot/efi --removable
else
chroot $os_dir grub-install /dev/$xda
fi
# grub tty
ttys_cmdline=$(get_ttys console=)
echo GRUB_CMDLINE_LINUX=\"\$GRUB_CMDLINE_LINUX $ttys_cmdline\" \
>>$os_dir/etc/default/grub.d/tty.cfg
chroot $os_dir update-grub
# fstab
{
# /
uuid=$(lsblk /dev/$xda*2 -no UUID)
echo "$fstab_line_os" | sed "s/%s/$uuid/"
# 官方安装器即使 swapfile 设为 0 也会有这行
echo "$fstab_line_swapfile" | sed "s/%s/$uuid/"
# /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_network_manager_config /net.cfg $os_dir
rm /net.cfg
# 修正网卡名
add_fix_eth_name_systemd_service $os_dir
}
install_qcow_by_copy() {
info "Install qcow2 by copy"
@ -5900,6 +6059,10 @@ trans() {
create_part
install_nixos
;;
fnos)
create_part
install_fnos
;;
*)
create_part
mount_part_for_iso_installer