SMB (SAMBA) file server on ZFS filesystem managed by FreeBSD on HyperV guest host


This article shows the configuration of a file server with these characteristics:


The purpose is to archive the most important data on a filesystem that can minimize the risk of data corruption, as discussed in this article: arstechnica.com/information-technology/2014/01/bitrot-and-atomic-cows-inside-next-gen-filesystems.

This is a home setup, for me all this infrastructure has the only purpose to prevent data corruption, data will be duplicated and checksummed by the ZFS filesystem, but on just one physical drive. For helping against data loss caused by hardware failure, I will do a backup copy of the virtual drive with the data on external physical hard drives.

Creating the virtual machine

I created the virtual machine using the Hyper-V management console:

Installing and configuring the operating system

I installed FreeBSD on the virtual machine.

I created a non-root user and I added it to the wheel group, so it is possible for me to connect to the system by ssh and to manage it by becoming root using the "su" command.

I modified the network interface card configuration as it is explained there: coreboarder.com/blog/?p=15.

After installing FreeBSD on a Hyper-V machine I had no network connection.
The solution is to modify rc.conf that DHCP will always work on boot
Edit /etc/rc.conf:
Comment the following with a “#”:
Add the following:
ifconfig_YOURNICID=”SYNCDHCP media 100baseTX mediaopt full-duplex”

I restarted the operating system and when it was up again, I connected to it and I tested the network connectivity.

See Loader Tunables - The Z File System (ZFS) - FreeBSD Handbook.

The settings suggested in the above document gave me this warning:

ZFS WARNING: Recommended minimum kmem_size is 512MB; expect unstable behavior.
Consider tuning vm.kmem_size and vm.kmem_size_max in /boot/loader.conf.

So I configured these settings:

root@fbsd1:~ # ed  /boot/loader.conf
root@fbsd1:~ #

I powered off the system with the "poweroff" commmand of the operating system.

Adding a virtual hard disk for the data

From the Hyper-V management console I added a virtual hard disk, which will contain the ZFS filesystem where the data will be stored. I added it on the IDE controller 1, I created it as a VHDX with dynamic expasion, of 300GB.

I powered on the virtual machine and I used the command "dmesg" to understand the name of the newly added device (the virtual hard disk):

da1 at blkvsc1 bus 0 scbus2 target 1 lun 0
da1:  Fixed Direct Access SCSI-4 device
da1: 300.000MB/s transfers
da1: Command Queueing enabled
da1: 307200MB (629145600 512 byte sectors: 255H 63S/T 39162C)

Preparing the aread for the data

I created the ZFS pool and filesystem, see also Single Disk Pool - The Z File System (ZFS) - FreeBSD Handbook.

root@fbsd1:~ # cd /
root@fbsd1:/ # zpool create m1pool /dev/da1
root@fbsd1:/ # zfs create m1pool/m1fs
root@fbsd1:/ # zfs set copies=3 m1pool/m1fs
root@fbsd1:/ # df -g
Filesystem  1G-blocks Used Avail Capacity  Mounted on
/dev/da0p2         36    2    31     7%    /
devfs               0    0     0   100%    /dev
m1pool            293    0   293     0%    /m1pool
m1pool/m1fs       293    0   293     0%    /m1pool/m1fs
root@fbsd1:/ #

Starting from now I can verify the data manually:

root@fbsd1:/ # zpool status m1pool
  pool: m1pool
 state: ONLINE
  scan: none requested

        NAME        STATE     READ WRITE CKSUM
        m1pool      ONLINE       0     0     0
          da1       ONLINE       0     0     0

errors: No known data errors
root@fbsd1:/ # zpool scrub m1pool
root@fbsd1:/ # echo $?
root@fbsd1:/ #

I created an user just for being used with the SMB service, I created it with its home directory inside the ZFS filesystem.

root@fbsd1:/m1pool/m1fs # adduser -d /m1pool/m1fs -s nologin -u 1000 -w random
Username: m1user
Full name: Marco SMB Access
Uid [1000]:
Login group [m1user]:
Login group is m1user. Invite m1user into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [nologin]:
Home directory [/m1pool/m1fs/m1user]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [yes]:
Lock out the account after creation? [no]:
Username   : m1user
Password   : 
Full Name  : Marco SMB Access
Uid        : 1000
Class      :
Groups     : m1user
Home       : /m1pool/m1fs/m1user
Home Mode  :
Shell      : /usr/sbin/nologin
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (m1user) to the user database.
adduser: INFO: Password for (m1user) is: RANDOMPASSWORDISHERE
Add another user? (yes/no): no
root@fbsd1:/m1pool/m1fs #

Coonfiguring the SMB service (SAMBA)

See 28.10. File and Print Services for Microsoft® Windows® Clients (Samba) - FreeBSD Handbook

root@fbsd1:/ # pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
Installing pkg-1.3.6: 100%
Message for pkg-1.3.6:
 If you are upgrading from the old package format, first run:

  # pkg2ng
pkg: not enough arguments
Usage: pkg [-v] [-d] [-l] [-N] [-j |-c ] [-C ] [-R ] [-o var=value]  []

For more information on available commands and options see 'pkg help'.
root@fbsd1:/ # pkg install net/samba36
Updating repository catalogue
Fetching meta.txz: 100% of 940 B
Fetching digests.txz: 100% of 2 MB
Fetching packagesite.txz: 100% of 5 MB

Adding new entries: 100%
Incremental update completed, 23314 packages processed:
0 packages updated, 0 removed and 23314 added.
Updating database digests format: 100%
The following 13 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        samba36: 3.6.24_2
        libsunacl: 1.0
        cups-client: 1.7.3_2
        openldap-client: 2.4.39_1
        tevent: 0.9.21
        python27: 2.7.8_2
        indexinfo: 0.2
        python2: 2_3
        talloc: 2.1.0
        tdb: 1.2.13,1
        pkgconf: 0.9.6_1
        popt: 1.16

The process will require 194 MB more space
34 MB to be downloaded

Proceed with this action [y/N]: y
Fetching samba36-3.6.24_2.txz: 100% of 21 MB
Fetching libsunacl-1.0.txz: 100% of 8 KB
Fetching cups-client-1.7.3_2.txz: 100% of 760 KB
Fetching openldap-client-2.4.39_1.txz: 100% of 995 KB
Fetching tevent-0.9.21.txz: 100% of 43 KB
Fetching python27-2.7.8_2.txz: 100% of 8 MB
Fetching gettext- 100% of 2 MB
Fetching indexinfo-0.2.txz: 100% of 6 KB
Fetching python2-2_3.txz: 100% of 2 KB
Fetching talloc-2.1.0.txz: 100% of 48 KB
Fetching tdb-1.2.13,1.txz: 100% of 77 KB
Fetching pkgconf-0.9.6_1.txz: 100% of 23 KB
Fetching popt-1.16.txz: 100% of 62 KB
Checking integrity... done (0 conflicting)
[1/13] Installing indexinfo-0.2: 100%
[2/13] Installing gettext- 100%
[3/13] Installing python27-2.7.8_2: 100%
[4/13] Installing python2-2_3: 100%
[5/13] Installing talloc-2.1.0: 100%
[6/13] Installing pkgconf-0.9.6_1: 100%
[7/13] Installing libsunacl-1.0: 100%
===> Creating users and/or groups.
Creating group 'cups' with gid '193'.
Creating user 'cups' with uid '193'.
[8/13] Installing cups-client-1.7.3_2: 100%
[9/13] Installing openldap-client-2.4.39_1: 100%
[10/13] Installing tevent-0.9.21: 100%
[11/13] Installing tdb-1.2.13,1: 100%
[12/13] Installing popt-1.16: 100%
[13/13] Installing samba36-3.6.24_2: 100%
root@fbsd1:/ # cp /usr/local/share/examples/samba36/smb.conf.default /usr/local/etc/smb.conf
root@fbsd1:/ # vi /usr/local/etc/smb.conf
(esempio delle modifiche effettuate)
root@fbsd1:/m1pool/m1fs # diff /usr/local/share/examples/samba36/smb.conf.default /usr/local/etc/smb.conf
<    workgroup = MYGROUP
>    workgroup = WORKGROUP
< ;   hosts allow = 192.168.1. 192.168.2. 127.
>    hosts allow =  127.
<    load printers = yes
>    load printers = no
root@fbsd1:/m1pool/m1fs # echo 'samba_enable="YES"' >> /etc/rc.conf
root@fbsd1:/m1pool/m1fs # service samba start
Removing stale Samba tdb files:  done
Starting nmbd.
Starting smbd.
root@fbsd1:/m1pool/m1fs # smbpasswd -a m1user
New SMB password:
Retype new SMB password:
Added user m1user.
root@fbsd1:/m1pool/m1fs #