秒速でRAM Diskを作成する

この記事はピョッコリンアドベントカレンダーのために書かれたものです。

サマリ

LIOでループバックのRAM Diskを作成する。

はじめに

書くネタがだいぶ苦しくなってきたので、特に意味もなくRAM Diskの作り方について書きます。

そもそもRAM Diskとは何か

DRAM(要はメモリ)を一部確保して、HDDやSSDのごとく使えるようにしたものです。 SSDがいくら速いと言っても、メモリにはもちろん勝てないです。 最近のマシンはメモリを山ほど積んでるので、一部切り取って、 何かのキャッシュ置き場として使うといいのでは感があります。

Windowsだとなんかわけわからんドライバやら入れないといけないのでは、というところですが、 Linuxだとまあ文字通りあっという間にできます。

想定環境

必要なもの

LIOがあれば万事OK。 ビルドは結構大変なので以下のコマンドで入れます。

$ sudo apt install targetd --install-recommends

作り方

targetdをインストールすると、targetcliというある種のシェル的なものが使えるようになります。 targetcliを使うとRAM Diskを作ることができます。

targetcliを起動してみます。何かまあプロンプトが出ますね。

$ sudo targetcli
targetcli GIT_VERSION (rtslib GIT_VERSION)
Copyright (c) 2011-2013 by Datera, Inc.
All rights reserved.
/> 

lsをたたいてみましょう。いろいろ出てきましたね。 LIOはフロントエンド(ユーザがI/OするためのI/F。/dev/sdXとかそういうの)と、 backstores以下のバックエンド(ユーザのI/Oを実際に受けるところ)に分かれています。 今回は、フロントエンドにloopback(自分のサーバ内でのみ有効な/dev/sd何とかに見せる)、 バックエンドにbackstores/rd_mcp(要はRAM Disk)を選びます。

/> ls
o- / ................................................................. [...]
  o- backstores ...................................................... [...]
  | o- fileio ........................................... [0 Storage Object]
  | o- iblock ........................................... [0 Storage Object]
  | o- pscsi ............................................ [0 Storage Object]
  | o- rd_dr ............................................ [0 Storage Object]
  | o- rd_mcp ........................................... [0 Storage Object]
  o- ib_srpt ................................................... [0 Targets]
  o- iscsi ..................................................... [0 Targets]
  o- loopback .................................................. [0 Targets]
  o- qla2xxx ................................................... [0 Targets]
  o- tcm_fc .................................................... [0 Targets]
/> 

まずはバックエンド部分を作ります。ってもコマンド1発です。 今回は、ramdiskという名前の1GBのRAM Diskを作りました。

/> /backstores/rd_mcp create name=ramdisk size=1G
Generating a wwn serial.
Created rd_mcp ramdisk ramdisk with size 1G.
/> ls
o- / ................................................................. [...]
  o- backstores ...................................................... [...]
  | o- fileio ........................................... [0 Storage Object]
  | o- iblock ........................................... [0 Storage Object]
  | o- pscsi ............................................ [0 Storage Object]
  | o- rd_dr ............................................ [0 Storage Object]
  | o- rd_mcp ........................................... [1 Storage Object]
  |   o- ramdisk ..................................... [ramdisk deactivated]
  o- ib_srpt ................................................... [0 Targets]
  o- iscsi ..................................................... [0 Targets]
  o- loopback .................................................. [0 Targets]
  o- qla2xxx ................................................... [0 Targets]
  o- tcm_fc .................................................... [0 Targets]
/> 

バックエンドを作っただけではアクセスできないので、ramdiskのステータスは dactivatedになっています。では、フロントエンドを作りましょう。 こちらも同じくコマンド1発・・・とはいかなくて、2発叩き込む必要があります。 タブキーで補完が効くので、あまり面倒ではないです。作業自体はこれで完了です。

/> /loopback create
Created target naa.60014053e8e7b899.
/> /loopback/naa.60014053e8e7b899/luns create /backstores/rd_mcp/ramdisk 
Selected LUN 0.
Successfully created LUN 0.
/> ls
o- / ................................................................. [...]
  o- backstores ...................................................... [...]
  | o- fileio ........................................... [0 Storage Object]
  | o- iblock ........................................... [0 Storage Object]
  | o- pscsi ............................................ [0 Storage Object]
  | o- rd_dr ............................................ [0 Storage Object]
  | o- rd_mcp ........................................... [1 Storage Object]
  |   o- ramdisk ....................................... [ramdisk activated]
  o- ib_srpt ................................................... [0 Targets]
  o- iscsi ..................................................... [0 Targets]
  o- loopback ................................................... [1 Target]
  | o- naa.60014053e8e7b899 ......................... [naa.6001405ec6fd7aef]
  |   o- luns ...................................................... [1 LUN]
  |     o- lun0 ................................. [rd_mcp/ramdisk (ramdisk)]
  o- qla2xxx ................................................... [0 Targets]
  o- tcm_fc .................................................... [0 Targets]
/> 

さて、lsscsiでチェックしてみましょう。僕の環境では/dev/sdcに見えていますね。 lsscsiがない人はaptで入れましょう。

$ lsscsi
()
[10:0:1:0]   disk    LIO-ORG  RAMDISK-MCP      4.0   /dev/sdc 

見えない場合は、以下コマンドでディスクをリスキャンしてみましょう。

#!/bin/bash

for i in /sys/class/scsi_host/*
do
  echo "- - -" > $i/scan
done

さて、試しにinquiryを投げつけてみましょう。 inquiryとは、SCSIというDiskとやりとりするためのプロトコルで定義されているコマンドで、 Diskのベンダやら種類やらを知るためのものです。

何かいろいろ出てきましたが、 Product identificationがRAMDISK-MCPになっていて、確かにRAM Diskぽいということがわかりますね。 これでSSDより圧倒的に速いDiskを手に入れることができました。

$ sudo sg_inq /dev/sdc   
standard INQUIRY:
  PQual=0  Device_type=0  RMB=0  version=0x05  [SPC-3]
  [AERC=0]  [TrmTsk=0]  NormACA=0  HiSUP=0  Resp_data_format=2
  SCCS=1  ACC=0  TPGS=3  3PC=1  Protect=0  [BQue=0]
  EncServ=0  MultiP=0  [MChngr=0]  [ACKREQQ=0]  Addr16=0
  [RelAdr=0]  WBus16=0  Sync=0  Linked=0  [TranDis=0]  CmdQue=1
    length=36 (0x24)   Peripheral device type: disk
 Vendor identification: LIO-ORG 
 Product identification: RAMDISK-MCP     
 Product revision level: 4.0
 Unit serial number: 7539e091-7407-4637-8edc-f8d4a531c92b

使う分にはあまり関係ないですが、このRAM Disk、 SATAではなくてSASディスクとして見えているようですね。

$ sudo sg_inq -i /dev/sdc
VPD INQUIRY: Device Identification page
  Designation descriptor number 1, descriptor length: 20
    designator_type: NAA,  code_set: Binary
    associated with the addressed logical unit
      NAA 6, IEEE Company_id: 0x1405
      Vendor Specific Identifier: 0x7539e0917
      Vendor Specific Identifier Extension: 0x40746378edcf8d4a
      [0x60014057539e091740746378edcf8d4a]
  Designation descriptor number 2, descriptor length: 61
    designator_type: T10 vendor identification,  code_set: ASCII
    associated with the addressed logical unit
      vendor id: LIO-ORG
      vendor specific: RAMDISK-MCP:7539e091-7407-4637-8edc-f8d4a531c92b
  Designation descriptor number 3, descriptor length: 8
    transport: Serial Attached SCSI Protocol (SPL-2)
    designator_type: Relative target port,  code_set: Binary
    associated with the target port
      Relative target port: 0x1
  Designation descriptor number 4, descriptor length: 8
    transport: Serial Attached SCSI Protocol (SPL-2)
    designator_type: Target port group,  code_set: Binary
    associated with the target port
      Target port group: 0x0
  Designation descriptor number 5, descriptor length: 8
    designator_type: Logical unit group,  code_set: Binary
    associated with the addressed logical unit
      Logical unit group: 0x0
  Designation descriptor number 6, descriptor length: 36
    transport: Serial Attached SCSI Protocol (SPL-2)
    designator_type: SCSI name string,  code_set: UTF-8
    associated with the target port
      SCSI name string:

さいごに

LIOを使うとRAM Diskが簡単にできちゃうわけですが、 /dev/shm/以下もRAM Disk扱いになっているので、別に無理に作る必要はない。