はじめに
目的とする構成は、以下の通りです。
PC ---(USB)---> NanoPi NEO2 ---(LAN)---> iSCSI Target(NAS)
つまり、PCにNanoPi NEO2 をUSBで繋ぐと、PCからはUSB-HDDとしてアクセスできるようになるが、そのファイル等の保存先が NAS上の iSCSI Target になる。というもの。
上手く使えば TV録画用のUSB-HDDの代替品となるわけです。
その他、RAID等によるデータ保護、データの自動バックアップ、USB-HDDでは実現できない大容量ができたりするわけです。
また、USB-HDDが分散して困っている人向けにもなります(笑
BeagleBoneBlack時代にも同様の実験しましたが、NanoPi-NEO2の GigabitEhter の恩恵がどれほどあるのか?を探るのがメインテーマです。
左端が主役の子。
必要なもの
ハードウェア
- PC本体
- MicroUSB ケーブル1本 (電源供給も兼ねる)
- NanoPi NEO2 1台
- LANケーブルとハブ
- iSCSI Targetに対応しているNAS (実験はSynologyでやってます)
ソフトウェア
- NanoPi-NEO2 Official Image
- nanopi-neo2_ubuntu-oled_4.11.2_20170531.img.zip
- 上記イメージに対応したカーネルソース
- linux_4.11.2_20170525.tar.gz
セットアップ
1. microSDでBoot
dd か Win32DiskImager-0.9.5-binary などを使用して、MicroSDに起動イメージを書き込み、NEO2に挿し、Bootさせます。
2. カーネルソースのコンパイル
Open-iSCSIのパッケージを使用するのですが、iscsi_tcp.ko が無いためエラーなってしまいます。そのため、カーネル再ビルドが必要となってしまいます。ディストリビューションによっては元々組み込まれていたりします。
下記手順で iSCSI Initiator over TCP/IP をKernel組み込みにして、再ビルドすればOKです。
apt-get install libncurses5-dev libncursesw5-dev bc
cd ~
wget http://www.mediafire.com/file/ica7ti6bxmag03o/linux_4.11.2_20170525.tar.gz
tar xf linux_4.11.2_20170525.tar.gz
cd linux
touch .scmversion
make sunxi_arm64_defconfig
make menuconfig
------------------------
Device Drivers --->
SCSI device support --->
SCSI low-level drivers -->
[space] & [enter]
<*> iSCSI Initiator over TCP/IP [space][space]
------------------------
make -j4
mkdir /boot/old
mv /boot/Image /boot/old
mv /boot/*.dtb /boot/old
cp arch/arm64/boot/Image /boot/
cp arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi*.dtb /boot/
reboot
NanoPi NEO2上でのLinuxカーネルコンパイルは、1~2時間程度かかりますので気長に待ちます。
###3. 必要パッケージのインストール
apt-get install open-iscsi
これだけです。
###4. iSCSI Initiator の構成
iscsiadm -m discovery -t sendtargets -p 192.168.1.9
iscsiadm -m node --targetname "iqn.2000-01.com.synology:nas.target1" --portal "192.168.1.9:3260" --login
※NASのIPアドレス、targetnameはお使いの物を設定します。
※NAS側のiSCSI Target は別途作成が必要です。
成功すると、/dev/sda のブロックデバイスが作成されます。
カーネルビルドしていないと、iscsi_tcp.ko が無いよ。系のエラーになったります。
###5. USB-HDD化
/dev/sda が作成されたので、以下のコマンドで、仮想的な USB-HDD を作成する。
これで、PCへ接続するとUSB-HDDとして認識されるようになります。
もちろん、ただのUSB-HDDですので、フォーマットが必要になります(笑
modprobe g_mass_storage file=/dev/sda
###6. NEO2起動時の自動接続
上記、4,5は再起動すると消えます。
必要に応じて、/etc/rc.local 等で自動起動します。
Networkの活性化のタイミング次第ではエラーになったりしますので、Sleep等で調整必要な場合もあります。
性能測定結果。
BeagleBoneBlack の結果
当時の結果ですが、100MbpsのLANがボトルネックとなり、性能が全然でていません。。。
-----------------------------------------------------------------------
CrystalDiskMark 3.0.2 x64 (C) 2007-2012 hiyohiyo
Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 byte/s [SATA/300 = 300,000,000 byte/s]
Sequential Read : 11.471 MB/s
Sequential Write : 7.710 MB/s
Random Read 512KB : 10.053 MB/s
Random Write 512KB : 5.635 MB/s
Random Read 4KB (QD=1) : 0.637 MB/s [ 155.5 IOPS]
Random Write 4KB (QD=1) : 3.356 MB/s [ 819.4 IOPS]
Random Read 4KB (QD=32) : 0.679 MB/s [ 165.8 IOPS]
Random Write 4KB (QD=32) : 3.062 MB/s [ 747.6 IOPS]
Test : 1000 MB [F: 0.8% (0.1/10.0 GB)] (x1)
Date : 2014/08/15 0:21:21
OS : Windows 7 Home Premium Edition SP1 [6.1 Build 7601] (x64)
NanoPi NEO2
1GbpsLANの恩恵は、ちょっとはあるようです。
USB2.0 ボトルネックで 25~30MB/sec 程度を期待していましたが、かなり下回りました。残念。
-----------------------------------------------------------------------
CrystalDiskMark 5.2.1 (C) 2007-2017 hiyohiyo
Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s]
* KB = 1000 bytes, KiB = 1024 bytes
Sequential Read (Q= 32,T= 1) : 15.884 MB/s
Sequential Write (Q= 32,T= 1) : 15.860 MB/s
Random Read 4KiB (Q= 32,T= 1) : 1.702 MB/s [ 415.5 IOPS]
Random Write 4KiB (Q= 32,T= 1) : 8.901 MB/s [ 2173.1 IOPS]
Sequential Read (T= 1) : 15.728 MB/s
Sequential Write (T= 1) : 15.729 MB/s
Random Read 4KiB (Q= 1,T= 1) : 3.162 MB/s [ 772.0 IOPS]
Random Write 4KiB (Q= 1,T= 1) : 7.581 MB/s [ 1850.8 IOPS]
Test : 1024 MiB [D: 0.0% (0.1/255.9 GiB)] (x1) [Interval=5 sec]
Date : 2017/06/07 21:03:16
OS : Windows 10 Professional [10.0 Build 15063] (x86)
その他
ボトルネック要因の調査のため、ネットワーク側を測定をしてみました。
### iSCSI Target : Synology DS216j (2TB x2, RAID 1)
$ hdparm -Tt /dev/sda
/dev/sda:
Timing cached reads: 1094 MB in 2.00 seconds = 546.39 MB/sec
Timing buffered disk reads: 294 MB in 3.01 seconds = 97.61 MB/sec
# FATでフォーマットした場合
$ dd if=/dev/zero of=/nas/write_bench bs=1M count=4096
4294967295 bytes (4.3 GB, 4.0 GiB) copied, 54.7855 s, 78.4 MB/s
# EXT4 でフォーマットした場合
$ dd if=/dev/zero of=/nas/write_bench bs=1M count=4096
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 45.5653 s, 94.3 MB/s
### iSCSI Target : Synology DS412+ (3TB x4, RAID 6)
# EXT4 でフォーマットした場合
$ dd if=/dev/zero of=/nas/write_bench bs=1M count=4096
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 46.271 s, 92.8 MB/s
# CIFS共有先へのdd (NAS側のファイルシステムは、Ext4)
$ dd if=/dev/zero of=/nas_cifs/write_bench bs=1M count=4096
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 47.475 s, 90.5 MB/s
計測結果としては、GigabitEhter ほぼほぼ出ており、USB回りがネックとの結論になりました。
その替りに、iSCSI等の性能はGigabitEtherの恩恵を受けていますので、MicroSDの代替にはもってこい!ともいえる状況です。