秒速でRAM Diskを作成する
この記事はピョッコリンアドベントカレンダーのために書かれたものです。
サマリ
LIOでループバックのRAM Diskを作成する。
はじめに
書くネタがだいぶ苦しくなってきたので、特に意味もなくRAM Diskの作り方について書きます。
そもそもRAM Diskとは何か
DRAM(要はメモリ)を一部確保して、HDDやSSDのごとく使えるようにしたものです。 SSDがいくら速いと言っても、メモリにはもちろん勝てないです。 最近のマシンはメモリを山ほど積んでるので、一部切り取って、 何かのキャッシュ置き場として使うといいのでは感があります。
Windowsだとなんかわけわからんドライバやら入れないといけないのでは、というところですが、 Linuxだとまあ文字通りあっという間にできます。
想定環境
- Linux Mint 17.1 (Ubuntu 14.04 LTSベース)
- Kernel 3.13.0-37-generic
必要なもの
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扱いになっているので、別に無理に作る必要はない。