テープはロマン。人生で一度は使っておきたい装置です。テープドライブはクッソ高いうえに遅いし、一般のご家庭のバックアップ用ならHDDの方が圧倒的に優れています。でもなぜか惹かれるのがテープ。今回はそんな夢のデバイス、テープ装置を使ってみました。

※ブログ主はテープ装置についての知識がありません。この記事に書いたノウハウ(特にコマンド関係)はほとんどがChatGPTによるものです。

今回使用した機材

テープドライブは買うと100万とかそうゆう単位なので普通は手が出せませんが、中古だと結構安いものが出回っています。現在出回っているものはLTOというタイプのものが主流で、LTO-1からLTO-10までの世代があります。LTO-1の容量は圧縮時で200GB、最新のLTO-10は圧縮時で100TBです。遊ぶだけならLTO-1でいいじゃん、とか思ったのですが、調べてみると遊ぶならLTO-5以降が面白いようです。

LTO-5は圧縮時の容量が3TB、転送速度は圧縮時で280MB/sです。なぜLTO-5がいいかというと、LTO-5以降がLTFSに対応しているからです。LTFSが使えると、ext4とかzfsみたいなファイルシステムのように普通にファイルを操作する感覚でテープの読み書きができるからです。

こちらが今回入手したLTO-5対応のテープドライブ。インターフェースはSASです。左がテープのカートリッジです。5インチベイサイズのドライブを選びました。SASのドライブはSATAには繋がらないので、別途SAS HBAカードが必要です。

こちらがSAS HBAカード LSI 9300-16iです。16ポートのSAS/SATAポートがあります。ちなみにアホみたいに発熱します。この拡張カードにはSFF-8644コネクタが4個あり、SFF-8643ケーブルを使ってドライブと接続します。

こちらがミニSAS SFF-8643 to SAS 29ピン SFF-8482変換ケーブルです。1本で4つのSASポートに接続できます。電源は別途接続が必要です。

Ubuntu 24で使う

デバイスをPCに接続したら認識するか確認してみましょう。

デバイスの認識

まずはSAS HBAから。

kaz@ubuntu-atx:~$ lspci
85:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS3008 PCI-Express Fusion-MPT SAS-3 (rev 02)
87:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS3008 PCI-Express Fusion-MPT SAS-3 (rev 02)
kaz@ubuntu-atx:~$ lspci -s 85:00.0 -vv
85:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS3008 PCI-Express Fusion-MPT SAS-3 (rev 02)
       	Subsystem: Broadcom / LSI SAS 9300-16i
       	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
       	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
       	Latency: 0, Cache Line Size: 64 bytes
       	Interrupt: pin A routed to IRQ 16
       	IOMMU group: 24
       	Region 0: I/O ports at 4000 [size=256]
       	Region 1: Memory at b8300000 (64-bit, non-prefetchable) [size=64K]
       	Expansion ROM at b8200000 [disabled] [size=1M]
       	Capabilities: <access denied>
       	Kernel driver in use: mpt3sas
       	Kernel modules: mpt3sas

LSI SAS 9300-16iは認識してますね。次は必要なツールをインストールしていきます。

$ sudo apt install lsscsi sg3-utils mt-st

テープドライブが認識しているか見てみましょう。

kaz@ubuntu-atx:~$ lsscsi -g
[0:0:0:0]    tape    HP       Ultrium 5-SCSI   Z39D  /dev/st0   /dev/sg0
[N:0:1:1]    disk    BC711 NVMe SK hynix 256GB__1               /dev/nvme0n1  -

Ultrium 5-SCSIと出てますね。デバイスファイルは以下のものが作られていました。

kaz@ubuntu-atx:~$ ll /dev/st*
crw-rw---- 1 root tape 9,  0  6月 28 08:07 /dev/st0
crw-rw---- 1 root tape 9, 96  6月 28 08:07 /dev/st0a
crw-rw---- 1 root tape 9, 32  6月 28 08:07 /dev/st0l
crw-rw---- 1 root tape 9, 64  6月 28 08:07 /dev/st0m

kaz@ubuntu-atx:~$ ll /dev/nst*
crw-rw---- 1 root tape 9, 128  6月 28 08:07 /dev/nst0
crw-rw---- 1 root tape 9, 224  6月 28 08:07 /dev/nst0a
crw-rw---- 1 root tape 9, 160  6月 28 08:07 /dev/nst0l
crw-rw---- 1 root tape 9, 192  6月 28 08:07 /dev/nst0m

kaz@ubuntu-atx:~$ ll /dev/sg*
crw-rw---- 1 root tape 21, 0  6月 28 08:07 /dev/sg0

st0, nst0, sg0 という3種類のデバイスファイルが出てきました。何が違うのかわからないのでChatGPTに聞いてみました。
st0 : 自動巻き戻し。操作後に巻き戻る。
nst0 : 巻き戻しされない。基本はこちらを使う。
sg0 : SCSIデバイスにコマンドを送るときに使う。

基本的なテープ操作

テープの状態確認。(テープなし時)

kaz@ubuntu-atx:~$ sudo mt -f /dev/nst0 status
SCSI 2 tape drive:
File number=-1, block number=-1, partition=0.
Tape block size 0 bytes. Density code 0x0 (default).
Soft error count since last status=0
General status bits on (50000):
 DR_OPEN IM_REP_EN

テープを入れてもう一度同じコマンドを実行してみます。ガチャン、カコカコッ、ウィーン。うわぁ~~かっこいい!!

kaz@ubuntu-atx:~$ sudo mt -f /dev/nst0 status
SCSI 2 tape drive:
File number=0, block number=0, partition=0.
Tape block size 0 bytes. Density code 0x58 (LTO-5).
Soft error count since last status=0
General status bits on (41010000):
 BOT ONLINE IM_REP_EN

基本的なコマンド

# 巻き戻し
sudo mt -f /dev/nst0 rewind

# アンロード / イジェクト
sudo mt -f /dev/nst0 offline
# または
sudo mt -f /dev/nst0 eject

# テープ終端へ移動
sudo mt -f /dev/nst0 eod

得体の知れないジャンク保証なしの中古品でしたが無事に動きました。

LTFSのインストール

続いてテープの読み書きを実践してみましょう。今回はLTFSを使用しますがUbuntuには標準で入ってはいません。通常はテープドライブのメーカーが使うソフトウェアを使用するそうですが、なんか面倒そうなので LinearTapeFileSystem/ltfs を使用することにしました。

まずはじめに開発環境をインストールしていきます。

sudo apt update
sudo apt install \
  git build-essential autoconf automake libtool pkg-config \
  libfuse-dev fuse \
  libxml2-dev uuid-dev libicu-dev libsnmp-dev \
  mt-st lsscsi sg3-utils

ltfsのリポジトリをクローンしてコンパイルします。

git clone https://github.com/LinearTapeFileSystem/ltfs.git
cd ltfs
git submodule update --init --recursive
./autogen.sh
./configure
    :
checking for icu >= 0.21... no
configure: error: Package requirements (icu >= 0.21) were not met:
Package 'icu', required by 'virtual:world', not found

おっと、configureでエラーになってしまいました。いろいろやっても解決せず、以下の方法でなんとかなりました。

mkdir -p ~/pkgconfig

printf '%s\n' \
'Name: icu' \
'Description: ICU compatibility alias for LTFS configure' \
'Version: 74.2' \
'Cflags:' \
'Libs: -licui18n -licuuc -licudata' \
> ~/pkgconfig/icu.pc

export PKG_CONFIG_PATH="$HOME/pkgconfig:$PKG_CONFIG_PATH"

pkg-config --modversion icu
# 74.2と出る

もう一度configureしてみます。

make distclean 2>/dev/null || true
./autogen.sh
./configure

今度は大丈夫ですね。makeしてインストールします。

make -j"$(nproc)"
sudo make install
sudo ldconfig
kaz@ubuntu-atx:~/ltfs$ ltfs --version
LTFS version 2.4.8.4 (Prelim).
LTFS Format Specification version 2.4.0.

kaz@ubuntu-atx:~/ltfs$ mkltfs --version
mkltfs version 2.4.8.4 (Prelim).
LTFS Format Specification version 2.4.0.

無事インストールされました!

LTFSでファイルの操作をする

これでやっとテープを読み書きする準備が整いました。さっそくファイルを操作してみましょう。

まずは状態を確認

kaz@ubuntu-atx:~/ltfs$ lsscsi -g
[0:0:0:0]    tape    HP       Ultrium 5-SCSI   Z39D  /dev/st0   /dev/sg0
[N:0:1:1]    disk    BC711 NVMe SK hynix 256GB__1               /dev/nvme0n1  -

kaz@ubuntu-atx:~/ltfs$ sudo mt -f /dev/nst0 status
SCSI 2 tape drive:
File number=0, block number=0, partition=0.
Tape block size 0 bytes. Density code 0x58 (LTO-5).
Soft error count since last status=0
General status bits on (41010000):
 BOT ONLINE IM_REP_EN

kaz@ubuntu-atx:~/ltfs$ sudo ltfs -o device_list
6bbd LTFS14000I LTFS starting, LTFS version 2.4.8.4 (Prelim), log level 2.
6bbd LTFS14058I LTFS Format Specification version 2.4.0.
6bbd LTFS14104I Launched by "ltfs -o device_list".
6bbd LTFS14105I This binary is built for Linux (x86_64).
6bbd LTFS14106I GCC version is 13.3.0.
6bbd LTFS17087I Kernel version: Linux version 6.17.0-35-generic (buildd@lcy02-amd64-079) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #35~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 19:30:42 UTC 2 i386.
6bbd LTFS17089I Distribution: DISTRIB_ID=Ubuntu.
6bbd LTFS17089I Distribution: PRETTY_NAME="Ubuntu 24.04.4 LTS".
6bbd LTFS17085I Plugin: Loading "sg" tape backend.
Tape Device list:.
Device Name = /dev/sg0 (0.0.0.0), Vendor ID = HP      , Product ID = Ultrium 5-SCSI  , Serial Number = HU1129HENG, Product Name =[Ultrium 5-SCSI].

この場合、LTFSでは/dev/st0ではなく、/dev/sg0を使うそうです。

テープをLTFSでフォーマット。この中古のLTO-5テープはフォーマット済みだったので、-f オプションでフォーマットを強制しています。ちなみに–no-compressionオプションを付けると非圧縮モードになるそうです。通常はデフォルトで圧縮モードです。

$ sudo mkltfs -d /dev/sg0 -f
    :
LTFS15019I Volume capacity is 1516 GB.
LTFS30205I MODESENSE (0x5a) returns -20501.
LTFS30263I MODESENSE returns Invalid Field in CDB (-20501) /dev/sg0.
LTFS15024I Medium formatted successfully.

フォーマットできました!ファイルシステムにマウントしてみましょう。

sudo mkdir -p /mnt/ltfs
sudo ltfs -o devname=/dev/sg0 /mnt/ltfs

マウントできました。

kaz@ubuntu-atx:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           1.6G  2.6M  1.6G   1% /run
/dev/nvme0n1p2  233G   12G  210G   6% /
tmpfs           7.6G     0  7.6G   0% /dev/shm
tmpfs           5.0M  8.0K  5.0M   1% /run/lock
efivarfs        192K  140K   48K  75% /sys/firmware/efi/efivars
/dev/nvme0n1p1  1.1G  6.2M  1.1G   1% /boot/efi
tmpfs           1.6G  120K  1.6G   1% /run/user/1000
ltfs:/dev/sg0   1.4T     0  1.4T   0% /mnt/ltfs

1.4TBで認識してますね。何か書き込んでみましょう。テープドライブでは大量の細かい不向きということなので、大きなファイルを1個書いてみます。

kaz@ubuntu-atx:~$ dd if=/dev/urandom of=test-1g.bin bs=1M count=1024
kaz@ubuntu-atx:~$ cp test-1g.bin /mnt/ltfs/.

書けたかな?

kaz@ubuntu-atx:~$ ll /mnt/ltfs/
合計 1048580
drwxrwxrwx 2 kaz  kaz           0  6月 28 10:50 ./
drwxr-xr-x 3 root root       4096  6月 28 10:45 ../
-rwxrwxrwx 1 kaz  kaz  1073741824  6月 28 10:50 test-1g.bin*

アンマウントして一旦テープを取り出してみます。

kaz@ubuntu-atx:~$ sudo umount /mnt/ltfs
kaz@ubuntu-atx:~$ sudo mt -f /dev/nst0 eject
/dev/nst0: Input/output error

なんかエラー出た。テープドライブが動いているときに実行したからなのか、音が止まってからもう一度やったらイジェクトできました。もう一度マウントして、ファイルが読めるかチェックしてみます。

kaz@ubuntu-atx:~$ sudo ltfs -o devname=/dev/sg0 /mnt/ltfs

kaz@ubuntu-atx:~$ ll /mnt/ltfs/
合計 1048580
drwxrwxrwx 2 kaz  kaz           0  6月 28 10:50 ./
drwxr-xr-x 3 root root       4096  6月 28 10:45 ../
-rwxrwxrwx 1 kaz  kaz  1073741824  6月 28 10:50 test-1g.bin*

kaz@ubuntu-atx:~$ cat /mnt/ltfs/test-1g.bin >/dev/null

kaz@ubuntu-atx:~$ od -tx1z -N 256 /mnt/ltfs/test-1g.bin
0000000 31 f8 94 7a d4 59 2e 5d 49 df e8 99 1f 1d 5a 2e  >1..z.Y.]I.....Z.<
0000020 d3 21 87 a9 4a da e4 32 09 d5 10 1c 95 e7 f1 8a  >.!..J..2........<
    :
0000340 4c 0d 4e 42 a2 0a 2b 69 f3 6d c0 97 f8 2e ff ef  >L.NB..+i.m......<
0000360 af 3b ea a1 a6 2b f5 e2 8e 58 c8 49 67 d1 3c 81  >.;...+...X.Ig.<.<

キュイーン、キュイーンといって動いてます。かっこいい!

最後に書き込みピードを測定してみたいと思います。10GBのファイルを書き込んでみました。

kaz@ubuntu-atx:~$ time (dd if=/dev/urandom of=/mnt/ltfs/test-10g.bin bs=1M count=10240; sync)
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 92.9369 s, 116 MB/s

real   	1m32.942s
user   	0m0.006s
sys    	0m19.649s

書き込み速度は 110MB/s くらいのようです。LTO-5は圧縮時の転送速度は280MB/s、非圧縮時の転送速度は140MB/sとのことですが、このファイルはランダムデータなので圧縮率は極めて悪いでしょう。そう考えると少し遅いものの妥当な値ですね。

読み込みスピードもみてみましょう。キャッシュをクリアするために一旦アンマウントして再マウントします。

sudo umount /mnt/ltfs
sudo ltfs -o devname=/dev/sg0 /mnt/ltfs
kaz@ubuntu-atx:~$ ll /mnt/ltfs/
合計 11534340
drwxrwxrwx 2 kaz  kaz            0  6月 28 11:03 ./
drwxr-xr-x 3 root root        4096  6月 28 10:45 ../
-rwxrwxrwx 1 kaz  kaz  10737418240  6月 28 11:05 test-10g.bin*
-rwxrwxrwx 1 kaz  kaz   1073741824  6月 28 10:50 test-1g.bin*
kaz@ubuntu-atx:~$ time cat /mnt/ltfs/test-10g.bin > /dev/null

real   	1m39.005s
user   	0m0.010s
sys    	0m2.373s

読み込み速度は 103MB/s くらいでした。テープが巻き戻ったり純粋な読み書き以外の時間もあるので、結構カチャカチャ、キュイーンが長いです。

最後に

いやぁ~、テープはかっこいい!こうなってくるとテープローダーも欲しくなりますね。さすがに遊びで使うには中古でも高いので、もっと実用的なレベルで考えるとLTO-7 (15TB)やLTO-8 (30TB)あたりがいいと思います。

世代別の容量一覧(WikiPediaより)

世代非圧縮時圧縮時価格(Amazon)TB単価
LTO-51.5TB3.0TB7,378円4,919円
LTO-62.5TB6.25TB8,265円3,306円
LTO-76TB15TB13,398円2,233円
LTO-812TB30TB14,882円1,240円

HDD価格が高騰している現在ではHDDへのバックアップは割高に感じますが、現在の価格では10TBクラスの最安が 4,290円/TB、20TBクラスの最安だと 3,998円/TBです。これを見るとやはりテープの方がコスト面では安いですね。

ただLTO-7の非圧縮転送速度(ドライブの素の能力)は300MB/sでLTO-10になっても400MB/s止まりです。これはこのサイズのテープでの物理的限界なんでしょう。読み書きにもの凄い時間がかかる、テープの先頭にあるファイルにアクセスするには巻き戻す必要がある、ということを考えると、主にテープは次のような使い方になるでしょう。

・追加書き込みのみ(削除や編集はしない)
・基本的に読まないデータ(バックアップ用)
・夜間のバッチ処理

なかなか使いどころが難しいデバイスではありますが、そんなことは気にせず、大切なのはロマンです。テープで遊びましょう!