NixOS on Proxmox の間違いだと思いましたか?......いいえ、NixOS「で」動かします。
目的
- Wi-Fi接続でProxmoxを運用する
- ↑のための面倒な設定をすべてNixOSで管理する
Proxmox側からできる設定がNixOSにより制限されていること除けば、やることは以下の公式ドキュメントの通りです。
Proxmoxの公式ドキュメントにある通り、Proxmoxを無線LANインターフェースで動かすことは推奨されていません。
今回のようにセットアップを工夫することで動かすことはできますが、無線なので通信が不安定という課題は残ります。
準備
- 物理マシン
- 今回はミニPC (GMKtec G3 Plus) を使用しました
- NixOS Configuration
- 事前にこのPC用の最低限の設定を用意しておくと楽です
- 宣言的管理のため、ネットワークデーモンには
NetworkManager
ではなく、systemd-networkd
を使用します
普通のNixOSのネットワーク設定
上記の準備のもとNixOSをインストール(当然Windowsは消し飛ば)し、Wi-Fiでインターネットに繋った状態の基本的なNixOSができあがったものとします。この時点のネットワーク設定は以下のようになっています。
# usual network settings
networking.useNetworkd = true;
networking.networkmanager.enable = false;
networking.interfaces."wlp1s0" = {
ipv4.addresses = [{
address = "192.168.0.100"; # 利便性のため静的IPを要求
prefixLength = 24;
}];
};
networking.defaultGateway = {
interface = "wlp1s0";
address = "192.168.0.1"; # おうちのルーターのアドレス
};
networking.nameservers = [ "8.8.8.8" "1.1.1.1" ];
networking = {
wireless.enable = true;
wireless.secretsFile = "/run/secrets/wireless.conf"; # 中身は psk_home=おうちwifiのpassword
wireless.networks."おうちwifiのssid" = {
pskRaw = "ext:psk_home";
};
};
ブリッジとDHCPサーバーの作成
ブリッジbr0
を作成し、このブリッジでDHCPサーバーを立てます。kea
でDHCPサーバーを立ててもいいのですが、systemd-networkd
だけで立てることができてしまうので、今回はこの方法で設定します。
# create bridge for mini dhcp server
systemd.network.netdevs."br0".netdevConfig = {
Name = "br0";
Kind = "bridge";
};
systemd.network.networks."00-br0" = {
matchConfig.Name = "br0";
networkConfig = {
Address = "10.42.0.1/24"; # デフォルトゲートウェイになる
DHCPServer = "yes";
};
dhcpServerConfig = {
PoolOffset = 100; # 適当。割り当てが 10.42.0.100 ~ になる
PoolSize = 100; # 適当。subnet maskが255.255.255.0なのでデカすぎても意味ない
};
};
インタフェースをブリッジに追加
あとはVMやEthernetの接続ポートをブリッジbr0
のメンバーに追加してあげるだけで、接続先にIPアドレスが振られていきます。
# vm taps to br0
systemd.network.networks."30-tap0" = {
matchConfig.Name = "tap*"; # VMを立てると tap<vmid>i0 のようなポートが生えて繋ってくる
networkConfig = { Bridge = "br0"; };
};
# enp3s0 to br0 (おまけ: ミニPCから物理配線で繋がった先のデバイスにもルーティングできる)
systemd.network.networks."20-enp3s0" = {
matchConfig.Name = "enp3s0";
networkConfig = { Bridge = "br0"; };
};
NAT
このままではVM達はインターネットの海には出られないので、NATの設定をしてあげます。このとき、インターネットにつながっている無線LANインターフェースが外側になります。
# nat via wlp1s0
networking.nat = {
enable = true;
externalInterface = "wlp1s0";
internalInterfaces = [ "br0" ];
};
本当にこれだけでいいの?お手軽すぎて涙が...
proxmox-nixosの導入
proxmox-nixos
という、Proxmox on NixOS を実現してくれるプロジェクトがあります。
ありがとうありがとう。
flake.nix
のinputs
に次の行を追加してあげましょう
proxmox-nixos.url = "github:SaumonNet/proxmox-nixos";
それからNixOSのコンフィグに以下の項目を追加します。
nixpkgs.overlays = [
inputs.proxmox-nixos.overlays."x86_64-linux"
];
services.proxmox-ve = {
enable = true;
ipAddress = "192.168.0.100"; # 先ほど固定したミニPCのIPアドレス
};
さて、この状態でnixos-rebuild
してあげると早速Proxmoxが使えます。
192.168.0.100:8006
でProxmoxのWEBダッシュボードが開けるはずです(ルートユーザーとしてログインしてあげましょう)。
Proxmoxからブリッジを作る
本来、Wi-Fi接続ではなく、かつ素のProxmoxを使用している場合、上記設定はいらないんです。proxmox-nixosを使う場合、Proxmoxのダッシュボードでネットワークの設定をいじっても、NixOS側のRead Onlyな領域を書きかえることができないので、NixOS側の設定で整合性を取る必要があるわけですね。
ノードのNetwork
→Create
でブリッジを作成します。このとき、ブリッジ名はNixOS側で先ほど準備してあげた物を入力する必要があります。
また、有線接続の場合と異なり、CIDRやGatewayはおうちルーターのものではなく、先ほどミニPC内部で組んだものを指定する必要があります。
NixOS側と同じ名前のブリッジを作れていると、br0
のActiveがYesとなります。
VMを作成する
あとは普通のProxmoxと同様に、Ubuntu Serverのisoをアップロードして、Create VMボタンからポチポチして作ることができます。
VMを作ってみて、IPが振ってこなかったりインターネットに繋がらなかったりする場合はどこかしらの設定を間違えている可能性が高いです。
うん、よき。
おわりに
何か間違ったことを言っていたら指摘していただけると嬉しいです。
なんか、こういう変な構成やってるとますますNixが好きになっちゃうね...///