Linux OSは日本国内の全てのシステムのなかで、シェアが80%以上と言われています。様々なデバイスに搭載されるLinuxの基本的な知識として、デバイス名のズレについて解説します。
長くエンジニアやってきた方でも、意外と知らなかったりするのがこのデバイス名がずれるという仕様。ぜひ押さえておいて頂ければと思います。
Linuxのディスクデバイス名
Linux OSにハードウェアが認識されると、/devファイルシステム配下にハードウェアのリンクファイルであるデバイスファイルが生成されます。今回はディスクの話をしますが、ネットワークアダプタやUSBポート、DVDドライブやCPUなどにもデバイスファイルが存在します。
/devディレクトリを参照すると、様々なデバイスパスが格納されていることがわかります。
Linuxをインストールすると、インストールディスクは/dev/sdaというデバイス名が設定されます。df コマンドを実行してると以下のように/dev/sdaというディスクがマウントされていることが分かります。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 102G 27G 70G 28% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
/dev/sda1 240M 36M 192M 16% /boot
$
df コマンドの結果を見ると、/dev/sda1というようにデバイス名の末尾に数字が振ってあります。これはパーティション番号を示します。下記の例では、「sdaという名称のディスクのパーティション1を/bootというマウントポイントにマウントしている」という意味です。
このデバイスパスはsd名と呼ばれます。sd名の命名規則は「/dev/sd」まで固定で、OSが認識したディスクごとにa〜zの文字列が振られます。ディスクが26本認識されたなら、sda、sdb、・・・、sdzと命名されます。
では27本目がどうなるかというと、sdaa になります。それ以降は、
sdab、sdac、・・・、sdaz、sdba、sdbb、・・・
と桁を増やして命名されます。
※ちなみにsdaaaと3桁まで振られたことを実環境で見たことがありますが、多くの場合は物理的に3桁が限界ではないかと思います。
Linuxのデバイスずれ
Linux OSに認識されたディスクのsd名は、OSが再起動するたびにズレる可能性があります。
下記の図を参照ください。sdbとして認識されていたディスクが、再起動後にはsdcと認識されることを表しています。
これはLinux OSのドライバソフトウェアがディスクを認識した順に従って番号を振るためです。システムディスクはOS起動時に認識済みのため、最初に認識されたデバイスとしてsdaが振られます。
その他のディスクに関しては、ドライバソフトウェアがディスクを認識する内部バス(ハードウェア的なアクセス経路)を認識した順序でデバイス番号を振ります。
例えば、システムディスクのほかにメモリダンプ出力用のディスクを認識している場合、そして、業務データ格納用に大容量のストレージ装置を接続していた場合がそれに当たります。(一般的なオンプレミス環境の基幹システムはこの構成を取ります)
なぜなら、メモリダンプ用のディスクと、ストレージ装置のディスクのいずれが先に認識されるかは、OS起動時のタイミング次第となるからです。メモリダンプがsdbになることもあれば、ある時はストレージ装置側のディスク(の先頭ディスク)がsdbとなることもあります。
ストレージ装置は一般的にアクセス経路が二つ以上に冗長化されますが、同一経路上のディスクデバイスは連番(sdb、sdc・・・)で認識されます。
デバイスずれ対策方法
ディスクのデバイス名がずれる事象は以下2通りで対策することが出来ます。
- udevデバイスパスを使用する
- マルチパス製品のデバイスパスを使用する
それぞれ解説します。
udevデバイスパスを使用する
Linuxカーネルの機能にudevというデバイス管理ツールがあります。
Wikipedia : udev
https://ja.m.wikipedia.org/wiki/Udev
デバイスずれ対策では、このudev機能を使用してディスクデバイスを示すことで、永続的、恒久的にディスクを指定することが出来ます。
/etc/fstab
ではデバイスパスとマウントポイントの紐付けを行いますが、このファイルで可変であるsd名を使ってしまうと、再起動のたびに異なるディスクがマウントされるという無茶苦茶なシステムが出来上がってしまうため、要注意です。
OSインストールによって自動的に/etc/fstab
に記載されるsdaは、初期でこのudevデバイスパスの一種、UUID(by-uuid)が用いられています。
下記の出力例でいう UUID=6e015357-8871-4d77-8529-b7c9cd2504ec
がUUIDに当たり、ディスクデバイスごとに固有の番号を有します。
udev機能によるデバイスパスは他にも、by-id、by-path がありますが、デバイスを操作するミドルウェアが主に使うのはby-idが多いようです。運用機能としてシェルスクリプトによるデバイス操作を行う場合も、by-idを使いましょう。scsi-<英数字>
を指定してください。
それぞれのパスの例は以下になります。
by-uuid : /dev/disk/by-uuid
by-id : /dev/disk/by-id
by-path : /dev/disk/by-path
以下のように、OS再起動によってsd名がずれたとしても、固有であるパス名を指定することで、ディスクデバイスを永続的に示すことができるってわけです。
マルチパス製品のデバイスパスを使用する
もうひとつのデバイスずれ対策は、マルチパスデバイスを指定する方法です。ストレージデバイスは一般的にこちらを使うことがほとんどでしょう。
以下のSAN(Storage Area Network)構成の図を例に説明します。
ストレージ装置のディスク接続には、サーバ側との経路をFCカードのポートを複数利用し、2経路以上とし、冗長構成(一本壊れても大丈夫な構成)とします。
このとき、図ではsdaとsddは同じ「DISK 1」を指します。同じディスクに対して、OSはsd名を二つ振ります。どちらを使っても同じディスクにたどり着き、データの書き込み、読み込み(I/O)を実行可能です。
図では、この二つのsd名をsddlmaaというデバイス名でひとまとめとしています。これがマルチパスデバイスです。このsddlmaaを使用してアクセスすると、マルチパスドライバソフトウェア(ディスクの経路を冗長化するソフト)の動作によって、適切な経路でディスクにアクセスします。
例えば、sdaに100回I/Oが実行されたら、もう片方のsddを使うようなロードバランスを自動的に行います。
そのため、再起動によって、いつズレるかも知らないsd名を使わずとも、マルチパスデバイスを使うことで「デバイスずれを意識することが、結果的にない」ということになります。
マルチパスデバイスはudev機能を使って冗長対象のディスクを認識しているため、実質的には先ほどと同じ対策をマルチパスドライバの内部で行われています。そのため、OSを再起動しても影響はありません。
ちなみにこのsddlmaa等のデバイス名は、日立製作所のDynamick Link Managerというマルチパスドライバソフトウェアを使った場合の名称です。
HITACHI | Dynamic Link Manager
https://www.hitachi.co.jp/products/it/storage-solutions/products/software/hsms/hdlm/index.html
ストレージ装置のベンダーごとにマルチパスドライバがありますが、ここの理論は同じです。富士通ならETERNUS Multipathドライバ、DELL EMCならPowerpath、といった具合に製品がありますが、扱いは同じです。
まとめ
復習すると、要点は以下の3点です。ぜひあなたのエンジニアリングの知識として頂ければ幸いです。
- /dev/sd**はOSを再起動すると変わる
- 対策はby-idなどのudevを使う
- マルチパスを使っているなら影響なし
ではまた。