転載・引用について

ユーザ用ツール

サイト用ツール


os:freebsd:nas

差分

このページの2つのバージョン間の差分を表示します。


os:freebsd:nas [2026/03/28 16:30] (現在) – 作成 - 外部編集 127.0.0.1
行 1: 行 1:
 +====== FreeBSDでNASを建てる ======
 +
 +FreeBSDでNASを作成する。
 +
 +Open Source なNASの実装には
 +  * [[http://www.freenas.org/|FreeNAS]] FreeBSDベース
 +  * [[https://www.nas4free.org/|NAS4Free]] FreeBSDベース。FreeNAS 0.7系からFork。
 +  * [[http://openmediavault.org/|OpenMediaVault]] Debian GNU Linuxベース。FreeNASからFork。
 +  * [[http://rockstor.com/|Rockstor]] CentOSベース。
 +  * [[https://www.openfiler.com/|OpenFiler Community Edition]] Linuxベース。
 +  * [[https://nexenta.com/products/downloads/download-community-edition/|Nexenta Community Edition]] Open Solarisベース。
 +などがある。
 +
 +(参考 : [[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として供給するのは、
 +  - 管理上面倒
 +    * インフラとユーザーではセキュリティポリシーが異なる
 +  - サービス要求レベルが異なる
 +    * インフラはできる限り安定して動かしたい。可能な限り触らない
 +    * ファイル共有は、設定の変更やアカウント追加削除など、触る局面が多い
 +というように、そもそもの要求要件が異なる。
 +
 +というわけで、今回は、
 +  * 仮想基盤用のNASはFreeBSDを生でiSCSIとNFS供給用として使う
 +  * ファイル共有用は、仮想基盤のVM上にNAS4Freeを投入して、設定の簡便化を図る
 +    * NAS上のStorageにNASのStorageをおくわけで、屋上屋を架している状態だが、レスポンスがシビアではない条件なのでよしとする。
 +という実装を行う。
 +
 +なお、NAS4Free環境の構築に関しては[[:serverapp:fileserver: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**関連の設定
 +    - ''/etc/rc.conf''を作成・編集する
 +      * <code bash>
 +# 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/    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"
 +</code>
 +  * ''/etc/sysctl.conf''関連
 +    * /etc/sysctl.confにいくつかの設定を書き込む
 +    * <code>
 +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
 +</code>
 +  * 名前解決
 +    - ''/etc/resolv.conf''を作成・編集する
 +      * <code>
 +domain management.example.org
 +nameserver 192.0.2.11
 +nameserver 192.0.2.12
 +</code>
 +  * **sshd**関連の設定
 +    - まず、自分のHome Directoryに''.ssh/authorized_keys''を設定する
 +      * これを忘れると、次の設定後にloginできなくなる
 +    - ''/etc/ssh/sshd_config''末尾に以下の設定を投入。''XXXX''には、待ち受けるポート番号を記載すること
 +      * <code>
 +##### Addtional
 +Port XXXX
 +UseDNS no
 +ChallengeResponseAuthentication no
 +</code>
 +      * ''service sshd restart''をroot権限で実行し、sshdを再起動する
 +  * **ntpd**関連の設定
 +    - ''/etc/ntp.conf''を編集する
 +      * serverを正しく設定すれば良い
 +      * 外部のNTPサーバーを参照するよりも、内部ネットワークに建ててあるNTPdを参照する方が望ましい
 +      * <code bash 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"
 +</code>
 +  * Update関連の設定
 +    - freebsd-updateでOSを更新する際に参照するサーバーを設定する
 +      * ''ServerName update.FreeBSD.org'' をコメントアウト
 +      * ''ServerName local-update-server'' を設定
 +        * local-update-serverは内部のDNSで引けるupdateサーバーを記載すること
 +    - pkgでpackageを更新する際に参照するサーバーを設定する
 +      - ''mkdir -p /usr/local/etc/pkg/repos''
 +      - ''vi /usr/local/etc/pkg/repos/FreeBSD.conf''
 +      - <code bash FreeBSD.conf>
 +FreeBSD: {
 +  url: "pkg+http://local-update-server/${ABI}/quarterly",
 +  mirror_type: "srv",
 +  signature_type: "fingerprints",
 +  fingerprints: "/usr/share/keys/pkg",
 +  enabled: yes
 +}
 +</code>
 +  * OSおよびPackageの更新
 +    - ''freebsd-update fetch install''を実行
 +    - ''pkg update && pkg upgrade''を実行
 +    - 再起動する
 +  * 最小限のPackageを投入
 +    * 本システムに必要となる最小限のPackageをBinaryで投入する
 +      * sudo
 +    * ''pkg install sudo smartmontools''
 +===== (おまけ) CAM =====
 +
 +FreeBSDには、CAM(Common Access Method)という仕組みがあり、これでSATAのDiskに対して(Diskだけではないが)色々な処理を行える。
 +この仕組みを使った様々な制御のために''camcontrol''がある。
 +
 +たとえば、こんな感じ。
 +
 +<code bash>
 +# 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)
 +</code>
 +
 +<code bash>
 +# 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
 +</code>
 +
 +で、本命はHDDの切り離し(未試験)
 +
 +<WRAP round warning>
 +以下正常動作していないので、試さないように
 +</WRAP>
 +
 +  * 参考URL
 +    * https://www.ainoniwa.net/pelican/wp/552.html
 +    * https://piano2nd.smb.net/~kuji/pukiwiki-1.4.7/index.php?ZFS%20HDD交換
 +    * http://decomo.info/wiki/blog/2017/2017-11-09
 +    * http://d.hatena.ne.jp/kamosawa/20110726/1311609509
 +    * http://d.hatena.ne.jp/flageo/20121218/p1
 +
 +<code>
 +# 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
 +</code>
 +
 +===== NAS環境構築 =====
 +
 +NAS関連の作業を以下の順に実施する。
 +
 +  - NAS公開用ZFS Pool/ZFS/Zvolの作成
 +  - iSCSI関連の設定とZvolの公開
 +  - NFS関連の設定とDirectoryの公開
 +
 +==== ZFS関連設定 ====
 +ZFS関連設定を記載する。
 +
 +本構成の場合、ZFSに利用するHDDは、ada[0-4]の5台
 +
 +=== ZFS poolを作成する ===
 +  - とにかくZFSのPoolを4Kセクタで作成するための準備
 +    * ''sysctl -w vfs.zfs.min_auto_ashift=12''
 +      * この設定を/etc/sysctl.confに書いておくとなおよし
 +  - GPTでDiskを初期化する
 +    * <code bash 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 slot$i ada$i
 +done
 +</code>
 +      * なお、GPTが設定されていないHDDの場合、''gpart destroy -F ada$i''の行は本質的に不要であり、''gpart: arg0 'ada0': Invalid argument''というエラーが表示されるが、これは気にしなくて良い。
 +  - ZFS Poolを作成する
 +    * atimeをOffに、圧縮アルゴリズムをLZ4に、Unicodeの (比較時) 正規化手法をNormalization Form D(NFD)に設定する
 +    * <code>
 +zpool create -O atime=off -O compression=lz4 -O normalization=formD zfstank raidz2 gpt/slot0 gpt/slot1 gpt/slot2 gpt/slot3 gpt/slot4
 +</code>
 +
 +<WRAP round tip>
 +zpool createコマンドは、ZFS Poolを作成するだけでなく、同時にpoolと同名のZFSファイルシステムを作成する。
 +
 +本例で表示した atime/compression/normalization パラメータは、このファイルシステムに対するOption Propertyである。
 +
 +ZFS poolに対するOption Propertyは、-o(小文字)の後に指定することができる。詳細は ''man 7 zpool-features'' を参照
 +</WRAP>
 +
 +<WRAP round tip>
 +通常、ZFS RAIDz2を利用すると、RAID6相当のパリティーを持つ構成になるため、故障に対して比較的強固になる。
 +今回は採用しなかったが、さらに冗長性を高めることを考えるのであれば、''-o copies=2''もしくは''-o copies=3''としておくと、Fileの保存時に、完全なコピーが2もしくは3個作成される。
 +
 +当然、その分だけ性能は劣化するが、必要に応じて複製が確保されるので、堅牢性が上がる。
 +</WRAP>
 +
 +<WRAP round tip>
 +ZFS poolを作成する場合、それぞれのDiskに個別のLabel(GPT label)を作成しておくことが重要になる。
 +
 +個別にLabelをつけておくことで、Disk故障などの理由でKernelがDiskを認識する順序が変化してしまった時に、故障したDiskを特定しやすくすることができる。
 +
 +当然、HDDユニット自体にもラベル名を物理的に記入することが重要になる。
 +</WRAP>
 +
 +<WRAP round tip>
 +normalizationの設定をどのようにするべきかはさんざん悩んだが、ここでは、formDを選択する。
 +なぜそうしたかは、以下のLinkを参照のこと。
 +
 +  * [[http://b00tb00k.blogspot.jp/2013/07/zfs-on-mac-3-hfs.html]]
 +  * [[http://key2.jp/~yskhashi/wordpress/?p=427]]
 +</WRAP>
 +=== 確認作業 ===
 +
 +  * 4k sectorであることの確認
 +<code>
 +zdb -C zfstank | grep ashift
 +                ashift: 12
 +</code>
 +
 +  * zpoolの状態確認
 +<code>
 +# zpool list
 +NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
 +zfstank  9.06T  1.03M  9.06T             0%     0%  1.00x  ONLINE  -
 +</code>
 +
 +<code>
 +# zpool status
 +  pool: zfstank
 + state: ONLINE
 +  scan: none requested
 +config:
 +
 + NAME          STATE     READ WRITE CKSUM
 + zfstank       ONLINE               0
 +   raidz2-0    ONLINE               0
 +     gpt/ada0  ONLINE               0
 +     gpt/ada1  ONLINE               0
 +     gpt/ada2  ONLINE               0
 +     gpt/ada3  ONLINE               0
 +     gpt/ada4  ONLINE               0
 +
 +errors: No known data errors
 +</code>
 +
 +<code>
 +# 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                                                  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                                                      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
 +</code>
 +
 +<code>
 +# zfs list
 +NAME      USED  AVAIL  REFER  MOUNTPOINT
 +zfstank   518K  5.20T   156K  /zfstank
 +</code>
 +
 +<code>
 +# 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                                    -
 +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                            -
 +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
 +</code>
 +
 +<WRAP round tip>
 +gpartコマンドで状態を確認する
 +
 +<code>
 +# gpart list -a
 +# gpart show -l # labelが表示される
 +# gpart show # partition tagが表示される
 +# gpart status # 現在の状態が表示される
 +</code>
 +</WRAP>
 +=== datasetとzvolを作成する ===
 +  * iSCSI用のzvolを作成
 +  * https://github.com/erigones/esdc-ce/wiki/Simple-iSCSI-target-and-initiator-setup
 +  * http://decomo.info/wiki/freebsd/freebsd_11_configure_iscsi_target
 +<code>
 +zfs create -o volmode=dev -V 3T zfstank/zd0v0
 +</code>
 +  * NFS用のdatasetを作成
 +<code>
 +zfs create zfstank/iso
 +# Mountpointを特に指定したい場合は、-o mountpoint を指定する
 +zfs create -o mountpoint=/zfstank/zd0d1 zfstank/iso
 +</code>
 +
 +=== 確認 ===
 +<code>
 +# zfs list
 +NAME            USED  AVAIL  REFER  MOUNTPOINT
 +zfstank        3.09T  2.10T   156K  /zfstank
 +zfstank/zd0v0  3.09T  5.20T  99.4K  -
 +</code>
 +
 +<code>
 +# 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                            -
 +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
 +</code>
 +
 +<code>
 +# 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  -
 +</code>
 +
 +<code>
 +# 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                                    -
 +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                            -
 +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
 +</code>
 +
 +<WRAP round tip>
 +  * zvolの場合に、compressionがzfstankから引き継いでいることを確認
 +  * datasetの場合に、compression/atimeがzfstankから引き継がれ、normarizationがzfstankと同じであることを確認
 +</WRAP>
 +
 +==== iSCSI関連設定 ====
 +
 +iSCSI関係の設定を行う。
 +
 +一昔前は、iSCSI targetになるためには、istgtコマンドを利用していた。
 +istgtはUserlandのiSCSI taeget実装であり、NetBSDやMacOS-X Leopardでも動作したため散々お世話になったが、(安定していることもあって)現在ではほぼメンテナンスされていないことと、FreeBSDのDistributionにctldが含まれ、iSCSI targetとして動作させることが可能になったため、本稿ではctldを利用するものとする。
 +
 +参考
 +  * https://github.com/erigones/esdc-ce/wiki/Simple-iSCSI-target-and-initiator-setup
 +  * http://decomo.info/wiki/freebsd/freebsd_11_configure_iscsi_target
 +
 +=== 設定する ===
 +
 +  - ''/etc/ctl.conf''を作成
 +    * <code>
 +#
 +# 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"
 +    }
 +}
 +</code>
 +  - ''chmod 640 /etc/ctl.conf''を実行
 +  - ''/etc/rc.conf''でctldをenableにする
 +    * ''echo 'ctld_enable="YES"' >> /etc/rc.conf''
 +  - ''service ctld start'' : ctldを起動
 +
 +=== 確認 ===
 +筆者の環境はmacOSなので、iSCSIの試験を行うには工夫が必要。
 +
 +[[https://qiita.com/kazutomo/items/f5b2d863d9e0729743c2|Macで無料ツールを使ってiSCSIボリュームをマウントする]]
 +を参考にmacOSに[[https://github.com/iscsi-osx/iSCSIInitiator|iSCSIinitiator]]を導入する。
 +
 +なお、Binaryは[[https://github.com/iscsi-osx/iSCSIInitiator/releases|ここ]]にある。
 +
 +以下、macOSからの確認
 +<code bash>
 +# 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
 +
 +</code>
 +==== NFS関連設定 ====
 +
 +  * rc.conf内で、以下の設定が有効になっていることを確認
 +    * NFSv2およびNFSv4は利用しない
 +    * NFS Clientにはならない
 +    * XCP-ngはLinuxなので、Linuxに合わせた設定を行う必要がある
 +      * RPC関連の挙動が異なったりするので、RCP関連のDaemonは必須
 +    * <code>
 +# 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"
 +</code>
 +  * NFSで公開するDirectoryを指定する
 +    * 昔から、maproot関連は色々鬼門なので、気になる人は節末のコラムを参照のこと
 +    * <code - exports>
 +/zfstank/iso      -network 198.51.100.0/24 -maproot=root -alldirs
 +</code>
 +
 +=== 確認 ===
 +  ; ''showmount -e'' : 現在公開しているDirectoryを表示する
 +  ; ''showmount -a'' : 現在NFS mountされているDirとNFS Clientを表示する
 +
 +<WRAP round tip>
 +mountdの再起動には、HUP Signalを送れば良い。
 +
 +''/etc/exports''を書き換えた後などで''kill -HUP `cat /var/run/mountd.pid`''
 +を実行すると良い。
 +</WRAP>
 +
 +<WRAP round warning>
 +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''となる。
 +</WRAP>
 +
 +====== 落ち穂拾い ======
 +
 +<WRAP round tip>
 +''/var/log/messages'' に GPT table is corrupt が出ている場合。
 +
 +  * ''gpart recover <geom>''
 +  * 参考: [[http://yomemacs.hatenablog.jp/entry/2014/02/04/205509]]
 +</WRAP>
 +
 +<WRAP round tip>
 +TimeMachineバックアップに使う場合
 +
 +TimeMachine用、DVD鑑賞用、写真バックアップ用のパーティションを afp で見えるようにすればよい。
 +
 +MacのFinderの接続あたりから ''afp:%%//%%xxx.xxx.xxx.xxx:5128'' とかやればOKのはず
 +
 +  * netatalk3を入れる
 +    * ''pkg install netatalk3''
 +  * 参考
 +    * [[http://blog.khubla.com/freebsd/timemachine-backups-on-freebsd-10]]
 +    * [[http://netatalk.sourceforge.net/3.0/htmldocs/configuration.html#idp139639143834112]]
 +    * [[http://illumos.org/msg/ZFS-8000-9P]]
 +
 +これでMacOSからも見れるようになる。
 +
 +</WRAP>
 +
 +<WRAP round tip>
 +参考
 +  * [[https://qiita.com/ryuinada/items/36535a0e7f1846d89fb6]] ZFSのRAIDZの修復とついでに拡張する
 +</WRAP>
  
os/freebsd/nas.1774682729.txt.gz · 最終更新: (外部編集)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki