目次
FreeBSDでNASを建てる
FreeBSDでNASを作成する。
Open Source なNASの実装には
- FreeNAS FreeBSDベース
- NAS4Free FreeBSDベース。FreeNAS 0.7系からFork。
- OpenMediaVault Debian GNU Linuxベース。FreeNASからFork。
- Rockstor CentOSベース。
- OpenFiler Community Edition Linuxベース。
- 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環境の構築に関しては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
を作成・編集する# 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
- 名前解決
/etc/resolv.conf
を作成・編集するdomain management.example.org nameserver 192.0.2.11 nameserver 192.0.2.12
- sshd関連の設定
- まず、自分のHome Directoryに
.ssh/authorized_keys
を設定する- これを忘れると、次の設定後にloginできなくなる
/etc/ssh/sshd_config
末尾に以下の設定を投入。XXXX
には、待ち受けるポート番号を記載すること##### Addtional Port XXXX UseDNS no ChallengeResponseAuthentication no
service sshd restart
をroot権限で実行し、sshdを再起動する
- ntpd関連の設定
/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関連の設定
- 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
- 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の更新
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
がある。
たとえば、こんな感じ。
# 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の切り離し(未試験)
以下正常動作していないので、試さないように
- 参考URL
# 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関連の作業を以下の順に実施する。
- 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を初期化する
- 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
というエラーが表示されるが、これは気にしなくて良い。
- 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を作成する
- iSCSI用の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を利用するものとする。
参考
設定する
/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" } }
chmod 640 /etc/ctl.conf
を実行/etc/rc.conf
でctldをenableにするecho 'ctld_enable=“YES”' » /etc/rc.conf
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 が出ている場合。
gpart recover <geom>
TimeMachineバックアップに使う場合
TimeMachine用、DVD鑑賞用、写真バックアップ用のパーティションを afp で見えるようにすればよい。
MacのFinderの接続あたりから afp://xxx.xxx.xxx.xxx:5128
とかやればOKのはず
- netatalk3を入れる
pkg install netatalk3
- 参考
これでMacOSからも見れるようになる。
参考
- https://qiita.com/ryuinada/items/36535a0e7f1846d89fb6 ZFSのRAIDZの修復とついでに拡張する