Disk & Volume雑記

(更新:2014/10)UUIDを使ったマウント
(作成:2012/02)

UUIDを使ったマウント

最近のLinuxは、ディスクのマウントに「UUID=ほげほげ」みたいな書き方してるのを良く見る。こりゃ一体何じゃろなーと思いつつ、これまで特に調べもせず放置していた。
調べた切っ掛けだけれど、最近VM上のLinuxにUSB HDDを起動時オートマウントするよう設定してて。いつもはUSB HDDの挿し口を固定してたんだけれど、先日ちょいと他所で使おうとした時に違うポートへ挿したら起動時マウントにコケてそのまま進まない、という残念な事が起きて。
これ回避したいなーと調べてた時の副産物として、このマウント方法を知ったのでメモ。

つまりUUIDて何よー、というのはUUID - Wikipediaを読むと良いんじゃないかな。簡単に言うと、128bitのユニークIDというだけのこと。ネットワークで言えば(厳密にはナンチャッテだけれど)MACアドレスみたいなもんで、対象を特定するためのIDとして利用できる。

で、それでディスクをマウントして何が楽しーの? ということになるけれど、つまりudevが接続された各種デバイスに対しUUIDとして一意なシンボリックリンク作ってくれるから、一度カーネルが認識したデバイスは以降見付け次第そのシンボリックリンクで参照できるよ、ということで。上記問題みたく、挿したポートが違うばかりに認識しない(内部的には以前と別のドライブとして認識)ということが少なくなる……ハズ。

まあ兎に角、こんな風に調べて。

$ ls -l /dev/disk/by-uuid/
...
lrwxrwxrwx 1 root root 10 10月 26 20:37 DE3C-37EA -> ../../sdb1
...

こんな風にfstabを書き換えるだけ。

# vi /etc/fstab
#/dev/sdb1 /media/nas vfat rw,users,defaults,iocharset=utf8,umask=000 0 0
UUID=DE3C-37EA /media/nas vfat rw,users,defaults,iocharset=utf8,umask=000 0 0

で、マウントテスト。OKだったら今後はそれでマウントすれば一応、違うポートに挿したが為に……という哀しみの螺旋から抜け出すことが出来る、ハズ。

HDDイメージをVM化

停電でPCが故障した……おかしいだろ常考。
とまあ嘆いていても仕方無いので、思いつくトラブル対応方法をまとめてみるテスト。

電源だけの故障ならHDDは生きてる。同スペックのPCがあればHDD交換で復活できるけれど、いっそ直接HDDからイメージ抽出してVM化したほうが後々楽でないかしらん、と思ったり思わなかったり。
この作業にはHDDに直接アクセスする方法が必要になります。「USB SATA 変換」とかでググれば色々出てくると思う。

で、手順。Ubuntu Desktopなら勝手にマウントして見せてくれるので、取り敢えずマウント情報を得る。

# mount
...
/dev/sdb3 on /media/_ type ext3 (rw,nosuid,nodev,uhelper=devkit)
/dev/sdb1 on /media/_boot type ext3 (rw,nosuid,nodev,uhelper=devkit)

例えばこんなん。判ったら下手なアクセスを防ぐためにアンマウント。で、ddでイメージ抽出。

# dd if=/dev/sdb of=/var/tmp/hogehoge.img

じっと待つ。出来上がったらqemuでイメージ変換。

# qemu convert /var/tmp/hogehoge.img -0 vmdk hogehoge.vmdk

LVMでSnapShotBackup

CentOSから持ってきたねた。LVM (Logical Volume Manager)なるディスク管理規格は、昨今のLinux OSでよく見かける。これを使うとLinuxでのディスク管理がものすごくステキになる。
例えばデータのバックアップを取りたい場合。MySQLなんかのデータは、必ずサービスを停止しないとデータが壊れる。けれど、バックアップ中ずっと停止してたら24H365Dサービスなんて出来ないわけで。
そこでLVM。まあえらく簡単な図で説明すると、こんな感じで管理が分かれている。


VolGroup(ボリュームグループ)というのがキモで、複数の物理ボリューム(/dev/hda1とか/dev/hda2とか)をまとめて取り扱っ てくれるもの。このVolGroup上にLogVol(論理ボリューム)を作り、それを従来のパーティションの代用として使う。しかも動的に。
で、上図のように物理ボリュームに対し論理ボリュームに空きがある場合、この領域をスナップショット・ボリュームとして使う事ができる。つまり、作業中 に変更の受けたデータをチャンク単位でスナップショット・ボリュームに保持し、実際のデータには変更を加えずにおくので、スナップショット中はデータ破損 の心配がなくバックアップすることができる。

スナップショット・ボリュームは、解放すれば保持していたデータを実データに適用してくれるので、バックアップ中も停止する事なく使い続けられる。

さて実際の操作。サーバへのLinuxインストール段階である程度論理ボリューム領域に空きを作っておくのが良いかと。例えばこんな感じ。

# vgdisplay 
  --- Volume group ---
  VG Name               VolGroup00
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  247
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               99.88 GB
  PE Size               32.00 MB
  Total PE              3196
  Alloc PE / Size       2992 / 93.50 GB
  Free  PE / Size       204 / 6.38 GB
  VG UUID               3fiEQq-1xd3-Bs2d-ayOc-KLE0-PGlD-BbaAbB

この例では、99.88GBあるうちの6.38GBを空き領域として確保しておいた。で、マウント状況がこんな感じだったとする。

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       15G  2.3G   12G  17% /
/dev/mapper/VolGroup00-LogVol02
                       76G  2.4G   70G   4% /var
/dev/sda1              99M   19M   75M  21% /boot
tmpfs                1006M     0 1006M   0% /dev/shm

/var/ 以下、例えば /var/www とか /var/lib/mysql とか、本来停止してからでなきゃバックアップできないものが盛り沢山。。。という時にLVMスナップショットを使うと素敵。

# lvcreate --snapshot --name snap-backup --size 5G /dev/VolGroup00/LogVol02
  Logical volume "snap-backup" created
# mount /dev/VolGroup00/snap-backup /mnt/

こうするとLVMスナップショットが働き、/mnt/ 以下で更新の発生しない実データを参照できる。思う存分バックアップできる。

バックアップを堪能したら、アンマウントしてスナップショット・ボリュームを解放してあげれば良い。

# umount /mnt/
# lvremove -f /dev/VolGroup00/snap-backup
  Logical volume "snap-backup" successfully removed

あら簡単。ちなみにMySQLをバックアップする際は、より安全性を考慮しLVMスナップショット作成する直前で FLUSH TABLES WITH READ LOCK; 、直後に UNLOCK TABLES; しておくと良い。

LVMで論理ボリューム拡張

CentOSから持ってきたねた。こんな図で表現してみるテスト。


どういう事かというと、つまり複数の物理ボリュームを合計して一つの論理ボリュームにすることができる。例えばVMware ESXiでVMFSのブロックサイズをデフォルトのまま設定しちゃった、とか……ウン解る方だけ解れば良いかな。256GB以上のディスクが作れない事を 知った時の絶望感といったら……

さて。そんなこんなで例えばVMware ESXiの[設定の編集]からハードディスクを沢山追加してゲストOSを再起動したとか、或いは普通のPCでもHDDを沢山購入してぶっ挿して再起動すると、OS上で複数のストレージ・デバイスが認識される。例えばこんな感じ。

$ ls /dev/sd
sda   sda1  sdb   sdb1  sdb2  sdb5  sdb6  sdc   sdc1  sdd   sde   sdf   
$ mount
/dev/sdb1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sdb5 on /usr/local type ext3 (rw)
/dev/sdc1 on /usr/local/dav type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

/dev/sdd、/dev/sde、/dev/sdf の3つのデバイスを一つのボリュームとして使ってみる。まずはfdiskでLVMパーティションを作成。

# fdisk /dev/sdd 
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

このディスクのシリンダ数は 33418 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-33418, default 1): 
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-33418, default 33418): 
Using default value 33418

コマンド (m でヘルプ): t
Selected partition 1
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): p

Disk /dev/sdd: 274.8 GB, 274877906944 bytes
255 heads, 63 sectors/track, 33418 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdd1               1       33418   268430053+  8e  Linux LVM

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。

やってる事は単純で、/dev/sdd上に基本領域1を作成し、Linux LVM(8e)のシステムタイプに変更するだけ。これを/dev/sde、/dev/sdfに対しても実施する。
これで物理ボリュームを耕せた。

# pvcreate /dev/sdd1
  Physical volume "/dev/sdd1" successfully created
# pvcreate /dev/sde1
  Physical volume "/dev/sde1" successfully created
# pvcreate /dev/sdf1
  Physical volume "/dev/sdf1" successfully created
# pvdisplay 
  "/dev/sdd1" is a new physical volume of "255.99 GB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd1
  VG Name               
  PV Size               255.99 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               2gnlAV-0Q7l-zjfX-uJcX-Y9g8-unyT-8lw7Ve

  "/dev/sde1" is a new physical volume of "255.99 GB"
  --- NEW Physical volume ---
  PV Name               /dev/sde1
  VG Name               
  PV Size               255.99 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               LvHy18-QWGJ-0XSv-gwy9-Juct-aS9i-WTt5Fq

  "/dev/sdf1" is a new physical volume of "255.99 GB"
  --- NEW Physical volume ---
  PV Name               /dev/sdf1
  VG Name               
  PV Size               255.99 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               YO0jOf-MyGE-PPho-UCAV-YgBN-AgJJ-Zn40x3

次はこれをボリューム・グループ"storage"に所属させてみる。

# vgcreate storage /dev/sdd1 
  Volume group "storage" successfully created
# vgextend storage /dev/sde1 
  Volume group "storage" successfully extended
# vgextend storage /dev/sdf1 
  Volume group "storage" successfully extended

これだけ。超簡単。これでボリューム・グループが面倒見てくれるようになった。

# vgdisplay 
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               767.98 GB
  PE Size               4.00 MB
  Total PE              196602
  Alloc PE / Size       0 / 0
  Free  PE / Size       196602 / 767.98 GB
  VG UUID               vwxumu-y8Up-o4Kb-6sZK-o8AT-YMhl-ZhZFYz

最後にここへ論理ボリュームを作成する。

# lvcreate -L 767.98GB -n LogVol00 storage
  Rounding up size to full physical extent 767.98 GB
  Logical volume "LogVol00" created

これだけ。なにこれべんり。これで複数あったディスクが一つにまとめられた。

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/storage/LogVol00
  VG Name                storage
  LV UUID                cdfowl-G0SE-dExJ-Dd8Z-tUQe-KKCh-1746b5
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                767.98 GB
  Current LE             196602
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

後は普通にフォーマットしてマウントすればOK。

# mkfs.ext3 -j /dev/storage/LogVol00 
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
100663296 inodes, 201320448 blocks
10066022 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
6144 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# mount -t ext3 /dev/storage/LogVol00 /mnt

そして後から更にディスクを追加して拡張する方法。まずはディスクを追加して再起動とかしてOS上で認識させる。今回の例では/dev/sdg、/dev/sdhの2台。
まずは物理ボリュームを耕す。fdiskは長いので割愛。

# pvcreate /dev/sdg1 
  Physical volume "/dev/sdg1" successfully created
# pvcreate /dev/sdh1
  Physical volume "/dev/sdh1" successfully created

物理ボリュームを見てみるとこんな感じ。/dev/sdg1と/dev/sdh1はまだVG Nameも設定無いしAllocatableにもされてない。

# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sdd1
  VG Name               storage
  PV Size               255.99 GB / not usable 2.72 MB
  Allocatable           yes (but full)
  PE Size (KByte)       4096
  Total PE              65534
  Free PE               0
  Allocated PE          65534
  PV UUID               2gnlAV-0Q7l-zjfX-uJcX-Y9g8-unyT-8lw7Ve

  --- Physical volume ---
  PV Name               /dev/sde1
  VG Name               storage
  PV Size               255.99 GB / not usable 2.72 MB
  Allocatable           yes (but full)
  PE Size (KByte)       4096
  Total PE              65534
  Free PE               0
  Allocated PE          65534
  PV UUID               LvHy18-QWGJ-0XSv-gwy9-Juct-aS9i-WTt5Fq

  --- Physical volume ---
  PV Name               /dev/sdf1
  VG Name               storage
  PV Size               255.99 GB / not usable 2.72 MB
  Allocatable           yes (but full)
  PE Size (KByte)       4096
  Total PE              65534
  Free PE               0
  Allocated PE          65534
  PV UUID               YO0jOf-MyGE-PPho-UCAV-YgBN-AgJJ-Zn40x3

  "/dev/sdg1" is a new physical volume of "255.99 GB"
  --- NEW Physical volume ---
  PV Name               /dev/sdg1
  VG Name               
  PV Size               255.99 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               qqWXiQ-3JSw-7Xki-7Eu2-oYDt-OTLy-uKGQXj

  "/dev/sdh1" is a new physical volume of "255.99 GB"
  --- NEW Physical volume ---
  PV Name               /dev/sdh1
  VG Name               
  PV Size               255.99 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               CfbNwM-9te6-wbxk-0bSt-o96y-cxvP-j3OrCW

というわけでボリュームグループに追加。何か色々増えたった。

# vgextend storage /dev/sdg1 
  Volume group "storage" successfully extended
# vgextend storage /dev/sdh1 
  Volume group "storage" successfully extended
# vgdisplay 
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        5
  Metadata Sequence No  8
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                5
  Act PV                5
  VG Size               1.25 TB
  PE Size               4.00 MB
  Total PE              327670
  Alloc PE / Size       196602 / 767.98 GB
  Free  PE / Size       131068 / 511.98 GB
  VG UUID               vwxumu-y8Up-o4Kb-6sZK-o8AT-YMhl-ZhZFYz

論理ボリューム拡張したったった。

# lvextend -l +131068 /dev/storage/LogVol00 
  Extending logical volume LogVol00 to 1.25 TB
  Logical volume LogVol00 successfully resized

更にファイルシステムをオンライン・リサイズしたったったった。

# resize2fs /dev/storage/LogVol00 
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/storage/LogVol00 is mounted on /usr/local/dav; on-line resizing required
Performing an on-line resize of /dev/storage/LogVol00 to 335534080 (4k) blocks.
The filesystem on /dev/storage/LogVol00 is now 335534080 blocks long.

拡張作業中、 watch df などのコマンドでディスクサイズの推移を見ると、徐々にディスク上限が増えていくのが解る。うむ、なかなかシュールな光景であるな。
他にもLVM管理は色々と便利な機能が盛り沢山。使えるなら使った方がお得かも。