NixOSでSambaによるファイルサーバの構築

前回の記事では、NixOSにSFTPの設定と設定後の動作確認を行った。
当ブログの著者の家庭内ではOpenBSDとDebian GNU/LinuxにSambaを導入しファイルサーバとして利用しており、Windows環境とmacOS環境との間でのファイル共有やファイルのバックアップなどを実施している。
自宅環境で稼働しているSambaと同じような設定や運用がNixOSでも可能かどうか確認する為、今回はNixOSにSambaをインストールし、設定と簡単な動作確認をやってみた。
2025/4/6追記 NixOSネタの記事の一覧は、当記事内最下部の「NixOS関連の記事」欄内を参照。



Sambaについて
Sambaとは、Linuxや*BSDなどUNIX系のOSでWindowsとファイルやプリンタを共有するためのソフトウェアである。
Microsoftが開発したSMB(Server Message Block)という通信プロトコルを実装したもので、異なるOS間でのファイル共有を可能にする。
Sambaという名称は、Windowsで使用されているSMBに2つの母音を入れて作られたものとなっている。
Sambaの主な機能として、ファイル共有やプリンタ共有の他にドメインコントローラやユーザ認証やアクセス制御などが挙げられる。
活用例として、社内や学校内や宅内などでファイルサーバとしての利用、バックアップ用のストレージとしての利用などが挙げられる。



当方の環境
ホスト機:macOS 15.3.2 / MacBook Pro 2020 / RAM: 16GB / CPU: Intel Core i5 2.0GHz
仮想化環境:Oracle VirtualBox 7.1.4 r165100
ゲストOS:NixOS 24.11 (Vicuna)
Samba:バージョン4.20.4
Sambaでファイルサーバを構築した後、ファイルサーバへの接続用端末としてMacBook Pro 2020とMacBook Air 2011とHP ProBook 5220m(Windows 10)を使用した。



今回の要件
・公開ディレクトリは/var配下ではなく/home/sambaを使用。/var配下に公開ディレクトリを作成出来なかったため。(sudo付けてmkdir叩いたけど、readonlyだよと怒られた)
・構成ファイルは/etc/samba/smb.confではなく/etc/nixos/smb.nixを使用。
・アカウントはsambaとする。

設定に取り掛かる前に、動作環境を出力した。
前回の記事の続きで当記事の内容を実施する際、NixOSへのsshログインはポート番号を指定して実行する。
もしくは/etc/nixos/ssh.nixファイルにてservices.openssh.ports = [ 22222 ];の行をコメントアウトする。

[testsv99:~ ]# uname -a          
Linux testsv99 6.6.82 #1-NixOS SMP PREEMPT_DYNAMIC Sun Mar  9 08:55:04 UTC 2025 x86_64 GNU/Linux
[testsv99:~ ]# 
[testsv99:~ ]# zsh --version
zsh 5.9 (x86_64-pc-linux-gnu)
[testsv99:~ ]# 

 
 

Sambaの設定
Samba用のアカウントを作成する前に、Sambaパッケージの導入設定とSambaの設定を済ませる。
自分の環境では、先にSamba用のアカウントを作成するとsmb.nixが読み込めない旨のエラーを吐いた為、先にSambaの設定を実施した。
/etc/nixos/configuration.nixファイル内の上の方に有るimportsの項目にて、/etc/nixos/smb.nixファイルを読み込ませる設定を追記する。

[testsv99:~ ]# sudo nvim /etc/nixos/configuration.nix

{ config, pkgs, ... }:

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      ./ssh.nix
      ./zsh.nix
      ./nvim.nix
      ./chrony.nix
      ./smb.nix  ◻️◻️この行を追記
    ];
:
省略
:

 
続いて、/etc/nixos/configuration.nixファイル内にて、以下のようにsambaを追記しsambaパッケージのインストールの設定を追記する。

:
省略
:
  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
  #  vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
    wget
    zsh
    neovim
    git
    wget
    curl
    chrony
    neofetch
    samba  ◻️◻️この行を追記
  ];
:
省略
:

 
更に、/etc/nixos/configuration.nixファイル内の下部にてSambaを有効にする設定とSambaのポートを開く設定を追記する。
追記し終えたら、編集内容を保存し/etc/nixos/configuration.nixファイルを閉じる。

:
省略
:
  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

    services.samba.smbd.enable = true;  ◻️◻️この行を追記
    services.samba.openFirewall = true;  ◻️◻️この行を追記

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;
:
省略
:
[testsv99:~ ]# 

 


smb.nixファイルにSambaの設定
他のLinuxディストリビューションや*BSD等で使用されている/etc/samba/smb.confファイルと同じようなファイルを作成する。
/etc/nixos/smb.nixファイルの内容は、以下のサイト内のServer setupの欄に記載されている設定例を参考にした。
ただし、設定例は/etc/nixos/configuration.nixファイルに記載する内容で書かれている為、/etc/nixos/smb.nixなど別のファイルに記載する際は少し手を加える必要が有る。
https://nixos.wiki/wiki/Samba NixOS Wiki - Samba - Server setup
 
ダブルクォーテーション(" ")で囲まれた行とそうでない行との違いについて。
NixOS Search Optionsで検索してもヒットしない設定は、ダブルクォーテーションで囲んで設定するようだ。SFTPやvimの設定では気が付かなかった。
ダブルクォーテーションで囲まれた設定は単なる文字列の扱いではない。例えば、hosts allowの行にて括弧の中の文字列をlocalhost以外削除したら公開ディレクトリにアクセス不可能になった事から、設定値として読み込まれて正常に動作する事がわかる。
smb.nixファイルで設定した際、smb.confファイルを編集したのではないためtestparmで構文チェックはできない。
https://search.nixos.org/options? NixOS Search Options

[testsv99:~ ]# sudo nvim /etc/nixos/smb.nix
{
  services.samba = {
    enable = true;
    openFirewall = true;
    settings = {
      global = {
        security = "user";
        "dns proxy" = "no";
        "dos charset" = "CP932";
        "log file" = "/var/log/samba/smbd.%m";
        "logging" = "file";
        "workgroup" = [ "WORKGROUP" ];
        "server string" = [ "nixossamba" ];
        "netbios name" = [ "nixossamba" ];
        "max protocol" = [ "smb3" ];
        "hosts allow" = [ "192.168.0. 192.168.1. 192.168.3. localhost" ];
        "hosts deny" = [ "0.0.0.0/0" ];
        "guest account" = [ "samba" ];
        "map to guest" = [ "bad user" ];
      };
      homes = {
        browseable = "no";
        "read only" = "no";
        "guest ok" = "yes";
        "valid users" = "%S %D%w%S";
      };
      samba = {
        path = "/home/samba";
        browseable = "yes";
	"read only" = "no";
	"writable" = "yes";
        "guest ok" = "yes";
        "guest only" = "yes";
        "create mask" = "0777";
        "directory mask" = "0777";
      };
    };
  };
}
[testsv99:~ ]# 

 

自分の環境では/etc/nixos/configuration.nixファイルと/etc/nixos/smb.nixの2つのファイルに分けてSambaの導入設定および環境設定を行ったが、分けずに/etc/nixos/configuration.nixファイルだけで設定を行う事も出来る。
構文は、settingsから下は/etc/nixos/smb.nixと同じである。
以下を/etc/nixos/configuration.nixファイルに追記した後、nixos-rebuildコマンドでリビルド、Sambaの動作確認という流れになる。

services.samba.enable = true;
services.samba.openFirewall = true;
services.samba.settings = {
  global = {
    security = "user";
    "dns proxy" = "no";
    "dos charset" = "CP932";
    "log file" = "/var/log/samba/smbd.%m";
    "logging" = "file";
    "workgroup" = [ "WORKGROUP" ];
    "server string" = [ "nixossamba" ];
    "netbios name" = [ "nixossamba" ];
    "max protocol" = [ "smb3" ];
    "hosts allow" = [ "192.168.0. 192.168.1. 192.168.3. localhost" ];
    "hosts deny" = [ "0.0.0.0/0" ];
    "guest account" = [ "samba" ];
    "map to guest" = [ "bad user" ];
  };
  homes = {
    browseable = "no";
    "read only" = "no";
    "guest ok" = "yes";
    "valid users" = "%S %D%w%S";
  };
  samba = {
        path = "/home/samba";
        browseable = "yes";
	"read only" = "no";
	"writable" = "yes";
        "guest ok" = "yes";
        "guest only" = "yes";
        "create mask" = "0777";
        "directory mask" = "0777";
  };
}

 

samba用のアカウントと公開ディレクトリを作成する。
本当は/varの配下に公開ディレクトリを作成したかったのだが、/varの配下はsudo付けてmkdir叩いてもフォルダの作成が出来なかったので、仕方なく/home配下に作成。
smbpasswdコマンドが弾かれた場合、sudo nixos-rebuild switchコマンドの後にもう一度実行する。

[testsv99:~ ]# sudo groupadd samba
[testsv99:~ ]# sudo useradd -m samba -g samba
[testsv99:~ ]# sudo smbpasswd -a samba
New SMB password:
Retype new SMB password:
Added user samba.
[testsv99:~ ]# 

 
上記の実行後、/home/sambaディレクトリが作成された事を確認する。

[testsv99:~ ]# ls -la /home                
total 20
drwxr-xr-x  5 root    root    4096  3月 26 21:15 .
drwxr-xr-x 19 root    root    4096  3月 16 15:03 ..
drwx------  2 ftpuser ftpuser 4096  3月 20 20:51 ftpuser
drwx------  7 user    users   4096  3月 26 20:03 user
drwx------  2 samba   samba   4096  3月 26 21:15 samba

 

設定を終えたら、設定内容を反映させる為にnixos-rebuildコマンドを叩いてリビルドする。
warningが出力された。/etc/nixos/smb.nixファイル内2行目の設定(services.samba.enable = true;)が5〜7行目の設定にリネームされたと言っている。とりあえず無視。

[testsv99:~ ]# sudo nixos-rebuild switch             
building Nix...
building the system configuration...
evaluation warning: The option `services.samba.securityType' defined in `/etc/nixos/smb.nix' has been renamed to `services.samba.settings.global.security'.
these 33 derivations will be built:
  /nix/store/rdvaypahc7fb28zd8wsr504rk12sb2qd-firewall-start.drv
:
省略
:
[testsv99:~ ]# 

 
リビルドの実行後、NixOSを再起動させる。

[testsv99:~ ]# sudo reboot

Broadcast message from root@testsv99 on pts/1 (Wed 2025-03-26 20:06:34 JST):

The system will reboot now!
:
省略
:

 

再起動の完了後、Sambaの動作確認。
ますはsmbdコマンドを叩いてバージョンの確認。

[testsv99:~ ]# smbd -V
Version 4.20.4
[testsv99:~ ]# 

 
OpenBSDや他のLinuxディストリビューションと同様に、NixOSはsystemctlコマンドでSambaサービスの動作を制御する事が出来る。
systemctlコマンドをstatusオプションを付けて実行。問題無く立ち上がっている事を確認。

[testsv99:~ ]# systemctl status samba-smbd.service
● samba-smbd.service - Samba SMB Daemon
     Loaded: loaded (/etc/systemd/system/samba-smbd.service; enabled; preset: ignored)
     Active: active (running) since Fri 2025-03-26 21:49:38 JST; 5min ago
 Invocation: 34a757858cb24edc8075c4d3dff88e72
       Docs: man:smbd(8)
             man:samba(7)
             man:smb.conf(5)
   Main PID: 853 (smbd)
     Status: "smbd: ready to serve connections..."
         IP: 62.5K in, 76.5K out
         IO: 3.6M read, 28K written
      Tasks: 3 (limit: 4662)
     Memory: 10.6M (peak: 29.6M)
        CPU: 699ms
     CGroup: /system.slice/system-samba.slice/samba-smbd.service
             ├─853 /nix/store/hr3yfivvn12mfnyzs6dlv7xgx03k67f8-samba-4.20.4/sbin/smbd --foreground --no-process-group
             ├─866 "smbd: notifyd" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "">
             └─867 "smbd: cleanupd" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ">

 3月 26 21:49:40 testsv99 systemd[1]: Starting Samba SMB Daemon...
 3月 26 21:49:41 testsv99 systemd[1]: Started Samba SMB Daemon.
[testsv99:~ ]# 

 

ホスト機側からNixOS内のSamba公開ディレクトリに接続テストを実施。
以下の画像のとおり、公開ディレクトリにアクセス出来た事を確認。
公開ディレクトリ内にあるファイルは、動作確認の際に作成したものである。


 

続けて、Windows端末から自宅内LANを経由しNixOSのSamba公開ディレクトリにアクセス。
以下の画像のとおり、公開ディレクトリにアクセス出来た事を確認。
.DS_Storeファイルや._test.txtファイルも表示されているが、MacBookからNixOSのSamba公開ディレクトリにアクセスした際、MacBook側でファイルを新規作成した時に生成された隠しファイル(ただしWindows環境からは見える)である。



今回はここまで。
別環境で動作しているOpenBSDやDebian GNU/LinuxのSambaと同等の設定が可能である事と、Sambaの立ち上げおよびクライアント側から公開ディレクトリにアクセス出来る事を確認した。
NixOS Search Optionsで検索しヒットしない設定項目であっても、ダブルクォーテーションで囲んで書く事が出来るのは知らなかった。今回はSambaで試してみたが、SFTPやNeovim等でも通用する設定方法であるか確認したい。
 


振り返り
/etc/nixos/smb.nixファイル内の設定の構文で少し躓いたものの、家庭内で稼働中のSambaサーバと同等の設定および動作が出来た。
NixOS Search Optionsで検索出来なかった設定項目はダブルクォーテーションで囲んで記載する事で、他のLinuxディストリビューション環境や*BSD環境と同様の動作をさせる事が出来る事も学んだ。
家庭内で稼働しているLinuxのサーバやOpenBSDのサーバにて動作しているサービスは、SFTPやSambaの他にも幾つかある。それらもNixOSにて動かしてみようと思う。
 
 

参照サイト
https://nixos.org/ Nix & NixOS Declarative builds and deployments
https://nixos.org/manual/nixos/stable/ NixOS Manual
https://search.nixos.org/packages NixOS Search Packages
https://search.nixos.org/options? NixOS Search Options
https://zenn.dev/asa1984/articles/nixos-is-the-best NixOSで最強のLinuxデスクトップを作ろう
https://nixos.wiki/wiki/Samba NixOS Wiki - Samba - Server setup
https://www.samba.org/ Samba - opening windows to a wider world
https://discourse.nixos.org/t/nixos-configuration-for-samba/17079/8 NixOS configuration for Samba
https://debslink.hatenadiary.jp/entry/20241130/1732965507 Raspberry Pi3 Model Bでファイルサーバを構築
 

NixOS関連の記事
https://debslink.hatenadiary.jp/entry/20250311/1741649715 NixOSの沼に片足を突っ込んだ
https://debslink.hatenadiary.jp/entry/20250316/1742128054 NixOSにFlakeを導入した
https://debslink.hatenadiary.jp/entry/20250320/1742459549 NixOSの環境構築
https://debslink.hatenadiary.jp/entry/20250323/1742731080 NixOSでSFTPサーバの設定
https://debslink.hatenadiary.jp/entry/20250328/1743167901 NixOSでSambaによるファイルサーバの構築
https://debslink.hatenadiary.jp/entry/20250405/1743844940 NixOSでrsyslogの設定
https://debslink.hatenadiary.jp/entry/20250411/1744300480 NixOSでDNSサーバの構築
https://debslink.hatenadiary.jp/entry/20250413/1744551596 NixOSのシステムの再現性の検証
https://debslink.hatenadiary.jp/entry/20250418/1744924524 NixOSでPostfixとDovecotによるメールサーバの構築
https://debslink.hatenadiary.jp/entry/20250419/1745062553 NixOSでPostfixとDovecotによるメールサーバの構築 - SASL認証編
https://debslink.hatenadiary.jp/entry/20250421/1745236668 NixOSのパッケージやOSのアップデートに関するメモ
https://debslink.hatenadiary.jp/entry/20250428/1745795434 NixOSをCLIでインストールした
https://debslink.hatenadiary.jp/entry/20250503/1746235454 NixOSでnginxによるWebサーバの構築
https://debslink.hatenadiary.jp/entry/20250508/1746706416 NixOSでPrometheusとGrafanaによる監視基盤の構築
https://debslink.hatenadiary.jp/entry/20250510/1746884897 NixOSの導入にあたり参考になったサイト
https://debslink.hatenadiary.jp/entry/20250524/1748072722 NixOSを24.11から25.05にアップデートした
https://debslink.hatenadiary.jp/entry/20251214/1765688458 NixOSを25.05から25.11にアップデートした
https://debslink.hatenadiary.jp/entry/20260117/1768615582 Raspberry Pi 4BにNixOSを導入しファイルサーバを構築した