はじめに
PCIeが搭載されているQNAP NASの多く(おそらくエンタープライズ向けでないもの)は、PCIeのブラケットが特殊なものになっていて、ロープロファイル フラット ブラケットと読ばれている。そのため、普通のPCIeカードが挿さらない。(以下のような背面の場合) これによって、省スペースのNASが実現しているのだが。。。
ハードウェア
ロープロファイル ブラケットのL字のところが曲げてない規格になっている。ロープロファイル ブラケットのL字を加工修正するのは大変なので、代わりにフルサイズ ブラケットを以下のように加工すると、何とかなる。斜めのカットは必須では無いが、カードを挿しやすくなるかも。右の写真は実際のQNAPの製品のブラケット。[ ]内は必要な工具。
- 下側を5mm(PCIeのスペック的には4.05mm)カットする[金ノコ]
- 筐体に合わせて上側のカットする場所を決めてカットする(だいたい90mmぐらいになるように)[金ノコ]
- 筐体に合わせてM3のねじ穴を切る[ドリル、ハンドタップ]
ソフトウェア
QNAP上でのカーネルモジュールのコンパイル
一つ目は、PCIeカードを直接、QNAP上で使用する場合。
目的のPCIeカードのカーネルモジュールが存在しない場合には、コンパイル環境を整備してモジュールを作成する必要あり。
- パッケージ管理ソフトのインストール
https://github.com/Entware/Entware/wiki/Install-on-QNAP-NAS を参考に
http://bin.entware.net/other/Entware_1.00std.qpkg をインストール - 以下を実行して、必要なものをインストール
(例)
PATH=/opt/bin:$PATH
opkg install pciutils
opkg install gcc
opkg install diffutils patch
opkg install git git-http
- カーネルモジュールをコンパイル
https://sourceforge.net/projects/qosgpl/ からファイルをダウンロードしたりする。詳細はググって他で探して。 - カーネルモジュールをロードするスクリプトを書いて、自動実行の機能により起動時にロードする
https://wiki.qnap.com/wiki/Running_Your_Own_Application_at_Startup
仮想マシンへのPCI passthrough
二つ目は、PCIeカードを仮想マシンで使用する場合。
QNAP上の仮想マシンへ、PCIeカードのアクセスを許可してやる。
lspci
...
07:00.0 XXXX controller: ...
と出たら、この番号(07, 00, 0)をメモして、
ls /QVS/usr/etc/libvirt/qemu
...
01234567-89ab-cdef-0123-456789abcdef.xml
目的の仮想マシンのID(上の例では、01234567-89ab-cdef-0123-456789abcdef)を取得し、
/QVS/usr/bin/virsh edit 01234567-89ab-cdef-0123-456789abcdef
で、仮想マシンの設定を変更する。具体的には、以下の内容を<devices>
の中に追加する。
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x07' slot='0x00' function='0x0'/>
</source>
</hostdev>
残念な事にこの方法は、ファームウェアのアップデートで設定が消えてしまうので、必要に応じで再実行しやすい様にシェルスクリプトを作成する。まず、上記の内容<hostdev>...</hostdev>
をファイル(pci_device.xml)にし、以下のシェルスクリプトを作成する。
#!/bin/bash
DOMAIN=01234567-89ab-cdef-0123-456789abcdef
/QVS/usr/bin/virsh attach-device $DOMAIN --file pci_device.xml --config
/QVS/usr/bin/virsh reboot $DOMAIN
感想
金属板削ったり、自作PC以上に自作感が味わえる。やるなQNAP。