※本記事は OpenShift Virtualization アドベントカレンダーの 8 日目の記事です。
皆さんこんにちは、OpenShift Virtualization とストレージを生業にしている Red Hat のうつぼ(宇都宮)です。
アドベントカレンダーも 1/3 くらいになって、いい具合に個人的にネタ切れ感が襲ってきました。いくらでも書くべきことや問われることはあるはずなんですが、いざ記事にしようと思うと浮かんでこない。
こないだのブラックフライデーでも、セールが始まる前には「これ今じゃなくてブラックフライデーで買おう」と何回も思ったんですが、いざセールが始まると「俺は何がほしかったんだっけ」となって呆然としました。
覚えてないってことは結局そんなに欲しいものじゃなかったってことですかね。欲を抑えて合理的に生きるというのはなかなか難しいものです。非合理でも刹那的に生きよう。
ということで今日のテーマはディスクの種類です。
Virt で VM を作成する際には必ずディスクが必要になります。VM で利用できる仮想ディスクには タイプ と インターフェース を指定します。それぞれに種類があってこれらを組み合わせます。
本稿では、主要な仮想ディスクのタイプとインターフェース、それぞれの特徴について紹介します。

仮想ディスクのタイプ
OpenShift Virtualization において、仮想ディスクとして設定できる主要なタイプは以下の2種類です。
Disk(一般的な仮想ディスク)
- 特徴: VM が利用する一般的な仮想ディスク形式です。Storage Class に PVC を作ることで CSI plugin によってストレージシステムで動的にプロビジョニングされた領域(ブロックデバイスまたはファイル・システム)にディスクが作られることが大半です。
- 用途: ほとんどの OS 用のルートディスク、アプリケーションデータ用ディスクなど、標準的な仮想化環境内で仮想ディスクを作る場合に適しています。大抵はこれでよいです。
LUN(Logical Unit Number)
- 特徴: 基盤となるストレージで切った論理ボリューム(Logical Volume とか Logical Drive とかいろんな言い方があります)を VM に直接ブロックデバイスとして見せる特殊な形式です。ストレージの特性(例:高度なストレージ機能、低遅延)を活かしやすくなります。
- 用途: かなり高速な I/O 性能が求められるデータベースや、ストレージの機能(Snapshot, Clone, QoS 等)を VM 側ではなくストレージ側で管理したい場合など、特定のワークロードで使われます。vSphere の RDM(Raw Device Mapping)と同じイメージで構いません。
もう一つ CD-ROM というタイプがありますが、これはちょっと仮想ディスクとは毛色が違うのでここでは省きます。
仮想ディスクのインターフェース
仮想ディスクを VM に接続するインターフェースは以下の3種類があります。
VirtIO
- 特徴: KVM/QEMU 環境で最高の I/O 性能を発揮するために設計された、準仮想化インターフェースです。ホスト OS とゲスト OS 間で効率的に通信し、仮想化による性能オーバーヘッドを最小限に抑えることができます。
- 用途: 概ね全てのワークロードで使える形式で、OpenShift Virtualization における標準的かつ推奨されるインターフェースです。Linux VM からは /dev/vdX というデバイス名で見えます。
SCSI
- 特徴: 仮想化環境以外でも広く普及しているインターフェースで、多くのOSでサポートされています。1つの SCSI バスに複数のデバイスをぶら下げるため、多くのディスクを同時に接続できたり、SCSI コマンドが話せるを使えるなど、エンタープライズ環境で求められる機能を提供します。仮想化環境では、通常、
virtio-scsiという準仮想化ドライバでエミュレートされます。 - 用途: ストレージと SCSI で話す場合に使います。複数 VM でクラスタリングする場合に SCSI-3 Persistent Reserve に対応する共有ディスクとして使う場合や、先の LUN タイプで仮想化環境外の論理ボリュームを直接見せる場合、ゲスト OS 上で直で SCSI UNMAP などの SCSI コマンドを打ちたい場合などで使います。Linux VM からは /dev/sdX というデバイス名で見えます。
SATA
- 特徴: 比較的古い規格であり、主に CD-ROM や古いストレージデバイスのエミュレーションで使います。完全仮想化のインターフェースで、オーバーヘッドのため他と比べて I/O 性能は劣ります。
- 用途: 対応する VirtIO ドライバがない古い OS のディスクや、特定の互換性要件がある場合にのみ使用されます。
タイプとインターフェースの組み合わせ
大半の用途では 3 つ、または 4 つで事足ります。 特別な理由がない限りは、まずは VirtIO Disk の組み合わせを第一選択としておくのがよいでしょう。
| 仮想ディスクの種類 | タイプ | インターフェース | 適した用途 |
|---|---|---|---|
| VirtIO Disk | Disk | VirtIO | ほとんどの用途で安定して使え、大抵はこれで OK 大丈夫。 |
| SCSI Disk | Disk | SCSI | SCSI3-PR 対応の共有ディスクとして使う場合や、大量に仮想ディスクを接続する場合。 |
| SCSI LUN | LUN | SCSI | 外部ストレージの LUN を直接アタッチしたい場合。 |
| SATA Disk | Disk | SATA | VirtIO ドライバがない古い OS 向けのみ。 |
まとめ(と言いつつブツブツ言う)
普通の VM ディスクの用途としては、VirtIO Disk, SCSI Disk のどちらかを使えばほとんどの場合 OK です。
DB のテーブル領域とか低レイテンシが欲しい領域で、今は vSphere の RDM で使ってる、という場合は SCSI LUN です。
物理互換モードの RDM だったら、そのまま vSphere から外して SCSI LUN としてアタッチできると思います。これはやってみて次回以降に報告しようと思います。
VirtIO (virtio-blk) も SCSI (virtio-scsi) もどちらも準仮想化インターフェースです。前者はブロックデバイスを仮想化するコントローラで、後者は SCSI インターフェースを仮想化するコントローラです。
virtio-blk はこれ自身が PCI 直のデバイスとして扱われますが、virtio-scsi は PCI に乗った SCSI コントローラ として扱われます。
例として適しているかはわからないですが、virtio-blk は PCI スロットに直挿しする SSD で、virtio-scsi は PCI スロットに挿す RAID コントローラみたいな感じです。
こうすると、virtio-scsi のほうが構成の自由度は高いと感じやすいかなと思います。実際 virtio-scsi だと数百のディスクを付けることができます。
さらに SCSI コマンドが使えるので、制御も行いやすい。やる人居ないと思うけど、テープとかまで繋げられるんじゃないかな。
しかし、性能においては VirtIO の方が SCSI レイヤーを噛まさず直で繋ぐので VirtIO の方がレイテンシは小さいです。
ただこれは理論的な話であって、現実的にはほとんど気にならない程度の性能差じゃないの?とか思います。
もしそうだったら SCSI Disk の方がいいですよね。デバイス名が sdX なんて嫌だ vdX じゃないと違和感で夜しか寝られない、みたいな人で無い限り SCSI を選ぶべきなのではとか思います。
次回以降に VirtIO Disk タイプと SCSI Disk タイプについて深堀りしていきたいと思います。
というわけで今日はここまで。