mhVTLによるテープライブラリの動作検証方法

膨大な量のデータを安価に管理するため、昨今「磁気テープ」に注目が集まっています。大量のテープを管理するにはテープライブラリと呼ばれる装置が用いられます。テープライブラリは、大量の磁気テープを収納するスロット、磁気テープからデータを読み書きするドライブ、スロットとドライブの間で磁気テープを移動するロボットにより構成されます。[こちらの動画](https://www.youtube.com/watch?v=IRGz-tNBeXM)を見ると、テープライブラリとはどのようなものか、よくわかると思います（リンク先の動画では、ロボットが手前と奥に一台ずつあり、手前のロボットは右側にある二台のドライブにテープを出し入れしています）。

今後、データの量が増え続けると、このようなテープライブラリを触る機会があるかもしれません。そこで、[mhVTL](https://sites.google.com/site/linuxvtl2/)と呼ばれるテープライブラリのエミュレータで遊んでみました。

# mhVTLの設定方法
mhVTLの設定方法は、本家のサイトに詳しく載っています。私はRHEL6.5の仮想マシン上で試してみました。まずは、ELRepo.orgをyum repositoryとして登録します。

```bash
[root@localhost ~]# rpm -Uvh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
```

次に、mhVTLをインストールします。

```bash
[root@localhost ~]# yum install kmod-mhvtl mhvtl-utils
```

最後に、mhVTLを起動します。これで、仮想テープライブラリを使用する準備ができました。

```bash
[root@localhost ~]# service mhvtl start
```

lsscsiというコマンドを入れると、二つの仮想テープ装置が起動していることが確認できます。下の例では、/dev/sg10というデバイスが一つ目のロボット、/dev/sg2-5がそのロボットとセットのドライブ、/dev/sg11が二つ目のロボット、/dev/sg6-9がそのドライブとなっています。

```bash
[root@localhost ~]# lsscsi -g
[1:0:0:0]    cd/dvd  VBOX     CD-ROM           1.0   /dev/sr0   /dev/sg0
[2:0:0:0]    disk    ATA      VBOX HARDDISK    1.0   /dev/sda   /dev/sg1
[4:0:0:0]    mediumx STK      L700             0104  /dev/sch0  /dev/sg10
[4:0:1:0]    tape    IBM      ULT3580-TD5      0104  /dev/st0   /dev/sg2
[4:0:2:0]    tape    IBM      ULT3580-TD5      0104  /dev/st1   /dev/sg3
[4:0:3:0]    tape    IBM      ULT3580-TD4      0104  /dev/st2   /dev/sg4
[4:0:4:0]    tape    IBM      ULT3580-TD4      0104  /dev/st3   /dev/sg5
[4:0:8:0]    mediumx STK      L80              0104  /dev/sch1  /dev/sg11
[4:0:9:0]    tape    STK      T10000B          0104  /dev/st4   /dev/sg6
[4:0:10:0]   tape    STK      T10000B          0104  /dev/st5   /dev/sg7
[4:0:11:0]   tape    STK      T10000B          0104  /dev/st6   /dev/sg8
[4:0:12:0]   tape    STK      T10000B          0104  /dev/st7   /dev/sg9

```

# mtxコマンドによるテープライブラリの操作方法
mtxというコマンドを入れると、このテープライブラリを操作することができます。

```bash
[root@localhost ~]# yum install mtx
```

mtxコマンドの"-f"オプションにロボットを指定して、statusサブコマンドを実行すると、そのテープライブラリ内のスロット、磁気テープおよびドライブの一覧を取得することができます。下の例では、「Data Transfer Element」がドライブ、「Storage Element」がスロットであり、それぞれ「Full」と表示されている場所に磁気テープがあることを示しています。それぞれの磁気テープは「VolumeTag = <磁気テープのID>」により区別されます。「Import/Export」と表示されている行は、テープライブラリ装置からの磁気テープの挿入・取り出し口です。

```bash
[root@localhost ~]# mtx -f /dev/sg10 status
  Storage Changer /dev/sg10:4 Drives, 43 Slots ( 4 Import/Export )
Data Transfer Element 0:Full (Storage Element 1 Loaded):VolumeTag = E01001L4
Data Transfer Element 1:Empty
Data Transfer Element 2:Empty
Data Transfer Element 3:Empty
      Storage Element 1:Empty
      Storage Element 2:Full :VolumeTag=E01002L4
      Storage Element 3:Full :VolumeTag=E01003L4
      Storage Element 4:Full :VolumeTag=E01004L4
      Storage Element 5:Full :VolumeTag=E01005L4
      Storage Element 6:Full :VolumeTag=E01006L4
      Storage Element 7:Full :VolumeTag=E01007L4
      Storage Element 8:Full :VolumeTag=E01008L4
      Storage Element 9:Full :VolumeTag=E01009L4
      Storage Element 10:Full :VolumeTag=E01010L4
      Storage Element 11:Full :VolumeTag=E01011L4
      Storage Element 12:Full :VolumeTag=E01012L4
      Storage Element 13:Full :VolumeTag=E01013L4
      Storage Element 14:Full :VolumeTag=E01014L4
      Storage Element 15:Full :VolumeTag=E01015L4
      Storage Element 16:Full :VolumeTag=E01016L4
      Storage Element 17:Full :VolumeTag=E01017L4
      Storage Element 18:Full :VolumeTag=E01018L4
      Storage Element 19:Full :VolumeTag=E01019L4
      Storage Element 20:Full :VolumeTag=E01020L4
      Storage Element 21:Empty
      Storage Element 22:Full :VolumeTag=CLN101L4
      Storage Element 23:Full :VolumeTag=CLN102L5
      Storage Element 24:Empty
      Storage Element 25:Empty
      Storage Element 26:Empty
      Storage Element 27:Empty
      Storage Element 28:Empty
      Storage Element 29:Empty
      Storage Element 30:Full :VolumeTag=F01030L5
      Storage Element 31:Full :VolumeTag=F01031L5
      Storage Element 32:Full :VolumeTag=F01032L5
      Storage Element 33:Full :VolumeTag=F01033L5
      Storage Element 34:Full :VolumeTag=F01034L5
      Storage Element 35:Full :VolumeTag=F01035L5
      Storage Element 36:Full :VolumeTag=F01036L5
      Storage Element 37:Full :VolumeTag=F01037L5
      Storage Element 38:Full :VolumeTag=F01038L5
      Storage Element 39:Full :VolumeTag=F01039L5
      Storage Element 40 IMPORT/EXPORT:Empty
      Storage Element 41 IMPORT/EXPORT:Empty
      Storage Element 42 IMPORT/EXPORT:Empty
      Storage Element 43 IMPORT/EXPORT:Empty

```

では、`mtx`コマンドを使って、磁気テープをスロットからドライブに移動してみましょう。「load」コマンドを使って、2番のスロットにある磁気テープを1番のドライブに移動してみます。

```bash
[root@localhost ~]# mtx -f /dev/sg10 load 2 1
Loading media from Storage Element 2 into drive 1...done
```

すると、2番のスロットが「Empty」に、1番のドライブが「Full」に変わったことがわかるかと思います。

```bash
[root@localhost ~]# mtx -f /dev/sg10 status
  Storage Changer /dev/sg10:4 Drives, 43 Slots ( 4 Import/Export )
Data Transfer Element 0:Full (Storage Element 1 Loaded):VolumeTag = E01001L4
Data Transfer Element 1:Full (Storage Element 2 Loaded):VolumeTag = E01002L4
Data Transfer Element 2:Empty
Data Transfer Element 3:Empty
      Storage Element 1:Empty
      Storage Element 2:Empty
      Storage Element 3:Full :VolumeTag=E01003L4
      Storage Element 4:Full :VolumeTag=E01004L4
      Storage Element 5:Full :VolumeTag=E01005L4
...
```

「unload」コマンドでドライブからスロットに磁気テープを戻すことができます。

```bash
[root@localhost ~]# mtx -f /dev/sg10 unload 2 1
Unloading drive 1 into Storage Element 2...done
[root@localhost ~]# mtx -f /dev/sg10 status
  Storage Changer /dev/sg10:4 Drives, 43 Slots ( 4 Import/Export )
Data Transfer Element 0:Full (Storage Element 1 Loaded):VolumeTag = E01001L4
Data Transfer Element 1:Empty
Data Transfer Element 2:Empty
Data Transfer Element 3:Empty
      Storage Element 1:Empty
      Storage Element 2:Full :VolumeTag=E01002L4
      Storage Element 3:Full :VolumeTag=E01003L4
      Storage Element 4:Full :VolumeTag=E01004L4
      Storage Element 5:Full :VolumeTag=E01005L4
...
```

# 磁気テープへのデータの読み書き方法
磁気テープにデータを読み書きするには、バックアップソフトを使う方法などがありますが、この記事ではtarコマンドを使った方法をご紹介します。まず、テープに書き込むファイルを用意してみます。

```bash
[root@localhost ~]# echo "hello world" > hello.txt
[root@localhost ~]# echo "hello hello" > hello2.txt
```

次に、磁気テープをドライブにロードし、ドライブに対して`tar`コマンドを発行してファイルをテープに書き込みます。私の環境では、指定するドライブのデバイス名は`lsscsi -g`コマンドにより出力される`/dev/st*`の方を指定する必要がありました。`tar`コマンドの`cvf`オプションで磁気テープにファイルを書き込むことができます。ファイルを追記するには`rvf`オプションを指定する必要があります。

```bash
[root@localhost ~]# mtx -f /dev/sg10 load 2 1
Loading media from Storage Element 2 into drive 1...done
[root@localhost ~]# tar cvf /dev/st1 hello.txt
hello.txt
[root@localhost ~]# tar rvf /dev/st1 hello2.txt
hello2.txt
```

磁気テープに書き込んだファイルの一覧を取得するには、`tar`コマンドの`tvf`オプションを使います。

```bash
[root@localhost ~]# tar tvf /dev/st1
-rw-r--r-- root/root        12 2016-11-01 00:57 hello.txt
-rw-r--r-- root/root        12 2016-11-01 00:57 hello2.txt
```

さて、磁気テープからファイルを復元してみましょう。復元先のディレクトリを用意し、そこにテープからファイルを読み戻してみます。

```bash
[root@localhost ~]# mkdir restore
[root@localhost ~]# cd restore
[root@localhost restore]# tar xvf /dev/st1 hello.txt
hello.txt
[root@localhost restore]# tar xvf /dev/st1 hello2.txt
hello2.txt
[root@localhost restore]# cat hello.txt
hello world
[root@localhost restore]# cat hello2.txt
hello hello
```

磁気テープに書き込んだファイルが復元できたことが確認できました。

# おわりに
以上が、mhVTLによるテープライブラリの操作方法のご紹介です。テープの管理に`mtx`コマンド、データの読み書きに`tar`コマンドを使っており、テープライブラリの管理が煩雑に思えるかもしれません。しかし、例えば[Spectrum Archive Library Edition](http://www-03.ibm.com/systems/storage/tape/ltfs-le/)のようなソフトウェアを用いると、ファイルシステムを扱うようにテープライブラリに保管したデータを操作することができます。

今後、データの量が増えると、いつか職場でテープライブラリの管理を任される日が来るかもしれません。テープライブラリの管理者に任命されたときは、ぜひこの記事を思い出してmhVTLで操作方法を練習してみてください。