転載・引用について

ユーザ用ツール

サイト用ツール


サイドバー

Site Contents Index

転載・引用について

RSS

os:freebsd:nas

FreeBSDでNASを建てる

FreeBSDでNASを作成する。

Open Source なNASの実装には

などがある。

(参考 : https://www.how2shout.com/tools/best-free-open-source-nas-software.html)

NASは、その利用目的によって、考慮するべき点が異なる。筆者の主要な用途としては

  • 仮想基盤向けStorage
    • 利用したいのは、iSCSI / NFS の2Protocol。CephもGlusterも興味はあるが、個人的にはまだ実験レベル。
  • ファイル共有用
    • 利用したいのはNFS(MacでFile共有するならNFSで十分)とAFP(TimeMachine)

の2種類である。

しかし、仮想基盤向けストレージとファイル共有を同一のNASとして供給するのは、

  1. 管理上面倒
    • インフラとユーザーではセキュリティポリシーが異なる
  2. サービス要求レベルが異なる
    • インフラはできる限り安定して動かしたい。可能な限り触らない
    • ファイル共有は、設定の変更やアカウント追加削除など、触る局面が多い

というように、そもそもの要求要件が異なる。

というわけで、今回は、

  • 仮想基盤用のNASはFreeBSDを生でiSCSIとNFS供給用として使う
  • ファイル共有用は、仮想基盤のVM上にNAS4Freeを投入して、設定の簡便化を図る
    • NAS上のStorageにNASのStorageをおくわけで、屋上屋を架している状態だが、レスポンスがシビアではない条件なのでよしとする。

という実装を行う。

なお、NAS4Free環境の構築に関してはnas4freeを参照のこと

準備

NASを構築するには当然、十分なStorageを持つ機材が必要になる。

まず、必要なスペックを検討する。

要求要件検討

まず、要求要件をまとめる。

  • XCP-ngに対して、VM用のDisk Imageを保存することができるだけの容量
  • XCP-ngに対して、XCP-ngのSR(Storage Repository)として認識できるProtocolが利用できること
  • 基盤環境がGbEネットワーク(100Base-T)で構築されているので、GbEで通信できる環境
    • なお、802.3adでのTrunkに対応したSwitching HUBを利用しているので、NICに余力があれば802.3adでのTrunkも考慮に入れる
  • Disk Imageを保持するために、性能が良く、比較的安定なFileSystem(FS)を組めること
  • サイズは小さくて良いので、Disk Imageを供給するためのNetwork File Systemを利用できること
SR用 NFS , iSCSI , Hardware HBA , Software FCoE
ISO File用 NFS , SMB/CIFS

以上の条件であれば、Hardware要件さえ満たせれば、世に数多あるNAS Applianceを利用することで解決できる。 が、今回は、生FreeBSD上でiSCSI/NFSを供給するNASを作成することにする。

実装仕様

手元の機材の関係上、以下の環境に実装する。

CPU Intel Pentium G630T / 2.30GHz 手元にあったので
Memory 16GB 手元にあったので
NIC RealTek 8168 MotherBoardにOnboardで載っているので
Intel PRO/1000 PCI Slotに追加した
HDD HDS728080PLA380 80G 起動用
WD Green WD20EARX 2T ada0 / 手元にあったので
WD Green WD20EZRX 2T ada1 / 手元にあったので
WD Green WD20EARX 2T ada2 / 手元にあったので
WD Green WD20EZRX 2T ada3 / 手元にあったので
WD Green WD20EZRX 2T ada4 / 手元にあったので

要件と好みから、以下のように実装する

OS FreeBSD 11.1-RELEASE
iSCSI target ctld (System Builtin)
NFS Server rpcbind/nfsd/mountd (System Builtin)
NFSv3を利用
ZFS RAID-Z2を利用
SR用Storageはvdevにする

その他、細かい諸元を以下に。

  • Remoteからの制御通信はsshのみを許可する。sshの待ち受けはHigh Portに移動する
  • 管理セグメントとStorageセグメント以外からの通信は全て遮断する
  • FreeBSD Updateおよびpkg updateは、手元にあるproxyを経由する
  • 監視のためのSoftwareはとりあえずPendする

OSの初期設定

Bare MetalにOSを投入する

Install FreeBSD

FreeBSDのInstaller CDからOSを導入する。

注意点は

  • BootDiskにはそれほどの容量はいらない
    • portsやsrcは展開しない
    • 不要な32bit Libは導入しない
  • Disk割り当ては、80Gだと少し大きすぎるので、以下のようにした。
    • Boot BlockにGPTを選択
    • OS部分は別にZFSにする必要がないので、UFSを利用する
    • Partition構成は以下の通り
      • efi: 512MB (40/1048576)
      • freebsd-ufs : 20G (10186/41943040)
      • freebsd-swap : 2G (42991656/4194304)
      • これらは、Installerから設定可能。重要なのは、efiを設定すること

あとは、普通にInstallすればよい。

Configuration of FreeBSD

最初にBootしたら、以下を行う。

  • rc.conf関連の設定
    1. /etc/rc.confを作成・編集する
      • # Host Information
        hostname="nas-temp"
        keymap="jp"
        dumpdev="NO"
         
        # System Configuration
        clear_tmp_enable="YES"
        zfs_enable="YES"
         
        # NIC Configuration
        ifconfig_re0="inet 192.0.2.254    netmask 255.255.255.0"
        ifconfig_em1="inet 198.51.100.254 netmask 255.255.255.0"
         
        # Routing Configuration
        route_private10=" -net 10.0.0.0/8     127.0.0.1 -blackhole"
        route_private172="-net 172.16.0.0/12  127.0.0.1 -blackhole"
        route_private192="-net 192.168.0.0/16 127.0.0.1 -blackhole"
         
        static_routes="private10 private172 private192"
        defaultrouter="192.0.2.1"
         
        #Network Parameters Configuration
        icmp_bmcastecho="NO"
        icmp_drop_redirect="YES"
        icmp_log_redirect="YES"
        ip6addrctl_enable="NO"
        ip6addrctl_policy="ipv4_prefer"
        ipv6_activate_all_interfaces="NO"
        ipv6_network_interfaces="NO"
         
        # NFS Configuration
        rpc_lockd_enable="YES"
        rpc_statd_enable="YES"
        rpcbind_enable="YES"
         
        nfs_client_enable="NO" 
        autofs_enable="NO" 
         
        mountd_enable="YES"
        mountd_flags="-lr"
        nfs_server_enable="YES"
         
        nfsv4_server_enable="NO"
        nfsuserd_enable="NO"
        nfsuserd_flags="-domain localdomain"
         
        # Firewall
        pf_enable="NO"
        pf_flags=""
        pflog_enable="NO"
         
        # Userland
        syslogd_flags="-ss"
        sendmail_enable="NONE"
        sshd_enable="YES"
        ntpd_enable="YES"
        ntp_leapfile_fetch_verbose="YES"
        ntp_leapfile_sources="ftp://tycho.usno.navy.mil/pub/ntp/leap-seconds.list"
  • /etc/sysctl.conf関連
    • /etc/sysctl.confにいくつかの設定を書き込む
    • security.bsd.unprivileged_read_msgbuf=0
      kern.randompid=5055
      security.bsd.stack_guard_page=1
      
      # ZFS use 4k sectors. (default: 9/512 byes)
      vfs.zfs.min_auto_ashift=12
      
      ### NFS parameters
      vfs.nfsd.server_min_nfsvers=3
  • 名前解決
    1. /etc/resolv.confを作成・編集する
      • domain management.example.org
        nameserver 192.0.2.11
        nameserver 192.0.2.12
  • sshd関連の設定
    1. まず、自分のHome Directoryに.ssh/authorized_keysを設定する
      • これを忘れると、次の設定後にloginできなくなる
    2. /etc/ssh/sshd_config末尾に以下の設定を投入。XXXXには、待ち受けるポート番号を記載すること
      • ##### Addtional
        Port XXXX
        UseDNS no
        ChallengeResponseAuthentication no
      • service sshd restartをroot権限で実行し、sshdを再起動する
  • ntpd関連の設定
    1. /etc/ntp.confを編集する
      • serverを正しく設定すれば良い
      • 外部のNTPサーバーを参照するよりも、内部ネットワークに建ててあるNTPdを参照する方が望ましい
      • ntp.conf
        tos minclock 3 maxclock 6
        server 192.0.2.1 iburst
        server 192.0.2.2 iburst
        server 192.0.2.3 iburst
         
        restrict    default limited kod nomodify notrap noquery nopeer
        restrict -6 default limited kod nomodify notrap noquery nopeer
         
        restrict 127.0.0.1
        restrict -6 ::1
         
        leapfile "/var/db/ntpd.leap-seconds.list"
  • Update関連の設定
    1. freebsd-updateでOSを更新する際に参照するサーバーを設定する
      • ServerName update.FreeBSD.org をコメントアウト
      • ServerName local-update-server を設定
        • local-update-serverは内部のDNSで引けるupdateサーバーを記載すること
    2. pkgでpackageを更新する際に参照するサーバーを設定する
      1. mkdir -p /usr/local/etc/pkg/repos
      2. vi /usr/local/etc/pkg/repos/FreeBSD.conf
      3. FreeBSD.conf
        FreeBSD: {
          url: "pkg+http://local-update-server/${ABI}/quarterly",
          mirror_type: "srv",
          signature_type: "fingerprints",
          fingerprints: "/usr/share/keys/pkg",
          enabled: yes
        }
  • OSおよびPackageの更新
    1. freebsd-update fetch installを実行
    2. pkg update && pkg upgradeを実行
    3. 再起動する
  • 最小限のPackageを投入
    • 本システムに必要となる最小限のPackageをBinaryで投入する
      • sudo
    • pkg install sudo smartmontools

(おまけ) CAM

FreeBSDには、CAM(Common Access Method)という仕組みがあり、これでSATAのDiskに対して(Diskだけではないが)色々な処理を行える。 この仕組みを使った様々な制御のためにcamcontrolがある。

たとえば、こんな感じ。

# camcontrol devlist
<WDC WD20EARX-00PASB0 51.0AB51>    at scbus0 target 0 lun 0 (ada0,pass0)
<WDC WD20EZRX-00DC0B0 80.00A80>    at scbus0 target 1 lun 0 (ada1,pass1)
<WDC WD20EARX-00PASB0 51.0AB51>    at scbus1 target 0 lun 0 (ada2,pass2)
<WDC WD20EZRX-00DC0B0 80.00A80>    at scbus1 target 1 lun 0 (ada3,pass3)
<WDC WD20EZRX-00DC0B0 80.00A80>    at scbus2 target 0 lun 0 (ada4,pass4)
<HDS728080PLA380 PF2OA60A>         at scbus3 target 0 lun 0 (ada5,pass5)
# camcontrol identify ada5
pass5: <HDS728080PLA380 PF2OA60A> ATA-7 SATA 1.x device
pass5: 150.000MB/s transfers (SATA 1.x, UDMA5, PIO 8192bytes)
 
protocol              ATA/ATAPI-7 SATA 1.x
device model          HDS728080PLA380
firmware revision     PF2OA60A
serial number         PFDB30S2UP51ZM
WWN                   5000cca300f3e550
cylinders             16383
heads                 16
sectors/track         63
sector size           logical 512, physical 512, offset 0
LBA supported         160836480 sectors
LBA48 supported       160836480 sectors
PIO supported         PIO4
DMA supported         WDMA2 UDMA6 
 
Feature                      Support  Enabled   Value           Vendor
read ahead                     yes	yes
write cache                    yes	yes
flush cache                    yes	yes
overlap                        no
Tagged Command Queuing (TCQ)   no	no
Native Command Queuing (NCQ)   yes		32 tags
NCQ Queue Management           no
NCQ Streaming                  no
Receive & Send FPDMA Queued    no
SMART                          yes	yes
microcode download             yes	yes
security                       yes	no
power management               yes	yes
advanced power management      yes	no	0/0x00
automatic acoustic management  yes	no	254/0xFE	128/0x80
media status notification      no	no
power-up in Standby            yes	no
write-read-verify              no	no
unload                         no	no
general purpose logging        yes	yes
free-fall                      no	no
Data Set Management (DSM/TRIM) no
Host Protected Area (HPA)      yes      no      160836480/160836480
HPA - Security                 no

で、本命はHDDの切り離し(未試験)

以下正常動作していないので、試さないように

# camcontrol devlist -v
# zpool status zfstank
# camcontrol identify ada0
→ diskのシリアル番号確認
# camcontrol eject ada0
→ 失敗(これは、試験したMBもシャシーもHotswap非対応なので当然)
# zpool offline zfstank gpt/ada0
TEST時# gpart destroy -F ada0
TEST時# zpool labelclear -f ada0
TEST時# dd if=/dev/zero of=/dev/ada0 bs=1m count=10
# zpool status zfstank
# camcontrol stop ada0
→ 物理的に抜く
# camcontrol devlist
→ Diskを挿す
# camcontrol rescan all
# camcontrol devlist
→Deviceが認識されていることを確認
# gpart create -s gpt ada0
# gpart add -a 4k -t freebsd-zfs -l ada0 ada0
# zpool status zfstank
# zpool replace zfstank gpt/ada0
# zpool status zfstank

NAS環境構築

NAS関連の作業を以下の順に実施する。

  1. NAS公開用ZFS Pool/ZFS/Zvolの作成
  2. iSCSI関連の設定とZvolの公開
  3. NFS関連の設定とDirectoryの公開

ZFS関連設定

ZFS関連設定を記載する。

本構成の場合、ZFSに利用するHDDは、ada[0-4]の5台

ZFS poolを作成する

  1. とにかくZFSのPoolを4Kセクタで作成するための準備
    • sysctl -w vfs.zfs.min_auto_ashift=12
      • この設定を/etc/sysctl.confに書いておくとなおよし
  2. GPTでDiskを初期化する
    • zfs_init.sh
      for i in 0 1 2 3 4; do
      gpart destroy -F ada$i
      gpart create -s gpt ada$i
      gpart add -a 4k -t freebsd-zfs -l ada$i ada$i
      done
      • なお、GPTが設定されていないHDDの場合、gpart destroy -F ada$iの行は本質的に不要であり、gpart: arg0 'ada0': Invalid argumentというエラーが表示されるが、これは気にしなくて良い。
  3. ZFS Poolを作成する
    • atimeをOffに、圧縮アルゴリズムをLZ4に、Unicodeの (比較時) 正規化手法をNormalization Form D(NFD)に設定する
    • zpool create -O atime=off -O compression=lz4 -O normalization=formD zfstank raidz2 gpt/ada0 gpt/ada1 gpt/ada2 gpt/ada3 gpt/ada4

zpool createコマンドは、ZFS Poolを作成するだけでなく、同時にpoolと同名のZFSファイルシステムを作成する。

本例で表示した atime/compression/normalization パラメータは、このファイルシステムに対するOption Propertyである。

ZFS poolに対するOption Propertyは、-o(小文字)の後に指定することができる。詳細は man 7 zpool-features を参照

通常、ZFS RAIDz2を利用すると、RAID6相当のパリティーを持つ構成になるため、故障に対して比較的強固になる。 今回は採用しなかったが、さらに冗長性を高めることを考えるのであれば、-o copies=2もしくは-o copies=3としておくと、Fileの保存時に、完全なコピーが2もしくは3個作成される。

当然、その分だけ性能は劣化するが、必要に応じて複製が確保されるので、堅牢性が上がる。

ZFS poolを作成する場合、それぞれのDiskに個別のLabel(GPT label)を作成しておくことが重要になる。

個別にLabelをつけておくことで、Disk故障などの理由でKernelがDiskを認識する順序が変化してしまった時に、故障したDiskを特定しやすくすることができる。

当然、HDDユニット自体にもラベル名を物理的に記入することが重要になる。

normalizationの設定をどのようにするべきかはさんざん悩んだが、ここでは、formDを選択する。 なぜそうしたかは、以下のLinkを参照のこと。

確認作業

  • 4k sectorであることの確認
zdb -C zfstank | grep ashift
                ashift: 12
  • zpoolの状態確認
# zpool list
NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zfstank  9.06T  1.03M  9.06T         -     0%     0%  1.00x  ONLINE  -
# zpool status
  pool: zfstank
 state: ONLINE
  scan: none requested
config:

	NAME          STATE     READ WRITE CKSUM
	zfstank       ONLINE       0     0     0
	  raidz2-0    ONLINE       0     0     0
	    gpt/ada0  ONLINE       0     0     0
	    gpt/ada1  ONLINE       0     0     0
	    gpt/ada2  ONLINE       0     0     0
	    gpt/ada3  ONLINE       0     0     0
	    gpt/ada4  ONLINE       0     0     0

errors: No known data errors
# zpool get -o all all zfstank
NAME     PROPERTY                       VALUE                          SOURCE
zfstank  size                           9.06T                          -
zfstank  capacity                       0%                             -
zfstank  altroot                        -                              default
zfstank  health                         ONLINE                         -
zfstank  guid                           11297120752257816277           default
zfstank  version                        -                              default
zfstank  bootfs                         -                              default
zfstank  delegation                     on                             default
zfstank  autoreplace                    off                            default
zfstank  cachefile                      -                              default
zfstank  failmode                       wait                           default
zfstank  listsnapshots                  off                            default
zfstank  autoexpand                     off                            default
zfstank  dedupditto                     0                              default
zfstank  dedupratio                     1.00x                          -
zfstank  free                           9.06T                          -
zfstank  allocated                      1.03M                          -
zfstank  readonly                       off                            -
zfstank  comment                        -                              default
zfstank  expandsize                     -                              -
zfstank  freeing                        0                              default
zfstank  fragmentation                  0%                             -
zfstank  leaked                         0                              default
zfstank  feature@async_destroy          enabled                        local
zfstank  feature@empty_bpobj            enabled                        local
zfstank  feature@lz4_compress           active                         local
zfstank  feature@multi_vdev_crash_dump  enabled                        local
zfstank  feature@spacemap_histogram     active                         local
zfstank  feature@enabled_txg            active                         local
zfstank  feature@hole_birth             active                         local
zfstank  feature@extensible_dataset     enabled                        local
zfstank  feature@embedded_data          active                         local
zfstank  feature@bookmarks              enabled                        local
zfstank  feature@filesystem_limits      enabled                        local
zfstank  feature@large_blocks           enabled                        local
zfstank  feature@sha512                 enabled                        local
zfstank  feature@skein                  enabled                        local
# zfs list
NAME      USED  AVAIL  REFER  MOUNTPOINT
zfstank   518K  5.20T   156K  /zfstank
# zfs get all zfstank
NAME     PROPERTY              VALUE                  SOURCE
zfstank  type                  filesystem             -
zfstank  creation              Tue May 15 15:16 2018  -
zfstank  used                  518K                   -
zfstank  available             5.20T                  -
zfstank  referenced            156K                   -
zfstank  compressratio         1.00x                  -
zfstank  mounted               yes                    -
zfstank  quota                 none                   default
zfstank  reservation           none                   default
zfstank  recordsize            128K                   default
zfstank  mountpoint            /zfstank               default
zfstank  sharenfs              off                    default
zfstank  checksum              on                     default
zfstank  compression           lz4                    local
zfstank  atime                 off                    local
zfstank  devices               on                     default
zfstank  exec                  on                     default
zfstank  setuid                on                     default
zfstank  readonly              off                    default
zfstank  jailed                off                    default
zfstank  snapdir               hidden                 default
zfstank  aclmode               discard                default
zfstank  aclinherit            restricted             default
zfstank  canmount              on                     default
zfstank  xattr                 off                    temporary
zfstank  copies                1                      default
zfstank  version               5                      -
zfstank  utf8only              on                     -
zfstank  normalization         formD                  -
zfstank  casesensitivity       sensitive              -
zfstank  vscan                 off                    default
zfstank  nbmand                off                    default
zfstank  sharesmb              off                    default
zfstank  refquota              none                   default
zfstank  refreservation        none                   default
zfstank  primarycache          all                    default
zfstank  secondarycache        all                    default
zfstank  usedbysnapshots       0                      -
zfstank  usedbydataset         156K                   -
zfstank  usedbychildren        362K                   -
zfstank  usedbyrefreservation  0                      -
zfstank  logbias               latency                default
zfstank  dedup                 off                    default
zfstank  mlslabel                                     -
zfstank  sync                  standard               default
zfstank  refcompressratio      1.00x                  -
zfstank  written               156K                   -
zfstank  logicalused           30.5K                  -
zfstank  logicalreferenced     11.5K                  -
zfstank  volmode               default                default
zfstank  filesystem_limit      none                   default
zfstank  snapshot_limit        none                   default
zfstank  filesystem_count      none                   default
zfstank  snapshot_count        none                   default
zfstank  redundant_metadata    all                    default

gpartコマンドで状態を確認する

# gpart list -a
# gpart show -l		# labelが表示される
# gpart show		# partition tagが表示される
# gpart status		# 現在の状態が表示される

datasetとzvolを作成する

zfs create -o volmode=dev -V 3T zfstank/zd0v0
  • NFS用のdatasetを作成
zfs create zfstank/iso
# Mountpointを特に指定したい場合は、-o mountpoint を指定する
zfs create -o mountpoint=/zfstank/zd0d1 zfstank/iso

確認

# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
zfstank        3.09T  2.10T   156K  /zfstank
zfstank/zd0v0  3.09T  5.20T  99.4K  -
# zfs get all zfstank/zd0v0
NAME           PROPERTY              VALUE                  SOURCE
zfstank/zd0v0  type                  volume                 -
zfstank/zd0v0  creation              Tue May 15 16:10 2018  -
zfstank/zd0v0  used                  3.09T                  -
zfstank/zd0v0  available             5.20T                  -
zfstank/zd0v0  referenced            99.4K                  -
zfstank/zd0v0  compressratio         1.00x                  -
zfstank/zd0v0  reservation           none                   default
zfstank/zd0v0  volsize               3T                     local
zfstank/zd0v0  volblocksize          8K                     -
zfstank/zd0v0  checksum              on                     default
zfstank/zd0v0  compression           lz4                    inherited from zfstank
zfstank/zd0v0  readonly              off                    default
zfstank/zd0v0  copies                1                      default
zfstank/zd0v0  refreservation        3.09T                  local
zfstank/zd0v0  primarycache          all                    default
zfstank/zd0v0  secondarycache        all                    default
zfstank/zd0v0  usedbysnapshots       0                      -
zfstank/zd0v0  usedbydataset         99.4K                  -
zfstank/zd0v0  usedbychildren        0                      -
zfstank/zd0v0  usedbyrefreservation  3.09T                  -
zfstank/zd0v0  logbias               latency                default
zfstank/zd0v0  dedup                 off                    default
zfstank/zd0v0  mlslabel                                     -
zfstank/zd0v0  sync                  standard               default
zfstank/zd0v0  refcompressratio      1.00x                  -
zfstank/zd0v0  written               99.4K                  -
zfstank/zd0v0  logicalused           6K                     -
zfstank/zd0v0  logicalreferenced     6K                     -
zfstank/zd0v0  volmode               dev                    local
zfstank/zd0v0  snapshot_limit        none                   default
zfstank/zd0v0  snapshot_count        none                   default
zfstank/zd0v0  redundant_metadata    all                    default
# zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
zfstank        3.09T  2.10T   156K  /zfstank
zfstank/iso     156K  2.10T   156K  /zfstank/iso
zfstank/zd0v0  3.09T  5.20T  99.4K  -
# zfs get all zfstank/iso
NAME         PROPERTY              VALUE                  SOURCE
zfstank/iso  type                  filesystem             -
zfstank/iso  creation              Tue May 15 16:11 2018  -
zfstank/iso  used                  156K                   -
zfstank/iso  available             2.10T                  -
zfstank/iso  referenced            156K                   -
zfstank/iso  compressratio         1.00x                  -
zfstank/iso  mounted               yes                    -
zfstank/iso  quota                 none                   default
zfstank/iso  reservation           none                   default
zfstank/iso  recordsize            128K                   default
zfstank/iso  mountpoint            /zfstank/iso           default
zfstank/iso  sharenfs              off                    default
zfstank/iso  checksum              on                     default
zfstank/iso  compression           lz4                    inherited from zfstank
zfstank/iso  atime                 off                    inherited from zfstank
zfstank/iso  devices               on                     default
zfstank/iso  exec                  on                     default
zfstank/iso  setuid                on                     default
zfstank/iso  readonly              off                    default
zfstank/iso  jailed                off                    default
zfstank/iso  snapdir               hidden                 default
zfstank/iso  aclmode               discard                default
zfstank/iso  aclinherit            restricted             default
zfstank/iso  canmount              on                     default
zfstank/iso  xattr                 off                    temporary
zfstank/iso  copies                1                      default
zfstank/iso  version               5                      -
zfstank/iso  utf8only              on                     -
zfstank/iso  normalization         formD                  -
zfstank/iso  casesensitivity       sensitive              -
zfstank/iso  vscan                 off                    default
zfstank/iso  nbmand                off                    default
zfstank/iso  sharesmb              off                    default
zfstank/iso  refquota              none                   default
zfstank/iso  refreservation        none                   default
zfstank/iso  primarycache          all                    default
zfstank/iso  secondarycache        all                    default
zfstank/iso  usedbysnapshots       0                      -
zfstank/iso  usedbydataset         156K                   -
zfstank/iso  usedbychildren        0                      -
zfstank/iso  usedbyrefreservation  0                      -
zfstank/iso  logbias               latency                default
zfstank/iso  dedup                 off                    default
zfstank/iso  mlslabel                                     -
zfstank/iso  sync                  standard               default
zfstank/iso  refcompressratio      1.00x                  -
zfstank/iso  written               156K                   -
zfstank/iso  logicalused           11.5K                  -
zfstank/iso  logicalreferenced     11.5K                  -
zfstank/iso  volmode               default                default
zfstank/iso  filesystem_limit      none                   default
zfstank/iso  snapshot_limit        none                   default
zfstank/iso  filesystem_count      none                   default
zfstank/iso  snapshot_count        none                   default
zfstank/iso  redundant_metadata    all                    default
  • zvolの場合に、compressionがzfstankから引き継いでいることを確認
  • datasetの場合に、compression/atimeがzfstankから引き継がれ、normarizationがzfstankと同じであることを確認

iSCSI関連設定

iSCSI関係の設定を行う。

一昔前は、iSCSI targetになるためには、istgtコマンドを利用していた。 istgtはUserlandのiSCSI taeget実装であり、NetBSDやMacOS-X Leopardでも動作したため散々お世話になったが、(安定していることもあって)現在ではほぼメンテナンスされていないことと、FreeBSDのDistributionにctldが含まれ、iSCSI targetとして動作させることが可能になったため、本稿ではctldを利用するものとする。

参考

設定する

  1. /etc/ctl.confを作成
    • #
      # ctl.conf : FreeBSD iSCSI target configuration
      #
      
      # iSCSI portal configuration
      
      portal-group pg0 {
          discovery-auth-group no-authentication
          listen 198.51.100.254:3260
      }
      
      # iSCSI target configuration
      target iqn.2018-05.org.example:target0 {
          alias "nas-temp zd0v0"
          auth-group no-authentication
          portal-group pg0
      
          lun 0 {
              path /dev/zvol/zfstank/zd0v0
              blocksize 4096
              option vendor "FreeBSD"
          }
      }
  2. chmod 640 /etc/ctl.confを実行
  3. /etc/rc.confでctldをenableにする
    • echo 'ctld_enable=“YES”' » /etc/rc.conf
  4. service ctld start : ctldを起動

確認

筆者の環境はmacOSなので、iSCSIの試験を行うには工夫が必要。

Macで無料ツールを使ってiSCSIボリュームをマウントする を参考にmacOSにiSCSIinitiatorを導入する。

なお、Binaryはここにある。

以下、macOSからの確認

# iscsictl add target iqn.2018-05.org.example:target0,198.51.100.254
The specified target has been added
# iscsictl list targets
iqn.2018-05.org.example:target0 <inactive, static>
	198.51.100.254 <inactive, port 3260, interface default>
# iscsictl login iqn.2018-05.org.example:target0,198.51.100.254
Attached iqn.2018-05.org.example:target0 <scsi domain 0, target 0>
	FreeBSD CTLDISK 0001
	Serial Number MYSERIAL   0
	lun 0: type 0x00 (Block device)
# iscsictl list targets
iqn.2018-05.org.example:target0 <active, static, sid 0, tpgt 257, tsid 0xbadd>
	198.51.100.254 <active, cid 0, port 3260, interface default>
# iscsictl list luns
iqn.2018-05.org.example:target0 <scsi domain 0, target 0>
	FreeBSD CTLDISK 0001
	Serial Number MYSERIAL   0
	lun 0: type 0x00 (Block device)
		disk2: 3.3 TB (805306368 4096 byte blocks)
# iscsictl logout iqn.2018-05.org.example:target0,198.51.100.254
Detached iqn.2018-05.org.seirios.dsk:target0
# iscsictl remove target iqn.2018-05.org.example:target0,198.51.100.254
The specified portal has been removed
# 

NFS関連設定

  • rc.conf内で、以下の設定が有効になっていることを確認
    • NFSv2およびNFSv4は利用しない
    • NFS Clientにはならない
    • XCP-ngはLinuxなので、Linuxに合わせた設定を行う必要がある
      • RPC関連の挙動が異なったりするので、RCP関連のDaemonは必須
    • # NFS Configuration
      rpc_lockd_enable="YES"
      rpc_statd_enable="YES"
      rpcbind_enable="YES"
      
      nfs_client_enable="NO" 
      autofs_enable="NO" 
      
      mountd_enable="YES"
      mountd_flags="-lr"
      nfs_server_enable="YES"
      
      nfsv4_server_enable="NO"
      nfsuserd_enable="NO"
      nfsuserd_flags="-domain localdomain"
  • NFSで公開するDirectoryを指定する
    • 昔から、maproot関連は色々鬼門なので、気になる人は節末のコラムを参照のこと
    • exports
      /zfstank/iso      -network 198.51.100.0/24 -maproot=root -alldirs

確認

showmount -e
現在公開しているDirectoryを表示する
showmount -a
現在NFS mountされているDirとNFS Clientを表示する

mountdの再起動には、HUP Signalを送れば良い。

/etc/exportsを書き換えた後などでkill -HUP `cat /var/run/mountd.pid` を実行すると良い。

exportsに記載するオプションとして、maprootがある。

NFSで供給されているファイルシステムに対してrootユーザーが書き込みを行う場合、通常であれば、ファイルのオーナーはrootになるはずである。しかし、これは、ファイルシステムを供給しているNFSサーバーおよび同一のファイルシステムを共有している他のNFS Clientが、そのファイルのオーナーをrootとして認識することになる。

書き込まれたファイルが一般ファイルであれば多くの場合は問題にならないが、実行ファイルであった場合には脆弱性を生む元凶となる場合がある。

例1
ShellなどのScriptを実行可能にしておくと、多くのシステムでその実行ファイルを実行することが可能
例2
実行ファイルにSUID Bitを立てておくと何が起こるか感がて見てください

そのため、特にroot userが書き込む場合にのみ、Fileのオーナーを別のUIDに割り当てる機能がmaprootである。

例えば-maproot=nobody:nogroupとした場合、rootがそのファイルシステムにファイルを作成すると、Owner:Group = nobody:nogroupとなる。

落ち穂拾い

/var/log/messages に GPT table is corrupt が出ている場合。

TimeMachineバックアップに使う場合

TimeMachine用、DVD鑑賞用、写真バックアップ用のパーティションを afp で見えるようにすればよい。

MacのFinderの接続あたりから afp://xxx.xxx.xxx.xxx:5128 とかやればOKのはず

これでMacOSからも見れるようになる。

参考

os/freebsd/nas.txt · 最終更新: 2019/01/20 00:06 (外部編集)