title: “绿联 NAS + iSCSI + iPXE 实现飞牛 fnOS 无盘启动完整实战”
date: 2026-05-02
tags: [飞牛, fnOS, 绿联NAS, iSCSI, PXE, iPXE, PVE, 无盘启动]

绿联 NAS + iSCSI + iPXE 实现飞牛 fnOS 无盘启动完整实战

这篇记录一次完整的无盘启动实战:把飞牛 fnOS 安装到绿联 NAS 的 iSCSI 系统盘上,让一台没有本地硬盘的小主机只插网线就能启动。前期用 PVE 辅助安装和排错,最终把 PXE/iPXE 服务迁移到绿联 NAS,这样 PVE 可以关机。

一、最终架构

启动链路如下:

无盘小主机
  -> PXE 获取网络启动信息
  -> 下载 ipxe.efi
  -> 下载 boot.ipxe
  -> iPXE 连接绿联 NAS iSCSI Target
  -> 挂载系统盘
  -> 启动 fnOS

本次环境:

PVE: 192.168.31.6
绿联 NAS: 192.168.31.20
路由器/网关: 192.168.31.3
无盘小主机 MAC: 48:f3:17:16:36:cd
系统盘 Target: iqn.2025-03.com.ugreen:target-1.50a337b00d
数据盘 Target: iqn.2025-03.com.ugreen:target-1.04cc5bb569
系统盘 Initiator: iqn.2026-05.local.fnos:50a337b00d

注意:iSCSI 只负责提供“远程硬盘”,真正让小主机知道怎么启动的,是 PXE/iPXE/TFTP 这一层。

二、网络规划

务必避免 DHCP 把固定 IP 分出去。本次就踩过一次坑:小主机 PXE 时拿到了 192.168.31.6,直接顶掉了 PVE。

推荐:

路由器: 192.168.31.3
PVE 固定 IP: 192.168.31.6
NAS 固定 IP: 192.168.31.20
DHCP 池: 192.168.31.100 - 192.168.31.250
小主机 DHCP 保留地址: 192.168.31.220

路由器里给小主机 MAC 绑定固定地址:

48:f3:17:16:36:cd -> 192.168.31.220

三、检查链路速度

iSCSI 对网络速度很敏感。PVE 的 enp3s0 虽然是 2.5G 口,但一开始因为线材问题只协商到 100M。

检查命令:

ethtool enp3s0
cat /sys/class/net/enp3s0/speed
cat /sys/class/net/enp3s0/duplex

正常结果:

Speed: 2500Mb/s
Duplex: Full
Auto-negotiation: on
Link detected: yes

如果只有 100M,先换网线、换交换机口,再继续折腾系统。

四、在 PVE 上发现并挂载绿联 iSCSI 系统盘

发现 Target:

iscsiadm -m discovery -t sendtargets -p 192.168.31.20

登录系统盘:

iscsiadm -m node \
  -T iqn.2025-03.com.ugreen:target-1.50a337b00d \
  -p 192.168.31.20:3260 \
  --login

查看磁盘:

lsblk -o NAME,SIZE,TYPE,FSTYPE,UUID,MOUNTPOINTS
ls -l /dev/disk/by-id/scsi-*

本次系统盘识别为:

/dev/sda
/dev/disk/by-id/scsi-360014051625c0881b9d4f5eac9b66de7

五、用 PVE 临时 VM 安装 fnOS 到 iSCSI

创建安装 VM:

qm create 115 \
  --name fnos-iscsi-install \
  --memory 4096 \
  --cores 4 \
  --cpu host \
  --machine q35 \
  --ostype l26 \
  --scsihw virtio-scsi-single \
  --net0 virtio,bridge=vmbr1 \
  --vga std

qm set 115 \
  --scsi0 /dev/disk/by-id/scsi-360014051625c0881b9d4f5eac9b66de7,cache=none,discard=on,iothread=1,ssd=1

qm set 115 \
  --ide2 local:iso/fnos-1.1.26-1650.iso,media=cdrom

qm set 115 --boot order=ide2\;scsi0
qm start 115

在控制台里把 fnOS 安装到 iSCSI 系统盘。安装完成后关机,移除 ISO:

qm stop 115
qm set 115 --delete ide2
qm set 115 --boot order=scsi0

安装后分区大致如下:

/dev/sda1   94M   空分区,后续改成 EFI System Partition
/dev/sda2 29.9G   ext4 根分区
/dev/sda3   70G   预留区域

根分区 UUID:

c7434822-bf92-4bea-9892-39e55ddd7445

六、给 fnOS 加入 iSCSI initramfs 支持

Linux 启动到 initramfs 阶段后,需要自己重新连接 iSCSI,否则根分区会丢失。

挂载根分区:

mkdir -p /mnt/fnos-iscsi-root
mount /dev/sda2 /mnt/fnos-iscsi-root
mount --bind /dev /mnt/fnos-iscsi-root/dev
mount --bind /proc /mnt/fnos-iscsi-root/proc
mount --bind /sys /mnt/fnos-iscsi-root/sys
mount --bind /run /mnt/fnos-iscsi-root/run
chroot /mnt/fnos-iscsi-root /bin/bash

安装组件:

apt update
apt install -y open-iscsi initramfs-tools busybox

写入 Initiator:

cat > /etc/iscsi/initiatorname.iscsi <<'EOF'
InitiatorName=iqn.2026-05.local.fnos:50a337b00d
EOF

写入 initramfs iSCSI 配置:

cat > /etc/iscsi/iscsi.initramfs <<'EOF'
ISCSI_INITIATOR=iqn.2026-05.local.fnos:50a337b00d
ISCSI_TARGET_NAME=iqn.2025-03.com.ugreen:target-1.50a337b00d
ISCSI_TARGET_IP=192.168.31.20
ISCSI_TARGET_PORT=3260
ISCSI_TARGET_GROUP=1
EOF

给 GRUB 加 DHCP 参数:

sed -i 's/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX="ip=dhcp modprobe.blacklist=pcspkr"/' /etc/default/grub

更新:

update-initramfs -u -k 6.12.18-trim
update-grub

检查 initrd:

lsinitramfs /boot/initrd.img-6.12.18-trim | grep -E '(iscsistart|iscsi_tcp|iscsi.initramfs|initiatorname|local-top/iscsi)'

退出:

exit
umount -R /mnt/fnos-iscsi-root

七、先在 PVE 上搭 PXE/iPXE 验证

安装:

apt update
apt install -y dnsmasq ipxe
mkdir -p /srv/tftp
cp /usr/lib/ipxe/ipxe.efi /srv/tftp/ipxe.efi
cp /usr/lib/ipxe/undionly.kpxe /srv/tftp/undionly.kpxe

boot.ipxe

cat > /srv/tftp/boot.ipxe <<'EOF'
#!ipxe
set initiator-iqn iqn.2026-05.local.fnos:50a337b00d
set keep-san 1
sanboot iscsi:192.168.31.20::::iqn.2025-03.com.ugreen:target-1.50a337b00d
EOF

/etc/dnsmasq.d/fnos-ipxe.conf

interface=vmbr1
bind-interfaces
port=0
log-dhcp
dhcp-range=192.168.31.0,proxy,255.255.255.0
dhcp-match=set:ipxe,175
dhcp-match=set:efi-bc,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9
dhcp-boot=tag:ipxe,boot.ipxe,192.168.31.6,192.168.31.6
dhcp-boot=tag:!ipxe,tag:efi-bc,ipxe.efi,192.168.31.6,192.168.31.6
dhcp-boot=tag:!ipxe,tag:efi-x86_64,ipxe.efi,192.168.31.6,192.168.31.6
dhcp-boot=tag:!ipxe,undionly.kpxe,192.168.31.6,192.168.31.6
pxe-prompt=fnOS iPXE boot,1
pxe-service=tag:!ipxe,BC_EFI,fnOS iPXE UEFI,ipxe.efi,192.168.31.6
pxe-service=tag:!ipxe,x86-64_EFI,fnOS iPXE UEFI x64,ipxe.efi,192.168.31.6
pxe-service=tag:!ipxe,x86PC,fnOS iPXE BIOS,undionly.kpxe,192.168.31.6
enable-tftp
tftp-root=/srv/tftp

启动:

dnsmasq --test
systemctl enable --now dnsmasq
systemctl restart dnsmasq

八、小主机 BIOS 设置

PXE 设置页:

Aptio BIOS PXE 设置

推荐:

PXE Function Support       Enabled
Network Stack              Enabled
IPv4 PXE Support           Enabled
IPv4 HTTP Support          Disabled
IPv6 PXE Support           Disabled
IPv6 HTTP Support          Disabled

Boot 页:

Aptio BIOS Boot 选项

推荐:

Operating System Select  -> Other OS
Fast Boot                -> Disabled
Boot Option #1           -> UEFI: PXE IPv4 Int...
HTTP IPv4                -> 不选
Secure Boot              -> Disabled

九、UEFI SAN boot 失败时补 EFI

如果出现:

iPXE SAN boot error

关键日志:

Registered SAN device 0x80
Boot from SAN device 0x80 failed: Error 0x7f22208e

原因是系统盘是 Legacy/MBR 方式安装,但小主机走 UEFI PXE,缺少:

/EFI/BOOT/BOOTX64.EFI

处理:把 /dev/sda1 改成 ESP 并安装 UEFI GRUB。

先备份:

mkdir -p /root/fnos-iscsi-efi-backups
stamp=$(date +%Y%m%d-%H%M%S)
sfdisk -d /dev/sda > /root/fnos-iscsi-efi-backups/sda-partitions-$stamp.sfdisk
dd if=/dev/sda of=/root/fnos-iscsi-efi-backups/sda-first-1MiB-$stamp.bin bs=1M count=1 status=none
dd if=/dev/sda1 of=/root/fnos-iscsi-efi-backups/sda1-before-efi-$stamp.img bs=1M status=none

改 ESP:

DISK=/dev/disk/by-id/scsi-360014051625c0881b9d4f5eac9b66de7
P1=/dev/disk/by-id/scsi-360014051625c0881b9d4f5eac9b66de7-part1
P2=/dev/disk/by-id/scsi-360014051625c0881b9d4f5eac9b66de7-part2

sfdisk --part-type "$DISK" 1 ef
udevadm settle
mkfs.vfat -F 32 -n FNOS_EFI "$P1"

mkdir -p /mnt/fnos-iscsi-root
mount "$P2" /mnt/fnos-iscsi-root
mkdir -p /mnt/fnos-iscsi-root/boot/efi
mount "$P1" /mnt/fnos-iscsi-root/boot/efi

安装 GRUB:

grub-install \
  --target=x86_64-efi \
  --efi-directory=/mnt/fnos-iscsi-root/boot/efi \
  --boot-directory=/mnt/fnos-iscsi-root/boot \
  --removable \
  --no-nvram \
  --recheck \
  --no-floppy

修复 /etc/fstab

UUID=c7434822-bf92-4bea-9892-39e55ddd7445 / ext4 errors=remount-ro 0 1
/swapfile none swap sw 0 0
UUID=60F8-9CA0 /boot/efi vfat umask=0077 0 1

更新 GRUB:

for d in dev proc sys run; do mount --bind /$d /mnt/fnos-iscsi-root/$d; done
chroot /mnt/fnos-iscsi-root /bin/bash -lc 'update-grub'
sync
umount -R /mnt/fnos-iscsi-root

最后退出 PVE 对系统盘的占用:

iscsiadm -m node -T iqn.2025-03.com.ugreen:target-1.50a337b00d -p 192.168.31.20:3260 --logout
iscsiadm -m session

十、把 PXE 迁移到绿联 NAS

NAS 目录:

/volume4/fnos-pxe
  ├─ conf/dnsmasq-fnos-pxe.conf
  ├─ logs/dnsmasq.log
  └─ tftp/
      ├─ ipxe.efi
      ├─ undionly.kpxe
      ├─ boot.ipxe
      └─ hosts/48:f3:17:16:36:cd.ipxe

总入口 /volume4/fnos-pxe/tftp/boot.ipxe

#!ipxe
set client ${net0/mac}
echo fnOS diskless boot for ${client}
chain --replace tftp://192.168.31.20/hosts/${client}.ipxe || goto unknown

:unknown
echo Unknown PXE client: ${client}
echo This NAS PXE service is bound only to registered hosts.
shell

主机脚本 /volume4/fnos-pxe/tftp/hosts/48:f3:17:16:36:cd.ipxe

#!ipxe
echo Booting fnOS host-01 from UGREEN iSCSI...
set initiator-iqn iqn.2026-05.local.fnos:50a337b00d
set keep-san 1
sanboot iscsi:192.168.31.20::::iqn.2025-03.com.ugreen:target-1.50a337b00d

NAS dnsmasq 配置 /volume4/fnos-pxe/conf/dnsmasq-fnos-pxe.conf

interface=bridge0
bind-interfaces
port=0
log-dhcp
log-facility=/volume4/fnos-pxe/logs/dnsmasq.log
dhcp-range=192.168.31.0,proxy,255.255.255.0
dhcp-mac=set:fnos-host-01,48:f3:17:16:36:cd
dhcp-match=set:ipxe,175
dhcp-match=set:efi-bc,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9
dhcp-ignore=tag:!fnos-host-01
dhcp-boot=tag:fnos-host-01,tag:ipxe,boot.ipxe,192.168.31.20,192.168.31.20
dhcp-boot=tag:fnos-host-01,tag:!ipxe,tag:efi-bc,ipxe.efi,192.168.31.20,192.168.31.20
dhcp-boot=tag:fnos-host-01,tag:!ipxe,tag:efi-x86_64,ipxe.efi,192.168.31.20,192.168.31.20
dhcp-boot=tag:fnos-host-01,tag:!ipxe,undionly.kpxe,192.168.31.20,192.168.31.20
pxe-prompt=fnOS NAS iPXE boot,1
pxe-service=tag:fnos-host-01,tag:!ipxe,BC_EFI,fnOS iPXE UEFI,ipxe.efi,192.168.31.20
pxe-service=tag:fnos-host-01,tag:!ipxe,x86-64_EFI,fnOS iPXE UEFI x64,ipxe.efi,192.168.31.20
pxe-service=tag:fnos-host-01,tag:!ipxe,x86PC,fnOS iPXE BIOS,undionly.kpxe,192.168.31.20
enable-tftp
tftp-root=/volume4/fnos-pxe/tftp

systemd 服务 /etc/systemd/system/fnos-pxe.service

[Unit]
Description=fnOS diskless PXE ProxyDHCP/TFTP service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/sbin/dnsmasq --no-daemon --conf-file=/volume4/fnos-pxe/conf/dnsmasq-fnos-pxe.conf
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target

启动:

sudo /usr/sbin/dnsmasq --test --conf-file=/volume4/fnos-pxe/conf/dnsmasq-fnos-pxe.conf
sudo systemctl daemon-reload
sudo systemctl enable --now fnos-pxe.service
sudo systemctl status fnos-pxe.service --no-pager -l

迁移完成后停掉 PVE 的 PXE,避免抢答:

ssh root@192.168.31.6 'systemctl disable --now dnsmasq'

十一、多台无盘小主机怎么扩展

原则:

一台小主机 = 一个 MAC = 一个固定 IP = 一个 Initiator IQN = 一个可写 iSCSI 系统盘 Target

不要多台机器同时写同一个普通 iSCSI 系统盘。

推荐表:

主机 PXE MAC IP Initiator IQN 系统盘 Target
host-01 48:f3:17:16:36:cd 192.168.31.220 iqn.2026-05.local.fnos:50a337b00d iqn.2025-03.com.ugreen:target-1.50a337b00d
host-02 xx:xx:xx:xx:xx:xx 192.168.31.221 iqn.2026-05.local.fnos:host-02 iqn.2025-03.com.ugreen:target-host-02-system

新增机器只要新增:

/volume4/fnos-pxe/tftp/hosts/<mac>.ipxe

并在 NAS iSCSI ACL 里绑定对应 Initiator。

十二、踩坑总结

1. PXE 卡在 Start PXE over IPv4

PXE 卡住

如果 dnsmasq 日志能看到:

PXEClient:Arch:00007:UNDI

说明请求到了服务器。若没 TFTP 记录,通常需要补 pxe-service

2. 小主机抢 PVE IP

现象:

arp -an 显示 192.168.31.6 对应小主机 MAC

处理:

arp -d 192.168.31.6

然后修改路由器 DHCP 池,给小主机做 DHCP 保留。

3. PVE 和 NAS 同时提供 PXE

迁移后必须停一个:

systemctl disable --now dnsmasq

4. dnsmasq 备份文件别放配置目录

不要把 fnos-ipxe.conf.bak-* 放在 /etc/dnsmasq.d/,否则可能被 dnsmasq 当配置读取。

5. fstab 追加时注意换行

错误例子:

/swapfile none swap sw 0 0UUID=60F8-9CA0 /boot/efi vfat umask=0077 0 1

直接重写三行最稳。

十三、常用排错命令

看 PXE 日志:

journalctl -u dnsmasq -f
journalctl -u fnos-pxe -f
tail -f /volume4/fnos-pxe/logs/dnsmasq.log

抓 DHCP/TFTP:

tcpdump -i bridge0 -nn -e -vv '(udp port 67 or udp port 68 or udp port 69)'

查 iSCSI 占用:

iscsiadm -m session

查链路:

ethtool enp3s0
ip neigh show | grep -i '48:f3:17:16:36'

十四、最终效果

最终,小主机无本地硬盘,只插网线,启动链路为:

小主机 UEFI PXE
  -> 路由器 DHCP
  -> 绿联 NAS ProxyDHCP/TFTP
  -> iPXE
  -> 绿联 NAS iSCSI 系统盘
  -> fnOS

image-1777654958503
PVE 不再参与启动,可以关机。