Slide 1

Slide 1 text

Linuxのブロックデバイス kanazawa.rb #127 LT Satoru Takeuchi twitter: satoru_takeuchi

Slide 2

Slide 2 text

Linuxのブロックデバイス ● 以下の特徴を持つデバイスのこと ○ ブロック単位でデータを読み書きする (最小単位は通常512バイト) ○ 「デバイス内のオフセット XX番からYYバイト読み出す」のようにランダムアクセス可能 ● 一般的にはHDDやSSDのようなディスクデバイスだと思えばいい ● 2つのコンポーネントが処理する ○ ブロック層: 全ブロックデバイスに共通の処理 ○ デバイスドライバ: 個々のデバイスに固有の処理

Slide 3

Slide 3 text

ユーザから見える部分との関係 ユーザ空間 カーネル空間 /dev/sda デバイスファイル ファイルシステム /dev/sdb プロセス 読み書き 読み書き ファイル ファイルシステム ブロック層 デバイスドライバ 物理世界 デバイスA デバイスB 対応 対応

Slide 4

Slide 4 text

ブロック層がやること ● ユーザ or ファイルシステムから依頼されたI/Oを効率的にデバイスに発行 ○ ハードウェアの特性を考慮して I/O発行前にI/Oの並び替えやマージを行う ● 先読み(readahead) ○ ある領域へのreadが発生したら、それに続く領域も先読みする ○ ある領域へのアクセス発生直後に近い領域へアクセスされる傾向にあるという経験則を利用

Slide 5

Slide 5 text

ブロックデバイスの種類(1/4) ● 物理ディスク ○ HDDやSSDのようなディスク ○ /dev/sdX(SCSIデバイス)、/dev/hdX(IDEデバイス), /dev/nvmeX(NVMe SSD)という名前 ■ iSCSIターゲットも/dev/sdXとして見える ● 仮想ディスク ○ VM上に存在する特殊なディスク ○ /dev/vdXという名前 ○ 実体はホストOS上のファイルイメージやディスク ○ 高速化のためにVMとホストOSとの間で特殊な通信をしている

Slide 6

Slide 6 text

ブロックデバイスの種類(2/4) ● ループデバイス ○ /dev/loopXという名前 ○ ファイルをデバイスとして扱うために使う ○ “mount test.iso /mnt”などによるisoイメージのマウントでは裏で loopデバイスを使う ● brd ○ マシンのメモリの一部をデバイスとして見せる ○ /dev/ramXという名前 /dev/loop0 ファイルシステム ファイル 対応 ユーザ空間 カーネル空間 物理世界 RAM(の一部) /dev/ram0 対応

Slide 7

Slide 7 text

ブロックデバイスの種類(3/4) ● 分散ストレージCephのブロックデバイス ○ /dev/rbdXという名前 ● ネットワークブロックデバイス ○ /dev/ndbXという名前 ○ ネットワーク上の任意のデータをブロックデバイスとして見せられる ユーザ空間 カーネル空間 物理世界 ネットワーク層 NIC /dev/rbd0 Cephクラスタ ディスクイメージ 対応

Slide 8

Slide 8 text

ブロックデバイスの種類(4/4) ● multiple device ○ 複数のブロックデバイスから 1つのブロックデバイスを構成 ○ /dev/mdXという名前 ○ RAID(mdraid)やmultipath deviceを実現 ● device mapper ○ 任意のものをブロックデバイスとして見せるしくみ ○ /dev/dmXという名前 ○ 詳細は後述 ユーザ空間 カーネル空間 /dev/sda /dev/sdb multiple device(md)層 /dev/md0 (1)束ねる /dev/sdaと/dev/sdbから 構成されるRAID1デバイス (2) 作る

Slide 9

Slide 9 text

device mapperの諸機能: dm-raid ● 複数のデバイスを指定すると、それらを使ってRAID構成のブロックデバイスを生成 ● mdraidと似通っているが別物 ユーザ空間 カーネル空間 /dev/sda /dev/sdb device mapper(dm)層 /dev/dm0 (1)束ねる (2) 作る /dev/sdaと/dev/sdbから 構成されるRAID1デバイス

Slide 10

Slide 10 text

device mapperの諸機能: dm-linear ● 複数のデバイスを指定すると、それらを順番につなぎ合わせたブロックデバイスを 生成 ● JBODのようなものと考えらればよい ユーザ空間 カーネル空間 /dev/sda (100GiB) /dev/sdb (100GiB) device mapper(dm)層 /dev/dm0 (1)束ねる (2) 作る /dev/sdaと/dev/sdbから構成される 200GiBのブロックデバイス オフセット100GiBより前へのアクセス: sdaへアクセス オフセット100GiB以降へのアクセス: sdbへアクセス

Slide 11

Slide 11 text

device mapperの諸機能: dm-flakey ● 指定したデバイスにリニアマップされたブロックデバイスを生成 ● 所定の条件でEIOを返すようにできる(疑似的にエラーを起こせる) ユーザ空間 カーネル空間 /dev/sda device mapper(dm)層 /dev/dm0 (2) 作る アクセスすると基本的には sdaにそのままアクセス 所定の条件を満たすと EIOを返す (1) 指定

Slide 12

Slide 12 text

device mapperの諸機能: LVM ● LVM(Logical Volume Manager, 論理ボリュームマネージャ) ● ボリューム管理ツール ● 3つの概念が存在する ○ PV(Physical Volume): 後述のVGを構成する1つ以上のブロックデバイス ○ VG(Volume Group): PVを束ねて作るボリュームグループ。ストレージプールを構成 ○ LV(Logical Volume): VGから好きなサイズを切り出せる ■ それぞれmdXと名前が付いたブロックデバイス ● 特徴 ○ 無停止のVG/LV拡張/縮小 ○ RAID組める ○ snapshot /dev/sda /dev/sdb /dev/sdc VG PV LV LV

Slide 13

Slide 13 text

device mapperの諸機能: dm-thin ● 特徴 a. ボリュームはシンプロビジョニング (実際にアクセスするまでディスク容量を消費しない )なのでディス ク利用効率が高い b. snapshotがLVMより優れている(LVMのsnapshotは採取後のI/O性能が極めて悪い傾向にある ) ● LVMの上に構築する ● しくみ 1. VGの上にthin poolと呼ばれる特別なLVを作る 2. thin pool内にthin volume(mdデバイス)を作る 3. thin volumeにアクセスされたらthin pool上のデータへのアクセスに変換 VG LV(thinpool) LV(thin volume) LV(thin volume) 1. 切り出し 2. 切り出し