← richliu.com / 文章
中文 EN

[Gentoo] 2025 小升級流水帳

2025-12-20 Gentoo Linux kernel iptables → nftables

這次升級是由三個問題同時觸發的,kernel 從 6.12 升到 6.18, 每個問題都踩了一個坑,記錄下來供有緣人參考。

問題一:Genkernel dmraid 編譯錯誤

使用 genkernel 搭配 dmraid 時,編譯直接失敗。 原因是 dmraid 最後一次 release 是 2010 年,程式碼年久失修, 現代 GCC 現在把「不相容函式指標類型」從 warning 升級為 error,直接中斷編譯。

解法:編輯 /etc/genkernel.conf,把 dmraid 選項關掉。

DMRAID="no"

現代系統已經改用 mdadm 了,dmraid 本來就不需要繼續掛著。

問題二:Init Respawning 錯誤(f0)

開機後持續出現 Id 'f0' respawning too fast: disabled for 5 minutes 的訊息。 追查到 /etc/inittab,發現 ttyAMA0 序列埠 console 的 getty 設定消失了—— 這個設定在 ARM 系統上常見,但不知道什麼時候被清掉了。

getty 找不到對應的 tty 就不斷重試,才會出現 respawning 錯誤。

解法:把 inittab 裡對應的那行注釋掉,然後執行 telinit q 重新讀取設定。

問題三:Linux 6.18 移除了 iptables 支援

這是這次升級最大的坑。

kernel 6.18 把 iptables 的核心支援完全移除,只剩下 nftables(nft)。 簡單的規則可以用 iptables-nft 相容層轉, 但複雜規則(例如 TCPMSS)就沒辦法,必須完整遷移到 nft 語法。

用了 DeepSeek 和 Gemini 協助轉換規則集,但還是需要手動微調。iptables 規則轉 nft 的基本對應:

# 舊的 iptables 寫法
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# 新的 nft 寫法
table ip filter {
  chain FORWARD {
    type filter hook forward priority 0;
    tcp flags syn tcp option maxseg size set rt mtu
  }
}

用了 iptables 將近二十年,這次真的是道別了。 nft 語法其實更清晰,只是遷移的過程有點費力。