NanoPi-NEO2 で USB mass storage → iSCSI Target してみる

# はじめに

目的とする構成は、以下の通りです。

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 の恩恵がどれほどあるのか？を探るのがメインテーマです。

<img width="512" alt="d390ebac-32b7-7a31-ac20-36d271eae92d.png" src="https://qiita-image-store.s3.amazonaws.com/0/187531/3c188171-7b7d-74fa-e084-42caff3d6421.png">

左端が主役の子。


# 必要なもの

## ハードウェア

- PC本体
- MicroUSB ケーブル1本　(電源供給も兼ねる)
- NanoPi NEO2 1台
- LANケーブルとハブ
- iSCSI Targetに対応しているNAS　(実験はSynologyでやってます)

## ソフトウェア

- [NanoPi-NEO2 Official Image](https://www.mediafire.com/folder/ah4i6w029912b/NanoPi-NEO2#b7f7bt3s240uw)
 - nanopi-neo2_ubuntu-oled_4.11.2_20170531.img.zip
- [上記イメージに対応したカーネルソース](https://www.mediafire.com/folder/ah4i6w029912b/NanoPi-NEO2#m4ursll77fvt1)
 - 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です。

```bash:NanoPi-NEO2
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カーネルコンパイルは、１～２時間程度かかりますので気長に待ちます。
　
###3. 必要パッケージのインストール

apt-get install open-iscsi

これだけです。

###4. iSCSI Initiator の構成

```bash:NanoPi-NEO2
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ですので、フォーマットが必要になります(笑

```bash:NanoPi-NEO2
modprobe g_mass_storage file=/dev/sda
```

###6. NEO2起動時の自動接続

上記、４，５は再起動すると消えます。

必要に応じて、/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の代替にはもってこい！ともいえる状況です。