HONDAさんにおかれましては、もうちょっと情報提供して欲しいにゃん。

オデッセイハイブリッド(RC4)に純正ナビ(MOPナビ)を付けたところ、USBメモリの動画ファイルを再生する機能がある。インターナビのマニュアル(30T6C8002_web.pdf)の194ページ(ノンブルは192ページ)には詳細()な仕様が掲載されているので楽勝だね。

screenshot 2016-12-29 12.24.20.png

とならないのが「イソターネット動画事情」の厄介なところだし、20年近く辛酸をなめ尽くしてきたお前らはオレか。

さて、OS X 10.12.2上のHandBrake-1.0では以下の方法で再生出来たけども、Linux (RHEL 7.3)にレポジトリから持ってきたHandBrake-0.99では同じパラメータで再生出来ないし、Windows PCは手元にあるけどテストするのが面倒なので、これを読んだ誰かがこの記事にリンクした上で検証してくれるのをお待ち申し上げております。おそらく同じ世代のアコードなど、インターナビ搭載車で上記マニュアルと同じ動画仕様ならたぶんいけるんじゃないかと。
screenshot 2016-12-29 12.22.03.png

まずUSBメモリはおそらく何でも良い。テストしたのはSanDiskの32GBのUSBメモリ。これをMS-DOS (FAT32)でフォーマットしておく。NTFSだと認識しないっていうか、ナビのOS、Linuxだよね、これ。当然のことだが、OS Xの場合、フォーマット時にMBRにしておくこと。

screenshot 2016-12-29 12.19.09.png

あとはHandBrakeのパラメータをちょちょいっと。まずは[Video]タブから。
[Video Encoder]はH.264(x264)、[Framerate (FPS)]は30までであれば動作することを確認。Peak Framerate (VFR)でもConstant Framerateでも大丈夫。[Quality]は[Average Bitrate (kbps)]が10000まで動作します。2-pass / Turbo firstはお好みで。
[Encoder Options]の[Profile]はbaselineに、[Level]は3.0にします。
screenshot 2016-12-29 12.13.04.png

次に[Picture]タブ。まず[Anamorphic]はoff。[Storage Size]の横720を超えると再生出来ないので注意。元が1440 x 1080だと、720 x 406になります。
screenshot 2016-12-29 12.13.33.png

[Audio]タブはAACになってれば大丈夫。ビットレートはお好みで。
screenshot 2016-12-29 12.14.01.png

残りのタブは一応確認のため掲載しておきます。デフォルト。
screenshot 2016-12-29 12.14.20.pngscreenshot 2016-12-29 12.14.37.png

長編の場合、ファイルサイズが4GBを超えるとダメなので(FAT32の仕様による制限)、分割するなり工夫する必要あり。

では、楽しいオデッセイハイブリッドライフを。

カニ、そしてカニ

この記事は自宅サーバの思い出 Advent Calendar 2016、18日目のカニです。

消えたよね、自宅サーバの思い出っていうか記録...。CD-RとDVD-Rに1996年からのデータが全部取ってあったんだけど。焼いたのは1999年以降だから、まあ16年で消えたよね。

これを読んだらCD-R / DVD-Rのバックアップを可及的速やかにとるんだ、いいね、おじさんとの約束だよ?
読み出せなくなったメディアはレーベル面にカッターで傷つけてガムテを貼って、ビーッって剥がすんだ。気持ちいいぞ!

閑話休題。

さて。消えたデータの中には10台前後の中古IBM PCで構成されたDMZや多段プロキシ有りな、今から考えるとアホみたいな自宅サーバ環境のネットワーク構成図が入ってたんだけど。電気代?ごめん、実家に置いてたw

プロキシはもちろんマルチホーミングしてるわけで、net.ipv4.ip_forwardはオレの友達。
プロキシだから1台に2匹のカニいるの、白いカニ。8169? 違う違う、それは良いカニだよ、うちに最初にいたのはISAバスの8019やPCIバスの8029、そう悪いカニたち。10baseで遅いうえに悪い。本当に悪い。自分でかしめたケーブルがおかしいのかと思ってtulipやne2kに変えるとちゃんと動く。ケーブルでもスイッチでもない、カニが悪いの。

リンクアップしました!ってLEDは光るくせにびたいちパケットが流れないとか、ざら。意味不明だった。

元々、あるMLの管理者の方の自宅にお邪魔した時に、FreeBSD(だったと思う。記憶が曖昧。)の自宅サーバ環境を見せてもらって、おれもやりたーいというのがきっかけ。ちょうどSIerに転職したぐらいのタイミングで、職場では本番はSolaris、テスト・開発はLinuxって感じで。カーネル2.4に切り替わるぐらいだった。

前述の方に

ネットワークにサーバを立てるなら、きちんとセキュアに設定して迷惑をかけない自信がついてから

と言われて、しばらく業務で勉強してからサーバを立てた。そうそう、セキュリティの勉強の一環でSELinuxにも手を出した。業務ではgo.jpドメインの運用してたしね。
いしかわさんごめんなさいしたことないw

さて、しばらくしたら100Mスイッチが安くなってきて8139ってカニをまた飼うことになるんだけど。これには近縁の亜種、8139Cとか8139Dやらがいて、また問題をややこしくしてくれる。

こいつら、動作の安定度とかはタラバガニとタカアシガニぐらい違う、型番は似てるのに。しかも製造時期によって同じドライバーで動かなかったりした。
でもまだまだ平和な時代で、100Mbpsまでは普通にケーブルも自作出来たから、プロキシと他のサーバを接続する7センチしか長さが無いカテ5も作ってた。

この頃、AOPEN(青ペン)のベアボーンもよく利用してた。比較的スリムで場所もとらないから調子に乗ってたくさん買ったら、電気代が高いことももちろんだけど、部屋が暑くて参った。CPUの製造プロセスルールが90nmなんて時代だから、ホムセンで買ってきたアルミダクトを付けて窓から排気したりした。2006年にCore世代が登場して、温度が一気に下がったのは有り難かったなぁ。

SIerに在籍してたのもこの時期で、アキバでパーツを調達して自作PCを作らせるのを新人研修でやってた時は白いカニは買ってくるなって注意するのがふつーだったw

2005年にRed Hatに転職して数年後にはギガニ、8169がだいぶ安くなってたんじゃないかな。最初の頃こそ不安定だったけど徐々に品質が向上して、あまり白いカニを気にしなくなった。オンボのギガニが8169なんてことも多くて、PCIバスにわざわざ別売りNICを挿さなくてもとりあえず使えるって感じになった。

2008年から自宅サーバ環境にSSDを導入し始めて、一気に台数が減り小型化した。自宅サーバだとCore 2 duoあたりからそれほどCPUパワーが不足することはなくなって、むしろI/O待ちの方が処理時間の大半を占めてるってのは明らかだったしね。一時期はIntel NUCでサーバを運用したりもしてたけど、拡張性に難があることもあって、数年間使ってまた自作に戻ったw

最初の頃は毎年、ここ数年は隔年で自宅サーバを更新し続けてるけど今は3台まで減った。


  1. メインサーバ:ウェブ(apache)、メール(postfix/dovecot)、DNS(bind)、マイクラ、DB(mariaDB/PostgreSQL)、録画(chinachu)

  2. エンコサーバ:handbrake専用

  3. ReadyNAS

そして今、自宅にカニはいない。
でも、自宅サーバでスキルを身につける時いつもそばにいた白いカニがいないのは一抹の寂しさを覚えるね(^_^;
screenshot 2016-12-05 14.17.06.png

ちなみに何でRealtekがカニなのかというと、Realtek in Briefによれば、

Through strength, persistence, and adaptability, Realtek follows in the spirit of the crab.

カニの魂を見習ってらしいよw なんだよ、カニの魂ってwww

仕事はAzureなんだけど、自宅サーバには完全な自由があるので当面継続するつもり。

2016年秋のベンチマーク祭り(毎年やるわけではない)

  • 投稿日:
  • by
  • カテゴリ:

なかなかMBP Late 2016が届かないのと、ストレージ・ネットワークを見直そうかということでベンチマーク祭りを。ベンチマークはあまり厳密なものではなく、アプリはベンチマークアプリ以外は起動せずMBP Mid 2014で実行。

まずは最近ほとんど使わなくなったUSBメモリ。SONYのUSM32GQというモデルでもちろん終売。
WRITE : 45.3 MB/s, READ : 125.7 MB/s
6bf64759892771ffed4344783871366a27d4c1e6.png

次。こちらも最近ほとんど使わなくなったUSB HDD。BUFFALOのHD-PCTU3の1TBモデル。
WRITE : 102.7 MB/s, READ : 107.7 MB/s
HD-PCTU3.png

続く2つはNAS。ストレージ本体がHDDであるかSSDであるかに関わらずネットワークで律速されてしまっているのがよく分かる数値。なので10Gbps化したい、という話に繋がるわけだが。
まずはReadyNAS RN31600の4TB x 6 (XRAID / RAID 5)のAFPボリューム。
WRITE : 102.6 MB/s, READ : 110.6 MB/s
ReadyNAS.png

もう1つのNASはRHEL 7.3で構築してNetatalkでSSDを見せているAFPボリューム。
WRITE : 110.4 MB/s, READ : 110.2 MB/s
hb.png

次はUSB 3.0接続だけど、UASPに対応していない玄人志向のケースに入ったRAID 0のHDD。
WRITE : 124.4 MB/s, READ : 177.1 MB/s
SVFastMedia.png

UASP対応のケースに、Seagateの2TB SSHDを入れてみたもの。
WRITE : 198.5 MB/s, READ : 212.6 MB/s
c2a0b7faca1d9b8599cd5fa7536b48e3ff68e2a7.png

外付けのSSDは相当に高速で、今持っているのはTranscendの512GBのモデル。さすがに速い。Thunderboltならもっと速いかも知れないけど、高いのでUSB 3.0で十分という感想しか無いw
WRITE : 374.4 MB/s, READ : 424.7 MB/s
transcend.png

非NVMeとはいえ、MBP Mid 2014の内蔵SSDも相当に速い。
WRITE : 677.0 MB/s, READ : 722.5 MB/s
SM0512F.png

MBP Late 2016の内蔵SSD、激速っ!
WRITE : 1622.7 MB/s, READ : 2000.0 MB/s
Late2016.png

おまけ。Intel SSD 750 400GB

Version  1.96       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
www.rio.st   63752M  1990  99 804390  27 342032  17  4469  99 874181  21  3091 111
Latency              4273us     369ms     854ms    2120us   14456us    2245us
Version  1.96       ------Sequential Create------ --------Random Create--------
www.rio.st          -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16 +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++ +++++ +++
Latency               561us     141us     177us     566us      15us      77us

まとめ
614b265ac1307a4f2621d0051a3a4fe31afbbd51.png

fio on Intel SSD DC P3608 (3.2TB)

  • 投稿日:
  • by
lspci
00:00.0 Host bridge: Intel Corporation Sky Lake Host Bridge/DRAM Registers (rev 07)
00:01.0 PCI bridge: Intel Corporation Sky Lake PCIe Controller (x16) (rev 07)
00:02.0 VGA compatible controller: Intel Corporation Sky Lake Integrated Graphics (rev 06)
00:14.0 USB controller: Intel Corporation Sunrise Point-H USB 3.0 xHCI Controller (rev 31)
00:14.2 Signal processing controller: Intel Corporation Sunrise Point-H Thermal subsystem (rev 31)
00:16.0 Communication controller: Intel Corporation Sunrise Point-H CSME HECI #1 (rev 31)
00:17.0 SATA controller: Intel Corporation Device a102 (rev 31)
00:1c.0 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #5 (rev f1)
00:1d.0 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #9 (rev f1)
00:1f.0 ISA bridge: Intel Corporation Sunrise Point-H LPC Controller (rev 31)
00:1f.2 Memory controller: Intel Corporation Sunrise Point-H PMC (rev 31)
00:1f.3 Audio device: Intel Corporation Sunrise Point-H HD Audio (rev 31)
00:1f.4 SMBus: Intel Corporation Sunrise Point-H SMBus (rev 31)
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-V (rev 31)
01:00.0 PCI bridge: PLX Technology, Inc. PEX 8718 16-Lane, 5-Port PCI Express Gen 3 (8.0 GT/s) Switch (rev ab)
02:01.0 PCI bridge: PLX Technology, Inc. PEX 8718 16-Lane, 5-Port PCI Express Gen 3 (8.0 GT/s) Switch (rev ab)
02:02.0 PCI bridge: PLX Technology, Inc. PEX 8718 16-Lane, 5-Port PCI Express Gen 3 (8.0 GT/s) Switch (rev ab)
03:00.0 Non-Volatile memory controller: Intel Corporation PCIe Data Center SSD (rev 02)
04:00.0 Non-Volatile memory controller: Intel Corporation PCIe Data Center SSD (rev 02)
lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 94
Model name:            Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz
Stepping:              3
CPU MHz:               3300.328
BogoMIPS:              5422.27
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K
NUMA node0 CPU(s):     0-3
uname -r
3.10.0-327.4.4.el7.x86_64
fio -rw=randwrite -bs=4k -size=100m -directory=/mnt/ -direct=1 -numjobs=50 -name=file1 -ioengine=libaio -group_reporting
file1: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=1
...
fio-2.2.8
Starting 50 processes
Jobs: 50 (f=50): [w(50)] [100.0% done] [0KB/829.9MB/0KB /s] [0/212K/0 iops] [eta 00m:00s]
file1: (groupid=0, jobs=50): err= 0: pid=4104: Mon Jan 25 22:53:49 2016
  write: io=5000.0MB, bw=971906KB/s, iops=242976, runt=  5268msec
    slat (usec): min=1, max=110, avg= 4.69, stdev= 4.58
    clat (usec): min=0, max=8200, avg=199.08, stdev=335.88
     lat (usec): min=10, max=8203, avg=203.83, stdev=335.92
    clat percentiles (usec):
     |  1.00th=[   11],  5.00th=[   14], 10.00th=[   19], 20.00th=[   30],
     | 30.00th=[   52], 40.00th=[   92], 50.00th=[  131], 60.00th=[  163],
     | 70.00th=[  191], 80.00th=[  227], 90.00th=[  318], 95.00th=[  668],
     | 99.00th=[ 1800], 99.50th=[ 2040], 99.90th=[ 2544], 99.95th=[ 3280],
     | 99.99th=[ 5856]
    bw (KB  /s): min=15760, max=23560, per=1.99%, avg=19380.92, stdev=1943.75
    lat (usec) : 2=0.04%, 4=0.01%, 10=0.16%, 20=10.69%, 50=18.22%
    lat (usec) : 100=12.63%, 250=42.20%, 500=9.99%, 750=1.46%, 1000=0.75%
    lat (msec) : 2=3.29%, 4=0.53%, 10=0.04%
  cpu          : usr=1.00%, sys=3.05%, ctx=1279344, majf=0, minf=1416
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=0/w=1280000/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: io=5000.0MB, aggrb=971905KB/s, minb=971905KB/s, maxb=971905KB/s, mint=5268msec, maxt=5268msec

Disk stats (read/write):
    dm-0: ios=0/1247022, merge=0/0, ticks=0/217499, in_queue=230737, util=100.00%, aggrios=0/1280000, aggrmerge=0/0, aggrticks=0/222904, aggrin_queue=231809, aggrutil=99.06%
  nvme0n1: ios=0/1280000, merge=0/0, ticks=0/222904, in_queue=231809, util=99.06%

fio on Intel SSD 750 (400GB)

  • 投稿日:
  • by
lspci 
00:00.0 Host bridge: Intel Corporation Sky Lake Host Bridge/DRAM Registers (rev 07)
00:01.0 PCI bridge: Intel Corporation Sky Lake PCIe Controller (x16) (rev 07)
00:02.0 VGA compatible controller: Intel Corporation Sky Lake Integrated Graphics (rev 06)
00:14.0 USB controller: Intel Corporation Sunrise Point-H USB 3.0 xHCI Controller (rev 31)
00:14.2 Signal processing controller: Intel Corporation Sunrise Point-H Thermal subsystem (rev 31)
00:16.0 Communication controller: Intel Corporation Sunrise Point-H CSME HECI #1 (rev 31)
00:17.0 SATA controller: Intel Corporation Device a102 (rev 31)
00:1b.0 PCI bridge: Intel Corporation Sunrise Point-H PCI Root Port #19 (rev f1)
00:1c.0 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #3 (rev f1)
00:1c.4 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #5 (rev f1)
00:1d.0 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #9 (rev f1)
00:1d.4 PCI bridge: Intel Corporation Sunrise Point-H PCI Express Root Port #13 (rev f1)
00:1f.0 ISA bridge: Intel Corporation Sunrise Point-H LPC Controller (rev 31)
00:1f.2 Memory controller: Intel Corporation Sunrise Point-H PMC (rev 31)
00:1f.3 Audio device: Intel Corporation Sunrise Point-H HD Audio (rev 31)
00:1f.4 SMBus: Intel Corporation Sunrise Point-H SMBus (rev 31)
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (2) I219-V (rev 31)
01:00.0 Non-Volatile memory controller: Intel Corporation PCIe Data Center SSD (rev 01)
02:00.0 PCI bridge: ASMedia Technology Inc. ASM1083/1085 PCIe to PCI Bridge (rev 04)
05:00.0 Multimedia controller: Altera Corporation Device 4c15 (rev 01)
lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 94
Model name:            Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
Stepping:              3
CPU MHz:               3584.250
BogoMIPS:              6381.15
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K
NUMA node0 CPU(s):     0-3
uname -r
3.10.0-327.4.4.el7.x86_64
fio -rw=randwrite -bs=4k -size=100m -directory=/mnt/ -direct=1 -numjobs=50 -name=file1 -ioengine=libaio -group_reporting
file1: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=1
...
fio-2.2.8
Starting 50 processes
Jobs: 47 (f=47): [w(1),_(1),w(5),_(1),w(41),_(1)] [100.0% done] [0KB/924.3MB/0KB /s] [0/237K/0 iops] [eta 00m:00s]
file1: (groupid=0, jobs=50): err= 0: pid=21073: Mon Jan 25 20:49:16 2016
  write: io=5000.0MB, bw=919705KB/s, iops=229926, runt=  5567msec
    slat (usec): min=1, max=80, avg= 3.66, stdev= 2.57
    clat (usec): min=0, max=13966, avg=203.23, stdev=389.81
     lat (usec): min=9, max=13969, avg=206.93, stdev=389.78
    clat percentiles (usec):
     |  1.00th=[    9],  5.00th=[   13], 10.00th=[   16], 20.00th=[   25],
     | 30.00th=[   38], 40.00th=[   65], 50.00th=[  112], 60.00th=[  145],
     | 70.00th=[  171], 80.00th=[  207], 90.00th=[  390], 95.00th=[ 1080],
     | 99.00th=[ 1592], 99.50th=[ 1672], 99.90th=[ 1944], 99.95th=[ 6112],
     | 99.99th=[11328]
    bw (KB  /s): min=15272, max=30728, per=2.07%, avg=19070.28, stdev=2008.08
    lat (usec) : 2=0.01%, 4=0.01%, 10=1.39%, 20=12.20%, 50=21.62%
    lat (usec) : 100=12.07%, 250=37.86%, 500=6.17%, 750=2.00%, 1000=1.27%
    lat (msec) : 2=5.33%, 4=0.03%, 10=0.04%, 20=0.03%
  cpu          : usr=0.83%, sys=2.40%, ctx=1279968, majf=0, minf=1417
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=0/w=1280000/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: io=5000.0MB, aggrb=919705KB/s, minb=919705KB/s, maxb=919705KB/s, mint=5567msec, maxt=5567msec

Disk stats (read/write):
    dm-0: ios=0/1252806, merge=0/0, ticks=0/236240, in_queue=243278, util=98.78%, aggrios=0/1280005, aggrmerge=0/0, aggrticks=0/239884, aggrin_queue=243983, aggrutil=98.18%
  nvme0n1: ios=0/1280005, merge=0/0, ticks=0/239884, in_queue=243983, util=98.18%

#妥協の必要が全くないストレージ

  • 投稿日:
  • by
  • カテゴリ:

この記事はIntel純正の安心感 Advent Calendar 2015の12月15日のエントリーです。

なんかしゅううさんIntel純正の安心感にはまっていて楽しそうなので、各種サーバを動かした実績を共有すべく。

1. DC3217IYE
このNUCについてはIntel NUC DC3217IYEに書いた通りで、RHEL 6で自宅サーバを構築するために2012年11月に購入。2015年11月までの3年間、自宅サーバをリプレースするまでの間、故障等は無く安定して稼働してくれた。よく頑張った。第3世代CoreのIvy Bridgeを搭載。

2. D34010WYB
2014年6月に購入したのは第4世代Core・Haswellのi3-4010Uを搭載したD34010WYB。こちらはRHEL 7を導入する前提で16GBメモリと240GBのSSDと一緒に購入したものの自宅サーバとして活用することなく、今では小2の息子ちゃんのマイクラ専用PCと化しFedora 23をインスコされ、パパァ、グラフィックが遅いよぉと罵られる不遇の日々を送っている。息子よ、それはIntegrated Graphicsと言ってな?

3. NUC5i3RYH
そして直近の2015年10月に2台購入したのは、第5世代・Broadwellのi5-5010Uを搭載したNUC5i3RYH。実は会社の資産でRed Hat Enterprise VirtualizationのManagerとHypervisorがそれぞれインストールされ、VDI(仮想デスクトップ)のデモ環境として稼働中。RHEL 6.7がベースで特に問題なく稼働しており、ある案件の受注に際して大活躍した機材w

ちなみに、現在の自宅サーバ(あなたが今見ているウェブをサーブしている機材だ)は、#妥協の必要が全くないストレージであるIntel SSD 750 (400GB)と、PT3を突っ込むためにMicro-ATXのマザボ、Skylakeのi5-6400、DDR4 32GBで構築してRHEL 7.2で運用されている爆速サーバだ。PCI-Eのカードを2枚接続しようとすると、外付けケース自作という方向もあるけれど、あんまり美しくならないので却下。

さて、以下、Intel純正の安心感にはまらないためのRHELでのTips等。

DC3217IYEの購入前には、RHEL 6のPCI IDs(/usr/share/hwdata/以下、hwdata RPMパッケージがインストールする)を見て、少なくともRHEL 6で確実にデバイスが認識されることを確認した。さらにIvy Bridgeのi3-3217Uを搭載しているので、同じIvy Bridgeのi5-3427Uを搭載している上位モデルのDC53427HYEがRed HatのHardware Certification Listに掲載されていることもあって確実に動作するだろうと。Intelさんからの噂ではSkylake世代でもHCLを取得するつもりがあるらしいので、RHEL 6とか7とか動かしたいならそれを待ってから本番導入するがよろし。

なお、RHEL 7.2のカーネルドライバだとSkylakeのG530でrotate出来ない(xrandrでもxorg-x11-drv-intelでもなくi915.koのせい、kern param追加してもムダムダムダァ!)ので、シ○ープが現金確保に在庫流したという噂のIGZOパネルを接続するとX Windowは縦長でしか使えないから注意な。

comparison mapcrafter with overviewer

overviewerはCPUを自動検出するので同時実行プロセス数の指定は無しで。同じワールドのデータなのにレンダリングするタイル数がなぜか違う。双方ともsmooth_lighting。
overviewerは約90分、mapcrafterは約30分と、mapcrafterが約3倍高速。仮にレンダリングタイル数を揃えると約2.2倍高速ということになる。

$ overviewer.py --config=minecraft/overviewer.config
2015-08-18 18:51:28  Welcome to Minecraft Overviewer!
2015-08-18 18:51:28  Generating textures...
2015-08-18 18:52:17  Preprocessing...
2015-08-18 18:54:02  Rendering 40848 total tiles.
 99% [================================================================================================= ] 40833 7.78t/s eta 00h 00m 01s
2015-08-18 20:21:28  Rendering complete!
2015-08-18 20:21:29  Your render has been written to '/var/www/html/map_test', open index.html to view it
$ mapcrafter -j 4 -c mapcrafter.render_test.conf 
2015-08-18 18:13:27 [INFO] [default] Scanning worlds...
2015-08-18 18:13:29 [INFO] [default] [1/1] Rendering map map_myworld_n ("Day"):
2015-08-18 18:13:29 [INFO] [default] [1.1/1.1] Rendering rotation top-left:
2015-08-18 18:13:29 [INFO] [default] Scanning required tiles...
2015-08-18 18:13:30 [INFO] [default] 4 threads will render 30348 render tiles.
[============================================================================================] 100.00% 30348/30348 17.72/s             
2015-08-18 18:42:03 [INFO] [default] [1.1/1.1] Rendering rotation top-left took 1713 seconds.
2015-08-18 18:42:03 [INFO] [default] Rendering all worlds took 1714 seconds.
2015-08-18 18:42:03 [INFO] [default] Finished.....aaand it's gone!

Build mapcrafter on RHEL6 / CentOS6

  • 投稿日:
  • by
  • カテゴリ:

I found I couldn't build mapcrafter, a high performance Minecraft map renderer written in C++, on my own RHEL6.6 without some workaround and additional RPM packages. This is just a memo. It may be useful info for CentOS users, I guess.

At first, you need to install the newer boost packages from the EPEL repo. If you didn't enable the repo, issue a following command or enable the repo manually.

yum install http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm

EPEL offers boost-1.48 with the package name, boost148-*, you can install them.

yum install boost148-devel boost148-iostreams boost148-system boost148-filesystem boost148-program_options

As mapcrafter is written in C++11 and RHEL6 is shipped with old gcc-4.4, you also need to install the latest devtoolset including gcc-4.9 from scl, Software Collection repo. Check whether the scl repo is enabled and enable it.

subscription-manager repos --list-enabled
subscription-manager repos --enable=rhel-server-rhscl-6-rpms

After enabling the repo, install the newer gcc-c++ package from the repo.

yum install devtoolset-3-gcc-c++

OK, now you can download the latest source codes of mapcrafter with git command.

git clone https://github.com/mapcrafter/mapcrafter.git
cd mapcrafter

Add two lines to the CMakeList.txt under the mapcrafter/ directory in order to make the gcc use boost148. NEVER EDIT other CMakeList.txt such as mapcrafter/src/CMakeList.txt.

--- mapcrafter.orig/CMakeLists.txt	2015-08-13 12:23:29.059788712 +0900
+++ mapcrafter/CMakeLists.txt	2015-08-13 12:25:42.440261458 +0900
@@ -49,6 +49,8 @@
     include_directories(${ZLIB_INCLUDE_DIRS})
 endif()
 
+SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "/usr/include/boost148")
+SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "/usr/lib64/boost148")
 find_package(Boost COMPONENTS iostreams system filesystem program_options REQUIRED)
 if(OPT_USE_BOOST_THREAD)
     find_package(Boost COMPONENTS thread REQUIRED)

Run cmake command via scl command.

scl enable devtoolset-3 'cmake .'
-- The C compiler identification is GNU 4.9.2
-- The CXX compiler identification is GNU 4.9.2
-- Check for working C compiler: /opt/rh/devtoolset-3/root/usr/bin/cc
-- Check for working C compiler: /opt/rh/devtoolset-3/root/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /opt/rh/devtoolset-3/root/usr/bin/c++
-- Check for working CXX compiler: /opt/rh/devtoolset-3/root/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Performing Test COMPILER_SUPPORTS_CXX11
-- Performing Test COMPILER_SUPPORTS_CXX11 - Success
-- Performing Test COMPILER_SUPPORTS_CXX0X
-- Performing Test COMPILER_SUPPORTS_CXX0X - Success
-- Boost version: 1.48.0
-- Found the following Boost libraries:
--   iostreams
--   system
--   filesystem
--   program_options
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Boost version: 1.48.0
-- Found the following Boost libraries:
--   unit_test_framework
-- Found ZLIB: /usr/lib64/libz.so (found version "1.2.3") 
-- Found PNG: /usr/lib64/libpng.so (found version "1.2.49") 
-- Found JPEG: /usr/lib64/libjpeg.so  
-- Performing Test HAVE_NULLPTR
-- Performing Test HAVE_NULLPTR - Success
-- Performing Test HAVE_ENUM_CLASS_COMPARISON
-- Performing Test HAVE_ENUM_CLASS_COMPARISON - Success
-- Looking for include file endian.h
-- Looking for include file endian.h - found
-- Looking for include file sys/endian.h
-- Looking for include file sys/endian.h - not found
-- Looking for include file sys/ioctl.h
-- Looking for include file sys/ioctl.h - found
-- Looking for include file unistd.h
-- Looking for include file unistd.h - found
-- Looking for include file syslog.h
-- Looking for include file syslog.h - found
-- Performing Test HAVE_ENDIAN_CONVERSION
-- Performing Test HAVE_ENDIAN_CONVERSION - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /root/mapcrafter

Let's build mapcrafter binaries!

scl enable devtoolset-3 'make'
Scanning dependencies of target version.cpp
[  1%] Built target version.cpp
Scanning dependencies of target mapcraftercore
[  3%] Building CXX object src/mapcraftercore/CMakeFiles/mapcraftercore.dir/version.cpp.o
[  5%] Building CXX object src/mapcraftercore/CMakeFiles/mapcraftercore.dir/config/configparser.cpp.o
[  7%] Building CXX object src/mapcraftercore/CMakeFiles/mapcraftercore.dir/config/iniconfig.cpp.o
......
Linking CXX executable testtextures
[100%] Built target testtextures

You may see some warnings in compiling and linking. Ignore them :)

make install
[  1%] Built target version.cpp
[ 74%] Built target mapcraftercore
[ 75%] Built target mapcrafter
[ 77%] Built target mapcrafter_markers
[ 94%] Built target test_all
[ 96%] Built target nbtdump
[ 98%] Built target testconfig
[100%] Built target testtextures
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/bin/mapcrafter
-- Removed runtime path from "/usr/local/bin/mapcrafter"
-- Installing: /usr/local/bin/mapcrafter_markers
.........

Check if the binaries exist under /usr/local/bin.

ll /usr/local/bin/
total 332
-rwxr-xr-x. 1 root root 177673 Aug 13 12:49 mapcrafter
-rwxr-xr-x. 1 root root 142925 Aug 13 12:49 mapcrafter_markers
-rwxr-xr-x. 1 root root   9362 Aug 13 12:43 mapcrafter_png-it.py
-rwxr-xr-x. 1 root root   3837 Aug 13 12:43 mapcrafter_textures.py

I don't know why 'make install' don't copy .so to /usr/lib64/. If you, of course me too, don't want to install .so under /usr/lib64/, you need to edit mapcrafter/src/mapcraftercore/cmake_install.cmake.

cp mapcrafter/src/mapcraftercore/libmapcraftercore.so /usr/lib64/

You can consult with documentation for textures and resources used by mapcrafter. Enjoy!

RHEL 6.6 on xhyve

  • 投稿日:
  • by
  • カテゴリ:

Here's the installation script for RHEL 6.6 on xhyve. You need to extract the vmlinuz and the initrd.img from /images/pxeboot/ directory in the installation DVD image.

#!/bin/sh

KERNEL="rhel66/vmlinuz"
INITRD="rhel66/initrd.img"
CMDLINE="console=ttyS0 acpi=off sshd=1 vnc vncpassword=yourpasswd"

MEM="-m 1G"
#SMP="-c 2"
NET="-s 2:0,virtio-net"
IMG_CD="-s 3,ahci-cd,/path/to/rhel-server-6.6-x86_64-dvd.iso"
IMG_HDD="-s 4,virtio-blk,rhel66/hdd.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"

build/xhyve $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD -f kexec,$KERNEL,$INITRD,"$CMDLINE"

You need to scp the initramfs, the vmlinuz and the grub.cfg from the installed RHEL 6.6 to Mac OS X at the end of installation sequence. So, I passed the 'sshd=1' param to the kernel. And here's the booting script for RHEL 6.6.

#!/bin/sh

KERNEL="rhel66/boot/vmlinuz-2.6.32-504.el6.x86_64"
INITRD="rhel66/boot/initramfs-2.6.32-504.el6.x86_64.img"
CMDLINE="BOOT_IMAGE=/vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD  KEYTABLE=us rd_LVM_LV=VolGroup/lv_swap acpi=off console=ttyS0 crashkernel=auto rd_LVM_LV=VolGroup/lv_root SYSFONT=latarcyrheb-sun16 rd_NO_DM"

MEM="-m 1G"
SMP="-c 2"
NET="-s 2:0,virtio-net"
IMG_HDD="-s 4,virtio-blk,rhel66/hdd.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"
UUID="-U ED92A783-625C-4A0F-B385-9F560A75FF75"

build/xhyve $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD $UUID -f kexec,$KERNEL,$INITRD,"$CMDLINE"

The kernel parameters are from grub.cfg. You can use 'uuidgen' command on Mac OS X to be used for 'UUID' in the script. Enjoy!

nftablesクイックHowto

  • 投稿日:
  • by
  • カテゴリ:

本エントリーはÉric Leblond氏のNftables quick howtoを翻訳し、執筆時点でのnftablesの情報を追加したものです。

はじめに

このドキュメントはダーティなハウツーとチートシートの中間に位置するものです。nftablesの面白い機能のいくつかについての短い説明は、Why you will love nftables和訳)で読むことが出来ます。

nftablesの背景にある設計やアイデアについては、announce of the first release of nftablesを読んでください。より一般的な情報については、Kernel Recipes:で私が話したEric Leblond, OISF - Nftablesを見ることも出来ます。

nftablesを作る

訳注:執筆時点で、Fedora rawhideにはnftablesを含め、nftablesに必要とされるRPMパッケージが用意されています。最新版を試すのでなければ、このセクションは読み飛ばして構いません。以下の手順でrawhideレポジトリを有効化し、yumコマンドでnftablesパッケージをインストールすればnftablesを使えます。

# yum install fedora-release-rawhide
# yum-config-manager --disable fedora updates updates-testing
# yum-config-manager --enable rawhide
# yum update yum
# yum install nftables

ライブラリ

以下のライブラリが必要です。

ディストリビューションにlibmnlが既に含まれているかもしれませんが、普通にビルドしても、両方とも簡単です:

./autogen.sh
./configure
make
make install
ldconfig

nftables

最初に依存するものをインストールします:

aptitude install libgmp-dev libreadline-dev

ドキュメンテーションをビルドしたい場合:

aptitude install docbook2x docbook-utils
git clone git://git.netfilter.org/nftables
cd nftables
./autogen.sh
./configure
make
make install

kernel

もしLinuxのgitツリーがまだ手元に無い場合は実行:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

もしLinuxのgitツリーが手元にある場合は最新のソースに更新するだけ:

cd linux
git pull --rebase

これでソースが用意出来たので、nftablesのオプションを選択できます:

$ make oldconfig

Netfilter Xtables support (required for ip_tables) (NETFILTER_XTABLES) [M/y/?] m
Netfilter nf_tables support (NF_TABLES) [N/m] (NEW) m
  Netfilter nf_tables payload module (NFT_PAYLOAD) [N/m] (NEW) m
  Netfilter nf_tables IPv6 exthdr module (NFT_EXTHDR) [N/m] (NEW) m
  Netfilter nf_tables meta module (NFT_META) [N/m] (NEW) m
  Netfilter nf_tables conntrack module (NFT_CT) [N/m] (NEW) m
  Netfilter nf_tables rbtree set module (NFT_RBTREE) [N/m] (NEW) m
  Netfilter nf_tables hash set module (NFT_HASH) [N/m] (NEW) m
  Netfilter nf_tables counter module (NFT_COUNTER) [N/m] (NEW) m
  Netfilter nf_tables log module (NFT_LOG) [N/m] (NEW) m
  Netfilter nf_tables limit module (NFT_LIMIT) [N/m] (NEW) m
  Netfilter nf_tables nat module (NFT_NAT) [N/m] (NEW) m
  Netfilter x_tables over nf_tables module (NFT_COMPAT) [N/m/?] (NEW) m

IPv4 nf_tables support (NF_TABLES_IPV4) [N/m] (NEW) m
  nf_tables IPv4 reject support (NFT_REJECT_IPV4) [N/m] (NEW) m
  IPv4 nf_tables route chain support (NFT_CHAIN_ROUTE_IPV4) [N/m] (NEW) m
  IPv4 nf_tables nat chain support (NFT_CHAIN_NAT_IPV4) [N/m] (NEW) m

IPv6 nf_tables support (NF_TABLES_IPV6) [M/n] m
  IPv6 nf_tables route chain support (NFT_CHAIN_ROUTE_IPV6) [M/n] m
  IPv6 nf_tables nat chain support (NFT_CHAIN_NAT_IPV6) [M/n] m

Ethernet Bridge nf_tables support (NF_TABLES_BRIDGE) [N/m/y] (NEW) m

さて、いつものコマンドでカーネルがビルドできます。Debianでデュアルコアのマシンの場合は以下で可能:

make -j 2 deb-pkg

もしくは、代わりに以下の古い方法でも:

CONCURRENCY_LEVEL=2 make-kpkg --revision 0.1 --rootcmd fakeroot  --initrd   --append-to-version nftables kernel_image kernel_headers

Debianユーザはgitソースからカーネルをビルドすることも可能:

他の関連するパッケージはこのディレクトリから利用できます。

実行する

初期設定

iptablesのようなチェインの設定にするには、ソースで提供されているipv4-filterファイルを使います。

nft -f files/nftables/ipv4-filter

訳注:Fedora rawhideでインストールした場合、/etc/nftables/ipv4-filter。実行権限とSELinuxのラベルが設定されているので、パスを指定して実行することが可能です。後述するIPv6のフィルタも同様。

そしてその結果のチェインを表示できます:

nft list table filter

フィルターはoutputやinputがチェインやテーブルの名前として使われている点に注意。他のどんな文字列でも使えます。

基本的なルールの扱い

ある宛先アドレスを持つoutputパケットをドロップするには

nft add rule ip filter output ip daddr 1.2.3.4 drop

ルールのカウンタ(訳注:パケットのバイト数をカウントするオプション)はnftablesではオプションで、有効にするにはcounterキーワードが必要です:

nft add rule ip filter output ip daddr 1.2.3.4 counter drop

ルールをネットワークに追加するには、以下をそのまま使います:

nft add rule ip filter output ip daddr 192.168.1.0/24 counter

TCP/80番ポートへのパケットをドロップするには構文は以下です:

nft add rule ip filter input tcp dport 80 drop

ICMP echoリクエストを受け取るには:

nft add rule filter input icmp type echo-request accept

フィルタリングを組み合わせるには、ipの構文を複数回指定すれば良いだけです:

nft add rule ip filter output ip protocol icmp ip daddr 1.2.3.4 counter drop

チェインのルールを全て削除するには:

nft delete rule filter output

特定のルールを削除するには、-aフラッグをnftコマンドで使ってハンドルナンバーを知る必要があります:

# nft list table filter -a
table filter {
        chain output {
                 ip protocol icmp ip daddr 1.2.3.4 counter packets 5 bytes 420 drop # handle 10
...

そうすればルール10番を削除できます:

nft delete rule filter output handle 10

フィルタテーブルをフラッシュすることもできます:

nft flush table filter

ルールを挿入することも:

nft insert rule filter input tcp dport 80 counter accept

ルールを特定の位置に挿入するあるいは追加することが可能です。そのためには、新しいルールを挿入あるいは追加したいルールのハンドル知る必要があります。リスト操作で-aフラッグを使えばできます:

# nft list table filter -n  -a
table filter {
        chain output {
                 type filter hook output priority 0;
                 ip protocol tcp counter packets 82 bytes 9680 # handle 8
                 ip saddr 127.0.0.1 ip daddr 127.0.0.6 drop # handle 7
        }
}
# nft add rule filter output position 8 ip daddr 127.0.0.8 drop
# nft list table filter -n -a
table filter {
        chain output {
                 type filter hook output priority 0;
                 ip protocol tcp counter packets 190 bytes 21908 # handle 8
                 ip daddr 127.0.0.8 drop # handle 10
                 ip saddr 127.0.0.1 ip daddr 127.0.0.6 drop # handle 7
        }
}

確かに、ハンドル8番のルールの後にルールが追加されました。指定のハンドル番号のルールの前に追加するのは、以下で可能:

nft insert rule filter output position 8 ip daddr 127.0.0.12 drop

単にプロトコルにマッチさせたいだけなら、次のようにすればできます:

nft insert rule filter output ip protocol tcp counter

IPv6

IPv4同様、チェインを作成する必要があります。以下で可能:

nft -f files/nftables/ipv6-filter

そうすればルールを追加できます:

nft add rule ip6 filter output ip6 daddr home.regit.org counter

ルールの一覧は以下で得られます:

nft list table ip6 filter

動的なIPv6設定と近隣探索(Neighbor Discovery)を受け入れるには、以下で可能:

nft add rule ip6 filter input icmpv6 type nd-neighbor-solicit accept
nft add rule ip6 filter input icmpv6 type nd-router-advert accept

コネクションのトラッキング

コネクションが確立した内向きパケットを受け入れるには:

nft insert rule filter input ct state established accept

インターフェースでのフィルタ

ループバックインターフェース上の外向きパケットを受け入れるには:

nft insert rule filter output oif lo accept

eth2上の内向きパケットの場合:

nft insert rule filter input iif eth2 accept

oifは実際のところ、カーネル内部のインターフェースのインデックスである整数でマッチすることに注意してください。ユーザスペースはnftのルールが評価され(カーネルに送られる前に)指定された名前をインターフェースのインデックスに変換します。結果として、もしインターフェースが存在しない場合にはルールを追加することは出来ません。さらに、インターフェースが削除されたり再作成された場合も同様で、カーネル内部に追加されたインターフェースのインデックスは単調に増加するので、やはりマッチしません。従って、oifは高速なフィルタですが、動的なインターフェースを使う時には問題を引き起こす可能性があります。インターフェースの名前でフィルタすることは可能ですが、整数でのマッチの代わりに文字列でのマッチを行うため、パフォーマンスコストとなります。インターフェースの名前でフィルタにするにはoifnameを使います:

nft insert rule filter input oifname ppp0 accept

ロギング

ログをとるにはlogキーワードを使います。典型的なログと受け入れるルールは以下のようになります:

nft add rule filter input tcp dport 22 ct state new log prefix \"SSH for ever\" group 2 accept

nftablesでは、iptablesだと2つになるような(NFLOGとACCEPT)ルールを1つのルールで書けます。もしprefixが単なる標準的な前置きのオプションであれば、groupオプションはnfnetlink_logグループを含み、このモードはロギングのフレームワークとして用いられます。

事実として、nftablesでのログはNetfilterのロギングのフレームワークを利用しています。つまり、ロギングはロードされたカーネルモジュールに依存するということです。利用可能なカーネルモジュールは:

  • xt_LOG:printkベースのログで、全てをsyslogに出力する(iptablesのLOGターゲットで用いられるものと同じモジュール)
  • nfnetlink_log:netlinkベースのログで、イベント取得のためにulogd2を設定する必要がある(iptablesのNFLOGターゲットで用いられるものと同じモジュール)

2つのモジュールのどちらかを使うには、modprobeでロードします。

各プロトコルを基準にログの設定が出来ます。設定は/procで可能:

# cat /proc/net/netfilter/nf_log 
 0 NONE (nfnetlink_log)
 1 NONE (nfnetlink_log)
 2 nfnetlink_log (nfnetlink_log,ipt_LOG)
 3 NONE (nfnetlink_log)
 4 NONE (nfnetlink_log)
 5 NONE (nfnetlink_log)
 6 NONE (nfnetlink_log)
 7 nfnetlink_log (nfnetlink_log)
 8 NONE (nfnetlink_log)
 9 NONE (nfnetlink_log)
10 nfnetlink_log (nfnetlink_log,ip6t_LOG)
11 NONE (nfnetlink_log)
12 NONE (nfnetlink_log)

これでnfnetlink_logが最初にロードされulogdが起動します。例として、IPv4(リスト中の2番)にipt_LOGを使いたい場合は、以下で可能です:

echo "ipt_LOG" >/proc/sys/net/netfilter/nf_log/2

これでIPv4にipt_LOGによるロギングが有効になります:

# cat /proc/net/netfilter/nf_log 
 0 NONE (nfnetlink_log)
 1 NONE (nfnetlink_log)
 2 ipt_LOG (nfnetlink_log,ipt_LOG)
 3 NONE (nfnetlink_log)
 4 NONE (nfnetlink_log)
 5 NONE (nfnetlink_log)
 6 NONE (nfnetlink_log)
 7 nfnetlink_log (nfnetlink_log)
 8 NONE (nfnetlink_log)
 9 NONE (nfnetlink_log)
10 nfnetlink_log (nfnetlink_log,ip6t_LOG)
11 NONE (nfnetlink_log)
12 NONE (nfnetlink_log)

もしちょっとしたテストのために使いたいだけなら、nfnetlink_logの前にxt_LOGを単にロードすれば、IPv4とIPv6プロトコルに対してロギングが可能になります。

単一のチェインを使う

チェインはユーザが定義し、色々な方法でアレンジできます。例えば、1台の箱なら、入力用に単一のチェインを使うこともあり得ます。onechainというファイルを以下の内容で作成します:

#! nft -f

table global {
        chain one { 
                type filter hook input priority   0;
        }
}

それから実行します。

nft -f onchain

そして以下のようにルールを追加することが可能です:

nft add rule ip global one ip daddr 192.168.0.0/24

この設定の良いところは箱にパケットが届いた時にだけNetfilterのフィルタリングが有効になることです。

セット

名前無しセットは以下の構文で使えます:

nft add rule ip filter output ip daddr {192.168.1.1, 192.168.1.4} drop

名前付きセットはファイルに記述出来ます。例えば、simpleというファイルを作成できます:

define ip_set = {192.168.1.2, 192.168.2.3}
add rule filter output ip daddr $ip_set counter

それから実行します。

nft -f simple

名前付きセットを使うことも出来ます。IPv4アドレスを含むセットを1つ定義します:

nft add set filter ipv4_ad { type ipv4_addr\;}

セットに要素を追加するには:

nft add element filter ipv4_ad { 192.168.3.4 }
nft add element filter ipv4_ad { 192.168.1.4, 192.168.1.5 }

セットの一覧は:

nft list set filter ipv4_ad

そして、ルール中でセットを使えます:

nft add rule ip filter input ip saddr @ipv4_ad drop

既存のセットから要素を取り除けます:

nft delete element filter ipv4_ad { 192.168.1.5 }

セットを削除するには:

nft delete set filter ipv4_ad

マッピング

マッピングは辞書のように振る舞う特定のタイプのセットです。例えばIPv4のアドレスをあう判定にマップすることが出来ます:

# nft -i
nft> add map filter verdict_map { type ipv4_address : verdict; }
nft> add element filter verdict_map { 1.2.3.5 : drop}
nft> add element filter verdict_map { 1.2.3.4 : accept}

nft> add rule filter output ip daddr vmap @verdict_map

マッピングの要素を1つ削除するには、セットの操作と同じ構文で可能です:

nft> delete element filter verdict_map 1.2.3.5

セットを削除するには:

nft delete set filter verdict_map

マッピングは名前を付けない方法でも使えます:

nft add rule filter output ip daddr vmap {192.168.0.0/24 : drop, 192.168.0.1 : accept}

特定のマッピングを一覧するには:

nft list set filter nat_map -n

NAT

何より最初にNATモジュールが必要です:

modprobe nft_nat

次にカーネルがプロトコルに(ここではIPv4)NATを使うことを通知しないといけません:

modprobe nft_chain_nat_ipv4

これでNAT専用のチェインを作成できます:

nft add table nat
nft add chain nat post { type nat hook postrouting priority 0 \; }
nft add chain nat pre { type nat hook prerouting priority 0 \; }

NATのルールを追加できます:

nft add rule nat post ip saddr 192.168.56.0/24 oif wlan0 snat 192.168.1.137
nft add rule nat pre udp dport 53 ip saddr 192.168.56.0/24 dnat 8.8.8.8:53

1つ目は192.168.56.0/24からのwlan0インターフェースへの外向きトラフィックを全てIPアドレス192.168.1.137にNATします。2つ目は192.168.56.0/24からの全てのDNSトラフィックを8.8.8.8サーバにリダイレクトします。アドレスレンジへのNATも可能です:

nft add rule nat post ip saddr 192.168.56.0/24 oif wlan0 snat 192.168.1.137-192.168.1.140

IPv6のNATも可能です。最初にIPv6用のNAT機能を定義するモジュールをロードする必要があります:

modprobe nft_chain_nat_ipv6

終われば、以下のようにルールを追加できます:

table ip6 nat {
    chain postrouting {
        type nat hook postrouting priority -150; 
        ip6 saddr 2::/64 snat 1::3;
    }
}

基本のルールセットを作り上げる

以下のルールセットはIPv4とIPv6であるラップトップを保護するための典型的なルールセットです:

# IPv4 filtering
table Filter {
        chain Input {
                 type filter hook input priority 0;
                 ct state established accept
                 ct state related accept
                 iif lo accept
                 tcp dport ssh counter accept
                 counter log drop
        }

        chain Output {
                 type filter hook output priority 0;
                 ct state established accept
                 ct state related accept
                 oif lo accept
                 ct state new counter accept
        }
}
#IPv6 filtering
table ip6 Filter {
        chain Input {
                 type filter hook input priority 0;
                 ct state established accept
                 ct state related accept
                 iif lo accept
                 tcp dport ssh counter accept
                 icmpv6 type { nd-neighbor-solicit, echo-request, nd-router-advert, nd-neighbor-advert } accept
                 counter log drop
        }

        chain Output {
                 type filter hook output priority 0;
                 ct state established accept
                 ct state related accept
                 oif lo accept
                 ct state new counter accept
        }

}